<artifactId>org.eclipse.equinox.launcher</artifactId>
<version>1.3.0.v20120522-1813</version>
</dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ <version>1.5</version>
+ <scope>test</scope>
+ </dependency>
<!-- Gemini Web -->
<dependency>
<groupId>geminiweb</groupId>
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ </dependency>
</dependencies>
package org.opendaylight.controller.config.persist.storage.directory.xml;
+import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import java.io.File;
+import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
-import com.google.common.base.Optional;
import org.junit.Test;
import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
import org.opendaylight.controller.config.persist.api.Persister;
import org.opendaylight.controller.config.persist.test.PropertiesProviderTest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import org.xml.sax.SAXException;
+
+import com.google.common.base.Optional;
public class DirectoryStorageAdapterTest {
Persister tested;
logger.info("Testing : " + tested.toString());
}
- private void assertResult(ConfigSnapshotHolder result, String s, String... caps) {
- assertEquals(s, result.getConfigSnapshot().replaceAll("\\s", ""));
+ private void assertResult(ConfigSnapshotHolder result, String s, String... caps) throws SAXException, IOException {
+ assertXMLEqual(s, result.getConfigSnapshot());
int i = 0;
for (String capFromSnapshot : result.getCapabilities()) {
assertEquals(capFromSnapshot, caps[i++]);
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ </dependency>
</dependencies>
<build>
package org.opendaylight.controller.config.persist.storage.file.xml;
-import com.google.common.base.Charsets;
+import static junit.framework.Assert.assertFalse;
+import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
+
import junit.framework.Assert;
+
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
import org.opendaylight.controller.config.persist.test.PropertiesProviderTest;
-import static junit.framework.Assert.assertFalse;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
+
+import com.google.common.base.Charsets;
public class FileStorageAdapterTest {
List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
assertEquals(1, lastConf.size());
ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
- assertEquals("<config>2</config>",
- configSnapshotHolder.getConfigSnapshot().replaceAll("\\s", ""));
+ assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
assertEquals(createCaps(), configSnapshotHolder.getCapabilities());
storage = new XmlFileStorageAdapter();
List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
assertEquals(1, lastConf.size());
ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
- assertEquals("<config>2</config>",
- configSnapshotHolder.getConfigSnapshot().replaceAll("\\s", ""));
+ assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
}
@Test
List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
assertEquals(1, lastConf.size());
ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
- assertEquals("<config>3</config>",
- configSnapshotHolder.getConfigSnapshot().replaceAll("\\s", ""));
+ assertXMLEqual("<config>3</config>", configSnapshotHolder.getConfigSnapshot());
assertFalse(readLines.contains(holder.getConfigSnapshot()));
}
<groupId>org.opendaylight.controller</groupId>
<artifactId>commons.logback_settings</artifactId>
</dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ </dependency>
</dependencies>
<build>
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.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 java.io.FileNotFoundException;
import java.io.IOException;
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 javax.management.ObjectName;
import javax.xml.parsers.ParserConfigurationException;
-import org.apache.commons.lang3.StringUtils;
+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;
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 com.google.common.base.Optional;
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;
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("ref_test2", "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("ref_test2", "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("ref_test2", "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("ref_test2", "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, Sets.newHashSet("ref_dep", "ref_dep2"));
edit("netconfMessages/editConfig_remove.xml");
config = getConfigCandidate();
- assertCorrectServiceNames(config, 0);
+ assertCorrectServiceNames(config, Collections.<String>emptySet());
commit();
config = getConfigCandidate();
- assertCorrectServiceNames(config, 0);
+ assertCorrectServiceNames(config, Collections.<String>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, final Set<String> refNames) throws NodeTestException {
- NodeList servicesList = configCandidate.getElementsByTagName("services");
- assertEquals(1, servicesList.getLength());
+ NodeList servicesNodes = configCandidate.getElementsByTagName("services");
+ assertEquals(1, servicesNodes.getLength());
- Element services = (Element) servicesList.item(0);
- String trimmedServices = XmlUtil.toString(services).replaceAll("\\s", "");
+ NodeTest nt = new NodeTest((DocumentTraversal) configCandidate, servicesNodes.item(0));
+ NodeTester tester = new AbstractNodeTester() {
- for (String s : refNames) {
- assertThat(trimmedServices, JUnitMatchers.containsString(s));
- }
+ @Override
+ public void testElement(Element element) throws NodeTestException {
+ if(element.getNodeName() != null) {
+ if(element.getNodeName().equals("name")) {
+ String elmText = element.getTextContent();
+ if(refNames.contains(elmText)) {
+ refNames.remove(elmText);
+ return;
+ } else {
+ throw new NodeTestException("Unexpected services defined: " + elmText);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void noMoreNodes(NodeTest forTest) throws NodeTestException {
+ assertTrue(refNames.isEmpty());
+ }
+ };
+ nt.performTest(tester, Node.ELEMENT_NODE);
}
@Test
edit("netconfMessages/editConfig.xml");
commit();
- Element response = getConfigRunning();
- String trimmedResponse = XmlUtil.toString(response).replaceAll("\\s", "");
- assertContainsString(trimmedResponse, "<ipxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">0:0:0:0:0:0:0:1</ip>");
- assertContainsString(trimmedResponse, "<union-test-attrxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">456</union-test-attr>");
+ Document response = getConfigRunning();
+ Element ipElement = readXmlToElement("<ip xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">0:0:0:0:0:0:0:1</ip>");
+ assertContainsElement(response, readXmlToElement("<ip xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">0:0:0:0:0:0:0:1</ip>"));
+
+ assertContainsElement(response, readXmlToElement("<union-test-attr xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">456</union-test-attr>"));
edit("netconfMessages/editConfig_setUnions.xml");
commit();
response = getConfigRunning();
-
- trimmedResponse = XmlUtil.toString(response).replaceAll("\\s", "");
- assertContainsString(trimmedResponse, "<ipxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">127.1.2.3</ip>");
- assertContainsString(trimmedResponse, "<union-test-attrxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">randomStringForUnion</union-test-attr>");
+ assertContainsElement(response, readXmlToElement("<ip xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">127.1.2.3</ip>"));
+ assertContainsElement(response, readXmlToElement("<union-test-attr xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">randomStringForUnion</union-test-attr>"));
}
createModule(INSTANCE_NAME);
edit("netconfMessages/editConfig.xml");
- Element configCandidate = getConfigCandidate();
+ Document configCandidate = getConfigCandidate();
checkBinaryLeafEdited(configCandidate);
// check after edit
commit();
- Element response = getConfigRunning();
+ Document response = getConfigRunning();
checkBinaryLeafEdited(response);
checkTypeConfigAttribute(response);
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();
verifyNoMoreInteractions(netconfOperationServiceSnapshot);
}
- private void checkBigDecimal(Element response) {
- String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", "");
-
- assertContainsString(responseTrimmed, "<sleep-factorxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">2.58</sleep-factor>");
+ private void checkBigDecimal(Document response) throws NodeTestException, SAXException, IOException {
+ assertContainsElement(response, readXmlToElement("<sleep-factor xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">2.58</sleep-factor>"));
// Default
- assertContainsString(responseTrimmed, "<sleep-factorxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">2.00</sleep-factor>");
+ assertContainsElement(response, readXmlToElement("<sleep-factor xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">2.00</sleep-factor>"));
}
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.<String> 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.<String> absent(), transactionProvider,
configRegistryClient, NETCONF_SESSION_ID);
edit("netconfMessages/editConfig.xml");
commit();
- Element response = getConfigRunning();
+ Document response = getConfigRunning();
final int allInstances = response.getElementsByTagName("module").getLength();
edit("netconfMessages/editConfig_replace_default.xml");
} 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, TEST_NAMESPACE);
assertContainsString(message, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG);
throw e;
}
} 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, TEST_NAMESPACE);
assertContainsString(message, XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG);
throw e;
}
edit("netconfMessages/namespaces/editConfig_typeNameConfigAttributeMatching.xml");
commit();
- Element response = getConfigRunning();
+ Document response = getConfigRunning();
checkTypeConfigAttribute(response);
}
edit("netconfMessages/editConfig.xml");
commit();
- Element response = getConfigRunning();
+ Document response = getConfigRunning();
final int allInstances = response.getElementsByTagName("instance").getLength();
edit("netconfMessages/editConfig_replace_module.xml");
executeOp(discardOp, "netconfMessages/discardChanges.xml");
}
- private void checkBinaryLeafEdited(final Element response) {
- String responseTrimmed = XmlUtil.toString(response).replaceAll("\\s", "");
- String substring = "<binaryLeafxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">YmluYXJ5</binaryLeaf>";
- assertContainsString(responseTrimmed, substring);
- substring = "<binaryLeafxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">ZGVmYXVsdEJpbg==</binaryLeaf>";
- assertContainsString(responseTrimmed, substring);
+ private void checkBinaryLeafEdited(final Document response) throws NodeTestException, SAXException, IOException {
+ assertContainsElement(response, readXmlToElement("<binaryLeaf xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">YmluYXJ5</binaryLeaf>"));
+ assertContainsElement(response, readXmlToElement("<binaryLeaf xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">ZGVmYXVsdEJpbg==</binaryLeaf>"));
}
- 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 = "<extendedxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">10</extended>";
- assertContainsString(responseTrimmed, substring);
+ assertContainsElement(response, readXmlToElement("<extended xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">10</extended>"));
// Default
- assertContainsString(responseTrimmed,
- "<extendedxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">1</extended>");
+ assertContainsElement(response, readXmlToElement("<extended xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">1</extended>"));
- assertContainsString(responseTrimmed,
- "<extended-twicexmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">20</extended-twice>");
+ assertContainsElement(response, readXmlToElement("<extended-twice xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">20</extended-twice>"));
// Default
- assertContainsString(responseTrimmed,
- "<extended-twicexmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">2</extended-twice>");
+ assertContainsElement(response, readXmlToElement("<extended-twice xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">2</extended-twice>"));
- assertContainsString(responseTrimmed,
- "<extended-enumxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">TWO</extended-enum>");
+ assertContainsElement(response, readXmlToElement("<extended-enum xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">TWO</extended-enum>"));
// Default
- assertContainsString(responseTrimmed,
- "<extended-enumxmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">ONE</extended-enum>");
+ assertContainsElement(response, readXmlToElement("<extended-enum xmlns=\"urn:opendaylight:params:xml:ns:yang:controller:test:impl\">ONE</extended-enum>"));
}
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")
+ private void checkEnum(final Document response) {
+ XmlElement modulesElement = XmlElement.fromDomElement(response.getDocumentElement()).getOnlyChildElement("data")
.getOnlyChildElement("modules");
String enumName = "extended-enum";
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));
}
- 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) {
+ private void checkTypeConfigAttribute(Document response) {
- XmlElement modulesElement = XmlElement.fromDomElement(response).getOnlyChildElement("data")
+ XmlElement modulesElement = XmlElement.fromDomElement(response.getDocumentElement()).getOnlyChildElement("data")
.getOnlyChildElement("modules");
List<String> expectedValues = Lists.newArrayList("default-string", "configAttributeType");
for (XmlElement moduleElement : modulesElement.getChildElements("module")) {
for (XmlElement type : moduleElement.getChildElements("type")) {
- if (type.getAttribute(XmlUtil.XMLNS_ATTRIBUTE_KEY).equals("") == false) {
+ if (type.getNamespace() != null) {
configAttributeType.add(type.getTextContent());
}
}
// 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
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 {
+ private Document get() throws NetconfDocumentedException, ParserConfigurationException, SAXException, IOException {
Get getOp = new Get(yangStoreSnapshot, configRegistryClient, NETCONF_SESSION_ID, transactionProvider);
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 Document executeOp(final NetconfOperation op, final String filename) throws ParserConfigurationException,
SAXException, IOException, NetconfDocumentedException {
final Document request = XmlFileLoader.xmlFileToDocument(filename);
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<InputStream> getYangs() throws FileNotFoundException {
package org.opendaylight.controller.netconf.impl;
+import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
NetconfMessage receivedMessage = (NetconfMessage) testChunkChannel.readInbound();
assertNotNull(receivedMessage);
- assertTrue(this.msg.getDocument().isEqualNode(receivedMessage.getDocument()));
+ assertXMLEqual(this.msg.getDocument(), receivedMessage.getDocument());
}
@Test
testChunkChannel.writeInbound(recievedOutbound);
NetconfMessage receivedMessage = (NetconfMessage) testChunkChannel.readInbound();
assertNotNull(receivedMessage);
- assertTrue(this.msg.getDocument().isEqualNode(receivedMessage.getDocument()));
+ assertXMLEqual(this.msg.getDocument(), receivedMessage.getDocument());
}
}
<version>${tinybundles.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ </dependency>
</dependencies>
<build>
*/
package org.opendaylight.controller.netconf.it;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import static junit.framework.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.opendaylight.controller.netconf.util.test.XmlUnitUtil.assertContainsElementWithName;
+import static org.opendaylight.controller.netconf.util.test.XmlUnitUtil.assertElementsCount;
+import static org.opendaylight.controller.netconf.util.xml.XmlUtil.readXmlToDocument;
import io.netty.channel.ChannelFuture;
-import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.junit.matchers.JUnitMatchers;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import org.opendaylight.controller.netconf.impl.DefaultCommitNotificationProducer;
import org.opendaylight.controller.netconf.impl.NetconfServerDispatcher;
import org.opendaylight.controller.netconf.impl.osgi.NetconfMonitoringServiceImpl;
-import org.opendaylight.controller.netconf.mapping.api.NetconfOperationProvider;
import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceFactoryListenerImpl;
import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceSnapshotImpl;
import org.opendaylight.controller.netconf.impl.osgi.SessionMonitoringService;
import org.opendaylight.controller.netconf.mapping.api.Capability;
+import org.opendaylight.controller.netconf.mapping.api.NetconfOperationProvider;
import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
import org.opendaylight.controller.netconf.monitoring.osgi.NetconfMonitoringActivator;
import org.opendaylight.controller.netconf.monitoring.osgi.NetconfMonitoringOperationService;
import org.opendaylight.controller.netconf.persist.impl.ConfigPersisterNotificationHandler;
import org.opendaylight.controller.netconf.util.test.XmlFileLoader;
-import org.opendaylight.controller.netconf.util.xml.XmlUtil;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
-import javax.management.InstanceNotFoundException;
-import javax.management.Notification;
-import javax.management.NotificationListener;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetSocketAddress;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-import static junit.framework.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
public class NetconfConfigPersisterITTest extends AbstractNetconfConfigTest {
try (TestingNetconfClient netconfClient = new TestingNetconfClient("client", tcpAddress, 4000, clientDispatcher)) {
NetconfMessage response = netconfClient.sendMessage(loadGetConfigMessage());
- assertResponse(response, "<modules");
- assertResponse(response, "<services");
+ assertContainsElementWithName(response.getDocument(), "modules");
+ assertContainsElementWithName(response.getDocument(), "services");
response = netconfClient.sendMessage(loadCommitMessage());
- assertResponse(response, "ok");
+ assertContainsElementWithName(response.getDocument(), "ok");
response = netconfClient.sendMessage(loadEditConfigMessage());
- assertResponse(response, "ok");
+ assertContainsElementWithName(response.getDocument(), "ok");
response = netconfClient.sendMessage(loadCommitMessage());
- assertResponse(response, "ok");
+ assertContainsElementWithName(response.getDocument(), "ok");
}
}
}
return listener;
}
- private void assertResponse(NetconfMessage response, String content) {
- Assert.assertThat(XmlUtil.toString(response.getDocument()), JUnitMatchers.containsString(content));
- }
-
private NetconfMessage loadGetConfigMessage() throws Exception {
return XmlFileLoader.xmlFileToNetconfMessage("netconfMessages/getConfig.xml");
}
assertEquals(size, snapshots.size());
}
- void assertSnapshotContent(int notificationIndex, int expectedModulesSize, int expectedServicesSize, int expectedCapsSize) {
+ void assertSnapshotContent(int notificationIndex, int expectedModulesSize, int expectedServicesSize, int expectedCapsSize)
+ throws SAXException, IOException {
ConfigSnapshotHolder snapshot = snapshots.get(notificationIndex);
int capsSize = snapshot.getCapabilities().size();
assertEquals("Expected capabilities count", expectedCapsSize, capsSize);
- String configSnapshot = snapshot.getConfigSnapshot();
- int modulesSize = StringUtils.countMatches(configSnapshot, "<module>");
- assertEquals("Expected modules count", expectedModulesSize, modulesSize);
- int servicesSize = StringUtils.countMatches(configSnapshot, "<instance>");
- assertEquals("Expected services count", expectedServicesSize, servicesSize);
+ Document configSnapshot = readXmlToDocument(snapshot.getConfigSnapshot());
+ assertElementsCount(configSnapshot, "module", expectedModulesSize);
+ assertElementsCount(configSnapshot, "instance", expectedServicesSize);
}
@Override
import com.google.common.base.Charsets;
import com.google.common.base.Optional;
import com.google.common.collect.Sets;
+import static org.opendaylight.controller.netconf.util.test.XmlUnitUtil.assertContainsElementWithText;
import io.netty.channel.ChannelFuture;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.junit.matchers.JUnitMatchers;
import org.mockito.Mock;
import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import org.opendaylight.controller.config.spi.ModuleFactory;
sock.close();
- org.junit.Assert.assertThat(responseBuilder.toString(), JUnitMatchers.containsString("<capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>"));
- org.junit.Assert.assertThat(responseBuilder.toString(), JUnitMatchers.containsString("<username>tomas</username>"));
+ String helloMsg = responseBuilder.substring(0, responseBuilder.indexOf(separator));
+ Document doc = XmlUtil.readXmlToDocument(helloMsg);
+ assertContainsElementWithText(doc, "urn:ietf:params:netconf:capability:candidate:1.0");
+
+ String replyMsg = responseBuilder.substring(responseBuilder.indexOf(separator) + separator.length());
+ doc = XmlUtil.readXmlToDocument(replyMsg);
+ assertContainsElementWithText(doc, "tomas");
}
private void assertSessionElementsInResponse(Document document, int i) {
import static org.ops4j.pax.exam.CoreOptions.streamBundle;
import static org.ops4j.pax.exam.CoreOptions.systemPackages;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+import io.netty.channel.nio.NioEventLoopGroup;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
import javax.inject.Inject;
import javax.xml.parsers.ParserConfigurationException;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Throwables;
-import io.netty.channel.nio.NioEventLoopGroup;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.osgi.framework.Constants;
import org.xml.sax.SAXException;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
@Ignore
@RunWith(PaxExam.class)
sendMessage(edit, netconfClient);
sendMessage(commit, netconfClient);
sendMessage(getConfig, netconfClient, "id-test",
- "<afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</afi>",
- "<afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</afi>",
- "<safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</safi>",
- "<safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</safi>");
+ "<prefix:afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</prefix:afi>",
+ "<prefix:afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</prefix:afi>",
+ "<prefix:safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</prefix:safi>",
+ "<prefix:safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</prefix:safi>");
clientDispatcher.close();
} catch (Exception e) {
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:test:impl">prefix:impl-identity-test</type>
- <name>id-test</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:test:impl">prefix:impl-identity-test</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:test:impl">id-test</prefix:name>
<identities-container xmlns="urn:opendaylight:params:xml:ns:yang:controller:test:impl">
- <afi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity2</afi>
+ <prefix:afi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity2</prefix:afi>
</identities-container>
<identities xmlns="urn:opendaylight:params:xml:ns:yang:controller:test:impl">
- <safi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity2</safi>
- <afi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity1</afi>
+ <prefix:safi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity2</prefix:safi>
+ <prefix:afi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity1</prefix:afi>
</identities>
<identities xmlns="urn:opendaylight:params:xml:ns:yang:controller:test:impl">
- <safi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity1</safi>
- <afi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity2</afi>
+ <prefix:safi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity1</prefix:safi>
+ <prefix:afi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity2</prefix:afi>
</identities>
- <afi xmlns="urn:opendaylight:params:xml:ns:yang:controller:test:impl" xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity1</afi>
+ <prefix:afi xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:test:types">prefix:test-identity1</prefix:afi>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-broker-impl</type>
- <name>binding-broker-impl</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-broker-impl</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding-broker-impl</prefix:name>
<notification-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-notification-service</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-notification-service</prefix:type>
<name>ref_binding-notification-broker</name>
</notification-service>
<data-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-data-broker</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-data-broker</prefix:type>
<name>ref_binding-data-broker</name>
</data-broker>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:runtime-generated-mapping</type>
- <name>runtime-mapping-singleton</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:runtime-generated-mapping</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">runtime-mapping-singleton</prefix:name>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-notification-broker</type>
- <name>binding-notification-broker</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-notification-broker</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding-notification-broker</prefix:name>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-data-broker</type>
- <name>binding-data-broker</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-data-broker</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding-data-broker</prefix:name>
<dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-broker-osgi-registry</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-broker-osgi-registry</prefix:type>
<name>ref_dom-broker</name>
</dom-broker>
<mapping-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-dom-mapping-service</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-dom-mapping-service</prefix:type>
<name>ref_runtime-mapping-singleton</name>
</mapping-service>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:logback:config">prefix:logback</type>
- <name>singleton</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:logback:config">prefix:logback</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:logback:config">singleton</prefix:name>
<console-appenders xmlns="urn:opendaylight:params:xml:ns:yang:controller:logback:config">
<threshold-filter>DEBUG</threshold-filter>
<name>console</name>
</loggers>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:schema-service-singleton</type>
- <name>yang-schema-service</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:schema-service-singleton</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">yang-schema-service</prefix:name>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:hash-map-data-store</type>
- <name>hash-map-data-store</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:hash-map-data-store</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">hash-map-data-store</prefix:name>
</module>
<module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:dom-broker-impl</type>
- <name>dom-broker</name>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:dom-broker-impl</prefix:type>
+ <prefix:name xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">dom-broker</prefix:name>
<data-store xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-data-store</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-data-store</prefix:type>
<name>ref_hash-map-data-store</name>
</data-store>
</module>
</modules>
<services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:schema-service</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:schema-service</prefix:type>
<instance>
<name>ref_yang-schema-service</name>
<provider>/modules/module[type='schema-service-singleton'][name='yang-schema-service']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-data-store</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-data-store</prefix:type>
<instance>
<name>ref_hash-map-data-store</name>
<provider>/modules/module[type='hash-map-data-store'][name='hash-map-data-store']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-broker-osgi-registry</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-broker-osgi-registry</prefix:type>
<instance>
<name>ref_dom-broker</name>
<provider>/modules/module[type='dom-broker-impl'][name='dom-broker']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:test">prefix:testing</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:test">prefix:testing</prefix:type>
<instance>
<name>ref_id-test</name>
<provider>/modules/module[type='impl-identity-test'][name='id-test']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-dom-mapping-service</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-dom-mapping-service</prefix:type>
<instance>
<name>ref_runtime-mapping-singleton</name>
<provider>/modules/module[type='runtime-generated-mapping'][name='runtime-mapping-singleton']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-data-consumer-broker</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-data-consumer-broker</prefix:type>
<instance>
<name>ref_binding-data-broker</name>
<provider>/modules/module[type='binding-data-broker'][name='binding-data-broker']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-rpc-registry</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-rpc-registry</prefix:type>
<instance>
<name>ref_binding-broker-impl</name>
<provider>/modules/module[type='binding-broker-impl'][name='binding-broker-impl']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-notification-service</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-notification-service</prefix:type>
<instance>
<name>ref_binding-notification-broker</name>
<provider>/modules/module[type='binding-notification-broker'][name='binding-notification-broker']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-broker-osgi-registry</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-broker-osgi-registry</prefix:type>
<instance>
<name>ref_binding-broker-impl</name>
<provider>/modules/module[type='binding-broker-impl'][name='binding-broker-impl']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-notification-subscription-service</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-notification-subscription-service</prefix:type>
<instance>
<name>ref_binding-notification-broker</name>
<provider>/modules/module[type='binding-notification-broker'][name='binding-notification-broker']</provider>
</instance>
</service>
<service>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-data-broker</type>
+ <prefix:type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-data-broker</prefix:type>
<instance>
<name>ref_binding-data-broker</name>
<provider>/modules/module[type='binding-data-broker'][name='binding-data-broker']</provider>
<groupId>org.opendaylight.controller.thirdparty</groupId>
<artifactId>ganymed</artifactId>
</dependency>
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ </dependency>
</dependencies>
<build>
--- /dev/null
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.controller.netconf.util.test;
+
+import static org.custommonkey.xmlunit.XMLAssert.assertNodeTestPasses;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.custommonkey.xmlunit.AbstractNodeTester;
+import org.custommonkey.xmlunit.NodeTest;
+import org.custommonkey.xmlunit.NodeTestException;
+import org.custommonkey.xmlunit.NodeTester;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+public class XmlUnitUtil {
+
+ private XmlUnitUtil() {}
+
+ public static void assertContainsElementWithText(final Document doc, final String textToFind) throws NodeTestException {
+ NodeTest nt = new NodeTest(doc);
+ NodeTester tester = new AbstractNodeTester() {
+
+ boolean textFound = false;
+
+ @Override
+ public void testText(Text text) throws NodeTestException {
+ if(!textFound) {
+ if (text.getData().equalsIgnoreCase(textToFind)) {
+ textFound = true;
+ }
+ }
+ }
+
+ @Override
+ public void noMoreNodes(NodeTest forTest) throws NodeTestException {
+ assertTrue(textFound);
+ }
+ };
+ assertNodeTestPasses(nt, tester, new short[]{Node.TEXT_NODE}, true);
+ }
+
+ public static void assertContainsElement(final Document doc, final Element testElement) throws NodeTestException {
+ NodeTest nt = new NodeTest(doc);
+ NodeTester tester = new AbstractNodeTester() {
+
+ private boolean elementFound = false;
+
+ @Override
+ public void testElement(Element element) throws NodeTestException {
+ if (!elementFound) {
+ if(element.isEqualNode(testElement)) {
+ elementFound = true;
+ }
+ }
+ }
+
+ @Override
+ public void noMoreNodes(NodeTest forTest) throws NodeTestException {
+ assertTrue(elementFound);
+ }
+ };
+ assertNodeTestPasses(nt, tester, new short[]{Node.ELEMENT_NODE}, true);
+ }
+
+ public static void assertContainsElementWithName(final Document doc, final String elementName) throws NodeTestException {
+ NodeTest nt = new NodeTest(doc);
+ NodeTester tester = new AbstractNodeTester() {
+
+ private boolean elementFound = false;
+
+ @Override
+ public void testElement(Element element) throws NodeTestException {
+ if (!elementFound) {
+ if (element.getNodeName() != null && element.getNodeName().equals(elementName)) {
+ elementFound = true;
+ }
+ }
+ }
+
+ @Override
+ public void noMoreNodes(NodeTest forTest) throws NodeTestException {
+ assertTrue(elementFound);
+ }
+ };
+ assertNodeTestPasses(nt, tester, new short[]{Node.ELEMENT_NODE}, true);
+ }
+
+ public static void assertElementsCount(final Document doc, final String elementName, final int expectedCount) {
+ NodeTest nt = new NodeTest(doc);
+ NodeTester tester = new AbstractNodeTester() {
+
+ private int elementFound = 0;
+
+ @Override
+ public void testElement(Element element) throws NodeTestException {
+ if (element.getNodeName() != null && element.getNodeName().equals(elementName)) {
+ elementFound++;
+ }
+ }
+
+ @Override
+ public void noMoreNodes(NodeTest forTest) throws NodeTestException {
+ assertEquals(expectedCount, elementFound);
+ }
+ };
+ assertNodeTestPasses(nt, tester, new short[]{Node.ELEMENT_NODE}, true);
+ }
+}
--- /dev/null
+<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" a="64" message-id="a">
+ <ok/>
+</rpc-reply>
\ No newline at end of file