Merge "Fix XmlStreamUtils writing attributes."
[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 com.google.common.base.Optional;
12 import com.google.common.collect.Maps;
13 import java.io.ByteArrayOutputStream;
14 import java.net.URI;
15 import java.util.AbstractMap;
16 import java.util.Map;
17 import javax.xml.stream.XMLOutputFactory;
18 import javax.xml.stream.XMLStreamWriter;
19 import junit.framework.Assert;
20 import org.custommonkey.xmlunit.Diff;
21 import org.custommonkey.xmlunit.XMLUnit;
22 import org.junit.Test;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.common.QNameModule;
25 import org.w3c.dom.Document;
26
27 public class XmlStreamUtilsTest {
28
29     public static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newFactory();
30
31     @Test
32     public void testWriteAttribute() throws Exception {
33         final ByteArrayOutputStream out = new ByteArrayOutputStream();
34         final XMLStreamWriter writer =  XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
35         writer.writeStartElement("element");
36
37         QName name = getAttrQName("namespace", "2012-12-12", "attr", Optional.of("prefix"));
38         final Map.Entry<QName, String> attributeEntry = new AbstractMap.SimpleEntry<>(name, "value");
39
40         name = getAttrQName("namespace2", "2012-12-12", "attr", Optional.<String>absent());
41         final Map.Entry<QName, String> attributeEntryNoPrefix = new AbstractMap.SimpleEntry<>(name, "value");
42
43         final RandomPrefix randomPrefix = new RandomPrefix();
44         XmlStreamUtils.writeAttribute(writer, attributeEntry, randomPrefix);
45         XmlStreamUtils.writeAttribute(writer, attributeEntryNoPrefix, randomPrefix);
46
47         writer.writeEndElement();
48         writer.close();
49         out.close();
50
51         final String xmlAsString = new String(out.toByteArray());
52
53         final Map<String, String> mappedPrefixes = mapPrefixed(randomPrefix.getPrefixes());
54         Assert.assertEquals(2, mappedPrefixes.size());
55         final String randomPrefixValue = mappedPrefixes.get("namespace2");
56
57         final String expectedXmlAsString = "<element xmlns:prefix=\"namespace\" prefix:attr=\"value\" xmlns:" + randomPrefixValue + "=\"namespace2\" " + randomPrefixValue + ":attr=\"value\"></element>";
58
59         XMLUnit.setIgnoreAttributeOrder(true);
60         final Document control = XMLUnit.buildControlDocument(expectedXmlAsString);
61         final Document test = XMLUnit.buildTestDocument(xmlAsString);
62         final Diff diff = XMLUnit.compareXML(control, test);
63
64         final boolean identical = diff.identical();
65         Assert.assertTrue("Xml differs: " + diff.toString(), identical);
66     }
67
68     private Map<String, String> mapPrefixed(final Iterable<Map.Entry<URI, String>> prefixes) {
69         final Map<String, String> mappedPrefixes = Maps.newHashMap();
70         for (final Map.Entry<URI, String> prefix : prefixes) {
71             mappedPrefixes.put(prefix.getKey().toString(), prefix.getValue());
72         }
73         return mappedPrefixes;
74     }
75
76     private QName getAttrQName(final String namespace, final String revision, final String localName, final Optional<String> prefix) {
77
78         if(prefix.isPresent()) {
79             final QName moduleQName = QName.create(namespace, revision, "module");
80             final QNameModule module = QNameModule.create(moduleQName.getNamespace(), moduleQName.getRevision());
81             return QName.create(module, prefix.get(), localName);
82         } else {
83             return QName.create(namespace, revision, localName);
84         }
85     }
86 }