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 static org.junit.jupiter.api.Assertions.assertThrows;
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;
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 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 static void afterClass() {
96 leafRefContext = null;
101 dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
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);
111 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
112 dataTree.commit(writeContributorsCandidate);
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);
123 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
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);
134 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
135 dataTree.commit(writeContributorsCandidate);
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);
146 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
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"))
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))
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"))
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))