2 * Copyright (c) 2014 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
9 package org.opendaylight.yangtools.yang.data.impl.codec.xml;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertTrue;
14 import com.google.common.base.Optional;
15 import com.google.common.collect.Lists;
16 import com.google.common.collect.Maps;
18 import java.io.ByteArrayOutputStream;
21 import java.util.AbstractMap;
22 import java.util.Collections;
25 import javax.xml.stream.XMLOutputFactory;
26 import javax.xml.stream.XMLStreamWriter;
28 import org.custommonkey.xmlunit.Diff;
29 import org.custommonkey.xmlunit.XMLUnit;
30 import org.junit.Test;
31 import org.opendaylight.yangtools.yang.common.QName;
32 import org.opendaylight.yangtools.yang.common.QNameModule;
33 import org.opendaylight.yangtools.yang.data.api.Node;
34 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
35 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
36 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
37 import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl;
38 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
39 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
40 import org.w3c.dom.Document;
42 public class XmlStreamUtilsTest {
44 public static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newFactory();
47 public void testWriteAttribute() throws Exception {
48 final ByteArrayOutputStream out = new ByteArrayOutputStream();
49 final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
50 writer.writeStartElement("element");
52 QName name = getAttrQName("namespace", "2012-12-12", "attr", Optional.of("prefix"));
53 final Map.Entry<QName, String> attributeEntry = new AbstractMap.SimpleEntry<>(name, "value");
55 name = getAttrQName("namespace2", "2012-12-12", "attr", Optional.<String>absent());
56 final Map.Entry<QName, String> attributeEntryNoPrefix = new AbstractMap.SimpleEntry<>(name, "value");
58 final RandomPrefix randomPrefix = new RandomPrefix();
59 XmlStreamUtils.writeAttribute(writer, attributeEntry, randomPrefix);
60 XmlStreamUtils.writeAttribute(writer, attributeEntryNoPrefix, randomPrefix);
62 writer.writeEndElement();
66 final String xmlAsString = new String(out.toByteArray());
68 final Map<String, String> mappedPrefixes = mapPrefixed(randomPrefix.getPrefixes());
69 assertEquals(2, mappedPrefixes.size());
70 final String randomPrefixValue = mappedPrefixes.get("namespace2");
72 final String expectedXmlAsString = "<element xmlns:a=\"namespace\" a:attr=\"value\" xmlns:" + randomPrefixValue + "=\"namespace2\" " + randomPrefixValue + ":attr=\"value\"></element>";
74 XMLUnit.setIgnoreAttributeOrder(true);
75 final Document control = XMLUnit.buildControlDocument(expectedXmlAsString);
76 final Document test = XMLUnit.buildTestDocument(xmlAsString);
77 final Diff diff = XMLUnit.compareXML(control, test);
79 final boolean identical = diff.identical();
80 assertTrue("Xml differs: " + diff.toString(), identical);
84 public void testEmptyNodeWithAttribute() throws Exception {
85 final ByteArrayOutputStream out = new ByteArrayOutputStream();
86 final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
88 final Map<QName, String> attrs = Maps.newHashMap();
89 attrs.put(QName.create("namespaceAttr", "2012-12-12", "attr1"), "value");
90 final QName qName = QName.create("urn:opendaylight:controller:rpc:test", "2014-07-28", "cont");
91 final ImmutableCompositeNode dataAttributes = ImmutableCompositeNode.create(qName, attrs, Collections.<Node<?>>emptyList());
92 XmlStreamUtils.create(XmlUtils.DEFAULT_XML_CODEC_PROVIDER).writeDocument(writer, dataAttributes);
97 final String xmlAsString = new String(out.toByteArray());
99 // 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
100 final String expectedXmlAsString = "<cont xmlns:a=\"namespaceAttr\" a:attr1=\"value\"></cont>";
102 XMLUnit.setIgnoreAttributeOrder(true);
103 final Document control = XMLUnit.buildControlDocument(expectedXmlAsString);
104 final Document test = XMLUnit.buildTestDocument(xmlAsString);
105 final Diff diff = XMLUnit.compareXML(control, test);
107 final boolean identical = diff.identical();
108 assertTrue("Xml differs: " + diff.toString(), identical);
111 private Map<String, String> mapPrefixed(final Iterable<Map.Entry<URI, String>> prefixes) {
112 final Map<String, String> mappedPrefixes = Maps.newHashMap();
113 for (final Map.Entry<URI, String> prefix : prefixes) {
114 mappedPrefixes.put(prefix.getKey().toString(), prefix.getValue());
116 return mappedPrefixes;
119 private QName getAttrQName(final String namespace, final String revision, final String localName, final Optional<String> prefix) {
121 if(prefix.isPresent()) {
122 final QName moduleQName = QName.create(namespace, revision, "module");
123 final QNameModule module = QNameModule.create(moduleQName.getNamespace(), moduleQName.getRevision());
124 return QName.create(module, prefix.get(), localName);
126 return QName.create(namespace, revision, localName);