Remove unused imports
[yangtools.git] / yang / yang-data-impl / src / test / java / org / opendaylight / yangtools / yang / data / impl / codec / xml / XmlStreamUtilsTest.java
1 /*
2  * Copyright (c) 2014 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
9 package org.opendaylight.yangtools.yang.data.impl.codec.xml;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertTrue;
13 import com.google.common.base.Optional;
14 import com.google.common.collect.Maps;
15 import java.io.ByteArrayOutputStream;
16 import java.net.URI;
17 import java.util.AbstractMap;
18 import java.util.Collections;
19 import java.util.Map;
20 import javax.xml.stream.XMLOutputFactory;
21 import javax.xml.stream.XMLStreamWriter;
22 import org.custommonkey.xmlunit.Diff;
23 import org.custommonkey.xmlunit.XMLUnit;
24 import org.junit.Test;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.common.QNameModule;
27 import org.opendaylight.yangtools.yang.data.api.Node;
28 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
29 import org.w3c.dom.Document;
30
31 public class XmlStreamUtilsTest {
32
33     public static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newFactory();
34
35     @Test
36     public void testWriteAttribute() throws Exception {
37         final ByteArrayOutputStream out = new ByteArrayOutputStream();
38         final XMLStreamWriter writer =  XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
39         writer.writeStartElement("element");
40
41         QName name = getAttrQName("namespace", "2012-12-12", "attr", Optional.of("prefix"));
42         final Map.Entry<QName, String> attributeEntry = new AbstractMap.SimpleEntry<>(name, "value");
43
44         name = getAttrQName("namespace2", "2012-12-12", "attr", Optional.<String>absent());
45         final Map.Entry<QName, String> attributeEntryNoPrefix = new AbstractMap.SimpleEntry<>(name, "value");
46
47         final RandomPrefix randomPrefix = new RandomPrefix();
48         XmlStreamUtils.writeAttribute(writer, attributeEntry, randomPrefix);
49         XmlStreamUtils.writeAttribute(writer, attributeEntryNoPrefix, randomPrefix);
50
51         writer.writeEndElement();
52         writer.close();
53         out.close();
54
55         final String xmlAsString = new String(out.toByteArray());
56
57         final Map<String, String> mappedPrefixes = mapPrefixed(randomPrefix.getPrefixes());
58         assertEquals(2, mappedPrefixes.size());
59         final String randomPrefixValue = mappedPrefixes.get("namespace2");
60
61         final String expectedXmlAsString = "<element xmlns:a=\"namespace\" a:attr=\"value\" xmlns:" + randomPrefixValue + "=\"namespace2\" " + randomPrefixValue + ":attr=\"value\"></element>";
62
63         XMLUnit.setIgnoreAttributeOrder(true);
64         final Document control = XMLUnit.buildControlDocument(expectedXmlAsString);
65         final Document test = XMLUnit.buildTestDocument(xmlAsString);
66         final Diff diff = XMLUnit.compareXML(control, test);
67
68         final boolean identical = diff.identical();
69         assertTrue("Xml differs: " + diff.toString(), identical);
70     }
71
72     @Test
73     public void testEmptyNodeWithAttribute() throws Exception {
74         final ByteArrayOutputStream out = new ByteArrayOutputStream();
75         final XMLStreamWriter writer =  XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
76
77         final Map<QName, String> attrs = Maps.newHashMap();
78         attrs.put(QName.create("namespaceAttr", "2012-12-12", "attr1"), "value");
79         final QName qName = QName.create("urn:opendaylight:controller:rpc:test", "2014-07-28", "cont");
80         final ImmutableCompositeNode dataAttributes = ImmutableCompositeNode.create(qName, attrs, Collections.<Node<?>>emptyList());
81         XmlStreamUtils.create(XmlUtils.DEFAULT_XML_CODEC_PROVIDER).writeDocument(writer, dataAttributes);
82
83         writer.close();
84         out.close();
85
86         final String xmlAsString = new String(out.toByteArray());
87
88         // TODO why resulting xml does not have namespace definition ? If sending xml by e.g. netconf the namespace is there but not here in test
89         final String expectedXmlAsString = "<cont xmlns:a=\"namespaceAttr\" a:attr1=\"value\"></cont>";
90
91         XMLUnit.setIgnoreAttributeOrder(true);
92         final Document control = XMLUnit.buildControlDocument(expectedXmlAsString);
93         final Document test = XMLUnit.buildTestDocument(xmlAsString);
94         final Diff diff = XMLUnit.compareXML(control, test);
95
96         final boolean identical = diff.identical();
97         assertTrue("Xml differs: " + diff.toString(), identical);
98     }
99
100     private Map<String, String> mapPrefixed(final Iterable<Map.Entry<URI, String>> prefixes) {
101         final Map<String, String> mappedPrefixes = Maps.newHashMap();
102         for (final Map.Entry<URI, String> prefix : prefixes) {
103             mappedPrefixes.put(prefix.getKey().toString(), prefix.getValue());
104         }
105         return mappedPrefixes;
106     }
107
108     private QName getAttrQName(final String namespace, final String revision, final String localName, final Optional<String> prefix) {
109
110         if(prefix.isPresent()) {
111             final QName moduleQName = QName.create(namespace, revision, "module");
112             final QNameModule module = QNameModule.create(moduleQName.getNamespace(), moduleQName.getRevision());
113             return QName.create(module, prefix.get(), localName);
114         } else {
115             return QName.create(namespace, revision, localName);
116         }
117     }
118 }