2 * Copyright (c) 2016 Cisco Systems, Inc. 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;
11 import javax.xml.stream.XMLOutputFactory;
12 import javax.xml.transform.dom.DOMResult;
13 import org.custommonkey.xmlunit.Diff;
14 import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener;
15 import org.custommonkey.xmlunit.XMLAssert;
16 import org.custommonkey.xmlunit.XMLUnit;
17 import org.junit.jupiter.api.BeforeEach;
18 import org.junit.jupiter.params.ParameterizedTest;
19 import org.junit.jupiter.params.provider.ArgumentsSource;
20 import org.opendaylight.yangtools.util.xml.UntrustedXML;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.common.QNameModule;
23 import org.opendaylight.yangtools.yang.common.Revision;
24 import org.opendaylight.yangtools.yang.common.XMLNamespace;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
28 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
30 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
31 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
33 public class SchemalessXMLStreamNormalizedNodeStreamWriterTest extends AbstractXmlTest {
34 private QNameModule foobarModule;
36 private QName outerContainer;
38 private QName myContainer1;
39 private QName myKeyedList;
40 private QName myKeyLeaf;
41 private QName myLeafInList1;
42 private QName myLeafInList2;
43 private QName myOrderedList;
44 private QName myKeyLeafInOrderedList;
45 private QName myLeafInOrderedList1;
46 private QName myLeafInOrderedList2;
47 private QName myUnkeyedList;
48 private QName myLeafInUnkeyedList;
49 private QName myLeaf1;
50 private QName myLeafList;
51 private QName myOrderedLeafList;
53 private QName myContainer2;
54 private QName innerContainer;
55 private QName myLeaf2;
56 private QName myLeaf3;
57 private QName myChoice;
58 private QName myLeafInCase2;
60 private QName myContainer3;
61 private QName myDoublyKeyedList;
62 private QName myFirstKeyLeaf;
63 private QName mySecondKeyLeaf;
64 private QName myLeafInList3;
68 foobarModule = QNameModule.create(XMLNamespace.of("foobar-namespace"), Revision.of("2016-09-19"));
70 outerContainer = QName.create(foobarModule, "outer-container");
72 myContainer1 = QName.create(foobarModule, "my-container-1");
73 myKeyedList = QName.create(foobarModule, "my-keyed-list");
74 myKeyLeaf = QName.create(foobarModule, "my-key-leaf");
75 myLeafInList1 = QName.create(foobarModule, "my-leaf-in-list-1");
76 myLeafInList2 = QName.create(foobarModule, "my-leaf-in-list-2");
77 myOrderedList = QName.create(foobarModule, "my-ordered-list");
78 myKeyLeafInOrderedList = QName.create(foobarModule, "my-key-leaf-in-ordered-list");
79 myLeafInOrderedList1 = QName.create(foobarModule, "my-leaf-in-ordered-list-1");
80 myLeafInOrderedList2 = QName.create(foobarModule, "my-leaf-in-ordered-list-2");
81 myUnkeyedList = QName.create(foobarModule, "my-unkeyed-list");
82 myLeafInUnkeyedList = QName.create(foobarModule, "my-leaf-in-unkeyed-list");
83 myLeaf1 = QName.create(foobarModule, "my-leaf-1");
84 myLeafList = QName.create(foobarModule, "my-leaf-list");
85 myOrderedLeafList = QName.create(foobarModule, "my-ordered-leaf-list");
87 myContainer2 = QName.create(foobarModule, "my-container-2");
88 innerContainer = QName.create(foobarModule, "inner-container");
89 myLeaf2 = QName.create(foobarModule, "my-leaf-2");
90 myLeaf3 = QName.create(foobarModule, "my-leaf-3");
91 myChoice = QName.create(foobarModule, "my-choice");
92 myLeafInCase2 = QName.create(foobarModule, "my-leaf-in-case-2");
94 myContainer3 = QName.create(foobarModule, "my-container-3");
95 myDoublyKeyedList = QName.create(foobarModule, "my-doubly-keyed-list");
96 myFirstKeyLeaf = QName.create(foobarModule, "my-first-key-leaf");
97 mySecondKeyLeaf = QName.create(foobarModule, "my-second-key-leaf");
98 myLeafInList3 = QName.create(foobarModule, "my-leaf-in-list-3");
101 @ParameterizedTest(name = "{0}")
102 @ArgumentsSource(TestFactories.class)
103 void testWrite(final String factoryMode, final XMLOutputFactory factory) throws Exception {
104 final var doc = loadDocument("/foobar.xml");
105 final var domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
106 final var xmlStreamWriter = factory.createXMLStreamWriter(domResult);
107 final var schemalessXmlNormalizedNodeStreamWriter =
108 XMLStreamNormalizedNodeStreamWriter.createSchemaless(xmlStreamWriter);
109 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(schemalessXmlNormalizedNodeStreamWriter);
111 normalizedNodeWriter.write(buildOuterContainerNode());
113 XMLUnit.setIgnoreWhitespace(true);
114 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 private ContainerNode buildOuterContainerNode() {
125 return Builders.containerBuilder()
126 .withNodeIdentifier(new NodeIdentifier(outerContainer))
127 .withChild(Builders.containerBuilder()
128 .withNodeIdentifier(new NodeIdentifier(myContainer1))
129 .withChild(Builders.mapBuilder()
130 .withNodeIdentifier(new NodeIdentifier(myKeyedList))
131 .withChild(Builders.mapEntryBuilder()
132 .withNodeIdentifier(NodeIdentifierWithPredicates.of(myKeyedList, myKeyLeaf, "listkeyvalue1"))
133 .withChild(ImmutableNodes.leafNode(myLeafInList1, "listleafvalue1"))
134 .withChild(ImmutableNodes.leafNode(myLeafInList2, "listleafvalue2"))
136 .withChild(Builders.mapEntryBuilder()
137 .withNodeIdentifier(NodeIdentifierWithPredicates.of(myKeyedList, myKeyLeaf, "listkeyvalue2"))
138 .withChild(ImmutableNodes.leafNode(myLeafInList1, "listleafvalue12"))
139 .withChild(ImmutableNodes.leafNode(myLeafInList2, "listleafvalue22"))
142 .withChild(Builders.orderedMapBuilder()
143 .withNodeIdentifier(new NodeIdentifier(myOrderedList))
144 .withChild(Builders.mapEntryBuilder()
146 NodeIdentifierWithPredicates.of(myOrderedList, myKeyLeafInOrderedList, "olistkeyvalue1"))
147 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList1, "olistleafvalue1"))
148 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList2, "olistleafvalue2"))
150 .withChild(Builders.mapEntryBuilder()
152 NodeIdentifierWithPredicates.of(myOrderedList, myKeyLeafInOrderedList, "olistkeyvalue2"))
153 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList1, "olistleafvalue12"))
154 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList2, "olistleafvalue22"))
157 .withChild(Builders.unkeyedListBuilder()
158 .withNodeIdentifier(new NodeIdentifier(myUnkeyedList))
159 .withChild(Builders.unkeyedListEntryBuilder()
160 .withNodeIdentifier(new NodeIdentifier(myUnkeyedList))
161 .withChild(ImmutableNodes.leafNode(myLeafInUnkeyedList, "foo"))
164 .withChild(ImmutableNodes.leafNode(myLeaf1, "value1"))
165 .withChild(Builders.leafSetBuilder()
166 .withNodeIdentifier(new NodeIdentifier(myLeafList))
167 .withChild(Builders.leafSetEntryBuilder()
168 .withNodeIdentifier(new NodeWithValue<>(myLeafList, "lflvalue1"))
169 .withValue("lflvalue1")
171 .withChild(Builders.leafSetEntryBuilder()
172 .withNodeIdentifier(new NodeWithValue<>(myLeafList, "lflvalue2"))
173 .withValue("lflvalue2")
176 .withChild(Builders.orderedLeafSetBuilder()
177 .withNodeIdentifier(new NodeIdentifier(myOrderedLeafList))
178 .withChild(Builders.leafSetEntryBuilder()
179 .withNodeIdentifier(new NodeWithValue<>(myOrderedLeafList, "olflvalue1"))
180 .withValue("olflvalue1")
182 .withChild(Builders.leafSetEntryBuilder()
183 .withNodeIdentifier(new NodeWithValue<>(myOrderedLeafList, "olflvalue2"))
184 .withValue("olflvalue2")
188 .withChild(Builders.containerBuilder().withNodeIdentifier(
189 new NodeIdentifier(myContainer2))
190 .withChild(Builders.containerBuilder()
191 .withNodeIdentifier(new NodeIdentifier(innerContainer))
192 .withChild(ImmutableNodes.leafNode(myLeaf2, "value2"))
194 .withChild(ImmutableNodes.leafNode(myLeaf3, "value3"))
195 .withChild(Builders.choiceBuilder()
196 .withNodeIdentifier(new NodeIdentifier(myChoice))
197 .withChild(ImmutableNodes.leafNode(myLeafInCase2, "case2value"))
199 // .withChild(Builders.anyXmlBuilder()
200 // .withNodeIdentifier(new NodeIdentifier(myAnyxml))
201 // .withValue(anyxmlDomSource)
204 .withChild(Builders.containerBuilder()
205 .withNodeIdentifier(new NodeIdentifier(myContainer3))
206 .withChild(Builders.mapBuilder()
207 .withNodeIdentifier(new NodeIdentifier(myDoublyKeyedList))
208 .withChild(Builders.mapEntryBuilder()
209 .withNodeIdentifier(NodeIdentifierWithPredicates.of(myDoublyKeyedList,
210 Map.of(myFirstKeyLeaf, "listkeyvalue1", mySecondKeyLeaf, "listkeyvalue2")))
211 .withChild(ImmutableNodes.leafNode(myLeafInList3, "listleafvalue1"))