Migrate yang-data-tree-ri to JUnit5
[yangtools.git] / data / yang-data-tree-ri / src / test / java / org / opendaylight / yangtools / yang / data / tree / leafref / YT821Test.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.tree.leafref;
9
10 import static org.junit.jupiter.api.Assertions.assertThrows;
11
12 import org.junit.jupiter.api.AfterAll;
13 import org.junit.jupiter.api.BeforeAll;
14 import org.junit.jupiter.api.BeforeEach;
15 import org.junit.jupiter.api.Test;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
20 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
21 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
22 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
23 import org.opendaylight.yangtools.yang.data.tree.api.DataTree;
24 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
25 import org.opendaylight.yangtools.yang.data.tree.impl.di.InMemoryDataTreeFactory;
26 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
27 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
28
29 class YT821Test {
30     private static final QName ROOT = QName.create("urn:opendaylight:params:xml:ns:yang:foo", "2018-07-18", "root");
31     private static final QName FOO = QName.create(ROOT, "foo");
32     private static final QName BAR = QName.create(ROOT, "bar");
33     private static final QName NAME = QName.create(ROOT, "name");
34     private static final QName CONTAINER_IN_LIST = QName.create(ROOT, "container-in-list");
35     private static final QName REF_FROM_AUG = QName.create(ROOT, "ref-from-aug");
36     private static final QName CONTAINER_FROM_AUG = QName.create(ROOT, "container-from-aug");
37     private static final QName REF_IN_CONTAINER = QName.create(ROOT, "ref-in-container");
38     private static final YangInstanceIdentifier ROOT_ID = YangInstanceIdentifier.of(ROOT);
39
40     private static EffectiveModelContext schemaContext;
41     private static LeafRefContext leafRefContext;
42
43     private DataTree dataTree;
44
45     @BeforeAll
46     static void beforeClass() {
47         schemaContext = YangParserTestUtils.parseYang("""
48             module yt821 {
49               namespace "urn:opendaylight:params:xml:ns:yang:foo";
50               prefix foo;
51               revision 2018-07-18;
52
53               container root {
54                 list foo {
55                   key name;
56                   leaf name {
57                     type string;
58                   }
59                 }
60
61                 list bar {
62                   key name;
63                   leaf name {
64                     type string;
65                   }
66
67                   container container-in-list {
68                   }
69                 }
70               }
71
72               augment /root/bar/container-in-list {
73                 leaf ref-from-aug {
74                   type leafref {
75                     path "/root/foo/name";
76                   }
77                 }
78               }
79
80               augment /root/bar/ {
81                 container container-from-aug {
82                   leaf ref-in-container {
83                     type leafref {
84                       path "/root/foo/name";
85                     }
86                   }
87                 }
88               }
89             }""");
90         leafRefContext = LeafRefContext.create(schemaContext);
91     }
92
93     @AfterAll
94     static void afterClass() {
95         schemaContext = null;
96         leafRefContext = null;
97     }
98
99     @BeforeEach
100     void before() {
101         dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
102     }
103
104     @Test
105     void testValidRefFromAugmentation() throws Exception {
106         final var writeModification = dataTree.takeSnapshot().newModification();
107         writeModification.write(ROOT_ID, refFromAug("foo1"));
108         writeModification.ready();
109         final var writeContributorsCandidate = dataTree.prepare(writeModification);
110
111         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
112         dataTree.commit(writeContributorsCandidate);
113     }
114
115     @Test
116     void testInvalidRefFromAugmentation() throws Exception {
117         assertThrows(LeafRefDataValidationFailedException.class, () -> {
118             final var writeModification = dataTree.takeSnapshot().newModification();
119             writeModification.write(ROOT_ID, refFromAug("foo2"));
120             writeModification.ready();
121             final var writeContributorsCandidate = dataTree.prepare(writeModification);
122
123             LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
124         });
125     }
126
127     @Test
128     void testValidRefInContainerFromAugmentation() throws Exception {
129         final var writeModification = dataTree.takeSnapshot().newModification();
130         writeModification.write(ROOT_ID, refInContainer("foo1"));
131         writeModification.ready();
132         final var writeContributorsCandidate = dataTree.prepare(writeModification);
133
134         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
135         dataTree.commit(writeContributorsCandidate);
136     }
137
138     @Test
139     void testInvalidRefInContainerFromAugmentation() throws Exception {
140         assertThrows(LeafRefDataValidationFailedException.class, () -> {
141             final var writeModification = dataTree.takeSnapshot().newModification();
142             writeModification.write(ROOT_ID, refInContainer("foo2"));
143             writeModification.ready();
144             final var writeContributorsCandidate = dataTree.prepare(writeModification);
145
146             LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
147         });
148     }
149
150     private static ContainerNode refFromAug(final String refValue) {
151         return Builders.containerBuilder()
152                 .withNodeIdentifier(new NodeIdentifier(ROOT))
153                 .withChild(Builders.mapBuilder()
154                     .withNodeIdentifier(new NodeIdentifier(FOO))
155                     .withChild(Builders.mapEntryBuilder()
156                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(FOO, NAME, "foo1"))
157                         .withChild(ImmutableNodes.leafNode(NAME, "foo1"))
158                         .build())
159                     .build())
160                 .withChild(Builders.mapBuilder()
161                     .withNodeIdentifier(new NodeIdentifier(BAR))
162                     .withChild(Builders.mapEntryBuilder()
163                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(BAR, NAME, "bar1"))
164                         .withChild(ImmutableNodes.leafNode(NAME, "bar1"))
165                         .withChild(Builders.containerBuilder()
166                             .withNodeIdentifier(new NodeIdentifier(CONTAINER_IN_LIST))
167                             .withChild(ImmutableNodes.leafNode(REF_FROM_AUG, refValue))
168                             .build())
169                         .build())
170                     .build())
171                 .build();
172     }
173
174     private static ContainerNode refInContainer(final String refValue) {
175         return Builders.containerBuilder()
176                 .withNodeIdentifier(new NodeIdentifier(ROOT))
177                 .withChild(Builders.mapBuilder()
178                     .withNodeIdentifier(new NodeIdentifier(FOO))
179                     .withChild(Builders.mapEntryBuilder()
180                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(FOO, NAME, "foo1"))
181                         .withChild(ImmutableNodes.leafNode(NAME, "foo1"))
182                         .build())
183                     .build())
184                 .withChild(Builders.mapBuilder()
185                     .withNodeIdentifier(new NodeIdentifier(BAR))
186                     .withChild(Builders.mapEntryBuilder()
187                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(BAR, NAME, "bar1"))
188                         .withChild(ImmutableNodes.leafNode(NAME, "bar1"))
189                         .withChild(Builders.containerBuilder()
190                             .withNodeIdentifier(new NodeIdentifier(CONTAINER_FROM_AUG))
191                             .withChild(ImmutableNodes.leafNode(REF_IN_CONTAINER, refValue))
192                             .build())
193                         .build())
194                     .build())
195                 .build();
196     }
197 }