Update yang-data-api tests
[yangtools.git] / data / 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.assertThrows;
18 import static org.junit.Assert.assertTrue;
19
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.Iterator;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Map.Entry;
30 import java.util.Optional;
31 import org.junit.Test;
32 import org.opendaylight.yangtools.yang.common.QName;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
37 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
38
39 /**
40  * Unit tests for InstanceIdentifier.
41  *
42  * @author Thomas Pantelis
43  */
44 public class YangInstanceIdentifierTest {
45
46     private static final QName NODENAME1 = QName.create("test", "2014-05-28", "node1");
47     private static final QName NODENAME2 = QName.create("test", "2014-05-28", "node2");
48     private static final QName NODENAME3 = QName.create("test", "2014-05-28", "node3");
49     private static final QName NODENAME4 = QName.create("test", "2014-05-28", "node4");
50     private static final QName KEY1 = QName.create("test", "2014-05-28", "key1");
51     private static final QName KEY2 = QName.create("test", "2014-05-28", "key2");
52     private static final QName KEY3 = QName.create("test", "2014-05-28", "key3");
53
54     @Test
55     public void testGetLastPathArgument() {
56         YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
57                 new NodeIdentifier(NODENAME2));
58         assertEquals("getLastPathArgument", new NodeIdentifier(NODENAME2), id1.getLastPathArgument());
59         YangInstanceIdentifier id2 = YangInstanceIdentifier.create();
60         assertNull(id2.getLastPathArgument());
61     }
62
63     @Test
64     public void testHashCodeEquals() {
65         YangInstanceIdentifier id1 = YangInstanceIdentifier.create(NodeIdentifier.create(NODENAME1),
66                 new NodeIdentifier(NODENAME2));
67         YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
68                 NodeIdentifier.create(NODENAME2));
69
70         assertEquals("hashCode", id1.hashCode(), id2.hashCode());
71     }
72
73     @Test
74     public void testEquals() {
75         final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
76                 new NodeIdentifier(NODENAME2));
77         final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
78                 new NodeIdentifier(NODENAME2));
79         final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME2),
80                 new NodeIdentifier(NODENAME1));
81         final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
82
83         assertFalse("equals", id1.equals(null));
84         assertTrue("equals", id1.equals(id1));
85         assertTrue("equals", id1.equals(id2));
86         assertFalse("equals", id1.equals(id3));
87         assertFalse("equals", id1.equals(id4));
88         assertFalse("equals", id1.equals(new Object()));
89     }
90
91     @Test
92     public void testToString() {
93         YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
94                 new NodeIdentifier(NODENAME2));
95
96         assertNotNull(id.toString());
97     }
98
99     @Test
100     public void testNode() {
101         final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
102                 new NodeIdentifier(NODENAME2));
103
104         YangInstanceIdentifier newID = id.node(NODENAME3);
105
106         assertNotNull("InstanceIdentifier is null", newID);
107         assertEquals("Path size", 3, newID.getPathArguments().size());
108
109         Iterator<PathArgument> it = newID.getPathArguments().iterator();
110         assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
111         assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
112         assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
113
114         newID = id.node(new NodeIdentifier(NODENAME3));
115
116         assertNotNull("InstanceIdentifier is null", newID);
117         assertEquals("Path size", 3, newID.getPathArguments().size());
118
119         it = newID.getPathArguments().iterator();
120         assertEquals("PathArg 1 node type", NODENAME1, it.next().getNodeType());
121         assertEquals("PathArg 2 node type", NODENAME2, it.next().getNodeType());
122         assertEquals("PathArg 3 node type", NODENAME3, it.next().getNodeType());
123     }
124
125     @Test
126     public void testRelativeTo() {
127         final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
128                 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
129         final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
130                 new NodeIdentifier(NODENAME2));
131         final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(List.of(
132                     new NodeIdentifier(NODENAME1), new NodeIdentifier(NODENAME2)));
133
134         Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
135         assertTrue("isPresent", relative.isPresent());
136
137         List<PathArgument> path = relative.get().getPathArguments();
138         assertEquals("Path size", 2, path.size());
139         assertEquals("PathArg 1 node type", NODENAME3, path.get(0).getNodeType());
140         assertEquals("PathArg 2 node type", NODENAME4, path.get(1).getNodeType());
141
142         relative = id2.relativeTo(id3);
143         assertTrue("isPresent", relative.isPresent());
144         assertEquals("Path size", 0, relative.get().getPathArguments().size());
145
146         relative = id2.relativeTo(id1);
147         assertFalse("isPresent", relative.isPresent());
148     }
149
150     @Test
151     public void testContainsNull() {
152         final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
153
154         assertThrows(IllegalArgumentException.class, () -> id.contains(null));
155     }
156
157     @Test
158     public void testContains() {
159         final YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
160                 new NodeIdentifier(NODENAME2), new NodeIdentifier(NODENAME3), new NodeIdentifier(NODENAME4));
161         final YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
162                 new NodeIdentifier(NODENAME2));
163         final YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
164                 new NodeIdentifier(NODENAME2));
165         final YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
166                 new NodeIdentifier(NODENAME3));
167
168         assertTrue("contains", id2.contains(id1));
169         assertTrue("contains", id2.contains(id3));
170         assertFalse("contains", id1.contains(id2));
171         assertFalse("contains", id2.contains(id4));
172     }
173
174     @Test
175     public void testOf() {
176         YangInstanceIdentifier newID = YangInstanceIdentifier.of(NODENAME1);
177
178         assertNotNull("InstanceIdentifier is null", newID);
179         assertEquals("Path size", 1, newID.getPathArguments().size());
180         assertEquals("PathArg 1 node type", NODENAME1, newID.getPathArguments().get(0).getNodeType());
181
182         // for code coverage
183         assertNotNull(newID.toString());
184     }
185
186     @Test
187     public void testBuilder() {
188         YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
189                 .node(NODENAME1)
190                 .nodeWithKey(NODENAME2, Map.of(KEY1, "foo"))
191                 .nodeWithKey(NODENAME3, KEY2, "bar").build();
192
193         assertNotNull("InstanceIdentifier is null", newID);
194         assertEquals("Path size", 3, newID.getPathArguments().size());
195
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");
200
201         newID = YangInstanceIdentifier.builder(newID).node(NODENAME4).build();
202
203         assertNotNull("InstanceIdentifier is null", newID);
204         assertEquals("Path size", 4, newID.getPathArguments().size());
205
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());
211
212         newID = YangInstanceIdentifier.builder().node(NODENAME1).build();
213
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());
217     }
218
219     private static void verifyNodeIdentifierWithPredicates(final String prefix,
220             final PathArgument arg, final QName nodeName, final QName key, final Object value) {
221
222         assertNotNull(prefix + " is null", arg);
223         assertThat(arg, instanceOf(NodeIdentifierWithPredicates.class));
224         NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
225         assertEquals(prefix + " node type", nodeName, node.getNodeType());
226         assertEquals(prefix + " key values map size", 1, node.size());
227         Entry<QName, Object> entry = node.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());
230     }
231
232     @Test
233     public void testNodeIdentifierWithPredicates() {
234
235         NodeIdentifierWithPredicates node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
236         verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
237
238         NodeIdentifierWithPredicates node2 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "foo");
239
240         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
241         assertTrue("equals", node1.equals(node2));
242
243         assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME2, KEY1, "foo")));
244         assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY2, "foo")));
245         assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, "bar")));
246         assertFalse("equals", node1.equals(new Object()));
247
248         // for code coverage
249         assertNotNull(node1.toString());
250         assertNotNull(node1.toRelativeString(node2));
251
252         NodeIdentifierWithPredicates node3 = NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY2, 20));
253
254         NodeIdentifierWithPredicates node4 = NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY2, 20));
255
256         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
257         assertTrue("equals", node3.equals(node4));
258
259         assertFalse("equals", node3.equals(node1));
260         assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, Map.of(KEY1, 10, KEY3, 20))));
261
262         node1 = NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 2 });
263         node2 = NodeIdentifierWithPredicates.of(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(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1, 3})));
269         assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(NODENAME1, KEY1, new byte[]{ 1 })));
270         assertFalse("equals", node1.equals(NodeIdentifierWithPredicates.of(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         // for code coverage
290         assertNotNull(node1.toString());
291         assertNotNull(node1.toRelativeString(node2));
292
293         NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
294         NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
295
296         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
297         assertTrue("equals", node3.equals(node4));
298
299         assertFalse("equals", node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
300         assertFalse("equals", node3.equals(node1));
301     }
302
303     @Test
304     public void testNodeIdentifier() {
305
306         final NodeIdentifier node1 = new NodeIdentifier(NODENAME1);
307         assertEquals("getNodeType", NODENAME1, node1.getNodeType());
308         final NodeIdentifier node2 = new NodeIdentifier(NODENAME1);
309         final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
310
311         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
312         assertEquals("compareTo", 0, node1.compareTo(node2));
313         assertTrue("compareTo", node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
314
315         assertFalse("equals", node1.equals(null));
316         assertFalse("equals", node1.equals(node3));
317         assertTrue("equals", node1.equals(node1));
318         assertTrue("equals", node1.equals(node2));
319         assertFalse("equals", node1.equals(new NodeIdentifier(NODENAME3)));
320         assertFalse("equals", node1.equals(new Object()));
321
322         // for code coverage
323         assertNotNull(node1.toString());
324     }
325
326     @Test
327     public void testAugmentationIdentifierNodeType() {
328         AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
329         assertThrows(UnsupportedOperationException.class, () -> node1.getNodeType());
330     }
331
332     @Test
333     public void testAugmentationIdentifier() {
334
335         final AugmentationIdentifier node1 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2));
336         assertEquals("getPossibleChildNames", ImmutableSet.of(NODENAME1, NODENAME2), node1.getPossibleChildNames());
337         final AugmentationIdentifier node2 = new AugmentationIdentifier(ImmutableSet.of(NODENAME2, NODENAME1));
338         final AugmentationIdentifier node3 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME3));
339         final AugmentationIdentifier node4 = new AugmentationIdentifier(ImmutableSet.of(NODENAME1, NODENAME2,
340                     NODENAME3));
341         final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
342
343         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
344
345         assertTrue("equals", node1.equals(node1));
346         assertTrue("equals", node1.equals(node2));
347         assertFalse("equals", node1.equals(node3));
348         assertFalse("equals", node1.equals(new AugmentationIdentifier(ImmutableSet.of(NODENAME1))));
349         assertFalse("equals", node1.equals(new Object()));
350
351         assertEquals("compareTo", -1, node1.compareTo(node5));
352         assertEquals("compareTo", 0, node1.compareTo(node2));
353         assertEquals("compareTo", 0, node1.compareTo(node2));
354         assertEquals("compareTo", 1, node1.compareTo(node4));
355         assertEquals("compareTo", -1, node4.compareTo(node1));
356
357         // for code coverage
358         assertNotNull(node1.toString());
359         assertNotNull(node1.toRelativeString(node5));
360     }
361
362     private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
363             ClassNotFoundException {
364         final ByteArrayOutputStream bos = new ByteArrayOutputStream();
365         try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
366             oos.writeObject(id);
367         }
368
369         final byte[] bytes = bos.toByteArray();
370         final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
371         try (ObjectInputStream ois = new ObjectInputStream(bis)) {
372             final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
373             assertEquals(0, ois.available());
374             return ret;
375         }
376     }
377
378     @Test
379     public void testSerialization() throws IOException, ClassNotFoundException {
380         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
381             new NodeIdentifier(NODENAME2));
382         assertEquals(fixed, serdes(fixed));
383
384         final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
385         assertEquals(stacked, serdes(stacked));
386
387         final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.empty());
388         assertSame(YangInstanceIdentifier.empty(), empty);
389     }
390
391     @Test
392     public void testToOptimized() {
393         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1),
394             new NodeIdentifier(NODENAME2));
395         final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(NodeIdentifier.create(NODENAME1))
396                 .node(NodeIdentifier.create(NODENAME2));
397
398         assertSame(fixed, fixed.toOptimized());
399
400         final YangInstanceIdentifier opt = stacked.toOptimized();
401         assertTrue(opt instanceof FixedYangInstanceIdentifier);
402         assertEquals(fixed, stacked.toOptimized());
403     }
404
405     @Test
406     public void testGetParent() {
407         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
408         final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
409         final YangInstanceIdentifier twoStacked = stacked.node(new NodeIdentifier(NODENAME2));
410
411         assertNull(YangInstanceIdentifier.empty().getParent());
412         assertSame(YangInstanceIdentifier.empty(), fixed.getParent());
413         assertSame(YangInstanceIdentifier.empty(), stacked.getParent());
414         assertSame(stacked, twoStacked.getParent());
415     }
416
417     @Test
418     public void testIsEmpty() {
419         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
420         final YangInstanceIdentifier stacked = YangInstanceIdentifier.empty().node(new NodeIdentifier(NODENAME1));
421
422         assertTrue(YangInstanceIdentifier.empty().isEmpty());
423         assertFalse(fixed.isEmpty());
424         assertFalse(stacked.isEmpty());
425     }
426 }