2 * Copyright (c) 2015 Inocybe Technologies 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.ovsdb.southbound;
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.anyInt;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.verify;
17 import static org.mockito.Mockito.when;
19 import java.net.InetAddress;
21 import java.util.concurrent.ConcurrentHashMap;
23 import org.junit.Before;
24 import org.junit.Ignore;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.Mock;
28 import org.mockito.Mockito;
29 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
30 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
31 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidateRegistration;
32 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
33 import org.opendaylight.ovsdb.lib.OvsdbClient;
34 import org.opendaylight.ovsdb.lib.OvsdbConnection;
35 import org.opendaylight.ovsdb.lib.impl.OvsdbConnectionService;
36 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionCommand;
37 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAttributes;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.powermock.api.mockito.PowerMockito;
46 import org.powermock.api.support.membermodification.MemberMatcher;
47 import org.powermock.api.support.membermodification.MemberModifier;
48 import org.powermock.core.classloader.annotations.PrepareForTest;
49 import org.powermock.modules.junit4.PowerMockRunner;
50 import org.powermock.reflect.Whitebox;
52 import com.google.common.base.Optional;
54 @PrepareForTest({SouthboundMapper.class, OvsdbConnectionManager.class, OvsdbConnectionService.class, InstanceIdentifier.class, SouthboundUtil.class, Optional.class})
55 @RunWith(PowerMockRunner.class)
56 public class OvsdbConnectionManagerTest {
58 @Mock private OvsdbConnectionManager ovsdbConnectionManager;
59 @Mock private DataBroker db;
60 @Mock private TransactionInvoker txInvoker;
61 @Mock private EntityOwnershipService entityOwnershipService;
62 private Map<ConnectionInfo,OvsdbConnectionInstance> clients;
63 private Map<ConnectionInfo,InstanceIdentifier<Node>> instanceIdentifiers;
64 private Map<Entity, OvsdbConnectionInstance> entityConnectionMap;
66 @Mock private InstanceIdentifier<Node> iid;
69 public void setUp() throws Exception {
70 ovsdbConnectionManager = PowerMockito.mock(OvsdbConnectionManager.class, Mockito.CALLS_REAL_METHODS);
71 MemberModifier.field(OvsdbConnectionManager.class, "db").set(ovsdbConnectionManager, db);
72 MemberModifier.field(OvsdbConnectionManager.class, "txInvoker").set(ovsdbConnectionManager, txInvoker);
73 MemberModifier.field(OvsdbConnectionManager.class, "entityOwnershipService").set(ovsdbConnectionManager, entityOwnershipService);
74 entityConnectionMap = new ConcurrentHashMap<>();
77 public void testConnected() throws Exception {
78 OvsdbConnectionInstance client = mock(OvsdbConnectionInstance.class);
79 OvsdbClient externalClient = mock(OvsdbClient.class);
80 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "connectedButCallBacksNotRegistered", OvsdbClient.class));
81 when(ovsdbConnectionManager.connectedButCallBacksNotRegistered(any(OvsdbClient.class))).thenReturn(client);
82 doNothing().when(client).registerCallbacks();
84 //TODO: Write unit tests for EntityOwnershipService
85 InstanceIdentifier<Node> iid = mock(InstanceIdentifier.class);
86 when(client.getInstanceIdentifier()).thenReturn(iid);
87 MemberModifier.field(OvsdbConnectionManager.class, "entityConnectionMap").set(ovsdbConnectionManager, entityConnectionMap);
88 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getEntityFromConnectionInstance", OvsdbConnectionInstance.class));
90 //TODO: Write unit tests for entity ownership service related code.
91 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "registerEntityForOwnership", OvsdbConnectionInstance.class));
92 ovsdbConnectionManager.connected(externalClient);
95 @SuppressWarnings("unchecked")
97 public void testConnectedButCallBacksNotRegistered() throws Exception {
98 OvsdbClient externalClient = mock(OvsdbClient.class, Mockito.RETURNS_DEEP_STUBS);
99 OvsdbConnectionInstance client = mock(OvsdbConnectionInstance.class);
101 InetAddress ip = mock(InetAddress.class);
103 when(externalClient.getConnectionInfo().getRemoteAddress()).thenReturn(ip);
104 when(externalClient.getConnectionInfo().getRemotePort()).thenReturn(new Integer(8080));
106 ConnectionInfo key = mock(ConnectionInfo.class);
107 PowerMockito.mockStatic(SouthboundMapper.class);
108 when(SouthboundMapper.createConnectionInfo(any(OvsdbClient.class))).thenReturn(key);
110 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getInstanceIdentifier", ConnectionInfo.class));
111 InstanceIdentifier<Node> iid = mock(InstanceIdentifier.class);
112 when(ovsdbConnectionManager.getInstanceIdentifier(key)).thenReturn(iid);
114 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
115 when(ovsdbConnectionManager.getConnectionInstance(key)).thenReturn(null);
117 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "putConnectionInstance", ConnectionInfo.class, OvsdbConnectionInstance.class));
118 doNothing().when(client).createTransactInvokers();
119 PowerMockito.whenNew(OvsdbConnectionInstance.class).
120 withArguments(any(ConnectionInfo.class), any(OvsdbClient.class),any(TransactionInvoker.class), any(InstanceIdentifier.class)).
123 assertEquals("Error, did not receive correct OvsdbConnectionInstance object", client, ovsdbConnectionManager.connectedButCallBacksNotRegistered(externalClient));
127 public void testDisconnected() throws Exception {
128 OvsdbClient client = mock(OvsdbClient.class, Mockito.RETURNS_DEEP_STUBS);
129 OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
130 InetAddress ip = mock(InetAddress.class);
131 when(client.getConnectionInfo().getRemoteAddress()).thenReturn(ip);
132 when(client.getConnectionInfo().getRemotePort()).thenReturn(new Integer(8080));
134 ConnectionInfo key = mock(ConnectionInfo.class);
135 PowerMockito.mockStatic(SouthboundMapper.class);
136 when(SouthboundMapper.createConnectionInfo(any(OvsdbClient.class))).thenReturn(key);
138 clients = new ConcurrentHashMap<ConnectionInfo,OvsdbConnectionInstance>();
139 clients.put(key, ovsdbConnectionInstance);
140 MemberModifier.field(OvsdbConnectionManager.class, "clients").set(ovsdbConnectionManager, clients);
142 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
143 when(ovsdbConnectionManager.getConnectionInstance(any(ConnectionInfo.class))).thenReturn(ovsdbConnectionInstance);
144 doNothing().when(txInvoker).invoke(any(TransactionCommand.class));
146 when(SouthboundMapper.suppressLocalIpPort(any(ConnectionInfo.class))).thenReturn(key);
148 //TODO: Write unit tests for EntityOwnershipService
149 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "unregisterEntityForOwnership", OvsdbConnectionInstance.class));
150 ovsdbConnectionManager.disconnected(client);
151 Map<ConnectionInfo,OvsdbConnectionInstance> testClients = Whitebox.getInternalState(ovsdbConnectionManager, "clients");
152 assertEquals("Error, size of the hashmap is incorrect", 0, testClients.size());
156 public void testDisconnect() throws Exception {
157 OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
158 ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
159 when(ovsdbNode.getConnectionInfo()).thenReturn(connectionInfo);
160 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
161 OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
162 when(ovsdbConnectionManager.getConnectionInstance(any(ConnectionInfo.class))).thenReturn(ovsdbConnectionInstance);
164 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "removeInstanceIdentifier", ConnectionInfo.class));
166 //TODO: Write unit tests for entity ownership service related code.
167 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "unregisterEntityForOwnership", OvsdbConnectionInstance.class));
168 ovsdbConnectionManager.disconnect(ovsdbNode);
169 verify((OvsdbClient)ovsdbConnectionInstance).disconnect();
174 public void testInit() {
175 ConnectionInfo key = mock(ConnectionInfo.class);
176 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
177 OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
178 when(ovsdbConnectionManager.getConnectionInstance(any(ConnectionInfo.class))).thenReturn(ovsdbConnectionInstance);
181 // ovsdbConnectionManager.init(key);
182 verify(ovsdbConnectionInstance).registerCallbacks();
186 public void testClose() throws Exception {
187 ConnectionInfo key1 = mock(ConnectionInfo.class);
188 ConnectionInfo key2 = mock(ConnectionInfo.class);
189 OvsdbConnectionInstance ovsdbConnectionInstance1 = mock(OvsdbConnectionInstance.class);
190 OvsdbConnectionInstance ovsdbConnectionInstance2 = mock(OvsdbConnectionInstance.class);
191 clients = new ConcurrentHashMap<ConnectionInfo,OvsdbConnectionInstance>();
192 clients.put(key1, ovsdbConnectionInstance1);
193 clients.put(key2, ovsdbConnectionInstance2);
194 MemberModifier.field(OvsdbConnectionManager.class, "clients").set(ovsdbConnectionManager, clients);
195 ovsdbConnectionManager.close();
196 verify(ovsdbConnectionInstance1).disconnect();
197 verify(ovsdbConnectionInstance2).disconnect();
201 public void testPutAndGetConnectionInstance() throws Exception {
202 ConnectionInfo key = mock(ConnectionInfo.class);
203 ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
204 OvsdbConnectionInstance instance = mock(OvsdbConnectionInstance.class);
205 PowerMockito.mockStatic(SouthboundMapper.class);
206 when(SouthboundMapper.suppressLocalIpPort(key)).thenReturn(connectionInfo);
208 clients = new ConcurrentHashMap<ConnectionInfo,OvsdbConnectionInstance>();
209 MemberModifier.field(OvsdbConnectionManager.class, "clients").set(ovsdbConnectionManager, clients);
211 //Test putConnectionInstance()
212 Whitebox.invokeMethod(ovsdbConnectionManager, "putConnectionInstance", key, instance);
213 Map<ConnectionInfo,OvsdbConnectionInstance> testClients = Whitebox.getInternalState(ovsdbConnectionManager, "clients");
214 assertEquals("Error, size of the hashmap is incorrect", 1, testClients.size());
216 //Test getConnectionInstance(ConnectionInfo key)
217 assertEquals("Error, returned incorrect OvsdbConnectionInstance object", instance, ovsdbConnectionManager.getConnectionInstance(key));
220 @SuppressWarnings("unchecked")
222 public void testPutandGetInstanceIdentifier() throws Exception {
223 ConnectionInfo key = mock(ConnectionInfo.class);
224 ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
225 InstanceIdentifier<Node> iid = mock(InstanceIdentifier.class);
226 PowerMockito.mockStatic(SouthboundMapper.class);
227 when(SouthboundMapper.suppressLocalIpPort(key)).thenReturn(connectionInfo);
229 instanceIdentifiers = new ConcurrentHashMap<ConnectionInfo,InstanceIdentifier<Node>>();
230 MemberModifier.field(OvsdbConnectionManager.class, "instanceIdentifiers").set(ovsdbConnectionManager, instanceIdentifiers);
232 //Test putInstanceIdentifier()
233 Whitebox.invokeMethod(ovsdbConnectionManager, "putInstanceIdentifier", key, iid);
234 Map<ConnectionInfo,OvsdbConnectionInstance> testIids = Whitebox.getInternalState(ovsdbConnectionManager, "instanceIdentifiers");
235 assertEquals("Error, size of the hashmap is incorrect", 1, testIids.size());
237 //Test getInstanceIdentifier()
238 assertEquals("Error returning correct InstanceIdentifier object",iid , ovsdbConnectionManager.getInstanceIdentifier(key));
240 //Test removeInstanceIdentifier()
241 Whitebox.invokeMethod(ovsdbConnectionManager, "removeInstanceIdentifier", key);
242 Map<ConnectionInfo,OvsdbConnectionInstance> testRemoveIids = Whitebox.getInternalState(ovsdbConnectionManager, "instanceIdentifiers");
243 assertEquals("Error, size of the hashmap is incorrect", 0, testRemoveIids.size());
247 public void testGetClient() {
248 OvsdbClient ovsdbClient = mock(OvsdbConnectionInstance.class);
250 //Test getClient(ConnectionInfo connectionInfo)
251 ConnectionInfo key = mock(ConnectionInfo.class);
252 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
253 when(ovsdbConnectionManager.getConnectionInstance(key)).thenReturn((OvsdbConnectionInstance)ovsdbClient);
254 assertEquals("Error getting correct OvsdbClient object", ovsdbClient, ovsdbConnectionManager.getClient(key));
256 //Test getClient(OvsdbBridgeAttributes mn)
257 OvsdbBridgeAttributes mn = mock(OvsdbBridgeAttributes.class);
258 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", OvsdbBridgeAttributes.class));
259 when(ovsdbConnectionManager.getConnectionInstance(mn)).thenReturn((OvsdbConnectionInstance)ovsdbClient);
260 assertEquals("Error getting correct OvsdbClient object", ovsdbClient, ovsdbConnectionManager.getClient(mn));
262 //Test getClient(Node node)
263 Node node = mock(Node.class);
264 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", Node.class));
265 when(ovsdbConnectionManager.getConnectionInstance(node)).thenReturn((OvsdbConnectionInstance)ovsdbClient);
266 assertEquals("Error getting correct OvsdbClient object", ovsdbClient, ovsdbConnectionManager.getClient(node));
269 @SuppressWarnings("unchecked")
271 public void testConnect() throws Exception {
272 OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
273 ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
274 when(ovsdbNode.getConnectionInfo()).thenReturn(connectionInfo);
275 IpAddress ipAddr = mock(IpAddress.class);
276 when(connectionInfo.getRemoteIp()).thenReturn(ipAddr);
278 PowerMockito.mockStatic(SouthboundMapper.class);
279 InetAddress ip = mock(InetAddress.class);
280 when(SouthboundMapper.createInetAddress(any(IpAddress.class))).thenReturn(ip);
282 OvsdbClient client = mock(OvsdbClient.class);
283 OvsdbConnection ovsdbConnection = mock(OvsdbConnection.class);
284 PowerMockito.mockStatic(OvsdbConnectionService.class);
285 when(OvsdbConnectionService.getService()).thenReturn(ovsdbConnection);
286 PortNumber port = mock(PortNumber.class);
287 when(connectionInfo.getRemotePort()).thenReturn(port);
288 when(port.getValue()).thenReturn(new Integer(8080));
289 when(ovsdbConnection.connect(any(InetAddress.class), anyInt())).thenReturn(client);
291 //client not null case
292 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "putInstanceIdentifier", ConnectionInfo.class, InstanceIdentifier.class));
293 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "connectedButCallBacksNotRegistered", OvsdbClient.class));
295 PowerMockito.doNothing().when(ovsdbConnectionManager, "putInstanceIdentifier", any(ConnectionInfo.class), any(InstanceIdentifier.class));
297 OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
298 when(ovsdbConnectionManager.connectedButCallBacksNotRegistered(any(OvsdbClient.class))).thenReturn(ovsdbConnectionInstance);
300 InstanceIdentifier<Node> iid = mock(InstanceIdentifier.class);
301 when(ovsdbConnectionInstance.getInstanceIdentifier()).thenReturn(iid);
302 MemberModifier.field(OvsdbConnectionManager.class, "entityConnectionMap").set(ovsdbConnectionManager, entityConnectionMap);
303 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getEntityFromConnectionInstance", OvsdbConnectionInstance.class));
304 //TODO: Write unit tests for entity ownership service related code.
305 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "registerEntityForOwnership", OvsdbConnectionInstance.class));
306 assertEquals("ERROR", client, ovsdbConnectionManager.connect(PowerMockito.mock(InstanceIdentifier.class), ovsdbNode));