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.parseYangResource("/yt821.yang");
48 leafRefContext = LeafRefContext.create(schemaContext);
52 public static void afterClass() {
54 leafRefContext = null;
58 public void before() {
59 dataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
63 public void testValidRefFromAugmentation() throws Exception {
64 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
65 writeModification.write(ROOT_ID, refFromAug("foo1"));
66 writeModification.ready();
67 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
69 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
70 dataTree.commit(writeContributorsCandidate);
73 @Test(expected = LeafRefDataValidationFailedException.class)
74 public void testInvalidRefFromAugmentation() throws Exception {
75 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
76 writeModification.write(ROOT_ID, refFromAug("foo2"));
77 writeModification.ready();
78 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
80 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
84 public void testValidRefInContainerFromAugmentation() throws Exception {
85 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
86 writeModification.write(ROOT_ID, refInContainer("foo1"));
87 writeModification.ready();
88 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
90 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
91 dataTree.commit(writeContributorsCandidate);
94 @Test(expected = LeafRefDataValidationFailedException.class)
95 public void testInvalidRefInContainerFromAugmentation() throws Exception {
96 final DataTreeModification writeModification = dataTree.takeSnapshot().newModification();
97 writeModification.write(ROOT_ID, refInContainer("foo2"));
98 writeModification.ready();
99 final DataTreeCandidate writeContributorsCandidate = dataTree.prepare(writeModification);
101 LeafRefValidation.validate(writeContributorsCandidate, leafRefContext);
104 private static ContainerNode refFromAug(final String refValue) {
105 return Builders.containerBuilder()
106 .withNodeIdentifier(new NodeIdentifier(ROOT))
107 .withChild(Builders.mapBuilder()
108 .withNodeIdentifier(new NodeIdentifier(FOO))
109 .withChild(Builders.mapEntryBuilder()
110 .withNodeIdentifier(NodeIdentifierWithPredicates.of(FOO, NAME, "foo1"))
111 .withChild(ImmutableNodes.leafNode(NAME, "foo1"))
114 .withChild(Builders.mapBuilder()
115 .withNodeIdentifier(new NodeIdentifier(BAR))
116 .withChild(Builders.mapEntryBuilder()
117 .withNodeIdentifier(NodeIdentifierWithPredicates.of(BAR, NAME, "bar1"))
118 .withChild(ImmutableNodes.leafNode(NAME, "bar1"))
119 .withChild(Builders.containerBuilder()
120 .withNodeIdentifier(new NodeIdentifier(CONTAINER_IN_LIST))
121 .withChild(ImmutableNodes.leafNode(REF_FROM_AUG, refValue))
128 private static ContainerNode refInContainer(final String refValue) {
129 return Builders.containerBuilder()
130 .withNodeIdentifier(new NodeIdentifier(ROOT))
131 .withChild(Builders.mapBuilder()
132 .withNodeIdentifier(new NodeIdentifier(FOO))
133 .withChild(Builders.mapEntryBuilder()
134 .withNodeIdentifier(NodeIdentifierWithPredicates.of(FOO, NAME, "foo1"))
135 .withChild(ImmutableNodes.leafNode(NAME, "foo1"))
138 .withChild(Builders.mapBuilder()
139 .withNodeIdentifier(new NodeIdentifier(BAR))
140 .withChild(Builders.mapEntryBuilder()
141 .withNodeIdentifier(NodeIdentifierWithPredicates.of(BAR, NAME, "bar1"))
142 .withChild(ImmutableNodes.leafNode(NAME, "bar1"))
143 .withChild(Builders.containerBuilder()
144 .withNodeIdentifier(new NodeIdentifier(CONTAINER_FROM_AUG))
145 .withChild(ImmutableNodes.leafNode(REF_IN_CONTAINER, refValue))