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.tree.leafref;
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;
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);
40 private static EffectiveModelContext schemaContext;
41 private static LeafRefContext leafRefContext;
43 private DataTree dataTree;
46 public static void beforeClass() {
47 schemaContext = YangParserTestUtils.parseYang("""
49 namespace "urn:opendaylight:params:xml:ns:yang:foo";
67 container container-in-list {
72 augment /root/bar/container-in-list {
75 path "/root/foo/name";
81 container container-from-aug {
82 leaf ref-in-container {
84 path "/root/foo/name";
90 leafRefContext = LeafRefContext.create(schemaContext);
94 public static void afterClass() {
96 leafRefContext = null;
100 public void before() {
101 dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
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);
111 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
112 dataTree.commit(writeContributorsCandidate);
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);
122 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
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);
132 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
133 dataTree.commit(writeContributorsCandidate);
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);
143 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
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"))
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))
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"))
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))