Cleanup use of Guava library
[yangtools.git] / yang / yang-data-api / src / test / java / org / opendaylight / yangtools / yang / data / api / YangInstanceIdentifierTest.java
1 /*
2  * Copyright (c) 2014 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.api;
9
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;
16
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;
37
38 /**
39  * Unit tests for InstanceIdentifier.
40  *
41  * @author Thomas Pantelis
42  */
43 public class YangInstanceIdentifierTest {
44
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");
52
53     @Test
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());
60     }
61
62     @Test
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));
68
69         assertEquals("hashCode", id1.hashCode(), id2.hashCode());
70     }
71
72     @Test
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));
81
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()));
88     }
89
90     @Test
91     public void testToString() {
92         YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
93                 new NodeIdentifier(NODENAME2));
94
95         assertNotNull(id.toString());
96     }
97
98     @Test
99     public void testNode() {
100         final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
101                 new NodeIdentifier(NODENAME2));
102
103         YangInstanceIdentifier newID = id.node(NODENAME3);
104
105         assertNotNull("InstanceIdentifier is null", newID);
106         assertEquals("Path size", 3, newID.getPathArguments().size());
107
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());
112
113         newID = id.node(new NodeIdentifier(NODENAME3));
114
115         assertNotNull("InstanceIdentifier is null", newID);
116         assertEquals("Path size", 3, newID.getPathArguments().size());
117
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());
122     }
123
124     @Test
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)));
132
133         Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
134         assertTrue("isPresent", relative.isPresent());
135
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());
140
141         relative = id2.relativeTo(id3);
142         assertTrue("isPresent", relative.isPresent());
143         assertEquals("Path size", 0, relative.get().getPathArguments().size());
144
145         relative = id2.relativeTo(id1);
146         assertFalse("isPresent", relative.isPresent());
147     }
148
149     @Test(expected = IllegalArgumentException.class)
150     public void testContainsNull() {
151         final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
152
153         id.contains(null);
154     }
155
156     @Test
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));
166
167         assertTrue("contains", id2.contains(id1));
168         assertTrue("contains", id2.contains(id3));
169         assertFalse("contains", id1.contains(id2));
170         assertFalse("contains", id2.contains(id4));
171     }
172
173     @Test
174     public void testOf() {
175         YangInstanceIdentifier newID = YangInstanceIdentifier.of(NODENAME1);
176
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());
180
181         assertNotNull(newID.toString()); // for code coverage
182     }
183
184     @Test
185     public void testBuilder() {
186         YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
187                 .node(NODENAME1)
188                 .nodeWithKey(NODENAME2, Collections.singletonMap(KEY1, "foo"))
189                 .nodeWithKey(NODENAME3, KEY2, "bar").build();
190
191         assertNotNull("InstanceIdentifier is null", newID);
192         assertEquals("Path size", 3, newID.getPathArguments().size());
193
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");
198
199         newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
200
201         assertNotNull("InstanceIdentifier is null", newID);
202         assertEquals("Path size", 4, newID.getPathArguments().size());
203
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());
209
210         newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
211
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());
215     }
216
217     private static void verifyNodeIdentifierWithPredicates(final String prefix,
218             final PathArgument arg, final QName nodeName, final QName key, final Object value) {
219
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());
228     }
229
230     @Test
231     public void testNodeIdentifierWithPredicates() {
232
233         NodeIdentifierWithPredicates node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
234         verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
235
236         NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
237
238         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
239         assertTrue("equals", node1.equals(node2));
240
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()));
245
246         assertNotNull(node1.toString()); // for code coverage
247         assertNotNull(node1.toRelativeString(node2));
248
249         NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates(NODENAME1,
250                 ImmutableMap.of(KEY1, 10, KEY2, 20));
251
252         NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates(NODENAME1,
253                 ImmutableMap.of(KEY1, 10, KEY2, 20));
254
255         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
256         assertTrue("equals", node3.equals(node4));
257
258         assertFalse("equals", node3.equals(node1));
259         assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1,
260             ImmutableMap.of(KEY1, 10, KEY3, 20))));
261
262         node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
263         node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
264
265         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
266         assertTrue("equals", node1.equals(node2));
267
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})));
271     }
272
273     @Test
274     public void testNodeWithValue() {
275
276         NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
277         assertEquals("getNodeType", NODENAME1, node1.getNodeType());
278         assertEquals("getValue", "foo", node1.getValue());
279
280         NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
281
282         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
283         assertTrue("equals", node1.equals(node2));
284
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()));
288
289         assertNotNull(node1.toString()); // for code coverage
290         assertNotNull(node1.toRelativeString(node2));
291
292         NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
293         NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
294
295         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
296         assertTrue("equals", node3.equals(node4));
297
298         assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
299         assertFalse("equals", node3.equals(node1));
300     }
301
302     @Test
303     public void testNodeIdentifier() {
304
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));
309
310         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
311         assertEquals("compareTo", 0, node1.compareTo(node2));
312         assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
313
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()));
320
321         assertNotNull(node1.toString()); // for code coverage
322     }
323
324     @Test(expected = UnsupportedOperationException.class)
325     public void testAugmentationIdentifierNodeType() {
326         AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
327         node1.getNodeType();
328     }
329
330     @Test
331     public void testAugmentationIdentifier() {
332
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,
338                     NODENAME3));
339         final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
340
341         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
342
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()));
348
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));
354
355         assertNotNull(node1.toString()); // for code coverage
356         assertNotNull(node1.toRelativeString(node5));
357     }
358
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)) {
363             oos.writeObject(id);
364         }
365
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());
371             return ret;
372         }
373     }
374
375     @Test
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));
380
381         final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
382         assertEquals(stacked, serdes(stacked));
383
384         final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.EMPTY);
385         assertSame(YangInstanceIdentifier.EMPTY, empty);
386     }
387
388     @Test
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));
394
395         assertSame(fixed, fixed.toOptimized());
396
397         final YangInstanceIdentifier opt = stacked.toOptimized();
398         assertTrue(opt instanceof FixedYangInstanceIdentifier);
399         assertEquals(fixed, stacked.toOptimized());
400     }
401
402     @Test
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));
407
408         assertNull(YangInstanceIdentifier.EMPTY.getParent());
409         assertSame(YangInstanceIdentifier.EMPTY, fixed.getParent());
410         assertSame(YangInstanceIdentifier.EMPTY, stacked.getParent());
411         assertSame(stacked, twoStacked.getParent());
412     }
413
414     @Test
415     public void testIsEmpty() {
416         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
417         final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
418
419         assertTrue(YangInstanceIdentifier.EMPTY.isEmpty());
420         assertFalse(fixed.isEmpty());
421         assertFalse(stacked.isEmpty());
422     }
423 }