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.data.api.YangInstanceIdentifier.NodeIdentifier;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
25 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
27 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
29 public class SchemalessXMLStreamNormalizedNodeStreamWriterTest extends AbstractXmlTest {
30 private QNameModule foobarModule;
32 private QName outerContainer;
34 private QName myContainer1;
35 private QName myKeyedList;
36 private QName myKeyLeaf;
37 private QName myLeafInList1;
38 private QName myLeafInList2;
39 private QName myOrderedList;
40 private QName myKeyLeafInOrderedList;
41 private QName myLeafInOrderedList1;
42 private QName myLeafInOrderedList2;
43 private QName myUnkeyedList;
44 private QName myLeafInUnkeyedList;
45 private QName myLeaf1;
46 private QName myLeafList;
47 private QName myOrderedLeafList;
49 private QName myContainer2;
50 private QName innerContainer;
51 private QName myLeaf2;
52 private QName myLeaf3;
53 private QName myChoice;
54 private QName myLeafInCase2;
56 private QName myContainer3;
57 private QName myDoublyKeyedList;
58 private QName myFirstKeyLeaf;
59 private QName mySecondKeyLeaf;
60 private QName myLeafInList3;
64 foobarModule = QNameModule.of("foobar-namespace", "2016-09-19");
66 outerContainer = QName.create(foobarModule, "outer-container");
68 myContainer1 = QName.create(foobarModule, "my-container-1");
69 myKeyedList = QName.create(foobarModule, "my-keyed-list");
70 myKeyLeaf = QName.create(foobarModule, "my-key-leaf");
71 myLeafInList1 = QName.create(foobarModule, "my-leaf-in-list-1");
72 myLeafInList2 = QName.create(foobarModule, "my-leaf-in-list-2");
73 myOrderedList = QName.create(foobarModule, "my-ordered-list");
74 myKeyLeafInOrderedList = QName.create(foobarModule, "my-key-leaf-in-ordered-list");
75 myLeafInOrderedList1 = QName.create(foobarModule, "my-leaf-in-ordered-list-1");
76 myLeafInOrderedList2 = QName.create(foobarModule, "my-leaf-in-ordered-list-2");
77 myUnkeyedList = QName.create(foobarModule, "my-unkeyed-list");
78 myLeafInUnkeyedList = QName.create(foobarModule, "my-leaf-in-unkeyed-list");
79 myLeaf1 = QName.create(foobarModule, "my-leaf-1");
80 myLeafList = QName.create(foobarModule, "my-leaf-list");
81 myOrderedLeafList = QName.create(foobarModule, "my-ordered-leaf-list");
83 myContainer2 = QName.create(foobarModule, "my-container-2");
84 innerContainer = QName.create(foobarModule, "inner-container");
85 myLeaf2 = QName.create(foobarModule, "my-leaf-2");
86 myLeaf3 = QName.create(foobarModule, "my-leaf-3");
87 myChoice = QName.create(foobarModule, "my-choice");
88 myLeafInCase2 = QName.create(foobarModule, "my-leaf-in-case-2");
90 myContainer3 = QName.create(foobarModule, "my-container-3");
91 myDoublyKeyedList = QName.create(foobarModule, "my-doubly-keyed-list");
92 myFirstKeyLeaf = QName.create(foobarModule, "my-first-key-leaf");
93 mySecondKeyLeaf = QName.create(foobarModule, "my-second-key-leaf");
94 myLeafInList3 = QName.create(foobarModule, "my-leaf-in-list-3");
97 @ParameterizedTest(name = "{0}")
98 @ArgumentsSource(TestFactories.class)
99 void testWrite(final String factoryMode, final XMLOutputFactory factory) throws Exception {
100 final var doc = loadDocument("/foobar.xml");
101 final var domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
102 final var xmlStreamWriter = factory.createXMLStreamWriter(domResult);
103 final var schemalessXmlNormalizedNodeStreamWriter =
104 XMLStreamNormalizedNodeStreamWriter.createSchemaless(xmlStreamWriter);
105 final var normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(schemalessXmlNormalizedNodeStreamWriter);
107 normalizedNodeWriter.write(buildOuterContainerNode());
109 XMLUnit.setIgnoreWhitespace(true);
110 XMLUnit.setNormalize(true);
112 final String expectedXml = toString(doc.getDocumentElement());
113 final String serializedXml = toString(domResult.getNode());
114 final Diff diff = new Diff(expectedXml, serializedXml);
115 diff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener());
117 XMLAssert.assertXMLEqual(diff, true);
120 private ContainerNode buildOuterContainerNode() {
121 return ImmutableNodes.newContainerBuilder()
122 .withNodeIdentifier(new NodeIdentifier(outerContainer))
123 .withChild(ImmutableNodes.newContainerBuilder()
124 .withNodeIdentifier(new NodeIdentifier(myContainer1))
125 .withChild(ImmutableNodes.newSystemMapBuilder()
126 .withNodeIdentifier(new NodeIdentifier(myKeyedList))
127 .withChild(ImmutableNodes.newMapEntryBuilder()
128 .withNodeIdentifier(NodeIdentifierWithPredicates.of(myKeyedList, myKeyLeaf, "listkeyvalue1"))
129 .withChild(ImmutableNodes.leafNode(myLeafInList1, "listleafvalue1"))
130 .withChild(ImmutableNodes.leafNode(myLeafInList2, "listleafvalue2"))
132 .withChild(ImmutableNodes.newMapEntryBuilder()
133 .withNodeIdentifier(NodeIdentifierWithPredicates.of(myKeyedList, myKeyLeaf, "listkeyvalue2"))
134 .withChild(ImmutableNodes.leafNode(myLeafInList1, "listleafvalue12"))
135 .withChild(ImmutableNodes.leafNode(myLeafInList2, "listleafvalue22"))
138 .withChild(ImmutableNodes.newUserMapBuilder()
139 .withNodeIdentifier(new NodeIdentifier(myOrderedList))
140 .withChild(ImmutableNodes.newMapEntryBuilder()
142 NodeIdentifierWithPredicates.of(myOrderedList, myKeyLeafInOrderedList, "olistkeyvalue1"))
143 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList1, "olistleafvalue1"))
144 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList2, "olistleafvalue2"))
146 .withChild(ImmutableNodes.newMapEntryBuilder()
148 NodeIdentifierWithPredicates.of(myOrderedList, myKeyLeafInOrderedList, "olistkeyvalue2"))
149 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList1, "olistleafvalue12"))
150 .withChild(ImmutableNodes.leafNode(myLeafInOrderedList2, "olistleafvalue22"))
153 .withChild(ImmutableNodes.newUnkeyedListBuilder()
154 .withNodeIdentifier(new NodeIdentifier(myUnkeyedList))
155 .withChild(ImmutableNodes.newUnkeyedListEntryBuilder()
156 .withNodeIdentifier(new NodeIdentifier(myUnkeyedList))
157 .withChild(ImmutableNodes.leafNode(myLeafInUnkeyedList, "foo"))
160 .withChild(ImmutableNodes.leafNode(myLeaf1, "value1"))
161 .withChild(ImmutableNodes.newSystemLeafSetBuilder()
162 .withNodeIdentifier(new NodeIdentifier(myLeafList))
163 .withChild(ImmutableNodes.leafSetEntry(myLeafList, "lflvalue1"))
164 .withChild(ImmutableNodes.leafSetEntry(myLeafList, "lflvalue2"))
166 .withChild(ImmutableNodes.newUserLeafSetBuilder()
167 .withNodeIdentifier(new NodeIdentifier(myOrderedLeafList))
168 .withChild(ImmutableNodes.leafSetEntry(myOrderedLeafList, "olflvalue1"))
169 .withChild(ImmutableNodes.leafSetEntry(myOrderedLeafList, "olflvalue2"))
172 .withChild(ImmutableNodes.newContainerBuilder().withNodeIdentifier(
173 new NodeIdentifier(myContainer2))
174 .withChild(ImmutableNodes.newContainerBuilder()
175 .withNodeIdentifier(new NodeIdentifier(innerContainer))
176 .withChild(ImmutableNodes.leafNode(myLeaf2, "value2"))
178 .withChild(ImmutableNodes.leafNode(myLeaf3, "value3"))
179 .withChild(ImmutableNodes.newChoiceBuilder()
180 .withNodeIdentifier(new NodeIdentifier(myChoice))
181 .withChild(ImmutableNodes.leafNode(myLeafInCase2, "case2value"))
183 // .withChild(Builders.anyXmlBuilder()
184 // .withNodeIdentifier(new NodeIdentifier(myAnyxml))
185 // .withValue(anyxmlDomSource)
188 .withChild(ImmutableNodes.newContainerBuilder()
189 .withNodeIdentifier(new NodeIdentifier(myContainer3))
190 .withChild(ImmutableNodes.newSystemMapBuilder()
191 .withNodeIdentifier(new NodeIdentifier(myDoublyKeyedList))
192 .withChild(ImmutableNodes.newMapEntryBuilder()
193 .withNodeIdentifier(NodeIdentifierWithPredicates.of(myDoublyKeyedList,
194 Map.of(myFirstKeyLeaf, "listkeyvalue1", mySecondKeyLeaf, "listkeyvalue2")))
195 .withChild(ImmutableNodes.leafNode(myLeafInList3, "listleafvalue1"))