a547cc28f6cc76f2de1dd054030c9e45133f0465
[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.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;
18
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;
39
40 /**
41  * Unit tests for InstanceIdentifier.
42  *
43  * @author Thomas Pantelis
44  */
45 public class YangInstanceIdentifierTest {
46
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");
54
55     @Test
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());
62     }
63
64     @Test
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));
70
71         assertEquals("hashCode", id1.hashCode(), id2.hashCode());
72     }
73
74     @Test
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));
83
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()));
90     }
91
92     @Test
93     public void testToString() {
94         YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
95                 new NodeIdentifier(NODENAME2));
96
97         assertNotNull(id.toString());
98     }
99
100     @Test
101     public void testNode() {
102         final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
103                 new NodeIdentifier(NODENAME2));
104
105         YangInstanceIdentifier newID = id.node(NODENAME3);
106
107         assertNotNull("InstanceIdentifier is null", newID);
108         assertEquals("Path size", 3, newID.getPathArguments().size());
109
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());
114
115         newID = id.node(new NodeIdentifier(NODENAME3));
116
117         assertNotNull("InstanceIdentifier is null", newID);
118         assertEquals("Path size", 3, newID.getPathArguments().size());
119
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());
124     }
125
126     @Test
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)));
134
135         Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
136         assertTrue("isPresent", relative.isPresent());
137
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());
142
143         relative = id2.relativeTo(id3);
144         assertTrue("isPresent", relative.isPresent());
145         assertEquals("Path size", 0, relative.get().getPathArguments().size());
146
147         relative = id2.relativeTo(id1);
148         assertFalse("isPresent", relative.isPresent());
149     }
150
151     @Test(expected = IllegalArgumentException.class)
152     public void testContainsNull() {
153         final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
154
155         id.contains(null);
156     }
157
158     @Test
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));
168
169         assertTrue("contains", id2.contains(id1));
170         assertTrue("contains", id2.contains(id3));
171         assertFalse("contains", id1.contains(id2));
172         assertFalse("contains", id2.contains(id4));
173     }
174
175     @Test
176     public void testOf() {
177         YangInstanceIdentifier newID = YangInstanceIdentifier.of(NODENAME1);
178
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());
182
183         // for code coverage
184         assertNotNull(newID.toString());
185     }
186
187     @Test
188     public void testBuilder() {
189         YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
190                 .node(NODENAME1)
191                 .nodeWithKey(NODENAME2, Collections.singletonMap(KEY1, "foo"))
192                 .nodeWithKey(NODENAME3, KEY2, "bar").build();
193
194         assertNotNull("InstanceIdentifier is null", newID);
195         assertEquals("Path size", 3, newID.getPathArguments().size());
196
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");
201
202         newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
203
204         assertNotNull("InstanceIdentifier is null", newID);
205         assertEquals("Path size", 4, newID.getPathArguments().size());
206
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());
212
213         newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
214
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());
218     }
219
220     private static void verifyNodeIdentifierWithPredicates(final String prefix,
221             final PathArgument arg, final QName nodeName, final QName key, final Object value) {
222
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());
231     }
232
233     @Test
234     public void testNodeIdentifierWithPredicates() {
235
236         NodeIdentifierWithPredicates node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
237         verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
238
239         NodeIdentifierWithPredicates node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
240
241         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
242         assertTrue("equals", node1.equals(node2));
243
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()));
248
249         // for code coverage
250         assertNotNull(node1.toString());
251         assertNotNull(node1.toRelativeString(node2));
252
253         NodeIdentifierWithPredicates node3 = NodeIdentifierWithPredicates.of(NODENAME1,
254                 ImmutableMap.of(KEY1, 10, KEY2, 20));
255
256         NodeIdentifierWithPredicates node4 = NodeIdentifierWithPredicates.of(NODENAME1,
257                 ImmutableMap.of(KEY1, 10, KEY2, 20));
258
259         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
260         assertTrue("equals", node3.equals(node4));
261
262         assertFalse("equals", node3.equals(node1));
263         assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1,
264             ImmutableMap.of(KEY1, 10, KEY3, 20))));
265
266         node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
267         node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
268
269         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
270         assertTrue("equals", node1.equals(node2));
271
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 })));
275     }
276
277     @Test
278     public void testNodeWithValue() {
279
280         NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
281         assertEquals("getNodeType", NODENAME1, node1.getNodeType());
282         assertEquals("getValue", "foo", node1.getValue());
283
284         NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
285
286         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
287         assertTrue("equals", node1.equals(node2));
288
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()));
292
293         // for code coverage
294         assertNotNull(node1.toString());
295         assertNotNull(node1.toRelativeString(node2));
296
297         NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
298         NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
299
300         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
301         assertTrue("equals", node3.equals(node4));
302
303         assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
304         assertFalse("equals", node3.equals(node1));
305     }
306
307     @Test
308     public void testNodeIdentifier() {
309
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));
314
315         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
316         assertEquals("compareTo", 0, node1.compareTo(node2));
317         assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
318
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()));
325
326         // for code coverage
327         assertNotNull(node1.toString());
328     }
329
330     @Test(expected = UnsupportedOperationException.class)
331     public void testAugmentationIdentifierNodeType() {
332         AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
333         node1.getNodeType();
334     }
335
336     @Test
337     public void testAugmentationIdentifier() {
338
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,
344                     NODENAME3));
345         final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
346
347         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
348
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()));
354
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));
360
361         // for code coverage
362         assertNotNull(node1.toString());
363         assertNotNull(node1.toRelativeString(node5));
364     }
365
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)) {
370             oos.writeObject(id);
371         }
372
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());
378             return ret;
379         }
380     }
381
382     @Test
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));
387
388         final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
389         assertEquals(stacked, serdes(stacked));
390
391         final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.empty());
392         assertSame(YangInstanceIdentifier.empty(), empty);
393     }
394
395     @Test
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));
401
402         assertSame(fixed, fixed.toOptimized());
403
404         final YangInstanceIdentifier opt = stacked.toOptimized();
405         assertTrue(opt instanceof FixedYangInstanceIdentifier);
406         assertEquals(fixed, stacked.toOptimized());
407     }
408
409     @Test
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));
414
415         assertNull(YangInstanceIdentifier.empty().getParent());
416         assertSame(YangInstanceIdentifier.empty(), fixed.getParent());
417         assertSame(YangInstanceIdentifier.empty(), stacked.getParent());
418         assertSame(stacked, twoStacked.getParent());
419     }
420
421     @Test
422     public void testIsEmpty() {
423         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
424         final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
425
426         assertTrue(YangInstanceIdentifier.empty().isEmpty());
427         assertFalse(fixed.isEmpty());
428         assertFalse(stacked.isEmpty());
429     }
430 }