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