Move yang-common(-netty)
[yangtools.git] / codec / yang-data-codec-xml / src / test / java / org / opendaylight / yangtools / yang / data / codec / xml / StrictParsingModeTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.hamcrest.CoreMatchers.containsString;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertThrows;
14
15 import java.io.InputStream;
16 import javax.xml.stream.XMLStreamException;
17 import javax.xml.stream.XMLStreamReader;
18 import org.junit.AfterClass;
19 import org.junit.BeforeClass;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.util.xml.UntrustedXML;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
25 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
26 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
27 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
28 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
29 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
30
31 public class StrictParsingModeTest {
32     private static EffectiveModelContext schemaContext;
33
34     @BeforeClass
35     public static void beforeClass() {
36         schemaContext = YangParserTestUtils.parseYangResource("/strict-parsing-mode-test/foo.yang");
37     }
38
39     @AfterClass
40     public static void afterClass() {
41         schemaContext = null;
42     }
43
44     @Test
45     // unknown child nodes in the top-level-container node will be skipped when the strictParsing is set to false
46     public void testLenientParsing() throws Exception {
47         final InputStream resourceAsStream = StrictParsingModeTest.class.getResourceAsStream(
48                 "/strict-parsing-mode-test/foo.xml");
49
50         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
51
52         final NormalizedNodeResult result = new NormalizedNodeResult();
53         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
54
55         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter,
56             Inference.ofDataTreePath(schemaContext, QName.create("foo", "top-level-container")), false);
57         xmlParser.parse(reader);
58
59         final NormalizedNode transformedInput = result.getResult();
60         assertNotNull(transformedInput);
61     }
62
63     @Test
64     // should fail because strictParsing is switched on and the top-level-container node contains child nodes
65     // which are not defined in the provided YANG model
66     public void testStrictParsing() throws Exception {
67         final InputStream resourceAsStream = StrictParsingModeTest.class.getResourceAsStream(
68                 "/strict-parsing-mode-test/foo.xml");
69
70         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
71
72         final NormalizedNodeResult result = new NormalizedNodeResult();
73         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
74
75         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter,
76             Inference.ofDataTreePath(schemaContext, QName.create("foo", "top-level-container")), true);
77
78         final XMLStreamException ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
79         assertThat(ex.getMessage(), containsString("Schema for node with name unknown-container-a and namespace foo "
80             + "does not exist in parent container top-level-container"));
81     }
82 }