groovy node-tree integration
[controller.git] / opendaylight / sal / yang-prototype / yang / yang-data-impl / src / test / java / org / opendaylight / controller / yang / data / impl / NodeUtilsTest.java
1 /*\r
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.controller.yang.data.impl;\r
9 \r
10 import java.io.IOException;\r
11 import java.net.URI;\r
12 import java.util.Date;\r
13 import java.util.List;\r
14 import java.util.Map;\r
15 import java.util.Stack;\r
16 \r
17 import org.junit.Assert;\r
18 import org.junit.Before;\r
19 import org.junit.Test;\r
20 import org.opendaylight.controller.yang.common.QName;\r
21 import org.opendaylight.controller.yang.data.api.CompositeNode;\r
22 import org.opendaylight.controller.yang.data.api.Node;\r
23 import org.opendaylight.controller.yang.data.api.SimpleNode;\r
24 import org.opendaylight.controller.yang.model.api.ListSchemaNode;\r
25 import org.opendaylight.controller.yang.model.api.SchemaContext;\r
26 import org.slf4j.Logger;\r
27 import org.slf4j.LoggerFactory;\r
28 import org.w3c.dom.Document;\r
29 \r
30 /**\r
31  * @author michal.rehak\r
32  *\r
33  */\r
34 public class NodeUtilsTest {\r
35     \r
36     private static final Logger LOG = LoggerFactory\r
37             .getLogger(NodeUtilsTest.class);\r
38     \r
39     private QName qName;\r
40     private CompositeNode network;\r
41 \r
42     private String ns;\r
43 \r
44 \r
45     /**\r
46      * @throws Exception\r
47      */\r
48     @Before\r
49     public void setUp() throws Exception {\r
50         ns = "urn:ietf:params:xml:ns:netconf:base:1.0";\r
51         qName = new QName(\r
52                 new URI(ns), \r
53                 new Date(42), "yang-data-impl-mutableTest");\r
54         network = NodeHelper.buildTestConfigTree(qName);\r
55     }\r
56 \r
57     /**\r
58      * Test method for {@link org.opendaylight.controller.yang.data.impl.NodeUtils#buildPath(org.opendaylight.controller.yang.data.api.Node)}.\r
59      * @throws Exception \r
60      */\r
61     @Test\r
62     public void testBuildPath() throws Exception {\r
63         SimpleNode<?> needle = network.getCompositesByName("topologies").iterator().next()\r
64             .getCompositesByName("topology").iterator().next()\r
65             .getSimpleNodesByName("topology-id").iterator().next();\r
66         String breadCrumbs = NodeUtils.buildPath(needle);\r
67         \r
68         Assert.assertEquals("network.topologies.topology.topology-id", breadCrumbs);\r
69     }\r
70 \r
71     /**\r
72      * Test method for {@link org.opendaylight.controller.yang.data.impl.NodeUtils#buildShadowDomTree(org.opendaylight.controller.yang.data.api.CompositeNode)}.\r
73      * @throws Exception \r
74      */\r
75     @Test\r
76     public void testBuildShadowDomTree() throws Exception {\r
77         MemoryConsumption mc = new MemoryConsumption();\r
78         mc.startObserving();\r
79         \r
80         Document networkShadow = NodeUtils.buildShadowDomTree(network);\r
81         \r
82         LOG.debug("After dom built: "+mc.finishObserving());\r
83         NodeHelper.compareXmlTree(networkShadow, "./config02-shadow.xml", getClass());\r
84     }\r
85 \r
86     /**\r
87      * Test method for {@link org.opendaylight.controller.yang.data.impl.NodeUtils#findNodeByXpath(org.w3c.dom.Document, java.lang.String)}.\r
88      * @throws Exception \r
89      */\r
90     @Test\r
91     public void testFindNodeByXpath() throws Exception {\r
92         Document networkShadow = NodeUtils.buildShadowDomTree(network);\r
93         MemoryConsumption mc = new MemoryConsumption();\r
94         mc.startObserving();\r
95         \r
96         SimpleNode<String> needle = NodeUtils.findNodeByXpath(networkShadow, \r
97                 NodeHelper.AddNamespaceToPattern(\r
98                         "//{0}node[{0}node-id='nodeId_19']//{0}termination-point[2]/{0}tp-id", ns));\r
99         \r
100         LOG.debug("After xpath executed: "+mc.finishObserving());\r
101         \r
102         Assert.assertNotNull(needle);\r
103         Assert.assertEquals("tpId_18", needle.getValue());\r
104     }\r
105     \r
106     /**\r
107      * Test method for {@link org.opendaylight.controller.yang.data.impl.NodeUtils#buildNodeMap(java.util.List)}.\r
108      */\r
109     @Test\r
110     public void testBuildNodeMap() {\r
111         CompositeNode topology = network.getCompositesByName("topologies").iterator().next()\r
112             .getCompositesByName("topology").iterator().next();\r
113         \r
114         Map<QName, List<Node<?>>> nodeMap = NodeUtils.buildNodeMap(topology.getChildren());\r
115         Assert.assertEquals(3, nodeMap.size());\r
116     }\r
117     \r
118     /**\r
119      * Test method for {@link org.opendaylight.controller.yang.data.impl.NodeUtils#buildMapOfListNodes(org.opendaylight.controller.yang.model.api.SchemaContext)}.\r
120      */\r
121     @Test\r
122     public void testBuildMapOfListNodes() {\r
123         SchemaContext schemaCtx = NodeHelper.loadSchemaContext();\r
124         Map<String, ListSchemaNode> mapOfLists = NodeUtils.buildMapOfListNodes(schemaCtx);\r
125         Assert.assertEquals(5, mapOfLists.size());\r
126     }\r
127 \r
128     /**\r
129      * Test method for {@link org.opendaylight.controller.yang.data.impl.NodeUtils#buildMapOfListNodes(org.opendaylight.controller.yang.model.api.SchemaContext)}.\r
130      * @throws Exception \r
131      * @throws IOException \r
132      */\r
133     @Test\r
134     public void testLoadConfigByGroovy() throws IOException, Exception {\r
135         CompositeNode treeRoot = NodeHelper.loadConfigByGroovy("./config02.groovy");\r
136         Document shadowTree = NodeUtils.buildShadowDomTree(treeRoot);\r
137         try {\r
138             checkFamilyBinding(treeRoot);\r
139         } catch (Exception e) {\r
140             LOG.error(e.getMessage());\r
141             throw e;\r
142         }\r
143         \r
144         NodeHelper.compareXmlTree(shadowTree, "./config02g-shadow.xml", getClass());\r
145     }\r
146 \r
147     private static void checkFamilyBinding(CompositeNode treeRoot) throws Exception {\r
148         Stack<CompositeNode> jobQueue = new Stack<>();\r
149         jobQueue.push(treeRoot);\r
150         \r
151         while (!jobQueue.isEmpty()) {\r
152             CompositeNode job = jobQueue.pop();\r
153             for (Node<?> child : job.getChildren()) {\r
154                 if (child instanceof CompositeNode) {\r
155                     jobQueue.push((CompositeNode) child);\r
156                 }\r
157                 \r
158                 if (job != child.getParent()) {\r
159                     throw new Exception("binding mismatch occured: \nPARENT["+job+"]\n CHILD[" + child+"]\n  +->  "+child.getParent());\r
160                 }\r
161             }\r
162         }\r
163     }\r
164     \r
165 }\r