58da0a64692f15c3f61f37891c8c07e6d85f3f72
[yangtools.git] / codec / yang-data-codec-xml / src / test / java / org / opendaylight / yangtools / yang / data / codec / xml / AnydataSerializeTest.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.codec.xml;
9
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;
14
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;
37
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();
43     }
44
45     private final XMLOutputFactory factory;
46
47     public AnydataSerializeTest(final String factoryMode, final XMLOutputFactory factory) {
48         this.factory = factory;
49     }
50
51     @Test
52     public void testDOMAnydata() throws Exception {
53         final var writer = new StringWriter();
54         final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
55
56         final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
57             SCHEMA_CONTEXT);
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\"/>"))
62             .build());
63         normalizedNodeWriter.flush();
64
65         final String serializedXml = writer.toString();
66         assertEquals("<foo xmlns=\"test-anydata\"><bar xmlns=\"test-anydata\"></bar></foo>", serializedXml);
67     }
68
69     @Test
70     public void testXmlParseAnydata() throws Exception {
71         // deserialization
72         final var reader = UntrustedXML.createXMLStreamReader(
73             AnydataSerializeTest.class.getResourceAsStream("/test-anydata.xml"));
74
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);
79
80         final var transformedInput = result.getResult().data();
81         assertThat(transformedInput, instanceOf(AnydataNode.class));
82         final var anydataNode = (AnydataNode<?>) transformedInput;
83
84         // serialization
85         final var writer = new StringWriter();
86         final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
87         final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
88             SCHEMA_CONTEXT);
89         final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(xmlNormalizedNodeStreamWriter);
90         normalizedNodeWriter.write(transformedInput);
91         normalizedNodeWriter.flush();
92
93         final String serializedXml = writer.toString();
94         final String deserializeXml = getXmlFromDOMSource(((DOMSourceAnydata) anydataNode.body()).getSource());
95         assertFalse(serializedXml.isEmpty());
96
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());
102
103         XMLAssert.assertXMLEqual(diff, true);
104     }
105
106     @Test
107     public void testAnydataLoadFromXML() throws Exception {
108         // Load XML file
109         final var doc = loadDocument("/test-anydata.xml");
110         final var domSource = new DOMSource(doc.getDocumentElement());
111
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));
118
119         xmlParser.parse(reader);
120         xmlParser.flush();
121
122         //Set XML comparing
123         XMLUnit.setIgnoreWhitespace(true);
124         XMLUnit.setNormalize(true);
125
126         // Check diff
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());
131
132         XMLAssert.assertXMLEqual(diff, true);
133     }
134
135     @Test
136     public void testAnydataSerialization() throws Exception {
137         //Get XML Data.
138         final var doc = loadDocument("/test-anydata.xml");
139         final var domSource = new DOMSource(doc.getDocumentElement());
140
141         //Create NormalizedNodeResult
142         final var normalizedResult = new NormalizationResultHolder();
143         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(normalizedResult);
144
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);
149         xmlParser.flush();
150
151         //Get Result
152         final var node = normalizedResult.getResult().data();
153         assertThat(node, instanceOf(AnydataNode.class));
154         final var anydataResult = (AnydataNode<?>) node;
155
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());
160
161         //Looking for difference in Serialized xml and in Loaded XML
162         final Diff diff = new Diff(expectedXml, serializedXml);
163         diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
164
165         XMLAssert.assertXMLEqual(diff, true);
166     }
167
168     @Test
169     public void testSiblingSerialize() throws Exception {
170         final var writer = new StringWriter();
171         final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
172
173         final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
174             SCHEMA_CONTEXT);
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\"/>"))
181                 .build())
182             .withChild(CONT_LEAF)
183             .build());
184         normalizedNodeWriter.flush();
185
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);
189     }
190
191     @Test
192     public void testNormalizedSerialize() throws Exception {
193         final var writer = new StringWriter();
194         final var xmlStreamWriter = factory.createXMLStreamWriter(writer);
195
196         final var xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter,
197             SCHEMA_CONTEXT);
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()))
206                 .build())
207             .build());
208         normalizedNodeWriter.flush();
209
210         final String serializedXml = writer.toString();
211         assertEquals("<cont xmlns=\"test-anydata\"><cont-any><cont/></cont-any></cont>", serializedXml);
212     }
213 }