2 * Copyright (c) 2016 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.impl.schema;
10 import static org.hamcrest.MatcherAssert.assertThat;
11 import static org.hamcrest.Matchers.isA;
12 import static org.junit.Assert.assertArrayEquals;
13 import static org.junit.Assert.assertEquals;
15 import com.google.common.collect.ImmutableMap;
16 import com.google.common.collect.ImmutableSet;
17 import java.util.Collection;
19 import org.junit.AfterClass;
20 import org.junit.BeforeClass;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.util.ImmutableOffsetMap;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
29 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
34 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
35 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
36 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
38 public class InstanceIdToNodesTest {
40 private static final String NS = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:normalization:test";
41 private static final String REVISION = "2014-03-13";
42 private static final QName ID = QName.create(NS, REVISION, "id");
43 private static final QName FOO = QName.create(ID, "foo");
44 private static final QName BAR = QName.create(ID, "bar");
45 private static final NodeIdentifier TWO_KEY_LIST = NodeIdentifier.create(QName.create(ID, "two-key-list"));
47 private static EffectiveModelContext ctx;
49 private final NodeIdentifier rootContainer = new NodeIdentifier(QName.create(NS, REVISION, "test"));
50 private final NodeIdentifier outerContainer = new NodeIdentifier(QName.create(NS, REVISION, "outer-container"));
51 private final NodeIdentifier augmentedLeaf = new NodeIdentifier(QName.create(NS, REVISION, "augmented-leaf"));
52 private final AugmentationIdentifier augmentation = new AugmentationIdentifier(
53 ImmutableSet.of(augmentedLeaf.getNodeType()));
55 private final NodeIdentifier outerList = new NodeIdentifier(QName.create(NS, REVISION, "outer-list"));
56 private final NodeIdentifierWithPredicates outerListWithKey = NodeIdentifierWithPredicates.of(
57 QName.create(NS, REVISION, "outer-list"), ID, 1);
58 private final NodeIdentifier choice = new NodeIdentifier(QName.create(NS, REVISION, "outer-choice"));
59 private final NodeIdentifier leafFromCase = new NodeIdentifier(QName.create(NS, REVISION, "one"));
61 private final NodeIdentifier leafList = new NodeIdentifier(QName.create(NS, REVISION, "ordered-leaf-list"));
62 private final NodeWithValue<?> leafListWithValue = new NodeWithValue<>(leafList.getNodeType(), "abcd");
65 public static void setUp() {
66 ctx = YangParserTestUtils.parseYangResources(InstanceIdToNodesTest.class, "/filter-test.yang");
70 public static void teardown() {
75 @Deprecated(since = "7.0.12", forRemoval = true)
76 public void testInAugment() {
77 final LeafNode<?> leaf = Builders.leafBuilder().withNodeIdentifier(augmentedLeaf).withValue("").build();
78 final ContainerNode expectedFilter = Builders
80 .withNodeIdentifier(rootContainer)
82 Builders.containerBuilder()
83 .withNodeIdentifier(outerContainer)
85 Builders.augmentationBuilder()
86 .withNodeIdentifier(augmentation)
88 leaf).build()).build()).build();
90 final NormalizedNode filter = ImmutableNodes.fromInstanceId(ctx,
91 YangInstanceIdentifier.create(rootContainer, outerContainer, augmentation, augmentedLeaf), leaf);
92 assertEquals(expectedFilter, filter);
96 @Deprecated(since = "7.0.12", forRemoval = true)
97 public void testInAugmentLeafOverride() {
98 final LeafNode<Object> lastLeaf = Builders.leafBuilder().withNodeIdentifier(augmentedLeaf)
99 .withValue("randomValue").build();
101 final ContainerNode expectedFilter = Builders
103 .withNodeIdentifier(rootContainer)
105 Builders.containerBuilder()
106 .withNodeIdentifier(outerContainer)
108 Builders.augmentationBuilder().withNodeIdentifier(augmentation)
109 .withChild(lastLeaf).build()).build()).build();
111 final NormalizedNode filter = ImmutableNodes.fromInstanceId(ctx,
112 YangInstanceIdentifier.create(rootContainer, outerContainer, augmentation, augmentedLeaf), lastLeaf);
113 assertEquals(expectedFilter, filter);
117 @Deprecated(since = "7.0.12", forRemoval = true)
118 public void testListChoice() {
119 final LeafNode<?> leaf = Builders.leafBuilder().withNodeIdentifier(leafFromCase).withValue("").build();
120 final ContainerNode expectedFilter = Builders
122 .withNodeIdentifier(rootContainer)
124 Builders.mapBuilder()
125 .withNodeIdentifier(outerList)
127 Builders.mapEntryBuilder()
128 .withNodeIdentifier(outerListWithKey)
130 Builders.leafBuilder()
132 new NodeIdentifier(ID))
133 .withValue(1).build())
135 Builders.choiceBuilder()
136 .withNodeIdentifier(choice)
143 final NormalizedNode filter = ImmutableNodes.fromInstanceId(ctx,
144 YangInstanceIdentifier.create(rootContainer, outerList, outerListWithKey, choice, leafFromCase), leaf);
145 assertEquals(expectedFilter, filter);
149 @Deprecated(since = "7.0.12", forRemoval = true)
150 public void testTopContainerLastChildOverride() {
151 final ContainerNode expectedStructure = Builders
153 .withNodeIdentifier(rootContainer)
155 Builders.mapBuilder()
156 .withNodeIdentifier(outerList)
158 Builders.mapEntryBuilder()
159 .withNodeIdentifier(outerListWithKey)
161 Builders.leafBuilder()
163 new NodeIdentifier(ID))
164 .withValue(1).build())
166 Builders.choiceBuilder()
167 .withNodeIdentifier(choice)
169 Builders.leafBuilder()
170 .withNodeIdentifier(leafFromCase)
172 .build()).build()).build()).build())
175 final NormalizedNode filter = ImmutableNodes.fromInstanceId(ctx,
176 YangInstanceIdentifier.create(rootContainer), expectedStructure);
177 assertEquals(expectedStructure, filter);
181 public void testListLastChildOverride() {
182 final MapEntryNode outerListEntry = Builders
184 .withNodeIdentifier(outerListWithKey)
186 Builders.leafBuilder().withNodeIdentifier(new NodeIdentifier(ID))
187 .withValue(1).build()).build();
188 final MapNode lastChild = Builders.mapBuilder().withNodeIdentifier(outerList).withChild(outerListEntry)
190 final ContainerNode expectedStructure = Builders.containerBuilder().withNodeIdentifier(rootContainer)
191 .withChild(lastChild).build();
193 NormalizedNode filter = ImmutableNodes.fromInstanceId(ctx,
194 YangInstanceIdentifier.create(rootContainer, outerList, outerListWithKey), outerListEntry);
195 assertEquals(expectedStructure, filter);
196 filter = ImmutableNodes.fromInstanceId(ctx,
197 YangInstanceIdentifier.create(rootContainer, outerList, outerListWithKey));
198 assertEquals(expectedStructure, filter);
202 public void testLeafList() {
203 final ContainerNode expectedFilter = Builders
205 .withNodeIdentifier(rootContainer)
207 Builders.orderedLeafSetBuilder()
208 .withNodeIdentifier(leafList)
210 Builders.leafSetEntryBuilder().withNodeIdentifier(leafListWithValue)
211 .withValue(leafListWithValue.getValue()).build()).build()).build();
213 final NormalizedNode filter = ImmutableNodes.fromInstanceId(ctx,
214 YangInstanceIdentifier.create(rootContainer, leafList, leafListWithValue));
215 assertEquals(expectedFilter, filter);
219 public void testEmptyInstanceIdentifier() {
220 assertEquals(ImmutableNodes.containerNode(SchemaContext.NAME),
221 ImmutableNodes.fromInstanceId(ctx, YangInstanceIdentifier.empty()));
225 public void testKeyOrdering() {
226 final Map<QName, Object> misordered = ImmutableOffsetMap.orderedCopyOf(ImmutableMap.of(BAR, "bar", FOO, "foo"));
227 final NodeIdentifierWithPredicates id = NodeIdentifierWithPredicates.of(TWO_KEY_LIST.getNodeType(), misordered);
228 assertArrayEquals(new Object[] { BAR, FOO }, id.keySet().toArray());
230 final NormalizedNode filter = ImmutableNodes.fromInstanceId(ctx,
231 YangInstanceIdentifier.create(TWO_KEY_LIST, id));
232 assertThat(filter, isA(MapNode.class));
233 final Collection<MapEntryNode> value = ((MapNode) filter).body();
234 assertEquals(1, value.size());
235 final MapEntryNode entry = value.iterator().next();
237 // The entry must have a the proper order
238 assertArrayEquals(new Object[] { FOO, BAR }, entry.getIdentifier().keySet().toArray());