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.assertTrue;
19 import com.google.common.collect.ImmutableMap;
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.Arrays;
27 import java.util.Collections;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.Map.Entry;
31 import java.util.Optional;
32 import org.junit.Test;
33 import org.opendaylight.yangtools.yang.common.QName;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
37 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
38 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
41 * Unit tests for InstanceIdentifier.
43 * @author Thomas Pantelis
45 public class YangInstanceIdentifierTest {
47 private static final QName NODENAME1 = QName.create("test", "2014-05-28", "node1");
48 private static final QName NODENAME2 = QName.create("test", "2014-05-28", "node2");
49 private static final QName NODENAME3 = QName.create("test", "2014-05-28", "node3");
50 private static final QName NODENAME4 = QName.create("test", "2014-05-28", "node4");
51 private static final QName KEY1 = QName.create("test", "2014-05-28", "key1");
52 private static final QName KEY2 = QName.create("test", "2014-05-28", "key2");
53 private static final QName KEY3 = QName.create("test", "2014-05-28", "key3");
56 public void testGetLastPathArgument() {
57 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
58 new NodeIdentifier(NODENAME2));
59 assertEquals("getLastPathArgument", new NodeIdentifier(NODENAME2), id1.getLastPathArgument());
60 YangInstanceIdentifier id2 = YangInstanceIdentifier.create();
61 assertNull(id2.getLastPathArgument());
65 public void testHashCodeEquals() {
66 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(NodeIdentifier.create(NODENAME1),
67 new NodeIdentifier(NODENAME2));
68 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
69 NodeIdentifier.create(NODENAME2));
71 assertEquals("hashCode", id1.hashCode(), id2.hashCode());
75 public void testEquals() {
76 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
77 new NodeIdentifier(NODENAME2));
78 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
79 new NodeIdentifier(NODENAME2));
80 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME2),
81 new NodeIdentifier(NODENAME1));
82 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
84 assertFalse("equals", id1.equals(null));
85 assertTrue("equals", id1.equals(id1));
86 assertTrue("equals", id1.equals(id2));
87 assertFalse("equals", id1.equals(id3));
88 assertFalse("equals", id1.equals(id4));
89 assertFalse("equals", id1.equals(new Object()));
93 public void testToString() {
94 YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
95 new NodeIdentifier(NODENAME2));
97 assertNotNull(id.toString());
101 public void testNode() {
102 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
103 new NodeIdentifier(NODENAME2));
105 YangInstanceIdentifier newID = id.node(NODENAME3);
107 assertNotNull("InstanceIdentifier is null", newID);
108 assertEquals("Path size", 3, newID.getPathArguments().size());
110 Iterator<PathArgument> it = newID.getPathArguments().iterator();
111 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
112 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
113 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
115 newID = id.node(new NodeIdentifier(NODENAME3));
117 assertNotNull("InstanceIdentifier is null", newID);
118 assertEquals("Path size", 3, newID.getPathArguments().size());
120 it = newID.getPathArguments().iterator();
121 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
122 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
123 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
127 public void testRelativeTo() {
128 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
129 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
130 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
131 new NodeIdentifier(NODENAME2));
132 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(Arrays.asList(
133 new NodeIdentifier(NODENAME1), new NodeIdentifier(NODENAME2)));
135 Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
136 assertTrue("isPresent", relative.isPresent());
138 List<PathArgument> path = relative.get().getPathArguments();
139 assertEquals("Path size", 2, path.size());
140 assertEquals("PathArg 1 node type", NODENAME3, path.get(0).getNodeType());
141 assertEquals("PathArg 2 node type", NODENAME4, path.get(1).getNodeType());
143 relative = id2.relativeTo(id3);
144 assertTrue("isPresent", relative.isPresent());
145 assertEquals("Path size", 0, relative.get().getPathArguments().size());
147 relative = id2.relativeTo(id1);
148 assertFalse("isPresent", relative.isPresent());
151 @Test(expected = IllegalArgumentException.class)
152 public void testContainsNull() {
153 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
159 public void testContains() {
160 final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
161 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
162 final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
163 new NodeIdentifier(NODENAME2));
164 final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
165 new NodeIdentifier(NODENAME2));
166 final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
167 new NodeIdentifier(NODENAME3));
169 assertTrue("contains", id2.contains(id1));
170 assertTrue("contains", id2.contains(id3));
171 assertFalse("contains", id1.contains(id2));
172 assertFalse("contains", id2.contains(id4));
176 public void testOf() {
177 YangInstanceIdentifier newID = YangInstanceIdentifier.of(NODENAME1);
179 assertNotNull("InstanceIdentifier is null", newID);
180 assertEquals("Path size", 1, newID.getPathArguments().size());
181 assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
184 assertNotNull(newID.toString());
188 public void testBuilder() {
189 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
191 .nodeWithKey(NODENAME2, Collections.singletonMap(KEY1, "foo"))
192 .nodeWithKey(NODENAME3, KEY2, "bar").build();
194 assertNotNull("InstanceIdentifier is null", newID);
195 assertEquals("Path size", 3, newID.getPathArguments().size());
197 Iterator<PathArgument> it = newID.getPathArguments().iterator();
198 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
199 verifyNodeIdentifierWithPredicates("PathArg 2", it.next(), NODENAME2, KEY1, "foo");
200 verifyNodeIdentifierWithPredicates("PathArg 3", it.next(), NODENAME3, KEY2, "bar");
202 newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
204 assertNotNull("InstanceIdentifier is null", newID);
205 assertEquals("Path size", 4, newID.getPathArguments().size());
207 it = newID.getPathArguments().iterator();
208 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
209 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
210 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
211 assertEquals("PathArg 4 node type", NODENAME4, it.next().getNodeType());
213 newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
215 assertNotNull("InstanceIdentifier is null", newID);
216 assertEquals("Path size", 1, newID.getPathArguments().size());
217 assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
220 private static void verifyNodeIdentifierWithPredicates(final String prefix,
221 final PathArgument arg, final QName nodeName, final QName key, final Object value) {
223 assertNotNull(prefix + " is null", arg);
224 assertThat(arg, instanceOf(NodeIdentifierWithPredicates.class));
225 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
226 assertEquals(prefix + " node type", nodeName, node.getNodeType());
227 assertEquals(prefix + " key values map size", 1, node.size());
228 Entry<QName, Object> entry = node.entrySet().iterator().next();
229 assertEquals(prefix + " key values map entry key", key, entry.getKey());
230 assertEquals(prefix + " key values map entry value", value, entry.getValue());
234 public void testNodeIdentifierWithPredicates() {
236 NodeIdentifierWithPredicates node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
237 verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
239 NodeIdentifierWithPredicates node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
241 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
242 assertTrue("equals", node1.equals(node2));
244 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME2, KEY1, "foo")));
245 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY2, "foo")));
246 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "bar")));
247 assertFalse("equals", node1.equals(new Object()));
250 assertNotNull(node1.toString());
251 assertNotNull(node1.toRelativeString(node2));
253 NodeIdentifierWithPredicates node3 = NodeIdentifierWithPredicates.of(NODENAME1,
254 ImmutableMap.of(KEY1, 10, KEY2, 20));
256 NodeIdentifierWithPredicates node4 = NodeIdentifierWithPredicates.of(NODENAME1,
257 ImmutableMap.of(KEY1, 10, KEY2, 20));
259 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
260 assertTrue("equals", node3.equals(node4));
262 assertFalse("equals", node3.equals(node1));
263 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1,
264 ImmutableMap.of(KEY1, 10, KEY3, 20))));
266 node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
267 node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
269 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
270 assertTrue("equals", node1.equals(node2));
272 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 3})));
273 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1 })));
274 assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2, 3 })));
278 public void testNodeWithValue() {
280 NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
281 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
282 assertEquals("getValue", "foo", node1.getValue());
284 NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
286 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
287 assertTrue("equals", node1.equals(node2));
289 assertFalse("equals", node1.equals(new NodeWithValue<>(NODENAME1, "bar")));
290 assertFalse("equals", node1.equals(new NodeWithValue<>(NODENAME2, "foo")));
291 assertFalse("equals", node1.equals(new Object()));
294 assertNotNull(node1.toString());
295 assertNotNull(node1.toRelativeString(node2));
297 NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
298 NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
300 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
301 assertTrue("equals", node3.equals(node4));
303 assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
304 assertFalse("equals", node3.equals(node1));
308 public void testNodeIdentifier() {
310 final NodeIdentifier node1 = new NodeIdentifier(NODENAME1);
311 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
312 final NodeIdentifier node2 = new NodeIdentifier(NODENAME1);
313 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
315 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
316 assertEquals("compareTo", 0, node1.compareTo(node2));
317 assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
319 assertFalse("equals", node1.equals(null));
320 assertFalse("equals", node1.equals(node3));
321 assertTrue("equals", node1.equals(node1));
322 assertTrue("equals", node1.equals(node2));
323 assertFalse("equals", node1.equals(new NodeIdentifier(NODENAME3)));
324 assertFalse("equals", node1.equals(new Object()));
327 assertNotNull(node1.toString());
330 @Test(expected = UnsupportedOperationException.class)
331 public void testAugmentationIdentifierNodeType() {
332 AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
337 public void testAugmentationIdentifier() {
339 final AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
340 assertEquals("getPossibleChildNames", ImmutableSet.of(NODENAME1, NODENAME2), node1.getPossibleChildNames());
341 final AugmentationIdentifier node2 = new AugmentationIdentifier(ImmutableSet.of(NODENAME2, NODENAME1));
342 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME3));
343 final AugmentationIdentifier node4 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2,
345 final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
347 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
349 assertTrue("equals", node1.equals(node1));
350 assertTrue("equals", node1.equals(node2));
351 assertFalse("equals", node1.equals(node3));
352 assertFalse("equals", node1.equals(new AugmentationIdentifier(ImmutableSet.of(NODENAME1))));
353 assertFalse("equals", node1.equals(new Object()));
355 assertEquals("compareTo", -1, node1.compareTo(node5));
356 assertEquals("compareTo", 0, node1.compareTo(node2));
357 assertEquals("compareTo", 0, node1.compareTo(node2));
358 assertEquals("compareTo", 1, node1.compareTo(node4));
359 assertEquals("compareTo", -1, node4.compareTo(node1));
362 assertNotNull(node1.toString());
363 assertNotNull(node1.toRelativeString(node5));
366 private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
367 ClassNotFoundException {
368 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
369 try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
373 final byte[] bytes = bos.toByteArray();
374 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
375 try (ObjectInputStream ois = new ObjectInputStream(bis)) {
376 final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
377 assertEquals(0, ois.available());
383 public void testSerialization() throws IOException, ClassNotFoundException {
384 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
385 new NodeIdentifier(NODENAME2));
386 assertEquals(fixed, serdes(fixed));
388 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
389 assertEquals(stacked, serdes(stacked));
391 final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.empty());
392 assertSame(YangInstanceIdentifier.empty(), empty);
396 public void testToOptimized() {
397 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
398 new NodeIdentifier(NODENAME2));
399 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(NodeIdentifier.create(NODENAME1))
400 .node(NodeIdentifier.create(NODENAME2));
402 assertSame(fixed, fixed.toOptimized());
404 final YangInstanceIdentifier opt = stacked.toOptimized();
405 assertTrue(opt instanceof FixedYangInstanceIdentifier);
406 assertEquals(fixed, stacked.toOptimized());
410 public void testGetParent() {
411 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
412 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
413 final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
415 assertNull(YangInstanceIdentifier.empty().getParent());
416 assertSame(YangInstanceIdentifier.empty(), fixed.getParent());
417 assertSame(YangInstanceIdentifier.empty(), stacked.getParent());
418 assertSame(stacked, twoStacked.getParent());
422 public void testIsEmpty() {
423 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
424 final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
426 assertTrue(YangInstanceIdentifier.empty().isEmpty());
427 assertFalse(fixed.isEmpty());
428 assertFalse(stacked.isEmpty());