X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fconfig-netconf-connector%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fconfignetconfconnector%2FNetconfMappingTest.java;h=641881cf9ee50b71119c930a495ded9920575f73;hp=8b6b1aefc1971d2af9fbc7f69b4264cc79ed3327;hb=9d9d2f8699b96837b7860bd2458680fee1f28529;hpb=4f8166639477de8c1c9048baee2ba70003748756 diff --git a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java index 8b6b1aefc1..641881cf9e 100644 --- a/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java +++ b/opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java @@ -8,12 +8,53 @@ package org.opendaylight.controller.netconf.confignetconfconnector; +import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.opendaylight.controller.netconf.util.test.XmlUnitUtil.assertContainsElement; +import static org.opendaylight.controller.netconf.util.test.XmlUnitUtil.assertContainsElementWithText; +import static org.opendaylight.controller.netconf.util.xml.XmlUtil.readXmlToElement; + import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import org.apache.commons.lang3.StringUtils; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.ObjectName; +import javax.xml.parsers.ParserConfigurationException; + +import org.custommonkey.xmlunit.AbstractNodeTester; +import org.custommonkey.xmlunit.NodeTest; +import org.custommonkey.xmlunit.NodeTestException; +import org.custommonkey.xmlunit.NodeTester; +import org.custommonkey.xmlunit.XMLAssert; +import org.custommonkey.xmlunit.XMLUnit; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -39,9 +80,10 @@ import org.opendaylight.controller.config.yang.test.impl.IdentityTestModuleFacto import org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModuleFactory; import org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModuleMXBean; import org.opendaylight.controller.config.yang.test.impl.Peers; +import org.opendaylight.controller.config.yang.test.impl.TestImplModuleFactory; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; -import org.opendaylight.controller.netconf.api.NetconfOperationRouter; +import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.operations.Commit; import org.opendaylight.controller.netconf.confignetconfconnector.operations.DiscardChanges; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfig; @@ -52,13 +94,12 @@ import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStore import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.impl.mapping.operations.DefaultCloseSession; -import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceSnapshot; +import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationRouter; +import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceSnapshotImpl; import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperation; import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.controller.netconf.util.test.XmlFileLoader; -import org.opendaylight.controller.netconf.util.xml.XmlElement; -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity2; @@ -72,52 +113,30 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.w3c.dom.Text; +import org.w3c.dom.traversal.DocumentTraversal; import org.xml.sax.SAXException; -import javax.management.InstanceAlreadyExistsException; -import javax.management.InstanceNotFoundException; -import javax.management.ObjectName; -import javax.xml.parsers.ParserConfigurationException; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - public class NetconfMappingTest extends AbstractConfigTest { private static final Logger logger = LoggerFactory.getLogger(NetconfMappingTest.class); private static final String INSTANCE_NAME = "instance-from-code"; private static final String NETCONF_SESSION_ID = "foo"; + private static final String TEST_NAMESPACE= "urn:opendaylight:params:xml:ns:yang:controller:test:impl"; private NetconfTestImplModuleFactory factory; private DepTestImplModuleFactory factory2; private IdentityTestModuleFactory factory3; + private TestImplModuleFactory factory4; @Mock YangStoreSnapshot yangStoreSnapshot; @Mock NetconfOperationRouter netconfOperationRouter; @Mock - NetconfOperationServiceSnapshot netconfOperationServiceSnapshot; + NetconfOperationServiceSnapshotImpl netconfOperationServiceSnapshot; private TransactionProvider transactionProvider; @@ -131,8 +150,9 @@ public class NetconfMappingTest extends AbstractConfigTest { this.factory = new NetconfTestImplModuleFactory(); this.factory2 = new DepTestImplModuleFactory(); this.factory3 = new IdentityTestModuleFactory(); - super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.factory, this.factory2, - this.factory3)); + factory4 = new TestImplModuleFactory(); + super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, this.factory, this.factory2, + this.factory3, factory4)); transactionProvider = new TransactionProvider(this.configRegistryClient, NETCONF_SESSION_ID); } @@ -180,72 +200,101 @@ public class NetconfMappingTest extends AbstractConfigTest { createModule(INSTANCE_NAME); edit("netconfMessages/editConfig.xml"); - Element config = getConfigCandidate(); - assertCorrectServiceNames(config, 6, "ref_test2", "user_to_instance_from_code", "ref_dep_user", + Document config = getConfigCandidate(); + assertCorrectServiceNames(config, Sets.newHashSet("user_to_instance_from_code", "ref_dep_user", "ref_dep_user_two", "ref_from_code_to_instance-from-code_dep_1", - "ref_from_code_to_instance-from-code_1"); + "ref_from_code_to_instance-from-code_1")); edit("netconfMessages/editConfig_addServiceName.xml"); config = getConfigCandidate(); - assertCorrectServiceNames(config, 7, "ref_test2", "user_to_instance_from_code", "ref_dep_user", + assertCorrectServiceNames(config, Sets.newHashSet("user_to_instance_from_code", "ref_dep_user", "ref_dep_user_two", "ref_from_code_to_instance-from-code_dep_1", - "ref_from_code_to_instance-from-code_1", "ref_dep_user_another"); + "ref_from_code_to_instance-from-code_1", "ref_dep_user_another")); edit("netconfMessages/editConfig_addServiceNameOnTest.xml"); config = getConfigCandidate(); - assertCorrectServiceNames(config, 7, "ref_test2", "user_to_instance_from_code", "ref_dep_user", + assertCorrectServiceNames(config, Sets.newHashSet("user_to_instance_from_code", "ref_dep_user", "ref_dep_user_two", "ref_from_code_to_instance-from-code_dep_1", - "ref_from_code_to_instance-from-code_1", "ref_dep_user_another"); + "ref_from_code_to_instance-from-code_1", "ref_dep_user_another")); commit(); config = getConfigRunning(); assertCorrectRefNamesForDependencies(config); - assertCorrectServiceNames(config, 7, "ref_test2", "user_to_instance_from_code", "ref_dep_user", + assertCorrectServiceNames(config, Sets.newHashSet("user_to_instance_from_code", "ref_dep_user", "ref_dep_user_two", "ref_from_code_to_instance-from-code_dep_1", - "ref_from_code_to_instance-from-code_1", "ref_dep_user_another"); + "ref_from_code_to_instance-from-code_1", "ref_dep_user_another")); edit("netconfMessages/editConfig_replace_default.xml"); config = getConfigCandidate(); - assertCorrectServiceNames(config, 2, "ref_dep", "ref_dep2"); + assertCorrectServiceNames(config, Collections.emptySet()); edit("netconfMessages/editConfig_remove.xml"); config = getConfigCandidate(); - assertCorrectServiceNames(config, 0); + assertCorrectServiceNames(config, Collections.emptySet()); commit(); config = getConfigCandidate(); - assertCorrectServiceNames(config, 0); + assertCorrectServiceNames(config, Collections.emptySet()); } - private void assertCorrectRefNamesForDependencies(Element config) { + private void assertCorrectRefNamesForDependencies(Document config) throws NodeTestException { NodeList modulesList = config.getElementsByTagName("modules"); assertEquals(1, modulesList.getLength()); - Element modules = (Element) modulesList.item(0); + NodeTest nt = new NodeTest((DocumentTraversal) config, modulesList.item(0)); + NodeTester tester = new AbstractNodeTester() { + private int defaultRefNameCount = 0; + private int userRefNameCount = 0; - String trimmedModules = XmlUtil.toString(modules).replaceAll("\\s", ""); - int defaultRefNameCount = StringUtils.countMatches(trimmedModules, "ref_dep2"); - int userRefNameCount = StringUtils.countMatches(trimmedModules, "ref_dep_user_two"); + @Override + public void testText(Text text) throws NodeTestException { + if(text.getData().equals("ref_dep2")) { + defaultRefNameCount++; + } else if(text.getData().equals("ref_dep_user_two")) { + userRefNameCount++; + } + } - assertEquals(0, defaultRefNameCount); - assertEquals(2, userRefNameCount); + @Override + public void noMoreNodes(NodeTest forTest) throws NodeTestException { + assertEquals(0, defaultRefNameCount); + assertEquals(2, userRefNameCount); + } + }; + nt.performTest(tester, Node.TEXT_NODE); } - private void assertCorrectServiceNames(Element configCandidate, int servicesSize, String... refNames) { - NodeList elements = configCandidate.getElementsByTagName("provider"); - assertEquals(servicesSize, elements.getLength()); + private void assertCorrectServiceNames(Document configCandidate, Set refNames) throws NodeTestException { + final Set refNames2 = new HashSet<>(refNames); + NodeList servicesNodes = configCandidate.getElementsByTagName("services"); + assertEquals(1, servicesNodes.getLength()); - NodeList servicesList = configCandidate.getElementsByTagName("services"); - assertEquals(1, servicesList.getLength()); + NodeTest nt = new NodeTest((DocumentTraversal) configCandidate, servicesNodes.item(0)); + NodeTester tester = new AbstractNodeTester() { - Element services = (Element) servicesList.item(0); - String trimmedServices = XmlUtil.toString(services).replaceAll("\\s", ""); + @Override + public void testElement(Element element) throws NodeTestException { + if(element.getNodeName() != null) { + if(element.getNodeName().equals("name")) { + String elmText = element.getTextContent(); + if(refNames2.contains(elmText)) { + refNames2.remove(elmText); + } else { + throw new NodeTestException("Unexpected services defined: " + elmText); + } + } + } + } - for (String s : refNames) { - assertThat(trimmedServices, JUnitMatchers.containsString(s)); - } + @Override + public void noMoreNodes(NodeTest forTest) throws NodeTestException { + assertEquals(Collections.emptySet(), refNames2); + assertTrue(refNames2.toString(), refNames2.isEmpty()); + } + }; + nt.performTest(tester, Node.ELEMENT_NODE); } @Test @@ -255,19 +304,18 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/editConfig.xml"); commit(); - Element response = getConfigRunning(); - String trimmedResponse = XmlUtil.toString(response).replaceAll("\\s", ""); - assertContainsString(trimmedResponse, "0:0:0:0:0:0:0:1"); - assertContainsString(trimmedResponse, "456"); + Document response = getConfigRunning(); + Element ipElement = readXmlToElement("0:0:0:0:0:0:0:1"); + assertContainsElement(response, readXmlToElement("0:0:0:0:0:0:0:1")); + + assertContainsElement(response, readXmlToElement("456")); edit("netconfMessages/editConfig_setUnions.xml"); commit(); response = getConfigRunning(); - - trimmedResponse = XmlUtil.toString(response).replaceAll("\\s", ""); - assertContainsString(trimmedResponse, "127.1.2.3"); - assertContainsString(trimmedResponse, "randomStringForUnion"); + assertContainsElement(response, readXmlToElement("127.1.2.3")); + assertContainsElement(response, readXmlToElement("randomStringForUnion")); } @@ -277,7 +325,7 @@ public class NetconfMappingTest extends AbstractConfigTest { createModule(INSTANCE_NAME); edit("netconfMessages/editConfig.xml"); - Element configCandidate = getConfigCandidate(); + Document configCandidate = getConfigCandidate(); checkBinaryLeafEdited(configCandidate); @@ -287,7 +335,7 @@ public class NetconfMappingTest extends AbstractConfigTest { // check after edit commit(); - Element response = getConfigRunning(); + Document response = getConfigRunning(); checkBinaryLeafEdited(response); checkTypeConfigAttribute(response); @@ -299,17 +347,12 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/editConfig_remove.xml"); commit(); - response = getConfigCandidate(); - final String responseFromCandidate = XmlUtil.toString(response).replaceAll("\\s+", ""); - response = getConfigRunning(); - final String responseFromRunning = XmlUtil.toString(response).replaceAll("\\s+", ""); - assertEquals(responseFromCandidate, responseFromRunning); - - final String expectedResult = XmlFileLoader.fileToString("netconfMessages/editConfig_expectedResult.xml") - .replaceAll("\\s+", ""); + assertXMLEqual(getConfigCandidate(), getConfigRunning()); - assertEquals(expectedResult, responseFromRunning); - assertEquals(expectedResult, responseFromCandidate); + final Document expectedResult = XmlFileLoader.xmlFileToDocument("netconfMessages/editConfig_expectedResult.xml"); + XMLUnit.setIgnoreWhitespace(true); + assertXMLEqual(expectedResult, getConfigRunning()); + assertXMLEqual(expectedResult, getConfigCandidate()); edit("netconfMessages/editConfig_none.xml"); closeSession(); @@ -318,12 +361,10 @@ public class NetconfMappingTest extends AbstractConfigTest { verifyNoMoreInteractions(netconfOperationServiceSnapshot); } - private void checkBigDecimal(Element response) { - String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", ""); - - assertContainsString(responseTrimmed, "2.58"); + private void checkBigDecimal(Document response) throws NodeTestException, SAXException, IOException { + assertContainsElement(response, readXmlToElement("2.58")); // Default - assertContainsString(responseTrimmed, "2.00"); + assertContainsElement(response, readXmlToElement("2.00")); } @@ -345,14 +386,14 @@ public class NetconfMappingTest extends AbstractConfigTest { executeOp(commitOp, "netconfMessages/commit.xml"); } - private Element getConfigCandidate() throws ParserConfigurationException, SAXException, IOException, + private Document getConfigCandidate() throws ParserConfigurationException, SAXException, IOException, NetconfDocumentedException { GetConfig getConfigOp = new GetConfig(yangStoreSnapshot, Optional. absent(), transactionProvider, configRegistryClient, NETCONF_SESSION_ID); return executeOp(getConfigOp, "netconfMessages/getConfig_candidate.xml"); } - private Element getConfigRunning() throws ParserConfigurationException, SAXException, IOException, + private Document getConfigRunning() throws ParserConfigurationException, SAXException, IOException, NetconfDocumentedException { GetConfig getConfigOp = new GetConfig(yangStoreSnapshot, Optional. absent(), transactionProvider, configRegistryClient, NETCONF_SESSION_ID); @@ -376,7 +417,7 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/editConfig.xml"); commit(); - Element response = getConfigRunning(); + Document response = getConfigRunning(); final int allInstances = response.getElementsByTagName("module").getLength(); edit("netconfMessages/editConfig_replace_default.xml"); @@ -389,42 +430,42 @@ public class NetconfMappingTest extends AbstractConfigTest { assertEquals(2, afterReplace); } - @Test(expected = NetconfDocumentedException.class) + @Test public void testSameAttrDifferentNamespaces() throws Exception { try { edit("netconfMessages/namespaces/editConfig_sameAttrDifferentNamespaces.xml"); + fail(); } catch (NetconfDocumentedException e) { String message = e.getMessage(); - assertContainsString(message, "Element simple-long-2 present multiple times with different namespaces"); - assertContainsString(message, "urn:opendaylight:params:xml:ns:yang:controller:test:impl"); + assertContainsString(message, "Element simpleInt present multiple times with different namespaces"); + assertContainsString(message, TEST_NAMESPACE); assertContainsString(message, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG); - throw e; } } - @Test(expected = NetconfDocumentedException.class) + @Test public void testDifferentNamespaceInTO() throws Exception { try { edit("netconfMessages/namespaces/editConfig_differentNamespaceTO.xml"); + fail(); } catch (NetconfDocumentedException e) { String message = e.getMessage(); assertContainsString(message, "Unrecognised elements"); assertContainsString(message, "simple-int2"); assertContainsString(message, "dto_d"); - throw e; } } - @Test(expected = NetconfDocumentedException.class) + @Test public void testSameAttrDifferentNamespacesList() throws Exception { try { edit("netconfMessages/namespaces/editConfig_sameAttrDifferentNamespacesList.xml"); + fail(); } catch (NetconfDocumentedException e) { String message = e.getMessage(); - assertContainsString(message, "Element binaryLeaf present multiple times with different namespaces"); - assertContainsString(message, "urn:opendaylight:params:xml:ns:yang:controller:test:impl"); + assertContainsString(message, "Element allow-user present multiple times with different namespaces"); + assertContainsString(message, TEST_NAMESPACE); assertContainsString(message, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG); - throw e; } } @@ -435,7 +476,7 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/namespaces/editConfig_typeNameConfigAttributeMatching.xml"); commit(); - Element response = getConfigRunning(); + Document response = getConfigRunning(); checkTypeConfigAttribute(response); } @@ -457,6 +498,7 @@ public class NetconfMappingTest extends AbstractConfigTest { for (int i = 0; i < TESTS_COUNT; i++) { String file = String.format(format, i + 1); + logger.info("Reading {}", file); try { edit(file); } catch (NetconfDocumentedException e) { @@ -477,7 +519,7 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/editConfig.xml"); commit(); - Element response = getConfigRunning(); + Document response = getConfigRunning(); final int allInstances = response.getElementsByTagName("instance").getLength(); edit("netconfMessages/editConfig_replace_module.xml"); @@ -506,83 +548,61 @@ public class NetconfMappingTest extends AbstractConfigTest { executeOp(discardOp, "netconfMessages/discardChanges.xml"); } - private void checkBinaryLeafEdited(final Element response) { - String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", ""); - String substring = "YmluYXJ5"; - assertContainsString(responseTrimmed, substring); - substring = "ZGVmYXVsdEJpbg=="; - assertContainsString(responseTrimmed, substring); + private void checkBinaryLeafEdited(final Document response) throws NodeTestException, SAXException, IOException { + assertContainsElement(response, readXmlToElement("YmluYXJ5")); + assertContainsElement(response, readXmlToElement("ZGVmYXVsdEJpbg==")); } - private void checkTypedefs(final Element response) { - String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", ""); + private void checkTypedefs(final Document response) throws NodeTestException, SAXException, IOException { - String substring = "10"; - assertContainsString(responseTrimmed, substring); + assertContainsElement(response, readXmlToElement("10")); // Default - assertContainsString(responseTrimmed, - "1"); + assertContainsElement(response, readXmlToElement("1")); - assertContainsString(responseTrimmed, - "20"); + assertContainsElement(response, readXmlToElement("20")); // Default - assertContainsString(responseTrimmed, - "2"); + assertContainsElement(response, readXmlToElement("2")); - assertContainsString(responseTrimmed, - "TWO"); + assertContainsElement(response, readXmlToElement("TWO")); // Default - assertContainsString(responseTrimmed, - "ONE"); + assertContainsElement(response, readXmlToElement("ONE")); } private void assertContainsString(String string, String substring) { assertThat(string, JUnitMatchers.containsString(substring)); } - private void checkEnum(final Element response) { - XmlElement modulesElement = XmlElement.fromDomElement(response).getOnlyChildElement("data") - .getOnlyChildElement("modules"); - - String enumName = "extended-enum"; - String enumContent = "TWO"; + private void checkEnum(final Document response) throws Exception { - for (XmlElement moduleElement : modulesElement.getChildElements("module")) { - String name = moduleElement.getOnlyChildElement("name").getTextContent(); - if(name.equals(INSTANCE_NAME)) { - XmlElement enumAttr = moduleElement.getOnlyChildElement(enumName); - assertEquals(enumContent, enumAttr.getTextContent()); + String expectedEnumContent = "TWO"; - return; - } - } - - fail("Enum attribute " + enumName + ":" + enumContent + " not present in " + XmlUtil.toString(response)); + XMLAssert.assertXpathEvaluatesTo(expectedEnumContent, + getXpathForNetconfImplSubnode(INSTANCE_NAME,"extended-enum"), + response); } - private void checkTestingDeps(Element response) { + private void checkTestingDeps(Document response) { int testingDepsSize = response.getElementsByTagName("testing-deps").getLength(); assertEquals(2, testingDepsSize); } - private void checkTypeConfigAttribute(Element response) { - - XmlElement modulesElement = XmlElement.fromDomElement(response).getOnlyChildElement("data") - .getOnlyChildElement("modules"); + private String getXpathForNetconfImplSubnode(String instanceName, String subnode) { + return "/urn:ietf:params:xml:ns:netconf:base:1.0:rpc-reply" + + "/urn:ietf:params:xml:ns:netconf:base:1.0:data" + + "/urn:opendaylight:params:xml:ns:yang:controller:config:modules" + + "/module[name='"+instanceName+"']" + + "/urn:opendaylight:params:xml:ns:yang:controller:test:impl:impl-netconf" + + "/urn:opendaylight:params:xml:ns:yang:controller:test:impl:"+subnode; + } - List expectedValues = Lists.newArrayList("default-string", "configAttributeType"); - Set configAttributeType = Sets.newHashSet(); + private void checkTypeConfigAttribute(Document response) throws Exception { - for (XmlElement moduleElement : modulesElement.getChildElements("module")) { - for (XmlElement type : moduleElement.getChildElements("type")) { - if (type.getAttribute(XmlUtil.XMLNS_ATTRIBUTE_KEY).equals("") == false) { - configAttributeType.add(type.getTextContent()); - } - } - } - - for (String expectedValue : expectedValues) { - assertTrue(configAttributeType.contains(expectedValue)); + Map namesToTypeValues = ImmutableMap.of("instance-from-code", "configAttributeType", + "test2", "default-string"); + for (Entry nameToExpectedValue : namesToTypeValues.entrySet()) { + XMLAssert.assertXpathEvaluatesTo(nameToExpectedValue.getValue(), + getXpathForNetconfImplSubnode(nameToExpectedValue.getKey(),"type"), + response); } } @@ -629,7 +649,7 @@ public class NetconfMappingTest extends AbstractConfigTest { // check after edit commit(); - Element response = get(); + Document response = get(); assertEquals(2/*With runtime beans*/ + 2 /*Without runtime beans*/, getElementsSize(response, "module")); // data from state @@ -642,36 +662,42 @@ public class NetconfMappingTest extends AbstractConfigTest { assertEquals(8 * 4, getElementsSize(response, "inner-inner-running-data")); assertEquals(8 * 4, getElementsSize(response, "deep3")); assertEquals(8 * 4 * 2, getElementsSize(response, "list-of-strings")); - assertEquals(8, getElementsSize(response, "inner-running-data-additional")); + assertEquals(8, getElementsSize(response, "inner-running-data-additional", "urn:opendaylight:params:xml:ns:yang:controller:test:impl")); assertEquals(8, getElementsSize(response, "deep4")); // TODO assert keys RuntimeRpc netconf = new RuntimeRpc(yangStoreSnapshot, configRegistryClient, NETCONF_SESSION_ID); response = executeOp(netconf, "netconfMessages/rpc.xml"); - assertContainsString(XmlUtil.toString(response), "testarg1".toUpperCase()); + assertContainsElementWithText(response, "testarg1"); response = executeOp(netconf, "netconfMessages/rpcInner.xml"); - assertContainsString(XmlUtil.toString(response), "ok"); + Document expectedReplyOk = XmlFileLoader.xmlFileToDocument("netconfMessages/rpc-reply_ok.xml"); + XMLUnit.setIgnoreWhitespace(true); + XMLAssert.assertXMLEqual(expectedReplyOk, response); response = executeOp(netconf, "netconfMessages/rpcInnerInner.xml"); - assertContainsString(XmlUtil.toString(response), "true"); + assertContainsElementWithText(response, "true"); response = executeOp(netconf, "netconfMessages/rpcInnerInner_complex_output.xml"); - assertContainsString(XmlUtil.toString(response), "1"); - assertContainsString(XmlUtil.toString(response), "2"); + assertContainsElementWithText(response, "1"); + assertContainsElementWithText(response, "2"); } - private Element get() throws NetconfDocumentedException, ParserConfigurationException, SAXException, IOException { - Get getOp = new Get(yangStoreSnapshot, configRegistryClient, NETCONF_SESSION_ID, transactionProvider); + private Document get() throws NetconfDocumentedException, ParserConfigurationException, SAXException, IOException { + Get getOp = new Get(yangStoreSnapshot, configRegistryClient, NETCONF_SESSION_ID); return executeOp(getOp, "netconfMessages/get.xml"); } - private int getElementsSize(Element response, String elementName) { + private int getElementsSize(Document response, String elementName) { return response.getElementsByTagName(elementName).getLength(); } - private Element executeOp(final NetconfOperation op, final String filename) throws ParserConfigurationException, + private int getElementsSize(Document response, String elementName, String namespace) { + return response.getElementsByTagNameNS(namespace, elementName).getLength(); + } + + private Document executeOp(final NetconfOperation op, final String filename) throws ParserConfigurationException, SAXException, IOException, NetconfDocumentedException { final Document request = XmlFileLoader.xmlFileToDocument(filename); @@ -683,7 +709,7 @@ public class NetconfMappingTest extends AbstractConfigTest { final Document response = op.handle(request, NetconfOperationChainedExecution.EXECUTION_TERMINATION_POINT); logger.debug("Got response\n{}", XmlUtil.toString(response)); - return response.getDocumentElement(); + return response; } private List getYangs() throws FileNotFoundException {