Fix eclipse/checkstyle warnings
[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
9 package org.opendaylight.yangtools.yang.data.api;
10
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;
18
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;
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-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");
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         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()));
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(Lists.newArrayList(
133                     new NodeIdentifier(NODENAME1), new NodeIdentifier(NODENAME2)));
134
135         Optional<YangInstanceIdentifier> relative = id1.relativeTo(id2);
136         assertEquals("isPresent", true, 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         assertEquals("isPresent", true, relative.isPresent());
145         assertEquals("Path size", 0, relative.get().getPathArguments().size());
146
147         relative = id2.relativeTo(id1);
148         assertEquals("isPresent", false, 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         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));
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         assertNotNull(newID.toString()); // for code coverage
184     }
185
186     @Test
187     public void testBuilder() {
188         YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
189                 .node(NODENAME1)
190                 .nodeWithKey(NODENAME2, Collections.singletonMap(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         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());
230     }
231
232     @Test
233     public void testNodeIdentifierWithPredicates() {
234
235         NodeIdentifierWithPredicates node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
236         verifyNodeIdentifierWithPredicates("NodeIdentifierWithPredicates", node1, NODENAME1, KEY1, "foo");
237
238         NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, "foo");
239
240         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
241         assertEquals("equals", true, node1.equals(node2));
242
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()));
250
251         assertNotNull(node1.toString()); // for code coverage
252         assertNotNull(node1.toRelativeString(node2));
253
254         NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates(NODENAME1,
255                 ImmutableMap.<QName, Object>builder().put(KEY1, 10).put(KEY2, 20).build());
256
257         NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates(NODENAME1,
258                 ImmutableMap.<QName, Object>builder().put(KEY1, 10).put(KEY2, 20).build());
259
260         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
261         assertEquals("equals", true, node3.equals(node4));
262
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())));
267
268         node1 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
269         node2 = new NodeIdentifierWithPredicates(NODENAME1, KEY1, new byte[]{1,2});
270
271         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
272         assertEquals("equals", true, node1.equals(node2));
273
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})));
280     }
281
282     @Test
283     public void testNodeWithValue() {
284
285         NodeWithValue<?> node1 = new NodeWithValue<>(NODENAME1, "foo");
286         assertEquals("getNodeType", NODENAME1, node1.getNodeType());
287         assertEquals("getValue", "foo", node1.getValue());
288
289         NodeWithValue<?> node2 = new NodeWithValue<>(NODENAME1, "foo");
290
291         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
292         assertEquals("equals", true, node1.equals(node2));
293
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()));
297
298         assertNotNull(node1.toString()); // for code coverage
299         assertNotNull(node1.toRelativeString(node2));
300
301         NodeWithValue<?> node3 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
302         NodeWithValue<?> node4 = new NodeWithValue<>(NODENAME1, new byte[]{1,2});
303
304         assertEquals("hashCode", node3.hashCode(), node4.hashCode());
305         assertEquals("equals", true, node3.equals(node4));
306
307         assertEquals("equals", false, node3.equals(new NodeWithValue<>(NODENAME1, new byte[]{1,3})));
308         assertEquals("equals", false, node3.equals(node1));
309     }
310
311     @Test
312     public void testNodeIdentifier() {
313
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));
318
319         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
320         assertEquals("compareTo", 0, node1.compareTo(node2));
321         assertEquals("compareTo", true, node1.compareTo(new NodeIdentifier(NODENAME3)) != 0);
322
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()));
329
330         assertNotNull(node1.toString()); // for code coverage
331     }
332
333     @Test(expected = UnsupportedOperationException.class)
334     public void testAugmentationIdentifierNodeType() {
335         AugmentationIdentifier node1 = new AugmentationIdentifier(Sets.newHashSet(NODENAME1, NODENAME2));
336         node1.getNodeType();
337     }
338
339     @Test
340     public void testAugmentationIdentifier() {
341
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,
347                     NODENAME3));
348         final NodeIdentifier node5 = new NodeIdentifier(NODENAME3);
349
350         assertEquals("hashCode", node1.hashCode(), node2.hashCode());
351
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()));
357
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));
363
364         assertNotNull(node1.toString()); // for code coverage
365         assertNotNull(node1.toRelativeString(node5));
366     }
367
368     private static YangInstanceIdentifier serdes(final YangInstanceIdentifier id) throws IOException,
369             ClassNotFoundException {
370         final ByteArrayOutputStream bos = new ByteArrayOutputStream();
371         try (final ObjectOutputStream oos = new ObjectOutputStream(bos)) {
372             oos.writeObject(id);
373         }
374
375         final byte[] bytes = bos.toByteArray();
376         final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
377         try (final ObjectInputStream ois = new ObjectInputStream(bis)) {
378             final YangInstanceIdentifier ret = (YangInstanceIdentifier) ois.readObject();
379             assertEquals(0, ois.available());
380             return ret;
381         }
382     }
383
384     @Test
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));
389
390         final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
391         assertEquals(stacked, serdes(stacked));
392
393         final YangInstanceIdentifier empty = serdes(YangInstanceIdentifier.EMPTY);
394         assertSame(YangInstanceIdentifier.EMPTY, empty);
395     }
396
397     @Test
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));
403
404         assertSame(fixed, fixed.toOptimized());
405
406         final YangInstanceIdentifier opt = stacked.toOptimized();
407         assertTrue(opt instanceof FixedYangInstanceIdentifier);
408         assertEquals(fixed, stacked.toOptimized());
409     }
410
411     @Test
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));
416
417         assertNull(YangInstanceIdentifier.EMPTY.getParent());
418         assertSame(YangInstanceIdentifier.EMPTY, fixed.getParent());
419         assertSame(YangInstanceIdentifier.EMPTY, stacked.getParent());
420         assertSame(stacked, twoStacked.getParent());
421     }
422
423     @Test
424     public void testIsEmpty() {
425         final YangInstanceIdentifier fixed = YangInstanceIdentifier.create(new NodeIdentifier(NODENAME1));
426         final YangInstanceIdentifier stacked = YangInstanceIdentifier.EMPTY.node(new NodeIdentifier(NODENAME1));
427
428         assertTrue(YangInstanceIdentifier.EMPTY.isEmpty());
429         assertFalse(fixed.isEmpty());
430         assertFalse(stacked.isEmpty());
431     }
432 }