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 javax.xml.stream.XMLOutputFactory;
17 import javax.xml.transform.dom.DOMResult;
18 import javax.xml.transform.dom.DOMSource;
19 import org.custommonkey.xmlunit.Diff;
20 import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener;
21 import org.custommonkey.xmlunit.XMLAssert;
22 import org.custommonkey.xmlunit.XMLUnit;
23 import org.junit.jupiter.params.ParameterizedTest;
24 import org.junit.jupiter.params.provider.ArgumentsSource;
25 import org.opendaylight.yangtools.util.xml.UntrustedXML;
26 import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
28 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
29 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
30 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
31 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
32 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
33 import org.opendaylight.yangtools.yang.model.spi.DefaultSchemaTreeInference;
34 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
36 class AnydataSerializeTest extends AbstractAnydataTest {
37 @ParameterizedTest(name = "{0}")
38 @ArgumentsSource(TestFactories.class)
39 public void testDOMAnydata(final String factoryMode, final XMLOutputFactory factory) throws Exception {
40 final var writer = new StringWriter();
41 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
43 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
45 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
46 normalizedNodeWriter.write(ImmutableNodes.newAnydataBuilder(DOMSourceAnydata.class)
47 .withNodeIdentifier(FOO_NODEID)
48 .withValue(toDOMSource("<bar xmlns=\"test-anydata\"/>"))
50 normalizedNodeWriter.flush();
52 final String serializedXml = writer.toString();
53 assertEquals("<foo xmlns=\"test-anydata\"><bar xmlns=\"test-anydata\"></bar></foo>", serializedXml);
56 @ParameterizedTest(name = "{0}")
57 @ArgumentsSource(TestFactories.class)
58 public void testXmlParseAnydata(final String factoryMode, final XMLOutputFactory factory) throws Exception {
60 final var reader = UntrustedXML.createXMLStreamReader(
61 AnydataSerializeTest.class.getResourceAsStream("/test-anydata.xml"));
63 final var result = new NormalizationResultHolder();
64 final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
65 final var xmlParser = XmlParserStream.create(streamWriter, Inference.ofDataTreePath(SCHEMA_CONTEXT, FOO_QNAME));
66 xmlParser.parse(reader);
68 final var transformedInput = result.getResult().data();
69 assertThat(transformedInput, instanceOf(AnydataNode.class));
70 final var anydataNode = (AnydataNode<?>) transformedInput;
73 final var writer = new StringWriter();
74 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
75 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
77 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
78 normalizedNodeWriter.write(transformedInput);
79 normalizedNodeWriter.flush();
81 final String serializedXml = writer.toString();
82 final String deserializeXml = getXmlFromDOMSource(((DOMSourceAnydata) anydataNode.body()).getSource());
83 assertFalse(serializedXml.isEmpty());
85 // Check if is Serialize Node same as Deserialize Node
86 XMLUnit.setIgnoreWhitespace(true);
87 XMLUnit.setNormalize(true);
88 final Diff diff = new Diff(deserializeXml, serializedXml);
89 diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
91 XMLAssert.assertXMLEqual(diff, true);
94 @ParameterizedTest(name = "{0}")
95 @ArgumentsSource(TestFactories.class)
96 public void testAnydataLoadFromXML(final String factoryMode, final XMLOutputFactory factory) throws Exception {
98 final var doc = loadDocument("/test-anydata.xml");
99 final var domSource = new DOMSource(doc.getDocumentElement());
101 //Load XML from file and write it with xmlParseStream
102 final var domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
103 final var xmlStreamWriter = factory.createXMLStreamWriter(domResult);
104 final var streamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, SCHEMA_CONTEXT);
105 final var reader = new DOMSourceXMLStreamReader(domSource);
106 final var xmlParser = XmlParserStream.create(streamWriter, Inference.ofDataTreePath(SCHEMA_CONTEXT, FOO_QNAME));
108 xmlParser.parse(reader);
112 XMLUnit.setIgnoreWhitespace(true);
113 XMLUnit.setNormalize(true);
116 final String expectedXml = toString(doc.getDocumentElement());
117 final String serializedXml = toString(domResult.getNode());
118 final Diff diff = new Diff(expectedXml, serializedXml);
119 diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
121 XMLAssert.assertXMLEqual(diff, true);
124 @ParameterizedTest(name = "{0}")
125 @ArgumentsSource(TestFactories.class)
126 public void testAnydataSerialization(final String factoryMode, final XMLOutputFactory factory) throws Exception {
128 final var doc = loadDocument("/test-anydata.xml");
129 final var domSource = new DOMSource(doc.getDocumentElement());
131 //Create NormalizedNodeResult
132 final var normalizedResult = new NormalizationResultHolder();
133 final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(normalizedResult);
135 //Initialize Reader with XML file
136 final var reader = new DOMSourceXMLStreamReader(domSource);
137 final var xmlParser = XmlParserStream.create(streamWriter, Inference.ofDataTreePath(SCHEMA_CONTEXT, FOO_QNAME));
138 xmlParser.parse(reader);
142 final var node = normalizedResult.getResult().data();
143 assertThat(node, instanceOf(AnydataNode.class));
144 final var anydataResult = (AnydataNode<?>) node;
146 //Get Result in formatted String
147 assertThat(anydataResult.body(), instanceOf(DOMSourceAnydata.class));
148 final String serializedXml = getXmlFromDOMSource(((DOMSourceAnydata)anydataResult.body()).getSource());
149 final String expectedXml = toString(doc.getDocumentElement());
151 //Looking for difference in Serialized xml and in Loaded XML
152 final Diff diff = new Diff(expectedXml, serializedXml);
153 diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
155 XMLAssert.assertXMLEqual(diff, true);
158 @ParameterizedTest(name = "{0}")
159 @ArgumentsSource(TestFactories.class)
160 public void testSiblingSerialize(final String factoryMode, final XMLOutputFactory factory) throws Exception {
161 final var writer = new StringWriter();
162 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
164 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
166 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
167 normalizedNodeWriter.write(ImmutableNodes.newContainerBuilder()
168 .withNodeIdentifier(CONT_NODEID)
169 .withChild(ImmutableNodes.newAnydataBuilder(DOMSourceAnydata.class)
170 .withNodeIdentifier(CONT_ANY_NODEID)
171 .withValue(toDOMSource("<bar xmlns=\"test-anydata\"/>"))
173 .withChild(CONT_LEAF)
175 normalizedNodeWriter.flush();
177 final String serializedXml = writer.toString();
178 assertEquals("<cont xmlns=\"test-anydata\"><cont-any><bar xmlns=\"test-anydata\"></bar></cont-any>"
179 + "<cont-leaf>abc</cont-leaf></cont>", serializedXml);
182 @ParameterizedTest(name = "{0}")
183 @ArgumentsSource(TestFactories.class)
184 public void testNormalizedSerialize(final String factoryMode, final XMLOutputFactory factory) throws Exception {
185 final var writer = new StringWriter();
186 final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
188 final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
190 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
191 normalizedNodeWriter.write(ImmutableNodes.newContainerBuilder()
192 .withNodeIdentifier(CONT_NODEID)
193 .withChild(ImmutableNodes.newAnydataBuilder(NormalizedAnydata.class)
194 .withNodeIdentifier(CONT_ANY_NODEID)
195 .withValue(NormalizedAnydata.of(
196 DefaultSchemaTreeInference.of(SCHEMA_CONTEXT, Absolute.of(CONT_QNAME)),
197 ImmutableNodes.newContainerBuilder().withNodeIdentifier(CONT_NODEID).build()))
200 normalizedNodeWriter.flush();
202 final String serializedXml = writer.toString();
203 assertEquals("<cont xmlns=\"test-anydata\"><cont-any><cont/></cont-any></cont>", serializedXml);