Bug 2964 - ClassCastException when querying -
[yangtools.git] / yang / yang-data-impl / src / test / java / org / opendaylight / yangtools / yang / data / impl / codec / xml / Bug2964Test.java
1 package org.opendaylight.yangtools.yang.data.impl.codec.xml;
2
3 import com.google.common.base.Charsets;
4 import com.google.common.collect.Lists;
5 import com.google.common.io.ByteSource;
6 import org.junit.Before;
7 import org.junit.Test;
8 import org.opendaylight.yangtools.yang.common.QName;
9 import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.DomUtils;
10 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
11 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
12 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
13 import org.opendaylight.yangtools.yang.model.api.Module;
14 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
15 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
16 import org.w3c.dom.Document;
17 import org.w3c.dom.Element;
18 import org.xml.sax.SAXException;
19
20 import javax.xml.parsers.DocumentBuilder;
21 import javax.xml.parsers.DocumentBuilderFactory;
22 import javax.xml.parsers.ParserConfigurationException;
23 import java.io.ByteArrayInputStream;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.net.URI;
27
28 import static org.hamcrest.CoreMatchers.instanceOf;
29 import static org.junit.Assert.assertEquals;
30 import static org.junit.Assert.assertThat;
31
32 public class Bug2964Test {
33
34     public static final String XML_CONTENT = "<cont2 xmlns=\"urn:opendaylight:yangtools:leafref:test\">\n" +
35             "<point-to-identityrefleaf>test-identity</point-to-identityrefleaf>\n" +
36             "</cont2>";
37
38     private static final DocumentBuilderFactory BUILDERFACTORY;
39
40     private static final String NAMESPACE = "urn:opendaylight:yangtools:leafref:test";
41     private static final String TEST_IDENTITY = "test-identity";
42     private static final String CONT_2 = "cont2";
43     private static final String IDENTITY_LEAFREF = "point-to-identityrefleaf";
44
45     static {
46         final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
47         factory.setNamespaceAware(true);
48         factory.setCoalescing(true);
49         factory.setIgnoringElementContentWhitespace(true);
50         factory.setIgnoringComments(true);
51         BUILDERFACTORY = factory;
52     }
53
54     private SchemaContext schema;
55
56     @Before
57     public void setUp() throws Exception {
58         final ByteSource byteSource = new ByteSource() {
59             @Override
60             public InputStream openStream() throws IOException {
61                 return Bug2964Test.this.getClass().getResourceAsStream("/leafref-test.yang");
62             }
63         };
64         schema = new YangParserImpl().parseSources(Lists.newArrayList(byteSource));
65     }
66
67     public static Document readXmlToDocument(final String xmlContent) throws SAXException, IOException {
68         return readXmlToDocument(new ByteArrayInputStream(xmlContent.getBytes(Charsets.UTF_8)));
69     }
70
71     @Test
72     public void testLeafrefIdentityRefDeserialization() throws Exception {
73         final URI namespaceUri = new URI(NAMESPACE);
74
75         final Document document = readXmlToDocument(XML_CONTENT);
76         final Element identityLeafRefElement = (Element) document.getDocumentElement().getFirstChild().getNextSibling();
77
78         final Module leafrefModule = schema.findModuleByNamespaceAndRevision(
79                 namespaceUri, null);
80         final ContainerSchemaNode cont2 = (ContainerSchemaNode) leafrefModule.getDataChildByName(CONT_2);
81         final DataSchemaNode identityLeafRefSchema = cont2.getDataChildByName(IDENTITY_LEAFREF);
82         final Object parsedValue = DomUtils.parseXmlValue(identityLeafRefElement, DomUtils.defaultValueCodecProvider(),
83                 identityLeafRefSchema, ((LeafSchemaNode) identityLeafRefSchema).getType(), schema);
84
85         assertThat(parsedValue, instanceOf(QName.class));
86         final QName parsedQName = (QName) parsedValue;
87         assertEquals(namespaceUri, parsedQName.getNamespace());
88         assertEquals(TEST_IDENTITY, parsedQName.getLocalName());
89     }
90
91     public static Document readXmlToDocument(final InputStream xmlContent) throws SAXException, IOException {
92         final DocumentBuilder dBuilder;
93         try {
94             dBuilder = BUILDERFACTORY.newDocumentBuilder();
95         } catch (final ParserConfigurationException e) {
96             throw new IllegalStateException("Failed to parse XML document", e);
97         }
98         final Document doc = dBuilder.parse(xmlContent);
99
100         doc.getDocumentElement().normalize();
101         return doc;
102     }
103 }