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.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
13 import static org.junit.jupiter.api.Assertions.assertNotNull;
14 import static org.junit.jupiter.api.Assertions.assertNull;
15 import static org.junit.jupiter.api.Assertions.assertSame;
16 import static org.junit.jupiter.api.Assertions.assertThrows;
17 import static org.junit.jupiter.api.Assertions.assertTrue;
19 import com.google.common.collect.ImmutableSet;
20 import java.io.ByteArrayInputStream;
21 import java.io.ByteArrayOutputStream;
22 import java.io.IOException;
23 import java.io.ObjectInputStream;
24 import java.io.ObjectOutputStream;
25 import java.util.Iterator;
26 import java.util.List;
28 import java.util.Map.Entry;
29 import java.util.Optional;
30 import org.junit.jupiter.api.Test;
31 import org.opendaylight.yangtools.yang.common.QName;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
39 * Unit tests for InstanceIdentifier.
41 * @author Thomas Pantelis
43 public class YangInstanceIdentifierTest {
44 private static final QName NODENAME1 = QName.create("test", "2014-05-28", "node1");
45 private static final QName NODENAME2 = QName.create("test", "2014-05-28", "node2");
46 private static final QName NODENAME3 = QName.create("test", "2014-05-28", "node3");
47 private static final QName NODENAME4 = QName.create("test", "2014-05-28", "node4");
48 private static final QName KEY1 = QName.create("test", "2014-05-28", "key1");
49 private static final QName KEY2 = QName.create("test", "2014-05-28", "key2");
50 private static final QName KEY3 = QName.create("test", "2014-05-28", "key3");
53 public void testGetLastPathArgument() {
54 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
55 new NodeIdentifier(NODENAME2));
56 assertEquals(new NodeIdentifier(NODENAME2), id1.getLastPathArgument());
57 YangInstanceIdentifier id2 = YangInstanceIdentifier.create();
58 assertNull(id2.getLastPathArgument());
62 public void testHashCodeEquals() {
63 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(NodeIdentifier.create(NODENAME1),
64 new NodeIdentifier(NODENAME2));
65 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
66 NodeIdentifier.create(NODENAME2));
67 assertEquals(id1.hashCode(), id2.hashCode());
71 public void testEquals() {
72 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
73 new NodeIdentifier(NODENAME2));
74 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
75 new NodeIdentifier(NODENAME2));
76 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME2),
77 new NodeIdentifier(NODENAME1));
78 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
80 assertFalse(id1.equals(null));
81 assertTrue(id1.equals(id1));
82 assertTrue(id1.equals(id2));
83 assertFalse(id1.equals(id3));
84 assertFalse(id1.equals(id4));
85 assertFalse(id1.equals(new Object()));
89 public void testToString() {
90 YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
91 new NodeIdentifier(NODENAME2));
93 assertNotNull(id.toString());
97 public void testNode() {
98 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
99 new NodeIdentifier(NODENAME2));
101 YangInstanceIdentifier newID = id.node(NODENAME3);
102 assertNotNull(newID);
103 assertEquals(3, newID.getPathArguments().size());
105 Iterator<PathArgument> it = newID.getPathArguments().iterator();
106 assertEquals(NODENAME1, it.next().getNodeType());
107 assertEquals(NODENAME2, it.next().getNodeType());
108 assertEquals(NODENAME3, it.next().getNodeType());
110 newID = id.node(new NodeIdentifier(NODENAME3));
111 assertNotNull(newID);
112 assertEquals(3, newID.getPathArguments().size());
114 it = newID.getPathArguments().iterator();
115 assertEquals(NODENAME1, it.next().getNodeType());
116 assertEquals(NODENAME2, it.next().getNodeType());
117 assertEquals(NODENAME3, it.next().getNodeType());
121 public void testRelativeTo() {
122 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
123 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
124 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
125 new NodeIdentifier(NODENAME2));
126 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(List.of(
127 new NodeIdentifier(NODENAME1), new NodeIdentifier(NODENAME2)));
129 Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
130 assertTrue(relative.isPresent());
132 List<PathArgument> path = relative.orElseThrow().getPathArguments();
133 assertEquals(2, path.size());
134 assertEquals(NODENAME3, path.get(0).getNodeType());
135 assertEquals(NODENAME4, path.get(1).getNodeType());
137 relative = id2.relativeTo(id3);
138 assertTrue(relative.isPresent());
139 assertEquals(0, relative.orElseThrow().getPathArguments().size());
141 relative = id2.relativeTo(id1);
142 assertFalse(relative.isPresent());
146 public void testContainsNull() {
147 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
149 assertThrows(IllegalArgumentException.class, () -> id.contains(null));
153 public void testContains() {
154 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
155 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
156 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
157 new NodeIdentifier(NODENAME2));
158 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
159 new NodeIdentifier(NODENAME2));
160 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
161 new NodeIdentifier(NODENAME3));
163 assertTrue(id2.contains(id1));
164 assertTrue(id2.contains(id3));
165 assertFalse(id1.contains(id2));
166 assertFalse(id2.contains(id4));
170 public void testOf() {
171 YangInstanceIdentifier newID = YangInstanceIdentifier.of(NODENAME1);
172 assertNotNull(newID);
173 assertEquals(1, newID.getPathArguments().size());
174 assertEquals(NODENAME1, newID.getPathArguments().get(0).getNodeType());
177 assertNotNull(newID.toString());
181 public void testBuilder() {
182 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
184 .nodeWithKey(NODENAME2, Map.of(KEY1, "foo"))
185 .nodeWithKey(NODENAME3, KEY2, "bar").build();
187 assertNotNull(newID);
188 assertEquals(3, newID.getPathArguments().size());
190 Iterator<PathArgument> it = newID.getPathArguments().iterator();
191 assertEquals(NODENAME1, it.next().getNodeType());
192 verifyNodeIdentifierWithPredicates("PathArg 2", it.next(), NODENAME2, KEY1, "foo");
193 verifyNodeIdentifierWithPredicates("PathArg 3", it.next(), NODENAME3, KEY2, "bar");
195 newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
197 assertNotNull(newID);
198 assertEquals(4, newID.getPathArguments().size());
200 it = newID.getPathArguments().iterator();
201 assertEquals(NODENAME1, it.next().getNodeType());
202 assertEquals(NODENAME2, it.next().getNodeType());
203 assertEquals(NODENAME3, it.next().getNodeType());
204 assertEquals(NODENAME4, it.next().getNodeType());
206 newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
208 assertNotNull(newID);
209 assertEquals(1, newID.getPathArguments().size());
210 assertEquals(NODENAME1, newID.getPathArguments().get(0).getNodeType());
213 private static void verifyNodeIdentifierWithPredicates(final String prefix,
214 final PathArgument arg, final QName nodeName, final QName key, final Object value) {
216 assertNotNull(arg, prefix + " is null");
217 assertInstanceOf(NodeIdentifierWithPredicates.class, arg);
218 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
219 assertEquals(nodeName, node.getNodeType(), prefix + " node type");
220 assertEquals(1, node.size(), prefix + " key values map size");
221 Entry<QName, Object> entry = node.entrySet().iterator().next();
222 assertEquals(key, entry.getKey(), prefix + " key values map entry key");
223 assertEquals(value, entry.getValue(), prefix + " key values map entry value");
227 public void testNodeIdentifierWithPredicates() {
229 NodeIdentifierWithPredicates node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
230 verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
232 NodeIdentifierWithPredicates node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
234 assertEquals(node1.hashCode(), node2.hashCode());
235 assertTrue(node1.equals(node2));
237 assertFalse(node1.equals(NodeIdentifierWithPredicates.of(NODENAME2, KEY1, "foo")));
238 assertFalse(node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY2, "foo")));
239 assertFalse(node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "bar")));
240 assertFalse(node1.equals(new Object()));
243 assertNotNull(node1.toString());
244 assertNotNull(node1.toRelativeString(node2));
246 NodeIdentifierWithPredicates node3 = NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY2, 20));
248 NodeIdentifierWithPredicates node4 = NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY2, 20));
250 assertEquals(node3.hashCode(), node4.hashCode());
251 assertTrue(node3.equals(node4));
253 assertFalse(node3.equals(node1));
254 assertFalse(node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY3, 20))));
256 node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
257 node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
259 assertEquals(node1.hashCode(), node2.hashCode());
260 assertTrue(node1.equals(node2));
262 assertFalse(node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 3})));
263 assertFalse(node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1 })));
264 assertFalse(node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2, 3 })));
268 public void testNodeWithValue() {
270 NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
271 assertEquals(NODENAME1, node1.getNodeType());
272 assertEquals("foo", node1.getValue());
274 NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
276 assertEquals(node1.hashCode(), node2.hashCode());
277 assertTrue(node1.equals(node2));
279 assertFalse(node1.equals(new NodeWithValue<>(NODENAME1, "bar")));
280 assertFalse(node1.equals(new NodeWithValue<>(NODENAME2, "foo")));
281 assertFalse(node1.equals(new Object()));
284 assertNotNull(node1.toString());
285 assertNotNull(node1.toRelativeString(node2));
287 NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
288 NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
290 assertEquals(node3.hashCode(), node4.hashCode());
291 assertTrue(node3.equals(node4));
293 assertFalse(node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
294 assertFalse(node3.equals(node1));
298 public void testNodeIdentifier() {
300 final NodeIdentifier node1 = new NodeIdentifier(NODENAME1);
301 assertEquals(NODENAME1, node1.getNodeType());
302 final NodeIdentifier node2 = new NodeIdentifier(NODENAME1);
303 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
305 assertEquals(node1.hashCode(), node2.hashCode());
306 assertEquals(0, node1.compareTo(node2));
307 assertTrue(node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
309 assertFalse(node1.equals(null));
310 assertFalse(node1.equals(node3));
311 assertTrue(node1.equals(node1));
312 assertTrue(node1.equals(node2));
313 assertFalse(node1.equals(new NodeIdentifier(NODENAME3)));
314 assertFalse(node1.equals(new Object()));
317 assertNotNull(node1.toString());
321 public void testAugmentationIdentifierNodeType() {
322 AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
323 assertThrows(UnsupportedOperationException.class, () -> node1.getNodeType());
327 public void testAugmentationIdentifier() {
329 final AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
330 assertEquals(ImmutableSet.of(NODENAME1, NODENAME2), node1.getPossibleChildNames());
331 final AugmentationIdentifier node2 = new AugmentationIdentifier(ImmutableSet.of(NODENAME2, NODENAME1));
332 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME3));
333 final AugmentationIdentifier node4 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2,
335 final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
337 assertEquals(node1.hashCode(), node2.hashCode());
339 assertTrue(node1.equals(node1));
340 assertTrue(node1.equals(node2));
341 assertFalse(node1.equals(node3));
342 assertFalse(node1.equals(new AugmentationIdentifier(ImmutableSet.of(NODENAME1))));
343 assertFalse(node1.equals(new Object()));
345 assertEquals(-1, node1.compareTo(node5));
346 assertEquals(0, node1.compareTo(node2));
347 assertEquals(0, node1.compareTo(node2));
348 assertEquals(1, node1.compareTo(node4));
349 assertEquals(-1, node4.compareTo(node1));
352 assertNotNull(node1.toString());
353 assertNotNull(node1.toRelativeString(node5));
356 private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
357 ClassNotFoundException {
358 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
359 try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
363 final byte[] bytes = bos.toByteArray();
364 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
365 try (ObjectInputStream ois = new ObjectInputStream(bis)) {
366 final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
367 assertEquals(0, ois.available());
373 public void testSerialization() throws IOException, ClassNotFoundException {
374 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
375 new NodeIdentifier(NODENAME2));
376 assertEquals(fixed, serdes(fixed));
378 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
379 assertEquals(stacked, serdes(stacked));
381 final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.empty());
382 assertSame(YangInstanceIdentifier.empty(), empty);
386 public void testToOptimized() {
387 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
388 new NodeIdentifier(NODENAME2));
389 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(NodeIdentifier.create(NODENAME1))
390 .node(NodeIdentifier.create(NODENAME2));
392 assertSame(fixed, fixed.toOptimized());
394 final YangInstanceIdentifier opt = stacked.toOptimized();
395 assertTrue(opt instanceof FixedYangInstanceIdentifier);
396 assertEquals(fixed, stacked.toOptimized());
400 public void testGetParent() {
401 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
402 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
403 final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
405 assertNull(YangInstanceIdentifier.empty().getParent());
406 assertSame(YangInstanceIdentifier.empty(), fixed.getParent());
407 assertSame(YangInstanceIdentifier.empty(), stacked.getParent());
408 assertSame(stacked, twoStacked.getParent());
412 public void testIsEmpty() {
413 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
414 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
416 assertTrue(YangInstanceIdentifier.empty().isEmpty());
417 assertFalse(fixed.isEmpty());
418 assertFalse(stacked.isEmpty());