2 * Copyright (c) 2015 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.openflowplugin.applications.topology.manager;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.junit.Assert.fail;
13 import static org.mockito.Matchers.any;
14 import static org.mockito.Matchers.eq;
15 import static org.mockito.Mockito.atLeast;
16 import static org.mockito.Mockito.doAnswer;
17 import static org.mockito.Mockito.inOrder;
18 import static org.mockito.Mockito.never;
20 import com.google.common.base.Optional;
21 import com.google.common.util.concurrent.CheckedFuture;
22 import com.google.common.util.concurrent.Futures;
23 import com.google.common.util.concurrent.SettableFuture;
24 import com.google.common.util.concurrent.Uninterruptibles;
25 import java.util.HashSet;
27 import java.util.concurrent.CountDownLatch;
28 import java.util.concurrent.TimeUnit;
29 import org.mockito.ArgumentCaptor;
30 import org.mockito.InOrder;
31 import org.mockito.invocation.InvocationOnMock;
32 import org.mockito.stubbing.Answer;
33 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
34 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
35 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.Destination;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.DestinationBuilder;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.Source;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.SourceBuilder;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkBuilder;
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
52 public class TestUtils {
53 static void verifyMockTx(ReadWriteTransaction mockTx) {
54 InOrder inOrder = inOrder(mockTx);
55 inOrder.verify(mockTx, atLeast(0)).submit();
56 inOrder.verify(mockTx, never()).delete(eq(LogicalDatastoreType.OPERATIONAL),
57 any(InstanceIdentifier.class));
60 @SuppressWarnings("rawtypes")
61 static void assertDeletedIDs(InstanceIdentifier[] expDeletedIIDs,
62 ArgumentCaptor<InstanceIdentifier> deletedLinkIDs) {
63 Set<InstanceIdentifier> actualIIDs = new HashSet<>(deletedLinkIDs.getAllValues());
64 for(InstanceIdentifier id: expDeletedIIDs) {
65 assertTrue("Missing expected deleted IID " + id, actualIIDs.contains(id));
69 static void setReadFutureAsync(final Topology topology,
70 final SettableFuture<Optional<Topology>> readFuture) {
74 Uninterruptibles.sleepUninterruptibly(50, TimeUnit.MILLISECONDS);
75 readFuture.set(Optional.of(topology));
81 static void waitForSubmit(CountDownLatch latch) {
82 assertEquals("Transaction submitted", true,
83 Uninterruptibles.awaitUninterruptibly(latch, 5, TimeUnit.SECONDS));
86 static void waitForDeletes(int expDeleteCalls, final CountDownLatch latch) {
87 boolean done = Uninterruptibles.awaitUninterruptibly(latch, 5, TimeUnit.SECONDS);
89 fail("Expected " + expDeleteCalls + " delete calls. Actual: " +
90 (expDeleteCalls - latch.getCount()));
94 static CountDownLatch setupStubbedSubmit(ReadWriteTransaction mockTx) {
95 final CountDownLatch latch = new CountDownLatch(1);
96 doAnswer(new Answer<CheckedFuture<Void, TransactionCommitFailedException>>() {
98 public CheckedFuture<Void, TransactionCommitFailedException> answer(
99 InvocationOnMock invocation) {
101 return Futures.immediateCheckedFuture(null);
103 }).when(mockTx).submit();
108 @SuppressWarnings("rawtypes")
109 static void setupStubbedDeletes(ReadWriteTransaction mockTx,
110 ArgumentCaptor<InstanceIdentifier> deletedLinkIDs, final CountDownLatch latch) {
111 doAnswer(new Answer<Void>() {
113 public Void answer(InvocationOnMock invocation) {
117 }).when(mockTx).delete(eq(LogicalDatastoreType.OPERATIONAL), deletedLinkIDs.capture());
120 static org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey
121 newInvNodeKey(String id) {
122 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey nodeKey =
123 new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey(
124 new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.
125 rev130819.NodeId(id));
129 static NodeConnectorKey newInvNodeConnKey(String id) {
130 return new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey(
131 new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.
132 NodeConnectorId(id));
135 static KeyedInstanceIdentifier<NodeConnector, NodeConnectorKey> newNodeConnID(
136 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey nodeKey,
137 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey ncKey) {
138 return InstanceIdentifier.create(Nodes.class).child(
139 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node.class,
140 nodeKey).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.
141 rev130819.node.NodeConnector.class, ncKey);
144 static Link newLink(String id, Source source, Destination dest) {
145 return new LinkBuilder().setLinkId(new LinkId(id))
146 .setSource(source).setDestination(dest).build();
149 static Destination newDestTp(String id) {
150 return new DestinationBuilder().setDestTp(new TpId(id)).build();
153 static Source newSourceTp(String id) {
154 return new SourceBuilder().setSourceTp(new TpId(id)).build();
157 static Destination newDestNode(String id) {
158 return new DestinationBuilder().setDestNode(new NodeId(id)).build();
161 static Source newSourceNode(String id) {
162 return new SourceBuilder().setSourceNode(new NodeId(id)).build();