Migrate users of deprecated QNameModule methods
[yangtools.git] / codec / yang-data-codec-xml / src / test / java / org / opendaylight / yangtools / yang / data / codec / xml / Bug5446Test.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertNotNull;
13 import static org.junit.jupiter.api.Assertions.assertTrue;
14
15 import java.io.IOException;
16 import java.util.Base64;
17 import javax.xml.stream.XMLStreamException;
18 import javax.xml.transform.dom.DOMResult;
19 import org.junit.jupiter.api.Test;
20 import org.opendaylight.yangtools.util.xml.UntrustedXML;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
23 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
25 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
27 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
28 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
29 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
30 import org.xmlunit.builder.DiffBuilder;
31
32 class Bug5446Test extends AbstractXmlTest {
33     private static final QName ROOT_QNAME = QName.create("foo", "2015-11-05", "root");
34     private static final QName IP_ADDRESS_QNAME = QName.create(ROOT_QNAME, "ip-address");
35
36     @Test
37     void test() throws Exception {
38         final EffectiveModelContext schemaContext = YangParserTestUtils.parseYang("""
39             module foo {
40               yang-version 1;
41               namespace "foo";
42               prefix "foo";
43
44               revision "2015-11-05" {
45               }
46
47               typedef ipv4-address-binary {
48                 type binary {
49                   length "4";
50                 }
51               }
52
53               typedef ipv6-address-binary {
54                 type binary {
55                   length "16";
56                 }
57               }
58
59               typedef ip-address-binary {
60                 type union {
61                   type ipv4-address-binary;
62                   type ipv6-address-binary;
63                 }
64               }
65
66               container root {
67                 leaf ip-address {
68                   type ip-address-binary;
69                 }
70               }
71             }""");
72         final var doc = loadDocument("/bug5446/xml/foo.xml");
73
74         final var docNode = createDocNode();
75
76         DataContainerChild root = docNode.getChildByArg(new NodeIdentifier(ROOT_QNAME));
77         DataContainerChild child = ((ContainerNode) root).getChildByArg(new NodeIdentifier(IP_ADDRESS_QNAME));
78         LeafNode<?> ipAdress = (LeafNode<?>) child;
79
80         Object value = ipAdress.body();
81         assertTrue(value instanceof byte[]);
82         assertEquals("fwAAAQ==", Base64.getEncoder().encodeToString((byte[]) value));
83
84         DOMResult serializationResult = writeNormalizedNode(docNode, schemaContext);
85         assertNotNull(serializationResult);
86
87         final var diff = DiffBuilder.compare(toString(doc.getDocumentElement()))
88             .withTest(toString(serializationResult.getNode()))
89             .ignoreWhitespace()
90             .ignoreComments()
91             .checkForIdentical()
92             .build();
93         assertFalse(diff.hasDifferences(), diff.toString());
94     }
95
96     private static ContainerNode createDocNode() {
97         return ImmutableNodes.newContainerBuilder()
98             .withNodeIdentifier(new NodeIdentifier(ROOT_QNAME))
99             .withChild(ImmutableNodes.newContainerBuilder()
100                 .withNodeIdentifier(new NodeIdentifier(ROOT_QNAME))
101                 .withChild(ImmutableNodes.leafNode(IP_ADDRESS_QNAME, Base64.getDecoder().decode("fwAAAQ==")))
102                 .build())
103             .build();
104     }
105
106     private static DOMResult writeNormalizedNode(final ContainerNode normalized, final EffectiveModelContext context)
107             throws IOException, XMLStreamException {
108         final var doc = UntrustedXML.newDocumentBuilder().newDocument();
109         final var result = new DOMResult(doc);
110         final var writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(result);
111         try (var nnWriter = NormalizedNodeWriter.forStreamWriter(
112                 XMLStreamNormalizedNodeStreamWriter.create(writer, context))) {
113             for (var child : normalized.body()) {
114                 nnWriter.write(child);
115             }
116             nnWriter.flush();
117         } finally {
118             writer.close();
119         }
120         return result;
121     }
122 }