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-5-28", "node1");
46 private static final QName NODENAME2 = QName.create("test", "2014-5-28", "node2");
47 private static final QName NODENAME3 = QName.create("test", "2014-5-28", "node3");
48 private static final QName NODENAME4 = QName.create("test", "2014-5-28", "node4");
49 private static final QName KEY1 = QName.create("test", "2014-5-28", "key1");
50 private static final QName KEY2 = QName.create("test", "2014-5-28", "key2");
51 private static final QName KEY3 = QName.create("test", "2014-5-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());
181 assertNotNull(newID.toString()); // for code coverage
185 public void testBuilder() {
186 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
188 .nodeWithKey(NODENAME2, Collections.singletonMap(KEY1, "foo"))
189 .nodeWithKey(NODENAME3, KEY2, "bar").build();
191 assertNotNull("InstanceIdentifier is null", newID);
192 assertEquals("Path size", 3, newID.getPathArguments().size());
194 Iterator<PathArgument> it = newID.getPathArguments().iterator();
195 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
196 verifyNodeIdentifierWithPredicates("PathArg 2", it.next(), NODENAME2, KEY1, "foo");
197 verifyNodeIdentifierWithPredicates("PathArg 3", it.next(), NODENAME3, KEY2, "bar");
199 newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
201 assertNotNull("InstanceIdentifier is null", newID);
202 assertEquals("Path size", 4, newID.getPathArguments().size());
204 it = newID.getPathArguments().iterator();
205 assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
206 assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
207 assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
208 assertEquals("PathArg 4 node type", NODENAME4, it.next().getNodeType());
210 newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
212 assertNotNull("InstanceIdentifier is null", newID);
213 assertEquals("Path size", 1, newID.getPathArguments().size());
214 assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
217 private static void verifyNodeIdentifierWithPredicates(final String prefix,
218 final PathArgument arg, final QName nodeName, final QName key, final Object value) {
220 assertNotNull(prefix + " is null", arg);
221 assertEquals(prefix + " class", NodeIdentifierWithPredicates.class, arg.getClass());
222 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
223 assertEquals(prefix + " node type", nodeName, node.getNodeType());
224 assertEquals(prefix + " key values map size", 1, node.getKeyValues().size());
225 Entry<QName, Object> entry = node.getKeyValues().entrySet().iterator().next();
226 assertEquals(prefix + " key values map entry key", key, entry.getKey());
227 assertEquals(prefix + " key values map entry value", value, entry.getValue());
231 public void testNodeIdentifierWithPredicates() {
233 NodeIdentifierWithPredicates node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
234 verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
236 NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
238 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
239 assertTrue("equals", node1.equals(node2));
241 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME2, KEY1, "foo")));
242 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY2, "foo")));
243 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, "bar")));
244 assertFalse("equals", node1.equals(new Object()));
246 assertNotNull(node1.toString()); // for code coverage
247 assertNotNull(node1.toRelativeString(node2));
249 NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates(NODENAME1,
250 ImmutableMap.of(KEY1, 10, KEY2, 20));
252 NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates(NODENAME1,
253 ImmutableMap.of(KEY1, 10, KEY2, 20));
255 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
256 assertTrue("equals", node3.equals(node4));
258 assertFalse("equals", node3.equals(node1));
259 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1,
260 ImmutableMap.of(KEY1, 10, KEY3, 20))));
262 node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
263 node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
265 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
266 assertTrue("equals", node1.equals(node2));
268 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,3})));
269 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1})));
270 assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(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()));
289 assertNotNull(node1.toString()); // for code coverage
290 assertNotNull(node1.toRelativeString(node2));
292 NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
293 NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
295 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
296 assertTrue("equals", node3.equals(node4));
298 assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
299 assertFalse("equals", node3.equals(node1));
303 public void testNodeIdentifier() {
305 final NodeIdentifier node1 = new NodeIdentifier(NODENAME1);
306 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
307 final NodeIdentifier node2 = new NodeIdentifier(NODENAME1);
308 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
310 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
311 assertEquals("compareTo", 0, node1.compareTo(node2));
312 assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
314 assertFalse("equals", node1.equals(null));
315 assertFalse("equals", node1.equals(node3));
316 assertTrue("equals", node1.equals(node1));
317 assertTrue("equals", node1.equals(node2));
318 assertFalse("equals", node1.equals(new NodeIdentifier(NODENAME3)));
319 assertFalse("equals", node1.equals(new Object()));
321 assertNotNull(node1.toString()); // for code coverage
324 @Test(expected = UnsupportedOperationException.class)
325 public void testAugmentationIdentifierNodeType() {
326 AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
331 public void testAugmentationIdentifier() {
333 final AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
334 assertEquals("getPossibleChildNames", ImmutableSet.of(NODENAME1, NODENAME2), node1.getPossibleChildNames());
335 final AugmentationIdentifier node2 = new AugmentationIdentifier(ImmutableSet.of(NODENAME2, NODENAME1));
336 final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME3));
337 final AugmentationIdentifier node4 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2,
339 final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
341 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
343 assertTrue("equals", node1.equals(node1));
344 assertTrue("equals", node1.equals(node2));
345 assertFalse("equals", node1.equals(node3));
346 assertFalse("equals", node1.equals(new AugmentationIdentifier(ImmutableSet.of(NODENAME1))));
347 assertFalse("equals", node1.equals(new Object()));
349 assertEquals("compareTo", -1, node1.compareTo(node5));
350 assertEquals("compareTo", 0, node1.compareTo(node2));
351 assertEquals("compareTo", 0, node1.compareTo(node2));
352 assertEquals("compareTo", 1, node1.compareTo(node4));
353 assertEquals("compareTo", -1, node4.compareTo(node1));
355 assertNotNull(node1.toString()); // for code coverage
356 assertNotNull(node1.toRelativeString(node5));
359 private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
360 ClassNotFoundException {
361 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
362 try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
366 final byte[] bytes = bos.toByteArray();
367 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
368 try (ObjectInputStream ois = new ObjectInputStream(bis)) {
369 final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
370 assertEquals(0, ois.available());
376 public void testSerialization() throws IOException, ClassNotFoundException {
377 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
378 new NodeIdentifier(NODENAME2));
379 assertEquals(fixed, serdes(fixed));
381 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
382 assertEquals(stacked, serdes(stacked));
384 final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.EMPTY);
385 assertSame(YangInstanceIdentifier.EMPTY, empty);
389 public void testToOptimized() {
390 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
391 new NodeIdentifier(NODENAME2));
392 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(NodeIdentifier.create(NODENAME1))
393 .node(NodeIdentifier.create(NODENAME2));
395 assertSame(fixed, fixed.toOptimized());
397 final YangInstanceIdentifier opt = stacked.toOptimized();
398 assertTrue(opt instanceof FixedYangInstanceIdentifier);
399 assertEquals(fixed, stacked.toOptimized());
403 public void testGetParent() {
404 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
405 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
406 final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
408 assertNull(YangInstanceIdentifier.EMPTY.getParent());
409 assertSame(YangInstanceIdentifier.EMPTY, fixed.getParent());
410 assertSame(YangInstanceIdentifier.EMPTY, stacked.getParent());
411 assertSame(stacked, twoStacked.getParent());
415 public void testIsEmpty() {
416 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
417 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
419 assertTrue(YangInstanceIdentifier.EMPTY.isEmpty());
420 assertFalse(fixed.isEmpty());
421 assertFalse(stacked.isEmpty());