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