package org.opendaylight.controller.sal.restconf.impl.xml.to.cnsn.test;
import static org.junit.Assert.*;
import java.io.*;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Set;
import javax.ws.rs.WebApplicationException;
import org.junit.Test;
import org.opendaylight.controller.sal.rest.impl.XmlToCompositeNodeProvider;
import org.opendaylight.controller.sal.restconf.impl.CompositeNodeWrapper;
import org.opendaylight.controller.sal.restconf.impl.test.TestUtils;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.*;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class XmlToCnSnTest {
private static final Logger LOG = LoggerFactory.getLogger(XmlToCnSnTest.class);
/**
* top level element represents container. second level element is list with
* two elements.
*/
@Test
public void testXmlDataContainer() {
CompositeNode compNode = compositeNodeFromXml("/xml-to-cnsn/data-container.xml", false);
assertNotNull(compNode);
DataSchemaNode dataSchemaNode = null;
try {
dataSchemaNode = TestUtils.obtainSchemaFromYang("/xml-to-cnsn/data-container-yang");
} catch (FileNotFoundException e) {
LOG.error(e.getMessage());
assertTrue(false);
}
assertNotNull(dataSchemaNode);
TestUtils.supplementNamespace(dataSchemaNode, compNode);
String nameSpace = "data:container:yang";
assertEquals(nameSpace, compNode.getNodeType().getNamespace().toString());
verifyNullAndEmptyStringSingleNode(compNode, nameSpace);
verifyCommonPartAOfXml(compNode, "", nameSpace);
}
private void verifyNullAndEmptyStringSingleNode(CompositeNode compNode, String nameSpace) {
assertEquals("cont", compNode.getNodeType().getLocalName());
SimpleNode> lf2 = null;
SimpleNode> lf3 = null;
int found = 0;
for (Node> child : compNode.getChildren()) {
if (found == 0x3)
break;
if (child instanceof SimpleNode>) {
SimpleNode> childSimple = (SimpleNode>) child;
if (childSimple.getNodeType().getLocalName().equals("lf3")) {
lf3 = childSimple;
found = found | (1 << 0);
} else if (childSimple.getNodeType().getLocalName().equals("lf2")) {
lf2 = childSimple;
found = found | (1 << 1);
}
}
assertEquals(nameSpace, child.getNodeType().getNamespace().toString());
}
assertEquals("", lf2.getValue());
assertEquals(null, lf3.getValue());
}
@Test
public void testXmlDataList() {
CompositeNode compNode = compositeNodeFromXml("/xml-to-cnsn/data-list.xml", false);
assertNotNull(compNode);
DataSchemaNode dataSchemaNode = null;
try {
dataSchemaNode = TestUtils.obtainSchemaFromYang("/xml-to-cnsn/data-list-yang", "data-container-yang");
} catch (FileNotFoundException e) {
LOG.error(e.getMessage());
}
assertNotNull(dataSchemaNode);
TestUtils.supplementNamespace(dataSchemaNode, compNode);
String nameSpaceList = "data:list:yang";
String nameSpaceCont = "data:container:yang";
assertEquals(nameSpaceCont, compNode.getNodeType().getNamespace().toString());
assertEquals("cont", compNode.getNodeType().getLocalName());
assertEquals(3, compNode.getChildren().size());
CompositeNode lst1_1 = null;
CompositeNode lst1_2 = null;
int loopCount = 0;
for (Node> node : compNode.getChildren()) {
if (node.getNodeType().getLocalName().equals("lf1")) {
assertEquals(nameSpaceList, node.getNodeType().getNamespace().toString());
assertTrue(node instanceof SimpleNode>);
assertEquals("lf1", node.getValue());
} else {
assertTrue(node instanceof CompositeNode);
switch (loopCount++) {
case 0:
lst1_1 = (CompositeNode) node;
break;
case 1:
lst1_2 = (CompositeNode) node;
break;
}
assertEquals(nameSpaceCont, node.getNodeType().getNamespace().toString());
}
}
// lst1_1
verifyCommonPartAOfXml(lst1_1, "1", nameSpaceCont);
// :lst1_1
// lst1_2
SimpleNode> lflst11 = null;
CompositeNode cont11 = null;
for (Node> node : lst1_2.getChildren()) {
String nodeName = node.getNodeType().getLocalName();
if (nodeName.equals("lflst11")) {
assertTrue(node instanceof SimpleNode>);
lflst11 = (SimpleNode>) node;
} else if (nodeName.equals("cont11")) {
assertTrue(node instanceof CompositeNode);
cont11 = (CompositeNode) node;
}
assertEquals(nameSpaceCont, compNode.getNodeType().getNamespace().toString());
}
assertEquals("221", lflst11.getValue());
assertEquals(1, cont11.getChildren().size());
assertTrue(cont11.getChildren().get(0) instanceof SimpleNode>);
SimpleNode> cont11_lf111 = (SimpleNode>) cont11.getChildren().get(0);
assertEquals(nameSpaceCont, cont11_lf111.getNodeType().getNamespace().toString());
assertEquals("lf111", cont11_lf111.getNodeType().getLocalName());
assertEquals((short) 100, cont11_lf111.getValue());
// :lst1_2
}
@Test
public void testXmlEmptyData() {
CompositeNode compNode = compositeNodeFromXml("/xml-to-cnsn/empty-data.xml", true);
assertEquals("cont", compNode.getNodeType().getLocalName());
SimpleNode> lf1 = null;
SimpleNode> lflst1_1 = null;
SimpleNode> lflst1_2 = null;
CompositeNode lst1 = null;
int lflst1Count = 0;
for (Node> node : compNode.getChildren()) {
if (node.getNodeType().getLocalName().equals("lf1")) {
assertTrue(node instanceof SimpleNode>);
lf1 = (SimpleNode>) node;
} else if (node.getNodeType().getLocalName().equals("lflst1")) {
assertTrue(node instanceof SimpleNode>);
switch (lflst1Count++) {
case 0:
lflst1_1 = (SimpleNode>) node;
break;
case 1:
lflst1_2 = (SimpleNode>) node;
break;
}
} else if (node.getNodeType().getLocalName().equals("lst1")) {
assertTrue(node instanceof CompositeNode);
lst1 = (CompositeNode) node;
}
}
assertNotNull(lf1);
assertNotNull(lflst1_1);
assertNotNull(lflst1_2);
assertNotNull(lst1);
assertEquals("", lf1.getValue());
assertEquals("", lflst1_1.getValue());
assertEquals("", lflst1_2.getValue());
assertEquals(1, lst1.getChildren().size());
assertEquals("lf11", lst1.getChildren().get(0).getNodeType().getLocalName());
assertTrue(lst1.getChildren().get(0) instanceof SimpleNode>);
assertEquals("", lst1.getChildren().get(0).getValue());
}
/**
* Test case like this x:identity
*/
@Test
public void testIdentityrefNmspcInElement() {
testIdentityrefToCnSn("/xml-to-cnsn/identityref/xml/data-nmspc-in-element.xml", "/xml-to-cnsn/identityref",
"identityref-module", "cont", 2, "iden", "identity:module");
}
/**
*
* Test case like identity
*/
@Test
public void testIdentityrefDefaultNmspcInElement() {
testIdentityrefToCnSn("/xml-to-cnsn/identityref/xml/data-default-nmspc-in-element.xml",
"/xml-to-cnsn/identityref/yang-augments", "general-module", "cont", 3, "iden", "identityref:module");
}
/**
*
* Test case like identity
*/
@Test
public void testIdentityrefDefaultNmspcInParrentElement() {
testIdentityrefToCnSn("/xml-to-cnsn/identityref/xml/data-default-nmspc-in-parrent-element.xml",
"/xml-to-cnsn/identityref", "identityref-module", "cont", 2, "iden", "identityref:module");
}
/**
*
* Test case like
* x:identity
*/
@Test
public void testIdentityrefNmspcInParrentElement() {
testIdentityrefToCnSn("/xml-to-cnsn/identityref/xml/data-nmspc-in-parrent-element.xml",
"/xml-to-cnsn/identityref", "identityref-module", "cont", 2, "iden", "z:namespace");
}
/**
*
* Test case like (without namespace in xml) x:identity
*
*/
@Test
public void testIdentityrefNoNmspcValueWithPrefix() {
testIdentityrefToCnSn("/xml-to-cnsn/identityref/xml/data-no-nmspc-value-with-prefix.xml",
"/xml-to-cnsn/identityref", "identityref-module", "cont", 2, "x:iden", "identityref:module");
}
/**
*
* Test case like (without namespace in xml) identity
*
*/
@Test
public void testIdentityrefNoNmspcValueWithoutPrefix() {
testIdentityrefToCnSn("/xml-to-cnsn/identityref/xml/data-no-nmspc-value-without-prefix.xml",
"/xml-to-cnsn/identityref", "identityref-module", "cont", 2, "iden", "identityref:module");
}
private void verifyCommonPartAOfXml(CompositeNode compNode, String suf, String nameSpace) {
SimpleNode> lf1suf = null;
SimpleNode> lflst1suf_1 = null;
SimpleNode> lflst1suf_2 = null;
SimpleNode> lflst1suf_3 = null;
CompositeNode cont1suf = null;
CompositeNode lst1suf = null;
int lflstCount = 0;
for (Node> node : compNode.getChildren()) {
String localName = node.getNodeType().getLocalName();
if (localName.equals("lf1" + suf)) {
assertTrue(node instanceof SimpleNode>);
lf1suf = (SimpleNode>) node;
} else if (localName.equals("lflst1" + suf)) {
assertTrue(node instanceof SimpleNode>);
switch (lflstCount++) {
case 0:
lflst1suf_1 = (SimpleNode>) node;
break;
case 1:
lflst1suf_2 = (SimpleNode>) node;
break;
case 2:
lflst1suf_3 = (SimpleNode>) node;
break;
}
} else if (localName.equals("lst1" + suf)) {
assertTrue(node instanceof CompositeNode);
lst1suf = (CompositeNode) node;
} else if (localName.equals("cont1" + suf)) {
assertTrue(node instanceof CompositeNode);
cont1suf = (CompositeNode) node;
}
assertEquals(nameSpace, node.getNodeType().getNamespace().toString());
}
assertNotNull(lf1suf);
assertNotNull(lflst1suf_1);
assertNotNull(lflst1suf_2);
assertNotNull(lflst1suf_3);
assertNotNull(lst1suf);
assertNotNull(cont1suf);
assertEquals("str0", lf1suf.getValue());
assertEquals("121", lflst1suf_1.getValue());
assertEquals("131", lflst1suf_2.getValue());
assertEquals("str1", lflst1suf_3.getValue());
assertEquals(1, lst1suf.getChildren().size());
assertTrue(lst1suf.getChildren().get(0) instanceof SimpleNode>);
SimpleNode> lst11_lf11 = (SimpleNode>) lst1suf.getChildren().get(0);
assertEquals(nameSpace, lst11_lf11.getNodeType().getNamespace().toString());
assertEquals("lf11" + suf, lst11_lf11.getNodeType().getLocalName());
assertEquals("str2", lst11_lf11.getValue());
assertTrue(cont1suf.getChildren().get(0) instanceof SimpleNode>);
SimpleNode> cont1_lf11 = (SimpleNode>) cont1suf.getChildren().get(0);
assertEquals(nameSpace, cont1_lf11.getNodeType().getNamespace().toString());
assertEquals("lf11" + suf, cont1_lf11.getNodeType().getLocalName());
assertEquals((short) 100, cont1_lf11.getValue());
}
private CompositeNode compositeNodeFromXml(String xmlPath, boolean dummyNamespaces) {
XmlToCompositeNodeProvider xmlToCompositeNodeProvider = XmlToCompositeNodeProvider.INSTANCE;
try {
InputStream xmlStream = XmlToCnSnTest.class.getResourceAsStream(xmlPath);
CompositeNode compositeNode = xmlToCompositeNodeProvider.readFrom(null, null, null, null, null, xmlStream);
if (dummyNamespaces) {
try {
TestUtils.addDummyNamespaceToAllNodes((CompositeNodeWrapper) compositeNode);
return ((CompositeNodeWrapper) compositeNode).unwrap();
} catch (URISyntaxException e) {
LOG.error(e.getMessage());
assertTrue(e.getMessage(), false);
}
}
return compositeNode;
} catch (WebApplicationException | IOException e) {
LOG.error(e.getMessage());
assertTrue(false);
}
return null;
}
private void testIdentityrefToCnSn(String xmlPath, String yangPath, String moduleName, String schemaName,
int moduleCount, String resultLocalName, String resultNamespace) {
CompositeNode compositeNode = compositeNodeFromXml(xmlPath, false);
assertNotNull(compositeNode);
Set modules = TestUtils.resolveModules(yangPath);
assertEquals(moduleCount, modules.size());
Module module = TestUtils.resolveModule(moduleName, modules);
assertNotNull(module);
DataSchemaNode dataSchemaNode = TestUtils.resolveDataSchemaNode(module, null);
assertNotNull(dataSchemaNode);
TestUtils.normalizeCompositeNode(compositeNode, modules, dataSchemaNode, moduleName + ":" + schemaName);
SimpleNode> lf11 = getLf11(compositeNode);
assertTrue(lf11.getValue() instanceof QName);
QName qName = (QName) lf11.getValue();
assertEquals(resultLocalName, qName.getLocalName());
assertEquals(resultNamespace, qName.getNamespace().toString());
}
private SimpleNode> getLf11(CompositeNode compositeNode) {
assertEquals("cont", compositeNode.getNodeType().getLocalName());
List> childs = compositeNode.getChildren();
assertEquals(1, childs.size());
Node> nd = childs.iterator().next();
assertTrue(nd instanceof CompositeNode);
assertEquals("cont1", nd.getNodeType().getLocalName());
childs = ((CompositeNode) nd).getChildren();
SimpleNode> lf11 = null;
for (Node> child : childs) {
assertTrue(child instanceof SimpleNode);
if (child.getNodeType().getLocalName().equals("lf11")) {
lf11 = (SimpleNode>) child;
}
}
assertNotNull(lf11);
return lf11;
}
}