2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.data.impl;
10 import java.io.IOException;
12 import java.util.Date;
13 import java.util.List;
15 import java.util.Deque;
16 import java.util.LinkedList;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
23 import org.opendaylight.yangtools.yang.data.api.Node;
24 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
25 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29 import org.w3c.dom.Document;
32 * @author michal.rehak
35 public class NodeUtilsTest {
37 private static final Logger LOG = LoggerFactory
38 .getLogger(NodeUtilsTest.class);
41 private CompositeNode network;
50 public void setUp() throws Exception {
51 ns = "urn:ietf:params:xml:ns:netconf:base:1.0";
54 new Date(42), "yang-data-impl-mutableTest");
55 network = NodeHelper.buildTestConfigTree(qName);
59 * Test method for {@link org.opendaylight.yangtools.yang.data.impl.NodeUtils#buildPath(org.opendaylight.yangtools.yang.data.api.Node)}.
63 public void testBuildPath() throws Exception {
64 SimpleNode<?> needle = network.getCompositesByName("topologies").iterator().next()
65 .getCompositesByName("topology").iterator().next()
66 .getSimpleNodesByName("topology-id").iterator().next();
67 String breadCrumbs = NodeUtils.buildPath(needle);
69 Assert.assertEquals("network.topologies.topology.topology-id", breadCrumbs);
73 * Test method for {@link org.opendaylight.yangtools.yang.data.impl.NodeUtils#buildShadowDomTree(org.opendaylight.yangtools.yang.data.api.CompositeNode)}.
77 public void testBuildShadowDomTree() throws Exception {
78 MemoryConsumption mc = new MemoryConsumption();
81 Document networkShadow = NodeUtils.buildShadowDomTree(network);
83 LOG.debug("After dom built: "+mc.finishObserving());
84 NodeHelper.compareXmlTree(networkShadow, "./config02-shadow.xml", getClass());
88 * Test method for {@link org.opendaylight.yangtools.yang.data.impl.NodeUtils#findNodeByXpath(org.w3c.dom.Document, java.lang.String)}.
92 public void testFindNodeByXpath() throws Exception {
93 Document networkShadow = NodeUtils.buildShadowDomTree(network);
94 MemoryConsumption mc = new MemoryConsumption();
97 SimpleNode<String> needle = NodeUtils.findNodeByXpath(networkShadow,
98 NodeHelper.AddNamespaceToPattern(
99 "//{0}node[{0}node-id='nodeId_19']//{0}termination-point[2]/{0}tp-id", ns));
101 LOG.debug("After xpath executed: "+mc.finishObserving());
103 Assert.assertNotNull(needle);
104 Assert.assertEquals("tpId_18", needle.getValue());
108 * Test method for {@link org.opendaylight.yangtools.yang.data.impl.NodeUtils#buildNodeMap(java.util.List)}.
111 public void testBuildNodeMap() {
112 CompositeNode topology = network.getCompositesByName("topologies").iterator().next()
113 .getCompositesByName("topology").iterator().next();
115 Map<QName, List<Node<?>>> nodeMap = NodeUtils.buildNodeMap(topology.getValue());
116 Assert.assertEquals(3, nodeMap.size());
120 * Test method for {@link org.opendaylight.yangtools.yang.data.impl.NodeUtils#buildMapOfListNodes(org.opendaylight.yangtools.yang.model.api.SchemaContext)}.
123 public void testBuildMapOfListNodes() {
124 SchemaContext schemaCtx = NodeHelper.loadSchemaContext();
125 Map<String, ListSchemaNode> mapOfLists = NodeUtils.buildMapOfListNodes(schemaCtx);
126 Assert.assertEquals(5, mapOfLists.size());
130 * Test method for {@link org.opendaylight.yangtools.yang.data.impl.NodeUtils#buildMapOfListNodes(org.opendaylight.yangtools.yang.model.api.SchemaContext)}.
132 * @throws IOException
135 public void testLoadConfigByGroovy() throws IOException, Exception {
136 CompositeNode treeRoot = NodeHelper.loadConfigByGroovy("./config02.groovy");
137 Document shadowTree = NodeUtils.buildShadowDomTree(treeRoot);
139 checkFamilyBinding(treeRoot);
140 } catch (Exception e) {
141 LOG.error(e.getMessage());
145 NodeHelper.compareXmlTree(shadowTree, "./config02g-shadow.xml", getClass());
148 private static void checkFamilyBinding(final CompositeNode treeRoot) throws Exception {
149 Deque<CompositeNode> jobQueue = new LinkedList<>();
150 jobQueue.push(treeRoot);
152 while (!jobQueue.isEmpty()) {
153 CompositeNode job = jobQueue.pop();
154 for (Node<?> child : job.getValue()) {
155 if (child instanceof CompositeNode) {
156 jobQueue.push((CompositeNode) child);
159 if (job != child.getParent()) {
160 throw new Exception("binding mismatch occured: \nPARENT["+job+"]\n CHILD[" + child+"]\n +-> "+child.getParent());