Speed up YT891 test
[yangtools.git] / yang / yang-data-codec-xml / src / test / java / org / opendaylight / yangtools / yang / data / codec / xml / Yangtools891Test.java
1 /*
2  * Copyright (c) 2018 Cisco Systems, Inc. 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 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;
36
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);
48
49     private static SchemaContext schemaContext;
50     private static LeafRefContext leafRefContext;
51     private static ContainerSchemaNode fooTopNode;
52     private static ContainerSchemaNode bazTopNode;
53
54     private DataTree dataTree;
55
56     @Before
57     public void before() {
58         dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
59     }
60
61     @BeforeClass
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();
69     }
70
71     @AfterClass
72     public static void afterClass() {
73         schemaContext = null;
74         leafRefContext = null;
75         fooTopNode = null;
76         bazTopNode = null;
77     }
78
79     @Test
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);
86
87         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
88         dataTree.commit(writeContributorsCandidate);
89     }
90
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);
98
99         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
100     }
101
102     @Test
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);
111
112         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
113     }
114
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);
124
125         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
126     }
127
128     private static NormalizedNode<?, ?> readNode(final String filename, final ContainerSchemaNode node)
129             throws Exception {
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();
137     }
138 }