2 * Copyright (c) 2018 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
8 package org.opendaylight.yangtools.yang.data.codec.xml;
10 import java.io.InputStream;
11 import javax.xml.stream.XMLStreamReader;
12 import org.junit.AfterClass;
13 import org.junit.Before;
14 import org.junit.BeforeClass;
15 import org.junit.Test;
16 import org.opendaylight.yangtools.util.xml.UntrustedXML;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.common.Revision;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
22 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
23 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
24 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
25 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
26 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContext;
27 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefDataValidationFailedException;
28 import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefValidation;
29 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
30 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
31 import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
32 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.Module;
34 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
35 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
37 public class Yangtools891Test {
38 private static final String FOO = "foo";
39 private static final String FOO_NS = "urn:opendaylight:params:xml:ns:yang:foo";
40 private static final String FOO_REV = "2018-07-27";
41 private static final QName FOO_TOP = QName.create(FOO_NS, FOO_REV, "foo-top");
42 private static final YangInstanceIdentifier FOO_TOP_ID = YangInstanceIdentifier.of(FOO_TOP);
43 private static final String BAZ = "baz";
44 private static final String BAZ_NS = "urn:opendaylight:params:xml:ns:yang:baz";
45 private static final String BAZ_REV = "2018-07-27";
46 private static final QName BAZ_TOP = QName.create(BAZ_NS, BAZ_REV, "baz-top");
47 private static final YangInstanceIdentifier BAZ_TOP_ID = YangInstanceIdentifier.of(BAZ_TOP);
49 private static SchemaContext schemaContext;
50 private static LeafRefContext leafRefContext;
51 private static ContainerSchemaNode fooTopNode;
52 private static ContainerSchemaNode bazTopNode;
54 private DataTree dataTree;
57 public void before() {
58 dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
62 public static void beforeClass() {
63 schemaContext = YangParserTestUtils.parseYangResourceDirectory("/yangtools891");
64 leafRefContext = LeafRefContext.create(schemaContext);
65 final Module fooModule = schemaContext.findModule(FOO, Revision.of(FOO_REV)).get();
66 fooTopNode = (ContainerSchemaNode) fooModule.findDataChildByName(FOO_TOP).get();
67 final Module bazModule = schemaContext.findModule(BAZ, Revision.of(BAZ_REV)).get();
68 bazTopNode = (ContainerSchemaNode) bazModule.findDataChildByName(BAZ_TOP).get();
72 public static void afterClass() {
74 leafRefContext = null;
80 public void testValid() throws Exception {
81 final NormalizedNode<?, ?> fooTop = readNode("/yangtools891/grouping-with-list-valid.xml", fooTopNode);
82 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
83 writeModification.write(FOO_TOP_ID, fooTop);
84 writeModification.ready();
85 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
87 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
88 dataTree.commit(writeContributorsCandidate);
91 @Test(expected = LeafRefDataValidationFailedException.class)
92 public void testInvalid() throws Exception {
93 final NormalizedNode<?, ?> fooTop = readNode("/yangtools891/grouping-with-list-invalid.xml", fooTopNode);
94 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
95 writeModification.write(FOO_TOP_ID, fooTop);
96 writeModification.ready();
97 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
99 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
103 public void testGroupingWithLeafrefValid() throws Exception {
104 final NormalizedNode<?, ?> bazTop = readNode("/yangtools891/baz-top.xml", bazTopNode);
105 final NormalizedNode<?, ?> fooTop = readNode("/yangtools891/grouping-with-leafref-valid.xml", fooTopNode);
106 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
107 writeModification.write(BAZ_TOP_ID, bazTop);
108 writeModification.write(FOO_TOP_ID, fooTop);
109 writeModification.ready();
110 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
112 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
115 @Test(expected = LeafRefDataValidationFailedException.class)
116 public void testGroupingWithLeafrefInvalid() throws Exception {
117 final NormalizedNode<?, ?> bazTop = readNode("/yangtools891/baz-top.xml", bazTopNode);
118 final NormalizedNode<?, ?> fooTop = readNode("/yangtools891/grouping-with-leafref-invalid.xml", fooTopNode);
119 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
120 writeModification.write(BAZ_TOP_ID, bazTop);
121 writeModification.write(FOO_TOP_ID, fooTop);
122 writeModification.ready();
123 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
125 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
128 private static NormalizedNode<?, ?> readNode(final String filename, final ContainerSchemaNode node)
130 final InputStream resourceAsStream = Yangtools891Test.class.getResourceAsStream(filename);
131 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
132 final NormalizedNodeResult result = new NormalizedNodeResult();
133 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
134 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, node);
135 xmlParser.parse(reader);
136 return result.getResult();