2 * Copyright (c) 2014 Cisco 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
8 package org.opendaylight.yangtools.yang.binding;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertSame;
15 import static org.junit.Assert.assertThrows;
16 import static org.junit.Assert.assertTrue;
17 import static org.mockito.Mockito.mock;
19 import com.google.common.base.VerifyException;
20 import com.google.common.collect.ImmutableList;
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 org.junit.Test;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
28 import org.opendaylight.yangtools.yang.binding.test.mock.FooChild;
29 import org.opendaylight.yangtools.yang.binding.test.mock.FooRoot;
30 import org.opendaylight.yangtools.yang.binding.test.mock.InstantiatedFoo;
31 import org.opendaylight.yangtools.yang.binding.test.mock.Node;
32 import org.opendaylight.yangtools.yang.binding.test.mock.NodeAugmentation;
33 import org.opendaylight.yangtools.yang.binding.test.mock.NodeChild;
34 import org.opendaylight.yangtools.yang.binding.test.mock.NodeChildKey;
35 import org.opendaylight.yangtools.yang.binding.test.mock.NodeKey;
36 import org.opendaylight.yangtools.yang.binding.test.mock.Nodes;
37 import org.powermock.reflect.Whitebox;
39 public class InstanceIdentifierTest {
42 public void constructWithPredicates() {
43 final InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).build();
46 assertEquals(Nodes.class, nodes.getTargetType());
48 final InstanceIdentifier<Node> node = nodes.builder().child(Node.class).build();
51 assertEquals(Node.class, node.getTargetType());
53 assertTrue(nodes.contains(node));
57 public void fluentConstruction() {
58 final InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).build();
59 final InstanceIdentifier<Node> node =
60 InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(10)).build();
63 assertEquals(Node.class, node.getTargetType());
65 assertTrue(nodes.contains(node));
69 public void negativeContains() {
70 final InstanceIdentifier<FooChild> fooChild =
71 InstanceIdentifier.builder(Nodes.class).child(InstantiatedFoo.class).child(FooChild.class).build();
73 final InstanceIdentifier<Node> nodeTen = InstanceIdentifier.builder(Nodes.class)
74 .child(Node.class, new NodeKey(10)).build();
75 final InstanceIdentifier<Node> nodeOne = InstanceIdentifier.builder(Nodes.class)
76 .child(Node.class, new NodeKey(1)).build();
77 final InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).build();
79 assertFalse(fooChild.contains(nodeTen));
80 assertFalse(nodeTen.contains(nodes));
82 assertFalse(nodeOne.contains(nodes));
83 assertTrue(nodes.contains(nodeOne));
85 assertTrue(nodes.containsWildcarded(nodeOne));
86 assertFalse(nodeOne.containsWildcarded(nodes));
90 public void containsWildcarded() {
91 final InstanceIdentifier<Nodes> nodes = InstanceIdentifier.builder(Nodes.class).build();
92 final InstanceIdentifier<Node> wildcarded = InstanceIdentifier.builder(Nodes.class).child(Node.class).build();
93 final InstanceIdentifier<NodeChild> wildcardedChildren = InstanceIdentifier.builder(Nodes.class)
95 .child(NodeChild.class).build();
97 assertTrue(wildcarded.isWildcarded());
98 assertTrue(wildcardedChildren.isWildcarded());
100 final InstanceIdentifier<Node> nodeTen = InstanceIdentifier.builder(Nodes.class)
101 .child(Node.class, new NodeKey(10)).build();
102 final InstanceIdentifier<Node> nodeOne = InstanceIdentifier.builder(Nodes.class)
103 .child(Node.class, new NodeKey(1)).build();
105 assertFalse(nodeTen.isWildcarded());
106 assertFalse(nodeOne.isWildcarded());
107 assertTrue(nodes.containsWildcarded(nodeOne));
108 assertTrue(wildcarded.containsWildcarded(nodeOne));
109 assertTrue(wildcarded.containsWildcarded(nodeTen));
110 assertFalse(InstanceIdentifier.builder(Nodes.class)
111 .child(InstantiatedFoo.class).build().containsWildcarded(wildcarded));
113 final InstanceIdentifier<NodeChild> nodeTenChildWildcarded = InstanceIdentifier.builder(Nodes.class)
114 .child(Node.class, new NodeKey(10)).child(NodeChild.class).build();
116 assertTrue(nodeTenChildWildcarded.isWildcarded());
118 final InstanceIdentifier<NodeChild> nodeTenChild = InstanceIdentifier.builder(Nodes.class)
119 .child(Node.class, new NodeKey(10)).child(NodeChild.class, new NodeChildKey(10)).build();
120 final InstanceIdentifier<NodeChild> nodeOneChild = InstanceIdentifier.builder(Nodes.class)
121 .child(Node.class, new NodeKey(1)).child(NodeChild.class, new NodeChildKey(1)).build();
123 assertFalse(nodeTenChildWildcarded.containsWildcarded(nodeOneChild));
124 assertTrue(nodeTenChildWildcarded.containsWildcarded(nodeTenChild));
128 public void basicTests() {
129 final InstanceIdentifier<FooRoot> instanceIdentifier1 = InstanceIdentifier.create(FooRoot.class);
130 final InstanceIdentifier<FooRoot> instanceIdentifier2 = InstanceIdentifier.create(FooRoot.class);
131 final InstanceIdentifier<FooRoot> instanceIdentifier4 = InstanceIdentifier.create(FooRoot.class);
132 final InstanceIdentifier<NodeChild> instanceIdentifier3 = InstanceIdentifier.builder(Nodes.class)
133 .child(Node.class, new NodeKey(10)).child(NodeChild.class).build();
134 final Object object = new Object();
136 assertTrue(instanceIdentifier1.equals(instanceIdentifier1));
137 assertFalse(instanceIdentifier1.equals(null));
138 assertFalse(instanceIdentifier1.equals(object));
139 assertTrue(instanceIdentifier1.equals(instanceIdentifier2));
141 Whitebox.setInternalState(instanceIdentifier2, "pathArguments", instanceIdentifier1.pathArguments);
142 Whitebox.setInternalState(instanceIdentifier4, "wildcarded", true);
144 assertTrue(instanceIdentifier1.equals(instanceIdentifier2));
145 assertFalse(instanceIdentifier1.equals(instanceIdentifier3));
146 assertFalse(instanceIdentifier1.equals(instanceIdentifier4));
148 final InstanceIdentifier<Node> instanceIdentifier5 = InstanceIdentifier.create(Nodes.class).child(Node.class);
149 Whitebox.setInternalState(instanceIdentifier5, "hash", instanceIdentifier1.hashCode());
150 Whitebox.setInternalState(instanceIdentifier5, "wildcarded", false);
152 assertNotNull(InstanceIdentifier.unsafeOf(ImmutableList.copyOf(instanceIdentifier1.getPathArguments())));
153 assertNotNull(InstanceIdentifier.create(Nodes.class).child(Node.class));
154 assertNotNull(InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(5)));
155 assertNotNull(instanceIdentifier5.augmentation(NodeAugmentation.class));
156 assertNotNull(instanceIdentifier1.hashCode());
157 assertNotNull(instanceIdentifier1.toString());
159 final InstanceIdentifierBuilder instanceIdentifierBuilder = instanceIdentifier1.builder();
160 assertEquals(instanceIdentifier1.hashCode(), instanceIdentifierBuilder.hashCode());
161 assertNotNull(instanceIdentifierBuilder.augmentation(InstantiatedFoo.class));
162 assertNotNull(instanceIdentifierBuilder.build());
166 public void firstIdentifierOfTest() {
167 final InstanceIdentifier<Node> instanceIdentifier =
168 InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(10)).build();
169 final InstanceIdentifier<Nodes> nodesIdentifier = instanceIdentifier.firstIdentifierOf(Nodes.class);
170 assertNotNull(nodesIdentifier);
171 final InstanceIdentifier<DataObject> dataObjectIdentifier =
172 instanceIdentifier.firstIdentifierOf(DataObject.class);
173 assertNull(dataObjectIdentifier);
177 public void firstKeyOfTest() {
178 final InstanceIdentifier<Node> instanceIdentifier =
179 InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(10)).build();
180 final InstanceIdentifier<FooRoot> instanceIdentifier1 = InstanceIdentifier.create(FooRoot.class);
181 assertNotNull(instanceIdentifier.firstKeyOf(Node.class));
182 assertNull(instanceIdentifier1.firstKeyOf(Node.class));
186 public void keyOfTest() {
187 final Identifier<?> identifier = mock(Identifier.class);
188 assertEquals(identifier, InstanceIdentifier.keyOf(
189 new KeyedInstanceIdentifier(Identifiable.class, ImmutableList.of(), false, 0, identifier)));
193 public void serializationTest() throws IOException, ClassNotFoundException {
194 final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
195 final ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);
197 final InstanceIdentifier<FooRoot> instanceIdentifier = InstanceIdentifier.create(FooRoot.class);
198 outputStream.writeObject(instanceIdentifier);
199 outputStream.flush();
200 outputStream.close();
202 final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
203 final ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
204 final InstanceIdentifier<?> deserialized = (InstanceIdentifier<?>) inputStream.readObject();
206 assertEquals(instanceIdentifier, deserialized);
210 public void equalsTest() {
211 final InstanceIdentifierBuilder<FooRoot> builder1 = InstanceIdentifier.create(FooRoot.class).builder();
212 final InstanceIdentifierBuilder<FooRoot> builder2 = InstanceIdentifier.create(FooRoot.class).builder();
213 final InstanceIdentifierBuilder<Nodes> builder3 = InstanceIdentifier.create(Nodes.class).builder();
214 final InstanceIdentifierBuilder<Nodes> builder4 = InstanceIdentifier.create(Nodes.class).builder();
215 final Object obj = new Object();
217 assertTrue(builder1.equals(builder2));
218 assertTrue(builder2.equals(builder1));
219 assertTrue(builder2.equals(builder2));
220 assertTrue(builder3.equals(builder4));
221 assertTrue(builder4.equals(builder4));
222 assertFalse(builder3.equals(builder1));
223 assertFalse(builder3.equals(null));
224 assertFalse(builder4.equals(null));
225 assertFalse(builder1.equals(obj));
227 builder3.child(Node.class, new NodeKey(10));
228 assertFalse(builder3.equals(builder4));
229 assertFalse(builder4.equals(builder3));
231 builder4.child(Node.class, new NodeKey(20));
232 assertFalse(builder3.equals(builder4));
233 assertFalse(builder4.equals(builder3));
235 InstanceIdentifierBuilder<Nodes> iib1 = new InstanceIdentifierBuilderImpl<>(null, null, 31, true);
236 InstanceIdentifierBuilder<Nodes> iib2 = new InstanceIdentifierBuilderImpl<>(null, null, 31, false);
237 InstanceIdentifierBuilder<Nodes> iib3 = new InstanceIdentifierBuilderImpl<>(null, null, 31, true);
238 assertFalse(iib1.equals(iib2));
239 assertFalse(iib2.equals(iib1));
240 assertTrue(iib1.equals(iib3));
241 assertTrue(iib3.equals(iib1));
245 public void hashCodeTest() {
246 final InstanceIdentifierBuilder<FooRoot> builder1 = InstanceIdentifier.create(FooRoot.class).builder();
247 final InstanceIdentifierBuilder<FooRoot> builder2 = InstanceIdentifier.create(FooRoot.class).builder();
248 final InstanceIdentifierBuilder<Nodes> builder3 = InstanceIdentifier.create(Nodes.class).builder();
249 final InstanceIdentifierBuilder<Nodes> builder4 = InstanceIdentifier.create(Nodes.class).builder();
250 final Object obj = new Object();
252 assertTrue(builder1.hashCode() == builder2.hashCode());
253 assertTrue(builder1.hashCode() != builder3.hashCode());
254 assertTrue(builder3.hashCode() == builder4.hashCode());
255 assertTrue(builder2.hashCode() != builder4.hashCode());
256 assertTrue(builder1.hashCode() != obj.hashCode());
258 builder3.child(Node.class, new NodeKey(10));
260 assertTrue(builder3.hashCode() != builder4.hashCode());
264 public void verifyTargetTest() {
265 final InstanceIdentifier<Nodes> nodeId = InstanceIdentifier.create(Nodes.class);
266 assertSame(nodeId, nodeId.verifyTarget(Nodes.class));
267 assertThrows(VerifyException.class, () -> nodeId.verifyTarget(Node.class));