2 * Copyright (c) 2017 Pantheon Technologies s.r.o. 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
8 package org.opendaylight.yangtools.yang.data.codec.xml;
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;
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;
31 public class StrictParsingModeTest {
32 private static EffectiveModelContext schemaContext;
35 public static void beforeClass() {
36 schemaContext = YangParserTestUtils.parseYangResource("/strict-parsing-mode-test/foo.yang");
40 public static void afterClass() {
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");
50 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
52 final NormalizedNodeResult result = new NormalizedNodeResult();
53 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
55 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter,
56 Inference.ofDataTreePath(schemaContext, QName.create("foo", "top-level-container")), false);
57 xmlParser.parse(reader);
59 final NormalizedNode transformedInput = result.getResult();
60 assertNotNull(transformedInput);
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");
70 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
72 final NormalizedNodeResult result = new NormalizedNodeResult();
73 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
75 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter,
76 Inference.ofDataTreePath(schemaContext, QName.create("foo", "top-level-container")), true);
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"));