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.assertNotNull;
13 import com.google.common.base.Optional;
14 import com.google.common.collect.ImmutableMap;
15 import com.google.common.collect.Iterables;
16 import com.google.common.collect.Lists;
17 import com.google.common.collect.Sets;
18 import java.io.ByteArrayInputStream;
19 import java.io.ByteArrayOutputStream;
20 import java.io.IOException;
21 import java.io.ObjectInputStream;
22 import java.io.ObjectOutputStream;
23 import java.util.Collections;
24 import java.util.Iterator;
25 import java.util.Map.Entry;
26 import org.junit.Test;
27 import org.opendaylight.yangtools.yang.common.QName;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
35 * Unit tests for InstanceIdentifier.
37 * @author Thomas Pantelis
39 public class InstanceIdentifierTest {
41 static QName nodeName1 = QName.create("test", "2014-5-28", "node1");
42 static QName nodeName2 = QName.create("test", "2014-5-28", "node2");
43 static QName nodeName3 = QName.create("test", "2014-5-28", "node3");
44 static QName nodeName4 = QName.create("test", "2014-5-28", "node4");
45 static QName key1 = QName.create("test", "2014-5-28", "key1");
46 static QName key2 = QName.create("test", "2014-5-28", "key2");
47 static QName key3 = QName.create("test", "2014-5-28", "key3");
50 public void testHashCodeEquals() {
52 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
53 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
54 YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName2), new NodeIdentifier(nodeName1));
55 YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1));
57 assertEquals( "hashCode", id1.hashCode(), id2.hashCode() );
58 assertEquals( "equals", true, id1.equals( id2 ) );
60 assertEquals( "equals", false, id1.equals( id3 ) );
61 assertEquals( "equals", false, id1.equals( id4 ) );
62 assertEquals( "equals", false, id1.equals( new Object() ) );
66 public void testNode() {
68 YangInstanceIdentifier id = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
70 YangInstanceIdentifier newID = id.node( nodeName3 );
72 assertNotNull( "InstanceIdentifier is null", newID );
73 assertEquals( "Path size", 3, Iterables.size(newID.getPathArguments()) );
75 Iterator<PathArgument> it = newID.getPathArguments().iterator();
76 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
77 assertEquals( "PathArg 2 node type", nodeName2, it.next().getNodeType() );
78 assertEquals( "PathArg 3 node type", nodeName3, it.next().getNodeType() );
80 newID = id.node( new NodeIdentifier( nodeName3 ) );
82 assertNotNull( "InstanceIdentifier is null", newID );
83 assertEquals( "Path size", 3, Iterables.size(newID.getPathArguments()) );
85 it = newID.getPathArguments().iterator();
86 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
87 assertEquals( "PathArg 2 node type", nodeName2, it.next().getNodeType() );
88 assertEquals( "PathArg 3 node type", nodeName3, it.next().getNodeType() );
92 public void testRelativeTo() {
94 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2),
95 new NodeIdentifier(nodeName3), new NodeIdentifier(nodeName4));
96 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
97 YangInstanceIdentifier id3 = YangInstanceIdentifier.create(
98 Lists.newArrayList(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2)));
100 Optional<YangInstanceIdentifier> relative = id1.relativeTo( id2 );
102 assertEquals( "isPresent", true, relative.isPresent() );
104 Iterable<PathArgument> p = relative.get().getPathArguments();
105 assertEquals( "Path size", 2, Iterables.size(p) );
106 assertEquals( "PathArg 1 node type", nodeName3, Iterables.get(p, 0).getNodeType() );
107 assertEquals( "PathArg 2 node type", nodeName4, Iterables.get(p, 1).getNodeType() );
109 relative = id2.relativeTo( id3 );
110 assertEquals( "isPresent", true, relative.isPresent() );
111 assertEquals( "Path size", 0, Iterables.size(relative.get().getPathArguments()) );
113 relative = id2.relativeTo( id1 );
114 assertEquals( "isPresent", false, relative.isPresent() );
118 public void testContains() {
120 YangInstanceIdentifier id1 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2),
121 new NodeIdentifier(nodeName3), new NodeIdentifier(nodeName4));
122 YangInstanceIdentifier id2 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
123 YangInstanceIdentifier id3 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
124 YangInstanceIdentifier id4 = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName3));
126 assertEquals( "contains", true, id2.contains( id1 ) );
127 assertEquals( "contains", true, id2.contains( id3 ) );
128 assertEquals( "contains", false, id1.contains( id2 ) );
129 assertEquals( "contains", false, id2.contains( id4 ) );
133 public void testOf() {
135 YangInstanceIdentifier newID = YangInstanceIdentifier.of( nodeName1 );
137 assertNotNull( "InstanceIdentifier is null", newID );
138 assertEquals( "Path size", 1, Iterables.size(newID.getPathArguments()) );
139 assertEquals( "PathArg 1 node type", nodeName1, Iterables.get(newID.getPathArguments(), 0).getNodeType() );
141 assertNotNull( newID.toString() ); // for code coverage
145 public void testBuilder() {
147 YangInstanceIdentifier newID = YangInstanceIdentifier.builder()
149 .nodeWithKey( nodeName2, Collections.<QName,Object>singletonMap( key1, "foo" ) )
150 .nodeWithKey( nodeName3, key2, "bar" ).build();
152 assertNotNull( "InstanceIdentifier is null", newID );
153 assertEquals( "Path size", 3, Iterables.size(newID.getPathArguments()) );
155 Iterator<PathArgument> it = newID.getPathArguments().iterator();
156 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
157 verifyNodeIdentifierWithPredicates( "PathArg 2", it.next(), nodeName2, key1, "foo" );
158 verifyNodeIdentifierWithPredicates( "PathArg 3", it.next(), nodeName3, key2, "bar" );
160 newID = YangInstanceIdentifier.builder( newID ).node( nodeName4 ).build();
162 assertNotNull( "InstanceIdentifier is null", newID );
163 assertEquals( "Path size", 4, Iterables.size(newID.getPathArguments()) );
165 it = newID.getPathArguments().iterator();
166 assertEquals( "PathArg 1 node type", nodeName1, it.next().getNodeType() );
167 assertEquals( "PathArg 2 node type", nodeName2, it.next().getNodeType() );
168 assertEquals( "PathArg 3 node type", nodeName3, it.next().getNodeType() );
169 assertEquals( "PathArg 4 node type", nodeName4, it.next().getNodeType() );
171 newID = YangInstanceIdentifier.builder( nodeName1 ).build();
173 assertNotNull( "InstanceIdentifier is null", newID );
174 assertEquals( "Path size", 1, Iterables.size(newID.getPathArguments()) );
175 assertEquals( "PathArg 1 node type", nodeName1, Iterables.get(newID.getPathArguments(), 0).getNodeType() );
178 private void verifyNodeIdentifierWithPredicates(final String prefix,
179 final PathArgument arg, final QName nodeName, final QName key, final Object value ) {
181 assertNotNull( prefix + " is null", arg );
182 assertEquals( prefix + " class", NodeIdentifierWithPredicates.class, arg.getClass() );
183 NodeIdentifierWithPredicates node = (NodeIdentifierWithPredicates)arg;
184 assertEquals( prefix + " node type", nodeName, node.getNodeType() );
185 assertEquals( prefix + " key values map size", 1, node.getKeyValues().size() );
186 Entry<QName, Object> entry = node.getKeyValues().entrySet().iterator().next();
187 assertEquals( prefix + " key values map entry key", key, entry.getKey() );
188 assertEquals( prefix + " key values map entry value", value, entry.getValue() );
192 public void testNodeIdentifierWithPredicates() {
194 NodeIdentifierWithPredicates node1 = new NodeIdentifierWithPredicates( nodeName1, key1, "foo" );
195 verifyNodeIdentifierWithPredicates( "NodeIdentifierWithPredicates", node1, nodeName1, key1, "foo" );
197 NodeIdentifierWithPredicates node2 = new NodeIdentifierWithPredicates( nodeName1, key1, "foo" );
199 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
200 assertEquals( "equals", true, node1.equals( node2 ) );
202 assertEquals( "equals", false,
203 node1.equals( new NodeIdentifierWithPredicates( nodeName2, key1, "foo" ) ) );
204 assertEquals( "equals", false,
205 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key2, "foo" ) ) );
206 assertEquals( "equals", false,
207 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, "bar" ) ) );
208 assertEquals( "equals", false, node1.equals( new Object() ) );
210 assertNotNull( node1.toString() ); // for code coverage
212 NodeIdentifierWithPredicates node3 = new NodeIdentifierWithPredicates( nodeName1,
213 ImmutableMap.<QName, Object>builder().put( key1, 10 ).put( key2, 20 ).build() );
215 NodeIdentifierWithPredicates node4 = new NodeIdentifierWithPredicates( nodeName1,
216 ImmutableMap.<QName, Object>builder().put( key1, 10 ).put( key2, 20 ).build() );
218 assertEquals( "hashCode", node3.hashCode(), node4.hashCode() );
219 assertEquals( "equals", true, node3.equals( node4 ) );
221 assertEquals( "equals", false, node3.equals( node1 ) );
222 assertEquals( "equals", false,
223 node1.equals( new NodeIdentifierWithPredicates( nodeName1,
224 ImmutableMap.<QName, Object>builder().put( key1, 10 ).put( key3, 20 ).build() ) ) );
226 node1 = new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,2} );
227 node2 = new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,2} );
229 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
230 assertEquals( "equals", true, node1.equals( node2 ) );
232 assertEquals( "equals", false,
233 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,3} ) ) );
234 assertEquals( "equals", false,
235 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1} ) ) );
236 assertEquals( "equals", false,
237 node1.equals( new NodeIdentifierWithPredicates( nodeName1, key1, new byte[]{1,2,3} ) ) );
241 public void testNodeWithValue() {
243 NodeWithValue node1 = new NodeWithValue( nodeName1, "foo" );
244 assertEquals( "getNodeType", nodeName1, node1.getNodeType() );
245 assertEquals( "getValue", "foo", node1.getValue() );
247 NodeWithValue node2 = new NodeWithValue( nodeName1, "foo" );
249 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
250 assertEquals( "equals", true, node1.equals( node2 ) );
252 assertEquals( "equals", false, node1.equals( new NodeWithValue( nodeName1, "bar" ) ) );
253 assertEquals( "equals", false, node1.equals( new NodeWithValue( nodeName2, "foo" ) ) );
254 assertEquals( "equals", false, node1.equals( new Object() ) );
256 assertNotNull( node1.toString() ); // for code coverage
258 NodeWithValue node3 = new NodeWithValue( nodeName1, new byte[]{1,2} );
259 NodeWithValue node4 = new NodeWithValue( nodeName1, new byte[]{1,2} );
261 assertEquals( "hashCode", node3.hashCode(), node4.hashCode() );
262 assertEquals( "equals", true, node3.equals( node4 ) );
264 assertEquals( "equals", false, node3.equals( new NodeWithValue( nodeName1, new byte[]{1,3} ) ) );
265 assertEquals( "equals", false, node3.equals( node1 ) );
269 public void testNodeIdentifier() {
271 NodeIdentifier node1 = new NodeIdentifier( nodeName1 );
272 assertEquals( "getNodeType", nodeName1, node1.getNodeType() );
274 NodeIdentifier node2 = new NodeIdentifier( nodeName1 );
276 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
277 assertEquals( "equals", true, node1.equals( node2 ) );
278 assertEquals( "compareTo", 0, node1.compareTo( node2 ) );
280 assertEquals( "equals", false, node1.equals( new NodeIdentifier( nodeName3 ) ) );
281 assertEquals( "compareTo", true, node1.compareTo( new NodeIdentifier( nodeName3 ) ) != 0 );
282 assertEquals( "equals", false, node1.equals( new Object() ) );
284 assertNotNull( node1.toString() ); // for code coverage
288 public void testAugmentationIdentifier() {
290 AugmentationIdentifier node1 = new AugmentationIdentifier( Sets.newHashSet( nodeName1, nodeName2 ) );
291 assertEquals( "getPossibleChildNames", Sets.newHashSet( nodeName1, nodeName2 ), node1.getPossibleChildNames() );
293 AugmentationIdentifier node2 = new AugmentationIdentifier( Sets.newHashSet( nodeName2, nodeName1 ) );
295 assertEquals( "hashCode", node1.hashCode(), node2.hashCode() );
296 assertEquals( "equals", true, node1.equals( node2 ) );
298 assertEquals( "equals", false,
299 node1.equals( new AugmentationIdentifier( Sets.newHashSet( nodeName1, nodeName3 ) ) ) );
300 assertEquals( "equals", false,
301 node1.equals( new AugmentationIdentifier( Sets.newHashSet( nodeName1 ) ) ) );
302 assertEquals( "equals", false, node1.equals( new Object() ) );
304 assertNotNull( node1.toString() ); // for code coverage
308 public void serializationTest() throws IOException, ClassNotFoundException {
309 final YangInstanceIdentifier expected = YangInstanceIdentifier.create(new NodeIdentifier(nodeName1), new NodeIdentifier(nodeName2));
311 final ByteArrayOutputStream bos = new ByteArrayOutputStream();
312 final ObjectOutputStream oos = new ObjectOutputStream(bos);
313 oos.writeObject(expected);
316 final byte[] bytes = bos.toByteArray();
317 final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
318 final ObjectInputStream ois = new ObjectInputStream(bis);
320 final YangInstanceIdentifier read = (YangInstanceIdentifier) ois.readObject();
321 assertEquals(0, ois.available());
324 assertEquals(expected, read);