Fix checkstyle issues reported by odlparent-3.0.0's checkstyle
[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-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");
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         // for code coverage
182         assertNotNull(newID.toString());
183     }
184
185     @Test
186     public void testBuilder() {
187         YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
188                 .node(NODENAME1)
189                 .nodeWithKey(NODENAME2, Collections.singletonMap(KEY1, "foo"))
190                 .nodeWithKey(NODENAME3, KEY2, "bar").build();
191
192         assertNotNull("InstanceIdentifier is null", newID);
193         assertEquals("Path size", 3, newID.getPathArguments().size());
194
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");
199
200         newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
201
202         assertNotNull("InstanceIdentifier is null", newID);
203         assertEquals("Path size", 4, newID.getPathArguments().size());
204
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());
210
211         newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
212
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());
216     }
217
218     private static void verifyNodeIdentifierWithPredicates(final String prefix,
219             final PathArgument arg, final QName nodeName, final QName key, final Object value) {
220
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());
229     }
230
231     @Test
232     public void testNodeIdentifierWithPredicates() {
233
234         NodeIdentifierWithPredicates node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
235         verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
236
237         NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
238
239         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
240         assertTrue("equals", node1.equals(node2));
241
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()));
246
247         // for code coverage
248         assertNotNull(node1.toString());
249         assertNotNull(node1.toRelativeString(node2));
250
251         NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates(NODENAME1,
252                 ImmutableMap.of(KEY1, 10, KEY2, 20));
253
254         NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates(NODENAME1,
255                 ImmutableMap.of(KEY1, 10, KEY2, 20));
256
257         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
258         assertTrue("equals", node3.equals(node4));
259
260         assertFalse("equals", node3.equals(node1));
261         assertFalse("equals", node1.equals(new NodeIdentifierWithPredicates(NODENAME1,
262             ImmutableMap.of(KEY1, 10, KEY3, 20))));
263
264         node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
265         node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
266
267         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
268         assertTrue("equals", node1.equals(node2));
269
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})));
273     }
274
275     @Test
276     public void testNodeWithValue() {
277
278         NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
279         assertEquals("getNodeType", NODENAME1, node1.getNodeType());
280         assertEquals("getValue", "foo", node1.getValue());
281
282         NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
283
284         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
285         assertTrue("equals", node1.equals(node2));
286
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()));
290
291         // for code coverage
292         assertNotNull(node1.toString());
293         assertNotNull(node1.toRelativeString(node2));
294
295         NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
296         NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
297
298         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
299         assertTrue("equals", node3.equals(node4));
300
301         assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
302         assertFalse("equals", node3.equals(node1));
303     }
304
305     @Test
306     public void testNodeIdentifier() {
307
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));
312
313         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
314         assertEquals("compareTo", 0, node1.compareTo(node2));
315         assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
316
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()));
323
324         // for code coverage
325         assertNotNull(node1.toString());
326     }
327
328     @Test(expected = UnsupportedOperationException.class)
329     public void testAugmentationIdentifierNodeType() {
330         AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
331         node1.getNodeType();
332     }
333
334     @Test
335     public void testAugmentationIdentifier() {
336
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,
342                     NODENAME3));
343         final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
344
345         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
346
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()));
352
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));
358
359         // for code coverage
360         assertNotNull(node1.toString());
361         assertNotNull(node1.toRelativeString(node5));
362     }
363
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)) {
368             oos.writeObject(id);
369         }
370
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());
376             return ret;
377         }
378     }
379
380     @Test
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));
385
386         final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
387         assertEquals(stacked, serdes(stacked));
388
389         final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.EMPTY);
390         assertSame(YangInstanceIdentifier.EMPTY, empty);
391     }
392
393     @Test
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));
399
400         assertSame(fixed, fixed.toOptimized());
401
402         final YangInstanceIdentifier opt = stacked.toOptimized();
403         assertTrue(opt instanceof FixedYangInstanceIdentifier);
404         assertEquals(fixed, stacked.toOptimized());
405     }
406
407     @Test
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));
412
413         assertNull(YangInstanceIdentifier.EMPTY.getParent());
414         assertSame(YangInstanceIdentifier.EMPTY, fixed.getParent());
415         assertSame(YangInstanceIdentifier.EMPTY, stacked.getParent());
416         assertSame(stacked, twoStacked.getParent());
417     }
418
419     @Test
420     public void testIsEmpty() {
421         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
422         final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
423
424         assertTrue(YangInstanceIdentifier.EMPTY.isEmpty());
425         assertFalse(fixed.isEmpty());
426         assertFalse(stacked.isEmpty());
427     }
428 }