From c946e61de9daece3bce9412187eaf7c91d406fb9 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 15 Jan 2019 19:19:08 +0100 Subject: [PATCH] Fix default namespace emission When we are emitting opening a new element, we need to consult XMLStreamWriter before we emit the element, otherwise its state already reflects the newly-started element. In non-repairing mode the JDK writer will accept our invocation and update the namespace mapping, which will lead us to erroneously assume we do not need to emit the declaration. Since it is non-repairing, it will not emit the declaration itself, leading to a blank document -- something for which we are actually testing in one of our tests. In order to improve the confidence in results, also update tests which used only repairing factories to use both repairing and non-repairing ones. JIRA: YANGTOOLS-801 Change-Id: I6975cf21121f7a8f92056b5b49b31d53b685dc0f Signed-off-by: Robert Varga (cherry picked from commit 706aaed3e21eb3c5d080ee974f27b9348c3d2e92) --- .../XMLStreamNormalizedNodeStreamWriter.java | 18 +++++--- .../yang/data/codec/xml/Bug5446Test.java | 10 +---- .../yang/data/codec/xml/Bug8745Test.java | 41 ++++++++++++++---- .../yang/data/codec/xml/Bug8803Test.java | 40 ++++++++++++++---- .../xml/DOMSourceXMLStreamReaderTest.java | 39 +++++++++++++---- .../xml/NormalizedNodeXmlTranslationTest.java | 21 +++++----- .../codec/xml/NormalizedNodesToXmlTest.java | 35 +++++++++++++--- ...SchemaOrderedNormalizedNodeWriterTest.java | 27 +++++++----- ...LStreamNormalizedNodeStreamWriterTest.java | 17 ++++++-- .../yang/data/codec/xml/TestFactories.java | 40 ++++++++++++++++++ .../data/codec/xml/XmlStreamUtilsTest.java | 8 +--- .../YangModeledAnyXMLSerializationTest.java | 42 ++++++++++++++----- 12 files changed, 252 insertions(+), 86 deletions(-) create mode 100644 yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/TestFactories.java diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java index 0f5ab22666..44c1fd216c 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java @@ -161,13 +161,19 @@ public abstract class XMLStreamNormalizedNodeStreamWriter implements Normaliz } private void writeStartElement(final QName qname) throws XMLStreamException { - String ns = qname.getNamespace().toString(); + final String ns = qname.getNamespace().toString(); + final NamespaceContext context = writer.getNamespaceContext(); + final boolean needDefaultNs; + if (context != null) { + final String parentNs = context.getNamespaceURI(XMLConstants.DEFAULT_NS_PREFIX); + needDefaultNs = !ns.equals(parentNs); + } else { + needDefaultNs = false; + } + writer.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, qname.getLocalName(), ns); - if (writer.getNamespaceContext() != null) { - String parentNs = writer.getNamespaceContext().getNamespaceURI(XMLConstants.DEFAULT_NS_PREFIX); - if (!ns.equals(parentNs)) { - writer.writeDefaultNamespace(ns); - } + if (needDefaultNs) { + writer.writeDefaultNamespace(ns); } } diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug5446Test.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug5446Test.java index d297f8e84b..3fe82d80cd 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug5446Test.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug5446Test.java @@ -15,7 +15,6 @@ import java.io.InputStream; import java.io.StringWriter; import java.net.URI; import java.util.Optional; -import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.OutputKeys; @@ -50,13 +49,6 @@ import org.w3c.dom.Node; import org.xml.sax.SAXException; public class Bug5446Test extends XMLTestCase { - private static final XMLOutputFactory XML_FACTORY; - - static { - XML_FACTORY = XMLOutputFactory.newFactory(); - XML_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.FALSE); - } - private static final QNameModule FOO_MODULE = QNameModule.create(URI.create("foo"), Revision.of("2015-11-05")); private static final QName ROOT_QNAME = QName.create(FOO_MODULE, "root"); private static final QName IP_ADDRESS_QNAME = QName.create(FOO_MODULE, "ip-address"); @@ -111,7 +103,7 @@ public class Bug5446Test extends XMLTestCase { NormalizedNodeStreamWriter normalizedNodeStreamWriter = null; XMLStreamWriter writer = null; try { - writer = XML_FACTORY.createXMLStreamWriter(result); + writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(result); normalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(writer, context); normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(normalizedNodeStreamWriter); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java index 6661c09806..64dde90e8d 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java @@ -5,7 +5,6 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.yangtools.yang.data.codec.xml; import static java.util.Objects.requireNonNull; @@ -13,6 +12,7 @@ import static java.util.Objects.requireNonNull; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; +import java.util.Collection; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; @@ -27,7 +27,11 @@ import javax.xml.transform.stream.StreamResult; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; @@ -40,33 +44,52 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; +@RunWith(Parameterized.class) public class Bug8745Test { + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return TestFactories.junitParameters(); + } + + private static SchemaContext SCHEMA_CONTEXT; + + private final XMLOutputFactory factory; + + public Bug8745Test(final String factoryMode, final XMLOutputFactory factory) { + this.factory = factory; + } + + @BeforeClass + public static void beforeClass() { + SCHEMA_CONTEXT = YangParserTestUtils.parseYangResource("/bug8745/foo.yang"); + } + + @AfterClass + public static void afterClass() { + SCHEMA_CONTEXT = null; + } @Test public void testParsingAttributes() throws Exception { - final SchemaContext schemaContext = YangParserTestUtils.parseYangResource("/bug8745/foo.yang"); final QName contWithAttributes = QName.create("foo", "cont-with-attributes"); final ContainerSchemaNode contWithAttr = (ContainerSchemaNode) SchemaContextUtil.findDataSchemaNode( - schemaContext, SchemaPath.create(true, contWithAttributes)); + SCHEMA_CONTEXT, SchemaPath.create(true, contWithAttributes)); final Document doc = loadDocument("/bug8745/foo.xml"); final DOMSource domSource = new DOMSource(doc.getDocumentElement()); final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument()); - final XMLOutputFactory outputfactory = XMLOutputFactory.newInstance(); - outputfactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); - - final XMLStreamWriter xmlStreamWriter = outputfactory.createXMLStreamWriter(domResult); + final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult); final NormalizedNodeStreamWriter streamWriter = XMLStreamNormalizedNodeStreamWriter.create( - xmlStreamWriter, schemaContext); + xmlStreamWriter, SCHEMA_CONTEXT); final InputStream resourceAsStream = Bug8745Test.class.getResourceAsStream("/bug8745/foo.xml"); // final XMLStreamReader reader = inputFactory.createXMLStreamReader(resourceAsStream); final XMLStreamReader reader = new DOMSourceXMLStreamReader(domSource); - final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, contWithAttr); + final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, contWithAttr); xmlParser.parse(reader); XMLUnit.setIgnoreWhitespace(true); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8803Test.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8803Test.java index 97e9d80c5e..ea1a026e2d 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8803Test.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8803Test.java @@ -13,10 +13,15 @@ import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.io.StringWriter; +import java.util.Collection; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -31,13 +36,35 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; +@RunWith(Parameterized.class) public class Bug8803Test { + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return TestFactories.junitParameters(); + } + + private static SchemaContext SCHEMA_CONTEXT; + + private final XMLOutputFactory factory; + + public Bug8803Test(final String factoryMode, final XMLOutputFactory factory) { + this.factory = factory; + } + + @BeforeClass + public static void beforeClass() { + SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/bug8803"); + } + + @AfterClass + public static void afterClass() { + SCHEMA_CONTEXT = null; + } @Test public void test() throws Exception { - final SchemaContext schemaContext = YangParserTestUtils.parseYangResourceDirectory("/bug8803"); final SchemaPath topContPath = SchemaPath.create(true, QName.create("foo-ns", "top-cont")); - final SchemaNode dataSchemaNode = SchemaContextUtil.findDataSchemaNode(schemaContext, topContPath); + final SchemaNode dataSchemaNode = SchemaContextUtil.findDataSchemaNode(SCHEMA_CONTEXT, topContPath); assertTrue(dataSchemaNode instanceof ContainerSchemaNode); final ContainerSchemaNode topContSchema = (ContainerSchemaNode) dataSchemaNode; @@ -48,20 +75,17 @@ public class Bug8803Test { final NormalizedNodeResult result = new NormalizedNodeResult(); final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result); - final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, topContSchema); + final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, topContSchema); xmlParser.parse(reader); final NormalizedNode transformedInput = result.getResult(); assertNotNull(transformedInput); // serialization final StringWriter writer = new StringWriter(); - final XMLOutputFactory outputFactory = XMLOutputFactory.newFactory(); - // switching NS repairing to false does not help - outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); - final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(writer); + final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(writer); final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create( - xmlStreamWriter, schemaContext); + xmlStreamWriter, SCHEMA_CONTEXT); final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter( xmlNormalizedNodeStreamWriter); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceXMLStreamReaderTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceXMLStreamReaderTest.java index 6606a44e01..d76283b49b 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceXMLStreamReaderTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceXMLStreamReaderTest.java @@ -15,6 +15,7 @@ import com.google.common.collect.ImmutableList; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; +import java.util.Collection; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; @@ -26,7 +27,11 @@ import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -42,13 +47,35 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; +@RunWith(Parameterized.class) public class DOMSourceXMLStreamReaderTest { + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return TestFactories.junitParameters(); + } + + private static SchemaContext SCHEMA_CONTEXT; + + private final XMLOutputFactory factory; + + public DOMSourceXMLStreamReaderTest(final String factoryMode, final XMLOutputFactory factory) { + this.factory = factory; + } + + @BeforeClass + public static void beforeClass() { + SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/dom-reader-test"); + } + + @AfterClass + public static void afterClass() { + SCHEMA_CONTEXT = null; + } @Test public void test() throws Exception { - final SchemaContext schemaContext = YangParserTestUtils.parseYangResourceDirectory("/dom-reader-test"); final ContainerSchemaNode outerContainerSchema = (ContainerSchemaNode) SchemaContextUtil - .findNodeInSchemaContext(schemaContext, ImmutableList.of(QName.create("foo-ns", "top-cont"))); + .findNodeInSchemaContext(SCHEMA_CONTEXT, ImmutableList.of(QName.create("foo-ns", "top-cont"))); assertNotNull(outerContainerSchema); // deserialization @@ -58,7 +85,7 @@ public class DOMSourceXMLStreamReaderTest { final NormalizedNodeResult result = new NormalizedNodeResult(); final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result); - final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, outerContainerSchema); + final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, outerContainerSchema); xmlParser.parse(domXMLReader); final NormalizedNode transformedInput = result.getResult(); assertNotNull(transformedInput); @@ -66,12 +93,10 @@ public class DOMSourceXMLStreamReaderTest { // serialization //final StringWriter writer = new StringWriter(); final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument()); - final XMLOutputFactory outputFactory = XMLOutputFactory.newFactory(); - outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); - final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(domResult); + final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult); final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create( - xmlStreamWriter, schemaContext); + xmlStreamWriter, SCHEMA_CONTEXT); final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter( xmlNormalizedNodeStreamWriter); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodeXmlTranslationTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodeXmlTranslationTest.java index 70b4a5e3e9..6d36877c5d 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodeXmlTranslationTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodeXmlTranslationTest.java @@ -99,13 +99,6 @@ public class NormalizedNodeXmlTranslationTest { private static final String NAMESPACE = "urn:opendaylight:params:xml:ns:yang:controller:test"; private static final Revision REVISION = Revision.of("2014-03-13"); - static final XMLOutputFactory XML_FACTORY; - - static { - XML_FACTORY = XMLOutputFactory.newFactory(); - XML_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.FALSE); - } - private static ContainerNode augmentChoiceHell2() { final NodeIdentifier container = getNodeIdentifier("container"); final QName augmentChoice1QName = QName.create(container.getNodeType(), "augment-choice1"); @@ -260,8 +253,17 @@ public class NormalizedNodeXmlTranslationTest { private final ContainerSchemaNode containerNode; private final String xmlPath; + @Test + public void testTranslationRepairing() throws Exception { + testTranslation(TestFactories.REPAIRING_OUTPUT_FACTORY); + } + @Test public void testTranslation() throws Exception { + testTranslation(TestFactories.DEFAULT_OUTPUT_FACTORY); + } + + private void testTranslation(final XMLOutputFactory factory) throws Exception { final InputStream resourceAsStream = XmlToNormalizedNodesTest.class.getResourceAsStream(xmlPath); final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream); @@ -282,10 +284,7 @@ public class NormalizedNodeXmlTranslationTest { final Document document = UntrustedXML.newDocumentBuilder().newDocument(); final DOMResult domResult = new DOMResult(document); - final XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); - outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); - - final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(domResult); + final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult); final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter .create(xmlStreamWriter, schema); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodesToXmlTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodesToXmlTest.java index f7f4e97adb..6188148f0e 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodesToXmlTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodesToXmlTest.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.net.URI; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -33,8 +34,12 @@ import org.custommonkey.xmlunit.DifferenceListener; import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener; import org.custommonkey.xmlunit.XMLTestCase; import org.custommonkey.xmlunit.XMLUnit; +import org.junit.AfterClass; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -58,7 +63,12 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; +@RunWith(Parameterized.class) public class NormalizedNodesToXmlTest { + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return TestFactories.junitParameters(); + } private QNameModule bazModule; @@ -85,6 +95,24 @@ public class NormalizedNodesToXmlTest { private QName mySecondKeyLeaf; private QName myLeafInList3; + private static SchemaContext SCHEMA_CONTEXT; + + private final XMLOutputFactory factory; + + public NormalizedNodesToXmlTest(final String factoryMode, final XMLOutputFactory factory) { + this.factory = factory; + } + + @BeforeClass + public static void beforeClass() { + SCHEMA_CONTEXT = YangParserTestUtils.parseYangResource("/baz.yang"); + } + + @AfterClass + public static void afterClass() { + SCHEMA_CONTEXT = null; + } + @Before public void setup() { bazModule = QNameModule.create(URI.create("baz-namespace")); @@ -115,19 +143,14 @@ public class NormalizedNodesToXmlTest { @Test public void testNormalizedNodeToXmlSerialization() throws XMLStreamException, IOException, SAXException { - final SchemaContext schemaContext = YangParserTestUtils.parseYangResource("/baz.yang"); - final Document doc = loadDocument("/baz.xml"); final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument()); - final XMLOutputFactory factory = XMLOutputFactory.newInstance(); - factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); - final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult); final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create( - xmlStreamWriter, schemaContext); + xmlStreamWriter, SCHEMA_CONTEXT); final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter( xmlNormalizedNodeStreamWriter); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaOrderedNormalizedNodeWriterTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaOrderedNormalizedNodeWriterTest.java index b2cfba716e..0e63b5e215 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaOrderedNormalizedNodeWriterTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaOrderedNormalizedNodeWriterTest.java @@ -10,16 +10,17 @@ package org.opendaylight.yangtools.yang.data.codec.xml; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; +import java.util.Collection; import java.util.List; -import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; -import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; @@ -35,10 +36,15 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; import org.xml.sax.SAXException; +@RunWith(Parameterized.class) public class SchemaOrderedNormalizedNodeWriterTest { + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return TestFactories.junitParameters(); + } private static final String EXPECTED_1 = "" - + "\n" + + "\n" + " \n" + " policy1\n" + " \n" @@ -61,7 +67,7 @@ public class SchemaOrderedNormalizedNodeWriterTest { private static final String EXPECTED_2 = "" - + "\n" + + "\n" + " id1\n" + " \n" + " content1\n" @@ -74,16 +80,17 @@ public class SchemaOrderedNormalizedNodeWriterTest { private static final String POLICY_NODE = "policy"; private static final String ORDER_NAMESPACE = "order"; + private final XMLOutputFactory factory; - @Before - public void setUp() { + public SchemaOrderedNormalizedNodeWriterTest(final String factoryMode, final XMLOutputFactory factory) { + this.factory = factory; XMLUnit.setIgnoreWhitespace(true); } @Test - public void testWrite() throws XMLStreamException, FactoryConfigurationError, IOException, SAXException { + public void testWrite() throws XMLStreamException, IOException, SAXException { final StringWriter stringWriter = new StringWriter(); - final XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newFactory().createXMLStreamWriter(stringWriter); + final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(stringWriter); SchemaContext schemaContext = getSchemaContext("/bug1848/foo.yang"); NormalizedNodeStreamWriter writer = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, schemaContext); @@ -142,9 +149,9 @@ public class SchemaOrderedNormalizedNodeWriterTest { } @Test - public void testWriteOrder() throws Exception { + public void testWriteOrder() throws XMLStreamException, IOException, SAXException { final StringWriter stringWriter = new StringWriter(); - final XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newFactory().createXMLStreamWriter(stringWriter); + final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(stringWriter); SchemaContext schemaContext = getSchemaContext("/bug1848/order.yang"); NormalizedNodeStreamWriter writer = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, schemaContext); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemalessXMLStreamNormalizedNodeStreamWriterTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemalessXMLStreamNormalizedNodeStreamWriterTest.java index 9a73627410..26bcce1971 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemalessXMLStreamNormalizedNodeStreamWriterTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemalessXMLStreamNormalizedNodeStreamWriterTest.java @@ -15,6 +15,7 @@ import java.io.InputStream; import java.io.StringWriter; import java.net.URI; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -37,6 +38,8 @@ import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -64,7 +67,14 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; +@RunWith(Parameterized.class) public class SchemalessXMLStreamNormalizedNodeStreamWriterTest { + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return TestFactories.junitParameters(); + } + + private final XMLOutputFactory factory; private QNameModule foobarModule; @@ -101,6 +111,10 @@ public class SchemalessXMLStreamNormalizedNodeStreamWriterTest { private DOMSource anyxmlDomSource; + public SchemalessXMLStreamNormalizedNodeStreamWriterTest(final String factoryMode, final XMLOutputFactory factory) { + this.factory = factory; + } + @Before public void setup() { foobarModule = QNameModule.create(URI.create("foobar-namespace"), Revision.of("2016-09-19")); @@ -145,9 +159,6 @@ public class SchemalessXMLStreamNormalizedNodeStreamWriterTest { final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument()); - final XMLOutputFactory factory = XMLOutputFactory.newInstance(); - factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); - final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult); final NormalizedNodeStreamWriter schemalessXmlNormalizedNodeStreamWriter = diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/TestFactories.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/TestFactories.java new file mode 100644 index 0000000000..da595c96a0 --- /dev/null +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/TestFactories.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2019 Pantheon Technologies, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.data.codec.xml; + +import java.util.Arrays; +import java.util.Collection; +import javax.xml.stream.XMLOutputFactory; + +final class TestFactories { + /** + * Non-repairing XMLOutputFactory. + */ + static final XMLOutputFactory DEFAULT_OUTPUT_FACTORY = XMLOutputFactory.newFactory(); + + /** + * Repairing XMLOuputFactory. + */ + static final XMLOutputFactory REPAIRING_OUTPUT_FACTORY; + + static { + REPAIRING_OUTPUT_FACTORY = XMLOutputFactory.newFactory(); + REPAIRING_OUTPUT_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); + } + + static Collection junitParameters() { + return Arrays.asList(new Object[][] { + { "default", DEFAULT_OUTPUT_FACTORY }, + { "repairing", REPAIRING_OUTPUT_FACTORY }, + }); + } + + private TestFactories() { + + } +} diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStreamUtilsTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStreamUtilsTest.java index c8365dd132..881e566a22 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStreamUtilsTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStreamUtilsTest.java @@ -5,7 +5,6 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.yangtools.yang.data.codec.xml; import static org.hamcrest.CoreMatchers.containsString; @@ -23,7 +22,6 @@ import java.util.Map; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.custommonkey.xmlunit.Diff; @@ -54,8 +52,6 @@ public class XmlStreamUtilsTest { void accept(XMLStreamWriter writer) throws XMLStreamException; } - public static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newFactory(); - private static SchemaContext schemaContext; private static Module leafRefModule; @@ -77,7 +73,7 @@ public class XmlStreamUtilsTest { @Test public void testWriteAttribute() throws Exception { final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out); + final XMLStreamWriter writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(out); writer.writeStartElement("element"); QName name = getAttrQName("namespace", "2012-12-12", "attr", Optional.of("prefix")); @@ -138,7 +134,7 @@ public class XmlStreamUtilsTest { private static String createXml(XMLStreamWriterConsumer consumer) throws XMLStreamException, IOException { final ByteArrayOutputStream out = new ByteArrayOutputStream(); - final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out); + final XMLStreamWriter writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(out); consumer.accept(writer); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/YangModeledAnyXMLSerializationTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/YangModeledAnyXMLSerializationTest.java index fb3c35dca3..7770138806 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/YangModeledAnyXMLSerializationTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/YangModeledAnyXMLSerializationTest.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.net.URI; +import java.util.Collection; import java.util.Optional; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; @@ -28,7 +29,11 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.custommonkey.xmlunit.XMLTestCase; import org.custommonkey.xmlunit.XMLUnit; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -54,23 +59,41 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; +@RunWith(Parameterized.class) public class YangModeledAnyXMLSerializationTest extends XMLTestCase { + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return TestFactories.junitParameters(); + } private final QNameModule bazModuleQName = QNameModule.create(URI.create("baz")); private final QName myAnyXMLDataBaz = QName.create(bazModuleQName, "my-anyxml-data"); private final QName bazQName = QName.create(bazModuleQName, "baz"); private final QName myContainer2QName = QName.create(bazModuleQName, "my-container-2"); - private final SchemaContext schemaContext; - public YangModeledAnyXMLSerializationTest() { - schemaContext = YangParserTestUtils.parseYangResourceDirectory("/anyxml-support/serialization"); + private static SchemaContext SCHEMA_CONTEXT; + + private final XMLOutputFactory factory; + + public YangModeledAnyXMLSerializationTest(final String factoryMode, final XMLOutputFactory factory) { + this.factory = factory; + } + + @BeforeClass + public static void beforeClass() { + SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/anyxml-support/serialization"); + } + + @AfterClass + public static void afterClass() { + SCHEMA_CONTEXT = null; } @Test public void testSerializationOfBaz() throws Exception { final InputStream resourceAsStream = XmlToNormalizedNodesTest.class.getResourceAsStream( "/anyxml-support/serialization/baz.xml"); - final Module bazModule = schemaContext.findModules("baz").iterator().next(); + final Module bazModule = SCHEMA_CONTEXT.findModules("baz").iterator().next(); final ContainerSchemaNode bazCont = (ContainerSchemaNode) bazModule.getDataChildByName( QName.create(bazModule.getQNameModule(), "baz")); assertNotNull(bazCont); @@ -81,7 +104,7 @@ public class YangModeledAnyXMLSerializationTest extends XMLTestCase { final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result); - final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, bazCont); + final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, bazCont); xmlParser.parse(reader); final NormalizedNode transformedInput = result.getResult(); @@ -97,7 +120,7 @@ public class YangModeledAnyXMLSerializationTest extends XMLTestCase { YangModeledAnyXmlNode yangModeledAnyXmlNode = (YangModeledAnyXmlNode) bazContainerChild.get(); DataSchemaNode schemaOfAnyXmlData = yangModeledAnyXmlNode.getSchemaOfAnyXmlData(); - SchemaNode myContainer2SchemaNode = SchemaContextUtil.findDataSchemaNode(schemaContext, + SchemaNode myContainer2SchemaNode = SchemaContextUtil.findDataSchemaNode(SCHEMA_CONTEXT, SchemaPath.create(true, bazQName, myContainer2QName)); assertTrue(myContainer2SchemaNode instanceof ContainerSchemaNode); assertEquals(myContainer2SchemaNode, schemaOfAnyXmlData); @@ -105,13 +128,10 @@ public class YangModeledAnyXMLSerializationTest extends XMLTestCase { final Document document = UntrustedXML.newDocumentBuilder().newDocument(); final DOMResult domResult = new DOMResult(document); - final XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); - outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); - - final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(domResult); + final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult); final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter - .create(xmlStreamWriter, schemaContext); + .create(xmlStreamWriter, SCHEMA_CONTEXT); final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter( xmlNormalizedNodeStreamWriter); -- 2.36.6