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.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertSame;
15 import static org.junit.Assert.assertTrue;
17 import com.google.common.collect.ImmutableMap;
18 import com.google.common.collect.ImmutableSet;
19 import java.io.ByteArrayInputStream;
20 import java.io.ByteArrayOutputStream;
21 import java.io.IOException;
22 import java.io.ObjectInputStream;
23 import java.io.ObjectOutputStream;
24 import java.util.Arrays;
25 import java.util.Collections;
26 import java.util.Iterator;
27 import java.util.List;
28 import java.util.Map.Entry;
29 import java.util.Optional;
30 import org.junit.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 {
45 private static final QName NODENAME1 = QName.create("test", "2014-05-28", "node1");
46 private static final QName NODENAME2 = QName.create("test", "2014-05-28", "node2");
47 private static final QName NODENAME3 = QName.create("test", "2014-05-28", "node3");
48 private static final QName NODENAME4 = QName.create("test", "2014-05-28", "node4");
49 private static final QName KEY1 = QName.create("test", "2014-05-28", "key1");
50 private static final QName KEY2 = QName.create("test", "2014-05-28", "key2");
51 private static final QName KEY3 = QName.create("test", "2014-05-28", "key3");
54 public void testGetLastPathArgument() {
55 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
56 new NodeIdentifier(NODENAME2));
57 assertEquals("getLastPathArgument", new NodeIdentifier(NODENAME2), id1.getLastPathArgument());
58 YangInstanceIdentifier id2 = YangInstanceIdentifier.create();
59 assertNull(id2.getLastPathArgument());
63 public void testHashCodeEquals() {
64 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(NodeIdentifier.create(NODENAME1),
65 new NodeIdentifier(NODENAME2));
66 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
67 NodeIdentifier.create(NODENAME2));
69 assertEquals("hashCode", id1.hashCode(), id2.hashCode());
73 public void testEquals() {
74 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
75 new NodeIdentifier(NODENAME2));
76 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
77 new NodeIdentifier(NODENAME2));
78 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME2),
79 new NodeIdentifier(NODENAME1));
80 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
82 assertFalse("equals", id1.equals(null));
83 assertTrue("equals", id1.equals(id1));
84 assertTrue("equals", id1.equals(id2));
85 assertFalse("equals", id1.equals(id3));
86 assertFalse("equals", id1.equals(id4));
87 assertFalse("equals", id1.equals(new Object()));
91 public void testToString() {
92 YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
93 new NodeIdentifier(NODENAME2));
95 assertNotNull(id.toString());
99 public void testNode() {
100 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
101 new NodeIdentifier(NODENAME2));
103 YangInstanceIdentifier newID = id.node(NODENAME3);
105 assertNotNull("InstanceIdentifier is null", newID);
106 assertEquals("Path size", 3, newID.getPathArguments().size());
108 Iterator<PathArgument> it = newID.getPathArguments().iterator();
109 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
110 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
111 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
113 newID = id.node(new NodeIdentifier(NODENAME3));
115 assertNotNull("InstanceIdentifier is null", newID);
116 assertEquals("Path size", 3, newID.getPathArguments().size());
118 it = newID.getPathArguments().iterator();
119 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
120 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
121 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
125 public void testRelativeTo() {
126 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
127 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
128 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
129 new NodeIdentifier(NODENAME2));
130 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(Arrays.asList(
131 new NodeIdentifier(NODENAME1), new NodeIdentifier(NODENAME2)));
133 Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
134 assertTrue("isPresent", relative.isPresent());
136 List<PathArgument> path = relative.get().getPathArguments();
137 assertEquals("Path size", 2, path.size());
138 assertEquals("PathArg 1 node type", NODENAME3, path.get(0).getNodeType());
139 assertEquals("PathArg 2 node type", NODENAME4, path.get(1).getNodeType());
141 relative = id2.relativeTo(id3);
142 assertTrue("isPresent", relative.isPresent());
143 assertEquals("Path size", 0, relative.get().getPathArguments().size());
145 relative = id2.relativeTo(id1);
146 assertFalse("isPresent", relative.isPresent());
149 @Test(expected = IllegalArgumentException.class)
150 public void testContainsNull() {
151 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
157 public void testContains() {
158 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
159 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
160 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
161 new NodeIdentifier(NODENAME2));
162 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
163 new NodeIdentifier(NODENAME2));
164 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
165 new NodeIdentifier(NODENAME3));
167 assertTrue("contains", id2.contains(id1));
168 assertTrue("contains", id2.contains(id3));
169 assertFalse("contains", id1.contains(id2));
170 assertFalse("contains", id2.contains(id4));
174 public void testOf() {
175 YangInstanceIdentifier newID = YangInstanceIdentifier.of(NODENAME1);
177 assertNotNull("InstanceIdentifier is null", newID);
178 assertEquals("Path size", 1, newID.getPathArguments().size());
179 assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
182 assertNotNull(newID.toString());
186 public void testBuilder() {
187 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
189 .nodeWithKey(NODENAME2, Collections.singletonMap(KEY1, "foo"))
190 .nodeWithKey(NODENAME3, KEY2, "bar").build();
192 assertNotNull("InstanceIdentifier is null", newID);
193 assertEquals("Path size", 3, newID.getPathArguments().size());
195 Iterator<PathArgument> it = newID.getPathArguments().iterator();
196 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
197 verifyNodeIdentifierWithPredicates("PathArg 2", it.next(), NODENAME2, KEY1, "foo");
198 verifyNodeIdentifierWithPredicates("PathArg 3", it.next(), NODENAME3, KEY2, "bar");
200 newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
202 assertNotNull("InstanceIdentifier is null", newID);
203 assertEquals("Path size", 4, newID.getPathArguments().size());
205 it = newID.getPathArguments().iterator();
206 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
207 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
208 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
209 assertEquals("PathArg 4 node type", NODENAME4, it.next().getNodeType());
211 newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
213 assertNotNull("InstanceIdentifier is null", newID);
214 assertEquals("Path size", 1, newID.getPathArguments().size());
215 assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
218 private static void verifyNodeIdentifierWithPredicates(final String prefix,
219 final PathArgument arg, final QName nodeName, final QName key, final Object value) {
221 assertNotNull(prefix + " is null", arg);
222 assertEquals(prefix + " class", NodeIdentifierWithPredicates.class, arg.getClass());
223 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
224 assertEquals(prefix + " node type", nodeName, node.getNodeType());
225 assertEquals(prefix + " key values map size", 1, node.getKeyValues().size());
226 Entry<QName, Object> entry = node.getKeyValues().entrySet().iterator().next();
227 assertEquals(prefix + " key values map entry key", key, entry.getKey());
228 assertEquals(prefix + " key values map entry value", value, entry.getValue());
232 public void testNodeIdentifierWithPredicates() {
234 NodeIdentifierWithPredicates node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
235 verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
237 NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
239 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
240 assertTrue("equals", node1.equals(node2));
242 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME2, KEY1, "foo")));
243 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY2, "foo")));
244 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, "bar")));
245 assertFalse("equals", node1.equals(new Object()));
248 assertNotNull(node1.toString());
249 assertNotNull(node1.toRelativeString(node2));
251 NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates(NODENAME1,
252 ImmutableMap.of(KEY1, 10, KEY2, 20));
254 NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates(NODENAME1,
255 ImmutableMap.of(KEY1, 10, KEY2, 20));
257 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
258 assertTrue("equals", node3.equals(node4));
260 assertFalse("equals", node3.equals(node1));
261 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1,
262 ImmutableMap.of(KEY1, 10, KEY3, 20))));
264 node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
265 node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
267 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
268 assertTrue("equals", node1.equals(node2));
270 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,3})));
271 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1})));
272 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2,3})));
276 public void testNodeWithValue() {
278 NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
279 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
280 assertEquals("getValue", "foo", node1.getValue());
282 NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
284 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
285 assertTrue("equals", node1.equals(node2));
287 assertFalse("equals", node1.equals(new NodeWithValue<>(NODENAME1, "bar")));
288 assertFalse("equals", node1.equals(new NodeWithValue<>(NODENAME2, "foo")));
289 assertFalse("equals", node1.equals(new Object()));
292 assertNotNull(node1.toString());
293 assertNotNull(node1.toRelativeString(node2));
295 NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
296 NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
298 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
299 assertTrue("equals", node3.equals(node4));
301 assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
302 assertFalse("equals", node3.equals(node1));
306 public void testNodeIdentifier() {
308 final NodeIdentifier node1 = new NodeIdentifier(NODENAME1);
309 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
310 final NodeIdentifier node2 = new NodeIdentifier(NODENAME1);
311 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
313 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
314 assertEquals("compareTo", 0, node1.compareTo(node2));
315 assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
317 assertFalse("equals", node1.equals(null));
318 assertFalse("equals", node1.equals(node3));
319 assertTrue("equals", node1.equals(node1));
320 assertTrue("equals", node1.equals(node2));
321 assertFalse("equals", node1.equals(new NodeIdentifier(NODENAME3)));
322 assertFalse("equals", node1.equals(new Object()));
325 assertNotNull(node1.toString());
328 @Test(expected = UnsupportedOperationException.class)
329 public void testAugmentationIdentifierNodeType() {
330 AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
335 public void testAugmentationIdentifier() {
337 final AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
338 assertEquals("getPossibleChildNames", ImmutableSet.of(NODENAME1, NODENAME2), node1.getPossibleChildNames());
339 final AugmentationIdentifier node2 = new AugmentationIdentifier(ImmutableSet.of(NODENAME2, NODENAME1));
340 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME3));
341 final AugmentationIdentifier node4 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2,
343 final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
345 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
347 assertTrue("equals", node1.equals(node1));
348 assertTrue("equals", node1.equals(node2));
349 assertFalse("equals", node1.equals(node3));
350 assertFalse("equals", node1.equals(new AugmentationIdentifier(ImmutableSet.of(NODENAME1))));
351 assertFalse("equals", node1.equals(new Object()));
353 assertEquals("compareTo", -1, node1.compareTo(node5));
354 assertEquals("compareTo", 0, node1.compareTo(node2));
355 assertEquals("compareTo", 0, node1.compareTo(node2));
356 assertEquals("compareTo", 1, node1.compareTo(node4));
357 assertEquals("compareTo", -1, node4.compareTo(node1));
360 assertNotNull(node1.toString());
361 assertNotNull(node1.toRelativeString(node5));
364 private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
365 ClassNotFoundException {
366 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
367 try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
371 final byte[] bytes = bos.toByteArray();
372 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
373 try (ObjectInputStream ois = new ObjectInputStream(bis)) {
374 final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
375 assertEquals(0, ois.available());
381 public void testSerialization() throws IOException, ClassNotFoundException {
382 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
383 new NodeIdentifier(NODENAME2));
384 assertEquals(fixed, serdes(fixed));
386 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
387 assertEquals(stacked, serdes(stacked));
389 final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.EMPTY);
390 assertSame(YangInstanceIdentifier.EMPTY, empty);
394 public void testToOptimized() {
395 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
396 new NodeIdentifier(NODENAME2));
397 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(NodeIdentifier.create(NODENAME1))
398 .node(NodeIdentifier.create(NODENAME2));
400 assertSame(fixed, fixed.toOptimized());
402 final YangInstanceIdentifier opt = stacked.toOptimized();
403 assertTrue(opt instanceof FixedYangInstanceIdentifier);
404 assertEquals(fixed, stacked.toOptimized());
408 public void testGetParent() {
409 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
410 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
411 final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
413 assertNull(YangInstanceIdentifier.EMPTY.getParent());
414 assertSame(YangInstanceIdentifier.EMPTY, fixed.getParent());
415 assertSame(YangInstanceIdentifier.EMPTY, stacked.getParent());
416 assertSame(stacked, twoStacked.getParent());
420 public void testIsEmpty() {
421 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
422 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
424 assertTrue(YangInstanceIdentifier.EMPTY.isEmpty());
425 assertFalse(fixed.isEmpty());
426 assertFalse(stacked.isEmpty());