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=2e8d1f64ab62cded6bde037c0d082e4604c8785a;hb=9d9d2f8699b96837b7860bd2458680fee1f28529;hpb=027bc8f87341f432654c3aaa7771658c25d2ca7d 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 2e8d1f64ab..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,11 +8,47 @@ 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 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; @@ -44,8 +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.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; @@ -62,8 +100,6 @@ 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; @@ -83,38 +119,6 @@ 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.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -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; - public class NetconfMappingTest extends AbstractConfigTest { private static final Logger logger = LoggerFactory.getLogger(NetconfMappingTest.class); @@ -125,6 +129,7 @@ public class NetconfMappingTest extends AbstractConfigTest { private NetconfTestImplModuleFactory factory; private DepTestImplModuleFactory factory2; private IdentityTestModuleFactory factory3; + private TestImplModuleFactory factory4; @Mock YangStoreSnapshot yangStoreSnapshot; @@ -145,8 +150,9 @@ public class NetconfMappingTest extends AbstractConfigTest { this.factory = new NetconfTestImplModuleFactory(); this.factory2 = new DepTestImplModuleFactory(); this.factory3 = new IdentityTestModuleFactory(); + factory4 = new TestImplModuleFactory(); super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, this.factory, this.factory2, - this.factory3)); + this.factory3, factory4)); transactionProvider = new TransactionProvider(this.configRegistryClient, NETCONF_SESSION_ID); } @@ -195,33 +201,33 @@ public class NetconfMappingTest extends AbstractConfigTest { edit("netconfMessages/editConfig.xml"); Document config = getConfigCandidate(); - assertCorrectServiceNames(config, Sets.newHashSet("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")); edit("netconfMessages/editConfig_addServiceName.xml"); config = getConfigCandidate(); - assertCorrectServiceNames(config, Sets.newHashSet("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")); edit("netconfMessages/editConfig_addServiceNameOnTest.xml"); config = getConfigCandidate(); - assertCorrectServiceNames(config, Sets.newHashSet("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")); commit(); config = getConfigRunning(); assertCorrectRefNamesForDependencies(config); - assertCorrectServiceNames(config, Sets.newHashSet("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")); edit("netconfMessages/editConfig_replace_default.xml"); config = getConfigCandidate(); - assertCorrectServiceNames(config, Sets.newHashSet("ref_dep", "ref_dep2")); + assertCorrectServiceNames(config, Collections.emptySet()); edit("netconfMessages/editConfig_remove.xml"); config = getConfigCandidate(); @@ -260,8 +266,8 @@ public class NetconfMappingTest extends AbstractConfigTest { nt.performTest(tester, Node.TEXT_NODE); } - private void assertCorrectServiceNames(Document configCandidate, final Set refNames) throws NodeTestException { - + private void assertCorrectServiceNames(Document configCandidate, Set refNames) throws NodeTestException { + final Set refNames2 = new HashSet<>(refNames); NodeList servicesNodes = configCandidate.getElementsByTagName("services"); assertEquals(1, servicesNodes.getLength()); @@ -273,9 +279,8 @@ public class NetconfMappingTest extends AbstractConfigTest { if(element.getNodeName() != null) { if(element.getNodeName().equals("name")) { String elmText = element.getTextContent(); - if(refNames.contains(elmText)) { - refNames.remove(elmText); - return; + if(refNames2.contains(elmText)) { + refNames2.remove(elmText); } else { throw new NodeTestException("Unexpected services defined: " + elmText); } @@ -285,7 +290,8 @@ public class NetconfMappingTest extends AbstractConfigTest { @Override public void noMoreNodes(NodeTest forTest) throws NodeTestException { - assertTrue(refNames.isEmpty()); + assertEquals(Collections.emptySet(), refNames2); + assertTrue(refNames2.toString(), refNames2.isEmpty()); } }; nt.performTest(tester, Node.ELEMENT_NODE); @@ -424,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, "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, "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; } } @@ -492,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) { @@ -565,23 +572,13 @@ public class NetconfMappingTest extends AbstractConfigTest { assertThat(string, JUnitMatchers.containsString(substring)); } - private void checkEnum(final Document response) throws NetconfDocumentedException { - XmlElement modulesElement = XmlElement.fromDomElement(response.getDocumentElement()).getOnlyChildElement("data") - .getOnlyChildElement("modules"); + private void checkEnum(final Document response) throws Exception { - String enumName = "extended-enum"; - String enumContent = "TWO"; + String expectedEnumContent = "TWO"; - for (XmlElement moduleElement : modulesElement.getChildElements("module")) { - String name = moduleElement.getOnlyChildElement("prefix:name").getTextContent(); - if(name.equals(INSTANCE_NAME)) { - XmlElement enumAttr = moduleElement.getOnlyChildElement(enumName); - assertEquals(enumContent, enumAttr.getTextContent()); - return; - } - } - - fail("Enum attribute " + enumName + ":" + enumContent + " not present in " + XmlUtil.toString(response)); + XMLAssert.assertXpathEvaluatesTo(expectedEnumContent, + getXpathForNetconfImplSubnode(INSTANCE_NAME,"extended-enum"), + response); } private void checkTestingDeps(Document response) { @@ -589,24 +586,23 @@ public class NetconfMappingTest extends AbstractConfigTest { assertEquals(2, testingDepsSize); } - private void checkTypeConfigAttribute(Document response) throws NetconfDocumentedException { - - XmlElement modulesElement = XmlElement.fromDomElement(response.getDocumentElement()).getOnlyChildElement("data") - .getOnlyChildElement("modules"); - - List expectedValues = Lists.newArrayList("default-string", "configAttributeType"); - Set configAttributeType = Sets.newHashSet(); + 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; + } - for (XmlElement moduleElement : modulesElement.getChildElements("module")) { - for (XmlElement type : moduleElement.getChildElements("type")) { - if (type.getNamespace() != null) { - configAttributeType.add(type.getTextContent()); - } - } - } + private void checkTypeConfigAttribute(Document response) throws Exception { - 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); } } @@ -666,7 +662,7 @@ 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 @@ -689,7 +685,7 @@ public class NetconfMappingTest extends AbstractConfigTest { } private Document get() throws NetconfDocumentedException, ParserConfigurationException, SAXException, IOException { - Get getOp = new Get(yangStoreSnapshot, configRegistryClient, NETCONF_SESSION_ID, transactionProvider); + Get getOp = new Get(yangStoreSnapshot, configRegistryClient, NETCONF_SESSION_ID); return executeOp(getOp, "netconfMessages/get.xml"); } @@ -697,6 +693,10 @@ public class NetconfMappingTest extends AbstractConfigTest { return response.getElementsByTagName(elementName).getLength(); } + 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 {