2 * Copyright (c) 2014 Brocade Communications 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.api;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertFalse;
14 import static org.junit.Assert.assertNotNull;
15 import static org.junit.Assert.assertNull;
16 import static org.junit.Assert.assertSame;
17 import static org.junit.Assert.assertThrows;
18 import static org.junit.Assert.assertTrue;
20 import com.google.common.collect.ImmutableSet;
21 import java.io.ByteArrayInputStream;
22 import java.io.ByteArrayOutputStream;
23 import java.io.IOException;
24 import java.io.ObjectInputStream;
25 import java.io.ObjectOutputStream;
26 import java.util.Iterator;
27 import java.util.List;
29 import java.util.Map.Entry;
30 import java.util.Optional;
31 import org.junit.Test;
32 import org.opendaylight.yangtools.yang.common.QName;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
37 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
40 * Unit tests for InstanceIdentifier.
42 * @author Thomas Pantelis
44 public class YangInstanceIdentifierTest {
46 private static final QName NODENAME1 = QName.create("test", "2014-05-28", "node1");
47 private static final QName NODENAME2 = QName.create("test", "2014-05-28", "node2");
48 private static final QName NODENAME3 = QName.create("test", "2014-05-28", "node3");
49 private static final QName NODENAME4 = QName.create("test", "2014-05-28", "node4");
50 private static final QName KEY1 = QName.create("test", "2014-05-28", "key1");
51 private static final QName KEY2 = QName.create("test", "2014-05-28", "key2");
52 private static final QName KEY3 = QName.create("test", "2014-05-28", "key3");
55 public void testGetLastPathArgument() {
56 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
57 new NodeIdentifier(NODENAME2));
58 assertEquals("getLastPathArgument", new NodeIdentifier(NODENAME2), id1.getLastPathArgument());
59 YangInstanceIdentifier id2 = YangInstanceIdentifier.create();
60 assertNull(id2.getLastPathArgument());
64 public void testHashCodeEquals() {
65 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(NodeIdentifier.create(NODENAME1),
66 new NodeIdentifier(NODENAME2));
67 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
68 NodeIdentifier.create(NODENAME2));
70 assertEquals("hashCode", id1.hashCode(), id2.hashCode());
74 public void testEquals() {
75 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
76 new NodeIdentifier(NODENAME2));
77 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
78 new NodeIdentifier(NODENAME2));
79 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME2),
80 new NodeIdentifier(NODENAME1));
81 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
83 assertFalse("equals", id1.equals(null));
84 assertTrue("equals", id1.equals(id1));
85 assertTrue("equals", id1.equals(id2));
86 assertFalse("equals", id1.equals(id3));
87 assertFalse("equals", id1.equals(id4));
88 assertFalse("equals", id1.equals(new Object()));
92 public void testToString() {
93 YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
94 new NodeIdentifier(NODENAME2));
96 assertNotNull(id.toString());
100 public void testNode() {
101 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
102 new NodeIdentifier(NODENAME2));
104 YangInstanceIdentifier newID = id.node(NODENAME3);
106 assertNotNull("InstanceIdentifier is null", newID);
107 assertEquals("Path size", 3, newID.getPathArguments().size());
109 Iterator<PathArgument> it = newID.getPathArguments().iterator();
110 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
111 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
112 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
114 newID = id.node(new NodeIdentifier(NODENAME3));
116 assertNotNull("InstanceIdentifier is null", newID);
117 assertEquals("Path size", 3, newID.getPathArguments().size());
119 it = newID.getPathArguments().iterator();
120 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
121 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
122 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
126 public void testRelativeTo() {
127 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
128 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
129 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
130 new NodeIdentifier(NODENAME2));
131 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(List.of(
132 new NodeIdentifier(NODENAME1), new NodeIdentifier(NODENAME2)));
134 Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
135 assertTrue("isPresent", relative.isPresent());
137 List<PathArgument> path = relative.get().getPathArguments();
138 assertEquals("Path size", 2, path.size());
139 assertEquals("PathArg 1 node type", NODENAME3, path.get(0).getNodeType());
140 assertEquals("PathArg 2 node type", NODENAME4, path.get(1).getNodeType());
142 relative = id2.relativeTo(id3);
143 assertTrue("isPresent", relative.isPresent());
144 assertEquals("Path size", 0, relative.get().getPathArguments().size());
146 relative = id2.relativeTo(id1);
147 assertFalse("isPresent", relative.isPresent());
151 public void testContainsNull() {
152 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
154 assertThrows(IllegalArgumentException.class, () -> id.contains(null));
158 public void testContains() {
159 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
160 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
161 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
162 new NodeIdentifier(NODENAME2));
163 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
164 new NodeIdentifier(NODENAME2));
165 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
166 new NodeIdentifier(NODENAME3));
168 assertTrue("contains", id2.contains(id1));
169 assertTrue("contains", id2.contains(id3));
170 assertFalse("contains", id1.contains(id2));
171 assertFalse("contains", id2.contains(id4));
175 public void testOf() {
176 YangInstanceIdentifier newID = YangInstanceIdentifier.of(NODENAME1);
178 assertNotNull("InstanceIdentifier is null", newID);
179 assertEquals("Path size", 1, newID.getPathArguments().size());
180 assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
183 assertNotNull(newID.toString());
187 public void testBuilder() {
188 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
190 .nodeWithKey(NODENAME2, Map.of(KEY1, "foo"))
191 .nodeWithKey(NODENAME3, KEY2, "bar").build();
193 assertNotNull("InstanceIdentifier is null", newID);
194 assertEquals("Path size", 3, newID.getPathArguments().size());
196 Iterator<PathArgument> it = newID.getPathArguments().iterator();
197 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
198 verifyNodeIdentifierWithPredicates("PathArg 2", it.next(), NODENAME2, KEY1, "foo");
199 verifyNodeIdentifierWithPredicates("PathArg 3", it.next(), NODENAME3, KEY2, "bar");
201 newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
203 assertNotNull("InstanceIdentifier is null", newID);
204 assertEquals("Path size", 4, newID.getPathArguments().size());
206 it = newID.getPathArguments().iterator();
207 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
208 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
209 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
210 assertEquals("PathArg 4 node type", NODENAME4, it.next().getNodeType());
212 newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
214 assertNotNull("InstanceIdentifier is null", newID);
215 assertEquals("Path size", 1, newID.getPathArguments().size());
216 assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
219 private static void verifyNodeIdentifierWithPredicates(final String prefix,
220 final PathArgument arg, final QName nodeName, final QName key, final Object value) {
222 assertNotNull(prefix + " is null", arg);
223 assertThat(arg, instanceOf(NodeIdentifierWithPredicates.class));
224 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
225 assertEquals(prefix + " node type", nodeName, node.getNodeType());
226 assertEquals(prefix + " key values map size", 1, node.size());
227 Entry<QName, Object> entry = node.entrySet().iterator().next();
228 assertEquals(prefix + " key values map entry key", key, entry.getKey());
229 assertEquals(prefix + " key values map entry value", value, entry.getValue());
233 public void testNodeIdentifierWithPredicates() {
235 NodeIdentifierWithPredicates node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
236 verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
238 NodeIdentifierWithPredicates node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
240 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
241 assertTrue("equals", node1.equals(node2));
243 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME2, KEY1, "foo")));
244 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY2, "foo")));
245 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "bar")));
246 assertFalse("equals", node1.equals(new Object()));
249 assertNotNull(node1.toString());
250 assertNotNull(node1.toRelativeString(node2));
252 NodeIdentifierWithPredicates node3 = NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY2, 20));
254 NodeIdentifierWithPredicates node4 = NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY2, 20));
256 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
257 assertTrue("equals", node3.equals(node4));
259 assertFalse("equals", node3.equals(node1));
260 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY3, 20))));
262 node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
263 node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
265 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
266 assertTrue("equals", node1.equals(node2));
268 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 3})));
269 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1 })));
270 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2, 3 })));
274 public void testNodeWithValue() {
276 NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
277 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
278 assertEquals("getValue", "foo", node1.getValue());
280 NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
282 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
283 assertTrue("equals", node1.equals(node2));
285 assertFalse("equals", node1.equals(new NodeWithValue<>(NODENAME1, "bar")));
286 assertFalse("equals", node1.equals(new NodeWithValue<>(NODENAME2, "foo")));
287 assertFalse("equals", node1.equals(new Object()));
290 assertNotNull(node1.toString());
291 assertNotNull(node1.toRelativeString(node2));
293 NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
294 NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
296 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
297 assertTrue("equals", node3.equals(node4));
299 assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
300 assertFalse("equals", node3.equals(node1));
304 public void testNodeIdentifier() {
306 final NodeIdentifier node1 = new NodeIdentifier(NODENAME1);
307 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
308 final NodeIdentifier node2 = new NodeIdentifier(NODENAME1);
309 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
311 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
312 assertEquals("compareTo", 0, node1.compareTo(node2));
313 assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
315 assertFalse("equals", node1.equals(null));
316 assertFalse("equals", node1.equals(node3));
317 assertTrue("equals", node1.equals(node1));
318 assertTrue("equals", node1.equals(node2));
319 assertFalse("equals", node1.equals(new NodeIdentifier(NODENAME3)));
320 assertFalse("equals", node1.equals(new Object()));
323 assertNotNull(node1.toString());
327 public void testAugmentationIdentifierNodeType() {
328 AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
329 assertThrows(UnsupportedOperationException.class, () -> node1.getNodeType());
333 public void testAugmentationIdentifier() {
335 final AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
336 assertEquals("getPossibleChildNames", ImmutableSet.of(NODENAME1, NODENAME2), node1.getPossibleChildNames());
337 final AugmentationIdentifier node2 = new AugmentationIdentifier(ImmutableSet.of(NODENAME2, NODENAME1));
338 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME3));
339 final AugmentationIdentifier node4 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2,
341 final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
343 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
345 assertTrue("equals", node1.equals(node1));
346 assertTrue("equals", node1.equals(node2));
347 assertFalse("equals", node1.equals(node3));
348 assertFalse("equals", node1.equals(new AugmentationIdentifier(ImmutableSet.of(NODENAME1))));
349 assertFalse("equals", node1.equals(new Object()));
351 assertEquals("compareTo", -1, node1.compareTo(node5));
352 assertEquals("compareTo", 0, node1.compareTo(node2));
353 assertEquals("compareTo", 0, node1.compareTo(node2));
354 assertEquals("compareTo", 1, node1.compareTo(node4));
355 assertEquals("compareTo", -1, node4.compareTo(node1));
358 assertNotNull(node1.toString());
359 assertNotNull(node1.toRelativeString(node5));
362 private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
363 ClassNotFoundException {
364 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
365 try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
369 final byte[] bytes = bos.toByteArray();
370 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
371 try (ObjectInputStream ois = new ObjectInputStream(bis)) {
372 final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
373 assertEquals(0, ois.available());
379 public void testSerialization() throws IOException, ClassNotFoundException {
380 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
381 new NodeIdentifier(NODENAME2));
382 assertEquals(fixed, serdes(fixed));
384 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
385 assertEquals(stacked, serdes(stacked));
387 final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.empty());
388 assertSame(YangInstanceIdentifier.empty(), empty);
392 public void testToOptimized() {
393 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
394 new NodeIdentifier(NODENAME2));
395 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(NodeIdentifier.create(NODENAME1))
396 .node(NodeIdentifier.create(NODENAME2));
398 assertSame(fixed, fixed.toOptimized());
400 final YangInstanceIdentifier opt = stacked.toOptimized();
401 assertTrue(opt instanceof FixedYangInstanceIdentifier);
402 assertEquals(fixed, stacked.toOptimized());
406 public void testGetParent() {
407 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
408 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
409 final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
411 assertNull(YangInstanceIdentifier.empty().getParent());
412 assertSame(YangInstanceIdentifier.empty(), fixed.getParent());
413 assertSame(YangInstanceIdentifier.empty(), stacked.getParent());
414 assertSame(stacked, twoStacked.getParent());
418 public void testIsEmpty() {
419 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
420 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
422 assertTrue(YangInstanceIdentifier.empty().isEmpty());
423 assertFalse(fixed.isEmpty());
424 assertFalse(stacked.isEmpty());