890dcae5e71605b80635527bc4c8c952c2ef7e08
[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 org.junit.AfterClass;
11 import org.junit.Before;
12 import org.junit.BeforeClass;
13 import org.junit.Test;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
18 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
19 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
20 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
21 import org.opendaylight.yangtools.yang.data.tree.api.DataTree;
22 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
23 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
24 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
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 public 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     @BeforeClass
46     public 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     @AfterClass
94     public static void afterClass() {
95         schemaContext = null;
96         leafRefContext = null;
97     }
98
99     @Before
100     public void before() {
101         dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
102     }
103
104     @Test
105     public void testValidRefFromAugmentation() throws Exception {
106         final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
107         writeModification.write(ROOT_ID, refFromAug("foo1"));
108         writeModification.ready();
109         final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
110
111         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
112         dataTree.commit(writeContributorsCandidate);
113     }
114
115     @Test(expected = LeafRefDataValidationFailedException.class)
116     public void testInvalidRefFromAugmentation() throws Exception {
117         final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
118         writeModification.write(ROOT_ID, refFromAug("foo2"));
119         writeModification.ready();
120         final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
121
122         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
123     }
124
125     @Test
126     public void testValidRefInContainerFromAugmentation() throws Exception {
127         final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
128         writeModification.write(ROOT_ID, refInContainer("foo1"));
129         writeModification.ready();
130         final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
131
132         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
133         dataTree.commit(writeContributorsCandidate);
134     }
135
136     @Test(expected = LeafRefDataValidationFailedException.class)
137     public void testInvalidRefInContainerFromAugmentation() throws Exception {
138         final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
139         writeModification.write(ROOT_ID, refInContainer("foo2"));
140         writeModification.ready();
141         final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
142
143         LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
144     }
145
146     private static ContainerNode refFromAug(final String refValue) {
147         return Builders.containerBuilder()
148                 .withNodeIdentifier(new NodeIdentifier(ROOT))
149                 .withChild(Builders.mapBuilder()
150                     .withNodeIdentifier(new NodeIdentifier(FOO))
151                     .withChild(Builders.mapEntryBuilder()
152                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(FOO, NAME, "foo1"))
153                         .withChild(ImmutableNodes.leafNode(NAME, "foo1"))
154                         .build())
155                     .build())
156                 .withChild(Builders.mapBuilder()
157                     .withNodeIdentifier(new NodeIdentifier(BAR))
158                     .withChild(Builders.mapEntryBuilder()
159                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(BAR, NAME, "bar1"))
160                         .withChild(ImmutableNodes.leafNode(NAME, "bar1"))
161                         .withChild(Builders.containerBuilder()
162                             .withNodeIdentifier(new NodeIdentifier(CONTAINER_IN_LIST))
163                             .withChild(ImmutableNodes.leafNode(REF_FROM_AUG, refValue))
164                             .build())
165                         .build())
166                     .build())
167                 .build();
168     }
169
170     private static ContainerNode refInContainer(final String refValue) {
171         return Builders.containerBuilder()
172                 .withNodeIdentifier(new NodeIdentifier(ROOT))
173                 .withChild(Builders.mapBuilder()
174                     .withNodeIdentifier(new NodeIdentifier(FOO))
175                     .withChild(Builders.mapEntryBuilder()
176                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(FOO, NAME, "foo1"))
177                         .withChild(ImmutableNodes.leafNode(NAME, "foo1"))
178                         .build())
179                     .build())
180                 .withChild(Builders.mapBuilder()
181                     .withNodeIdentifier(new NodeIdentifier(BAR))
182                     .withChild(Builders.mapEntryBuilder()
183                         .withNodeIdentifier(NodeIdentifierWithPredicates.of(BAR, NAME, "bar1"))
184                         .withChild(ImmutableNodes.leafNode(NAME, "bar1"))
185                         .withChild(Builders.containerBuilder()
186                             .withNodeIdentifier(new NodeIdentifier(CONTAINER_FROM_AUG))
187                             .withChild(ImmutableNodes.leafNode(REF_IN_CONTAINER, refValue))
188                             .build())
189                         .build())
190                     .build())
191                 .build();
192     }
193 }