2 * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.yangtools.yang.data.api;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotEquals;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertNull;
15 import com.google.common.base.Optional;
16 import com.google.common.collect.ImmutableMap;
17 import com.google.common.collect.Lists;
18 import com.google.common.collect.Sets;
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.Collections;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Map.Entry;
28 import org.junit.Test;
29 import org.opendaylight.yangtools.yang.common.QName;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
37 * Unit tests for InstanceIdentifier.
39 * @author Thomas Pantelis
41 public class YangInstanceIdentifierTest {
43 static QName nodeName1 = QName.create("test", "2014-5-28", "node1");
44 static QName nodeName2 = QName.create("test", "2014-5-28", "node2");
45 static QName nodeName3 = QName.create("test", "2014-5-28", "node3");
46 static QName nodeName4 = QName.create("test", "2014-5-28", "node4");
47 static QName key1 = QName.create("test", "2014-5-28", "key1");
48 static QName key2 = QName.create("test", "2014-5-28", "key2");
49 static QName key3 = QName.create("test", "2014-5-28", "key3");
52 public void testGetLastPathArgument() {
53 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
54 assertEquals( "getLastPathArgument", new NodeIdentifier(nodeName2), id1.getLastPathArgument());
55 YangInstanceIdentifier id2 = YangInstanceIdentifier.create();
56 assertNull( id2.getLastPathArgument() );
60 public void testHashCodeEquals() {
62 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
63 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
65 assertEquals( "hashCode", id1.hashCode(), id2.hashCode() );
69 public void testEquals() {
71 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
72 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
73 YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName2), new NodeIdentifier(nodeName1));
74 YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1));
76 assertEquals( "equals", false, id1.equals( null ) );
77 assertEquals( "equals", true, id1.equals( id1 ) );
78 assertEquals( "equals", true, id1.equals( id2 ) );
79 assertEquals( "equals", false, id1.equals( id3 ) );
80 assertEquals( "equals", false, id1.equals( id4 ) );
81 assertEquals( "equals", false, id1.equals( new Object() ) );
85 public void testToString() {
86 YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
88 assertNotNull( id.toString() );
93 public void testNode() {
95 YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
97 YangInstanceIdentifier newID = id.node( nodeName3 );
99 assertNotNull( "InstanceIdentifier is null", newID );
100 assertEquals( "Path size", 3, newID.getPathArguments().size() );
102 Iterator<PathArgument> it = newID.getPathArguments().iterator();
103 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
104 assertEquals( "PathArg 2 node type", nodeName2, it.next().getNodeType() );
105 assertEquals( "PathArg 3 node type", nodeName3, it.next().getNodeType() );
107 newID = id.node( new NodeIdentifier( nodeName3 ) );
109 assertNotNull( "InstanceIdentifier is null", newID );
110 assertEquals( "Path size", 3, newID.getPathArguments().size() );
112 it = newID.getPathArguments().iterator();
113 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
114 assertEquals( "PathArg 2 node type", nodeName2, it.next().getNodeType() );
115 assertEquals( "PathArg 3 node type", nodeName3, it.next().getNodeType() );
119 public void testRelativeTo() {
121 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2),
122 new NodeIdentifier(nodeName3), new NodeIdentifier(nodeName4));
123 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
124 YangInstanceIdentifier id3 = YangInstanceIdentifier.create(
125 Lists.newArrayList(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2)));
127 Optional<YangInstanceIdentifier> relative = id1.relativeTo( id2 );
128 assertEquals( "isPresent", true, relative.isPresent() );
130 List<PathArgument> p = relative.get().getPathArguments();
131 assertEquals( "Path size", 2, p.size() );
132 assertEquals( "PathArg 1 node type", nodeName3, p.get(0).getNodeType() );
133 assertEquals( "PathArg 2 node type", nodeName4, p.get(1).getNodeType() );
135 relative = id2.relativeTo( id3 );
136 assertEquals( "isPresent", true, relative.isPresent() );
137 assertEquals( "Path size", 0, relative.get().getPathArguments().size() );
139 relative = id2.relativeTo( id1 );
140 assertEquals( "isPresent", false, relative.isPresent() );
143 @Test(expected=IllegalArgumentException.class)
144 public void testContainsNull() {
145 final YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1));
151 public void testContains() {
153 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2),
154 new NodeIdentifier(nodeName3), new NodeIdentifier(nodeName4));
155 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
156 YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
157 YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName3));
159 assertEquals( "contains", true, id2.contains( id1 ) );
160 assertEquals( "contains", true, id2.contains( id3 ) );
161 assertEquals( "contains", false, id1.contains( id2 ) );
162 assertEquals( "contains", false, id2.contains( id4 ) );
166 public void testOf() {
168 YangInstanceIdentifier newID = YangInstanceIdentifier.of( nodeName1 );
170 assertNotNull( "InstanceIdentifier is null", newID );
171 assertEquals( "Path size", 1, newID.getPathArguments().size() );
172 assertEquals( "PathArg 1 node type", nodeName1, newID.getPathArguments().get(0).getNodeType() );
174 assertNotNull( newID.toString() ); // for code coverage
178 public void testBuilder() {
180 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
182 .nodeWithKey( nodeName2, Collections.<QName,Object>singletonMap( key1, "foo" ) )
183 .nodeWithKey( nodeName3, key2, "bar" ).build();
185 assertNotNull( "InstanceIdentifier is null", newID );
186 assertEquals( "Path size", 3, newID.getPathArguments().size() );
188 Iterator<PathArgument> it = newID.getPathArguments().iterator();
189 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
190 verifyNodeIdentifierWithPredicates( "PathArg 2", it.next(), nodeName2, key1, "foo" );
191 verifyNodeIdentifierWithPredicates( "PathArg 3", it.next(), nodeName3, key2, "bar" );
193 newID = YangInstanceIdentifier.builder( newID ).node( nodeName4 ).build();
195 assertNotNull( "InstanceIdentifier is null", newID );
196 assertEquals( "Path size", 4, newID.getPathArguments().size() );
198 it = newID.getPathArguments().iterator();
199 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
200 assertEquals( "PathArg 2 node type", nodeName2, it.next().getNodeType() );
201 assertEquals( "PathArg 3 node type", nodeName3, it.next().getNodeType() );
202 assertEquals( "PathArg 4 node type", nodeName4, it.next().getNodeType() );
204 newID = YangInstanceIdentifier.builder().node( nodeName1 ).build();
206 assertNotNull( "InstanceIdentifier is null", newID );
207 assertEquals( "Path size", 1, newID.getPathArguments().size() );
208 assertEquals( "PathArg 1 node type", nodeName1, newID.getPathArguments().get(0).getNodeType() );
211 private void verifyNodeIdentifierWithPredicates(final String prefix,
212 final PathArgument arg, final QName nodeName, final QName key, final Object value ) {
214 assertNotNull( prefix + " is null", arg );
215 assertEquals( prefix + " class", NodeIdentifierWithPredicates.class, arg.getClass() );
216 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
217 assertEquals( prefix + " node type", nodeName, node.getNodeType() );
218 assertEquals( prefix + " key values map size", 1, node.getKeyValues().size() );
219 Entry<QName, Object> entry = node.getKeyValues().entrySet().iterator().next();
220 assertEquals( prefix + " key values map entry key", key, entry.getKey() );
221 assertEquals( prefix + " key values map entry value", value, entry.getValue() );
225 public void testNodeIdentifierWithPredicates() {
227 NodeIdentifierWithPredicates node1 = new NodeIdentifierWithPredicates( nodeName1, key1, "foo" );
228 verifyNodeIdentifierWithPredicates( "NodeIdentifierWithPredicates", node1, nodeName1, key1, "foo" );
230 NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates( nodeName1, key1, "foo" );
232 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
233 assertEquals( "equals", true, node1.equals( node2 ) );
235 assertEquals( "equals", false,
236 node1.equals( new NodeIdentifierWithPredicates( nodeName2, key1, "foo" ) ) );
237 assertEquals( "equals", false,
238 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key2, "foo" ) ) );
239 assertEquals( "equals", false,
240 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, "bar" ) ) );
241 assertEquals( "equals", false, node1.equals( new Object() ) );
243 assertNotNull( node1.toString() ); // for code coverage
244 assertNotNull( node1.toRelativeString(node2) );
246 NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates( nodeName1,
247 ImmutableMap.<QName, Object>builder().put( key1, 10 ).put( key2, 20 ).build() );
249 NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates( nodeName1,
250 ImmutableMap.<QName, Object>builder().put( key1, 10 ).put( key2, 20 ).build() );
252 assertEquals( "hashCode", node3.hashCode(), node4.hashCode() );
253 assertEquals( "equals", true, node3.equals( node4 ) );
255 assertEquals( "equals", false, node3.equals( node1 ) );
256 assertEquals( "equals", false,
257 node1.equals( new NodeIdentifierWithPredicates( nodeName1,
258 ImmutableMap.<QName, Object>builder().put( key1, 10 ).put( key3, 20 ).build() ) ) );
260 node1 = new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,2} );
261 node2 = new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,2} );
263 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
264 assertEquals( "equals", true, node1.equals( node2 ) );
266 assertEquals( "equals", false,
267 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,3} ) ) );
268 assertEquals( "equals", false,
269 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1} ) ) );
270 assertEquals( "equals", false,
271 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,2,3} ) ) );
275 public void testNodeWithValue() {
277 NodeWithValue node1 = new NodeWithValue( nodeName1, "foo" );
278 assertEquals( "getNodeType", nodeName1, node1.getNodeType() );
279 assertEquals( "getValue", "foo", node1.getValue() );
281 NodeWithValue node2 = new NodeWithValue( nodeName1, "foo" );
283 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
284 assertEquals( "equals", true, node1.equals( node2 ) );
286 assertEquals( "equals", false, node1.equals( new NodeWithValue( nodeName1, "bar" ) ) );
287 assertEquals( "equals", false, node1.equals( new NodeWithValue( nodeName2, "foo" ) ) );
288 assertEquals( "equals", false, node1.equals( new Object() ) );
290 assertNotNull( node1.toString() ); // for code coverage
291 assertNotNull( node1.toRelativeString(node2) );
293 NodeWithValue node3 = new NodeWithValue( nodeName1, new byte[]{1,2} );
294 NodeWithValue node4 = new NodeWithValue( nodeName1, new byte[]{1,2} );
296 assertEquals( "hashCode", node3.hashCode(), node4.hashCode() );
297 assertEquals( "equals", true, node3.equals( node4 ) );
299 assertEquals( "equals", false, node3.equals( new NodeWithValue( nodeName1, new byte[]{1,3} ) ) );
300 assertEquals( "equals", false, node3.equals( node1 ) );
304 public void testNodeIdentifier() {
306 NodeIdentifier node1 = new NodeIdentifier( nodeName1 );
307 assertEquals( "getNodeType", nodeName1, node1.getNodeType() );
308 NodeIdentifier node2 = new NodeIdentifier( nodeName1 );
309 AugmentationIdentifier node3 = new AugmentationIdentifier( Sets.newHashSet( nodeName1, nodeName2 ) );
311 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
312 assertEquals( "compareTo", 0, node1.compareTo( node2 ) );
313 assertEquals( "compareTo", true, node1.compareTo( new NodeIdentifier( nodeName3 ) ) != 0 );
315 assertEquals( "equals", false, node1.equals( null ) );
316 assertEquals( "equals", false, node1.equals( node3 ) );
317 assertEquals( "equals", true, node1.equals( node1 ) );
318 assertEquals( "equals", true, node1.equals( node2 ) );
319 assertEquals( "equals", false, node1.equals( new NodeIdentifier( nodeName3 ) ) );
320 assertEquals( "equals", false, node1.equals( new Object() ) );
322 assertNotNull( node1.toString() ); // for code coverage
325 @Test(expected=UnsupportedOperationException.class)
326 public void testAugmentationIdentifierNodeType() {
327 AugmentationIdentifier node1 = new AugmentationIdentifier( Sets.newHashSet( nodeName1, nodeName2 ) );
332 public void testAugmentationIdentifier() {
334 AugmentationIdentifier node1 = new AugmentationIdentifier( Sets.newHashSet( nodeName1, nodeName2 ) );
335 assertEquals( "getPossibleChildNames", Sets.newHashSet( nodeName1, nodeName2 ), node1.getPossibleChildNames() );
336 AugmentationIdentifier node2 = new AugmentationIdentifier( Sets.newHashSet( nodeName2, nodeName1 ) );
337 AugmentationIdentifier node3 = new AugmentationIdentifier( Sets.newHashSet( nodeName1, nodeName3 ) );
338 AugmentationIdentifier node4 = new AugmentationIdentifier( Sets.newHashSet( nodeName1, nodeName2, nodeName3 ) );
339 NodeIdentifier node5 = new NodeIdentifier( nodeName3 );
341 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
343 assertEquals( "equals", true, node1.equals( node1 ) );
344 assertEquals( "equals", true, node1.equals( node2 ) );
345 assertEquals( "equals", false, node1.equals( node3 ) );
346 assertEquals( "equals", false, node1.equals( new AugmentationIdentifier( Sets.newHashSet( nodeName1 ) ) ) );
347 assertEquals( "equals", false, node1.equals( new Object() ) );
349 assertEquals( "compareTo", -1, node1.compareTo( node5 ) );
350 assertNotEquals( "compareTo", -1, node1.compareTo( node2 ) );
351 assertEquals( "compareTo", 0, node1.compareTo( node2 ) );
352 assertEquals( "compareTo", 1, node1.compareTo( node4 ) );
353 assertEquals( "compareTo", -1, node4.compareTo( node1 ) );
355 assertNotNull( node1.toString() ); // for code coverage
356 assertNotNull( node1.toRelativeString(node5));
360 public void serializationTest() throws IOException, ClassNotFoundException {
361 final YangInstanceIdentifier expected = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
363 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
364 final ObjectOutputStream oos = new ObjectOutputStream(bos);
365 oos.writeObject(expected);
368 final byte[] bytes = bos.toByteArray();
369 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
370 final ObjectInputStream ois = new ObjectInputStream(bis);
372 final YangInstanceIdentifier read = (YangInstanceIdentifier) ois.readObject();
373 assertEquals(0, ois.available());
376 assertEquals(expected, read);