2 * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.codec.xml;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertFalse;
15 import java.io.StringWriter;
16 import java.util.Collection;
17 import javax.xml.stream.XMLOutputFactory;
18 import javax.xml.transform.dom.DOMResult;
19 import javax.xml.transform.dom.DOMSource;
20 import org.custommonkey.xmlunit.Diff;
21 import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener;
22 import org.custommonkey.xmlunit.XMLAssert;
23 import org.custommonkey.xmlunit.XMLUnit;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.junit.runners.Parameterized;
27 import org.opendaylight.yangtools.util.xml.UntrustedXML;
28 import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
30 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
31 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
32 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
33 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
34 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
35 import org.opendaylight.yangtools.yang.model.spi.DefaultSchemaTreeInference;
36 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
38 @RunWith(Parameterized.class)
39 public class AnydataSerializeTest extends AbstractAnydataTest {
40 @Parameterized.Parameters(name = "{0}")
41 public static Collection<Object[]> data() {
42 return TestFactories.junitParameters();
45 private final XMLOutputFactory factory;
47 public AnydataSerializeTest(final String factoryMode, final XMLOutputFactory factory) {
48 this.factory = factory;
52 public void testDOMAnydata() throws Exception {
53 final var writer = new StringWriter();
54 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
56 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
58 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
59 normalizedNodeWriter.write(Builders.anydataBuilder(DOMSourceAnydata.class)
60 .withNodeIdentifier(FOO_NODEID)
61 .withValue(toDOMSource("<bar xmlns=\"test-anydata\"/>"))
63 normalizedNodeWriter.flush();
65 final String serializedXml = writer.toString();
66 assertEquals("<foo xmlns=\"test-anydata\"><bar xmlns=\"test-anydata\"></bar></foo>", serializedXml);
70 public void testXmlParseAnydata() throws Exception {
72 final var reader = UntrustedXML.createXMLStreamReader(
73 AnydataSerializeTest.class.getResourceAsStream("/test-anydata.xml"));
75 final var result = new NormalizationResultHolder();
76 final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
77 final var xmlParser = XmlParserStream.create(streamWriter, Inference.ofDataTreePath(SCHEMA_CONTEXT, FOO_QNAME));
78 xmlParser.parse(reader);
80 final var transformedInput = result.getResult().data();
81 assertThat(transformedInput, instanceOf(AnydataNode.class));
82 final var anydataNode = (AnydataNode<?>) transformedInput;
85 final var writer = new StringWriter();
86 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
87 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
89 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
90 normalizedNodeWriter.write(transformedInput);
91 normalizedNodeWriter.flush();
93 final String serializedXml = writer.toString();
94 final String deserializeXml = getXmlFromDOMSource(((DOMSourceAnydata) anydataNode.body()).getSource());
95 assertFalse(serializedXml.isEmpty());
97 // Check if is Serialize Node same as Deserialize Node
98 XMLUnit.setIgnoreWhitespace(true);
99 XMLUnit.setNormalize(true);
100 final Diff diff = new Diff(deserializeXml, serializedXml);
101 diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
103 XMLAssert.assertXMLEqual(diff, true);
107 public void testAnydataLoadFromXML() throws Exception {
109 final var doc = loadDocument("/test-anydata.xml");
110 final var domSource = new DOMSource(doc.getDocumentElement());
112 //Load XML from file and write it with xmlParseStream
113 final var domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
114 final var xmlStreamWriter = factory.createXMLStreamWriter(domResult);
115 final var streamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, SCHEMA_CONTEXT);
116 final var reader = new DOMSourceXMLStreamReader(domSource);
117 final var xmlParser = XmlParserStream.create(streamWriter, Inference.ofDataTreePath(SCHEMA_CONTEXT, FOO_QNAME));
119 xmlParser.parse(reader);
123 XMLUnit.setIgnoreWhitespace(true);
124 XMLUnit.setNormalize(true);
127 final String expectedXml = toString(doc.getDocumentElement());
128 final String serializedXml = toString(domResult.getNode());
129 final Diff diff = new Diff(expectedXml, serializedXml);
130 diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
132 XMLAssert.assertXMLEqual(diff, true);
136 public void testAnydataSerialization() throws Exception {
138 final var doc = loadDocument("/test-anydata.xml");
139 final var domSource = new DOMSource(doc.getDocumentElement());
141 //Create NormalizedNodeResult
142 final var normalizedResult = new NormalizationResultHolder();
143 final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(normalizedResult);
145 //Initialize Reader with XML file
146 final var reader = new DOMSourceXMLStreamReader(domSource);
147 final var xmlParser = XmlParserStream.create(streamWriter, Inference.ofDataTreePath(SCHEMA_CONTEXT, FOO_QNAME));
148 xmlParser.parse(reader);
152 final var node = normalizedResult.getResult().data();
153 assertThat(node, instanceOf(AnydataNode.class));
154 final var anydataResult = (AnydataNode<?>) node;
156 //Get Result in formatted String
157 assertThat(anydataResult.body(), instanceOf(DOMSourceAnydata.class));
158 final String serializedXml = getXmlFromDOMSource(((DOMSourceAnydata)anydataResult.body()).getSource());
159 final String expectedXml = toString(doc.getDocumentElement());
161 //Looking for difference in Serialized xml and in Loaded XML
162 final Diff diff = new Diff(expectedXml, serializedXml);
163 diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
165 XMLAssert.assertXMLEqual(diff, true);
169 public void testSiblingSerialize() throws Exception {
170 final var writer = new StringWriter();
171 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
173 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
175 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
176 normalizedNodeWriter.write(Builders.containerBuilder()
177 .withNodeIdentifier(CONT_NODEID)
178 .withChild(Builders.anydataBuilder(DOMSourceAnydata.class)
179 .withNodeIdentifier(CONT_ANY_NODEID)
180 .withValue(toDOMSource("<bar xmlns=\"test-anydata\"/>"))
182 .withChild(CONT_LEAF)
184 normalizedNodeWriter.flush();
186 final String serializedXml = writer.toString();
187 assertEquals("<cont xmlns=\"test-anydata\"><cont-any><bar xmlns=\"test-anydata\"></bar></cont-any>"
188 + "<cont-leaf>abc</cont-leaf></cont>", serializedXml);
192 public void testNormalizedSerialize() throws Exception {
193 final var writer = new StringWriter();
194 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
196 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
198 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
199 normalizedNodeWriter.write(Builders.containerBuilder()
200 .withNodeIdentifier(CONT_NODEID)
201 .withChild(Builders.anydataBuilder(NormalizedAnydata.class)
202 .withNodeIdentifier(CONT_ANY_NODEID)
203 .withValue(NormalizedAnydata.of(
204 DefaultSchemaTreeInference.of(SCHEMA_CONTEXT, Absolute.of(CONT_QNAME)),
205 Builders.containerBuilder().withNodeIdentifier(CONT_NODEID).build()))
208 normalizedNodeWriter.flush();
210 final String serializedXml = writer.toString();
211 assertEquals("<cont xmlns=\"test-anydata\"><cont-any><cont/></cont-any></cont>", serializedXml);