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
9 package org.opendaylight.yangtools.yang.data.api;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNotEquals;
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.base.Optional;
20 import com.google.common.collect.ImmutableMap;
21 import com.google.common.collect.Lists;
22 import com.google.common.collect.Sets;
23 import java.io.ByteArrayInputStream;
24 import java.io.ByteArrayOutputStream;
25 import java.io.IOException;
26 import java.io.ObjectInputStream;
27 import java.io.ObjectOutputStream;
28 import java.util.Collections;
29 import java.util.Iterator;
30 import java.util.List;
31 import java.util.Map.Entry;
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-5-28", "node1");
48 private static final QName NODENAME2 = QName.create("test", "2014-5-28", "node2");
49 private static final QName NODENAME3 = QName.create("test", "2014-5-28", "node3");
50 private static final QName NODENAME4 = QName.create("test", "2014-5-28", "node4");
51 private static final QName KEY1 = QName.create("test", "2014-5-28", "key1");
52 private static final QName KEY2 = QName.create("test", "2014-5-28", "key2");
53 private static final QName KEY3 = QName.create("test", "2014-5-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 assertEquals("equals", false, id1.equals(null));
85 assertEquals("equals", true, id1.equals(id1));
86 assertEquals("equals", true, id1.equals(id2));
87 assertEquals("equals", false, id1.equals(id3));
88 assertEquals("equals", false, id1.equals(id4));
89 assertEquals("equals", false, 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(Lists.newArrayList(
133 new NodeIdentifier(NODENAME1), new NodeIdentifier(NODENAME2)));
135 Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
136 assertEquals("isPresent", true, 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 assertEquals("isPresent", true, relative.isPresent());
145 assertEquals("Path size", 0, relative.get().getPathArguments().size());
147 relative = id2.relativeTo(id1);
148 assertEquals("isPresent", false, 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 assertEquals("contains", true, id2.contains(id1));
170 assertEquals("contains", true, id2.contains(id3));
171 assertEquals("contains", false, id1.contains(id2));
172 assertEquals("contains", false, 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());
183 assertNotNull(newID.toString()); // for code coverage
187 public void testBuilder() {
188 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
190 .nodeWithKey(NODENAME2, Collections.singletonMap(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 assertEquals(prefix + " class", NodeIdentifierWithPredicates.class, arg.getClass());
224 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
225 assertEquals(prefix + " node type", nodeName, node.getNodeType());
226 assertEquals(prefix + " key values map size", 1, node.getKeyValues().size());
227 Entry<QName, Object> entry = node.getKeyValues().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 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
236 verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
238 NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
240 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
241 assertEquals("equals", true, node1.equals(node2));
243 assertEquals("equals", false,
244 node1.equals(new NodeIdentifierWithPredicates(NODENAME2, KEY1, "foo")));
245 assertEquals("equals", false,
246 node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY2, "foo")));
247 assertEquals("equals", false,
248 node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, "bar")));
249 assertEquals("equals", false, node1.equals(new Object()));
251 assertNotNull(node1.toString()); // for code coverage
252 assertNotNull(node1.toRelativeString(node2));
254 NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates(NODENAME1,
255 ImmutableMap.<QName, Object>builder().put(KEY1, 10).put(KEY2, 20).build());
257 NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates(NODENAME1,
258 ImmutableMap.<QName, Object>builder().put(KEY1, 10).put(KEY2, 20).build());
260 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
261 assertEquals("equals", true, node3.equals(node4));
263 assertEquals("equals", false, node3.equals(node1));
264 assertEquals("equals", false,
265 node1.equals(new NodeIdentifierWithPredicates(NODENAME1,
266 ImmutableMap.<QName, Object>builder().put(KEY1, 10).put(KEY3, 20).build())));
268 node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
269 node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
271 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
272 assertEquals("equals", true, node1.equals(node2));
274 assertEquals("equals", false,
275 node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,3})));
276 assertEquals("equals", false,
277 node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1})));
278 assertEquals("equals", false,
279 node1.equals(new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2,3})));
283 public void testNodeWithValue() {
285 NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
286 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
287 assertEquals("getValue", "foo", node1.getValue());
289 NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
291 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
292 assertEquals("equals", true, node1.equals(node2));
294 assertEquals("equals", false, node1.equals(new NodeWithValue<>(NODENAME1, "bar")));
295 assertEquals("equals", false, node1.equals(new NodeWithValue<>(NODENAME2, "foo")));
296 assertEquals("equals", false, node1.equals(new Object()));
298 assertNotNull(node1.toString()); // for code coverage
299 assertNotNull(node1.toRelativeString(node2));
301 NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
302 NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
304 assertEquals("hashCode", node3.hashCode(), node4.hashCode());
305 assertEquals("equals", true, node3.equals(node4));
307 assertEquals("equals", false, node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
308 assertEquals("equals", false, node3.equals(node1));
312 public void testNodeIdentifier() {
314 final NodeIdentifier node1 = new NodeIdentifier(NODENAME1);
315 assertEquals("getNodeType", NODENAME1, node1.getNodeType());
316 final NodeIdentifier node2 = new NodeIdentifier(NODENAME1);
317 final AugmentationIdentifier node3 = new AugmentationIdentifier(Sets.newHashSet(NODENAME1, NODENAME2));
319 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
320 assertEquals("compareTo", 0, node1.compareTo(node2));
321 assertEquals("compareTo", true, node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
323 assertEquals("equals", false, node1.equals(null));
324 assertEquals("equals", false, node1.equals(node3));
325 assertEquals("equals", true, node1.equals(node1));
326 assertEquals("equals", true, node1.equals(node2));
327 assertEquals("equals", false, node1.equals(new NodeIdentifier(NODENAME3)));
328 assertEquals("equals", false, node1.equals(new Object()));
330 assertNotNull(node1.toString()); // for code coverage
333 @Test(expected = UnsupportedOperationException.class)
334 public void testAugmentationIdentifierNodeType() {
335 AugmentationIdentifier node1 = new AugmentationIdentifier(Sets.newHashSet(NODENAME1, NODENAME2));
340 public void testAugmentationIdentifier() {
342 final AugmentationIdentifier node1 = new AugmentationIdentifier(Sets.newHashSet(NODENAME1, NODENAME2));
343 assertEquals("getPossibleChildNames", Sets.newHashSet(NODENAME1, NODENAME2), node1.getPossibleChildNames());
344 final AugmentationIdentifier node2 = new AugmentationIdentifier(Sets.newHashSet(NODENAME2, NODENAME1));
345 final AugmentationIdentifier node3 = new AugmentationIdentifier(Sets.newHashSet(NODENAME1, NODENAME3));
346 final AugmentationIdentifier node4 = new AugmentationIdentifier(Sets.newHashSet(NODENAME1, NODENAME2,
348 final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
350 assertEquals("hashCode", node1.hashCode(), node2.hashCode());
352 assertEquals("equals", true, node1.equals(node1));
353 assertEquals("equals", true, node1.equals(node2));
354 assertEquals("equals", false, node1.equals(node3));
355 assertEquals("equals", false, node1.equals(new AugmentationIdentifier(Sets.newHashSet(NODENAME1))));
356 assertEquals("equals", false, node1.equals(new Object()));
358 assertEquals("compareTo", -1, node1.compareTo(node5));
359 assertNotEquals("compareTo", -1, node1.compareTo(node2));
360 assertEquals("compareTo", 0, node1.compareTo(node2));
361 assertEquals("compareTo", 1, node1.compareTo(node4));
362 assertEquals("compareTo", -1, node4.compareTo(node1));
364 assertNotNull(node1.toString()); // for code coverage
365 assertNotNull(node1.toRelativeString(node5));
368 private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
369 ClassNotFoundException {
370 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
371 try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
375 final byte[] bytes = bos.toByteArray();
376 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
377 try (ObjectInputStream ois = new ObjectInputStream(bis)) {
378 final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
379 assertEquals(0, ois.available());
385 public void testSerialization() throws IOException, ClassNotFoundException {
386 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
387 new NodeIdentifier(NODENAME2));
388 assertEquals(fixed, serdes(fixed));
390 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
391 assertEquals(stacked, serdes(stacked));
393 final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.EMPTY);
394 assertSame(YangInstanceIdentifier.EMPTY, empty);
398 public void testToOptimized() {
399 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
400 new NodeIdentifier(NODENAME2));
401 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(NodeIdentifier.create(NODENAME1))
402 .node(NodeIdentifier.create(NODENAME2));
404 assertSame(fixed, fixed.toOptimized());
406 final YangInstanceIdentifier opt = stacked.toOptimized();
407 assertTrue(opt instanceof FixedYangInstanceIdentifier);
408 assertEquals(fixed, stacked.toOptimized());
412 public void testGetParent() {
413 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
414 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
415 final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
417 assertNull(YangInstanceIdentifier.EMPTY.getParent());
418 assertSame(YangInstanceIdentifier.EMPTY, fixed.getParent());
419 assertSame(YangInstanceIdentifier.EMPTY, stacked.getParent());
420 assertSame(stacked, twoStacked.getParent());
424 public void testIsEmpty() {
425 final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
426 final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
428 assertTrue(YangInstanceIdentifier.EMPTY.isEmpty());
429 assertFalse(fixed.isEmpty());
430 assertFalse(stacked.isEmpty());