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.junit.Assert.assertNull;
13 import static org.mockito.Matchers.any;
14 import static org.mockito.Matchers.anyString;
15 import static org.mockito.Matchers.eq;
16 import static org.mockito.Mockito.doNothing;
17 import static org.mockito.Mockito.doReturn;
18 import static org.mockito.Mockito.mock;
19 import static org.mockito.Mockito.times;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.when;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.List;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.mockito.Mock;
34 import org.mockito.Mockito;
35 import org.opendaylight.ovsdb.lib.EchoServiceCallbackFilters;
36 import org.opendaylight.ovsdb.lib.LockAquisitionCallback;
37 import org.opendaylight.ovsdb.lib.LockStolenCallback;
38 import org.opendaylight.ovsdb.lib.MonitorCallBack;
39 import org.opendaylight.ovsdb.lib.MonitorHandle;
40 import org.opendaylight.ovsdb.lib.OvsdbClient;
41 import org.opendaylight.ovsdb.lib.OvsdbConnectionInfo;
42 import org.opendaylight.ovsdb.lib.message.MonitorRequest;
43 import org.opendaylight.ovsdb.lib.message.MonitorRequestBuilder;
44 import org.opendaylight.ovsdb.lib.message.MonitorSelect;
45 import org.opendaylight.ovsdb.lib.message.TableUpdates;
46 import org.opendaylight.ovsdb.lib.operations.OperationResult;
47 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
48 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
49 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
50 import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactCommand;
51 import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactInvoker;
52 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.powermock.api.mockito.PowerMockito;
59 import org.powermock.api.support.membermodification.MemberMatcher;
60 import org.powermock.api.support.membermodification.MemberModifier;
61 import org.powermock.core.classloader.annotations.PrepareForTest;
62 import org.powermock.modules.junit4.PowerMockRunner;
63 import org.powermock.reflect.Whitebox;
65 import com.google.common.util.concurrent.ListenableFuture;
67 @PrepareForTest({OvsdbConnectionInstance.class, MonitorRequestBuilder.class})
68 @RunWith(PowerMockRunner.class)
70 public class OvsdbConnectionInstanceTest {
71 @Mock private OvsdbConnectionInstance ovsdbConnectionInstance;
72 @Mock private OvsdbClient client;
73 @Mock private ConnectionInfo connectionInfo;
74 @Mock private TransactionInvoker txInvoker;
75 @Mock private MonitorCallBack callback;
76 @Mock private ConnectionInfo key;
77 @Mock private InstanceIdentifier<Node> instanceIdentifier;
78 private Map<DatabaseSchema,TransactInvoker> transactInvokers;
81 public void setUp() throws Exception {
82 ovsdbConnectionInstance = PowerMockito.mock(OvsdbConnectionInstance.class, Mockito.CALLS_REAL_METHODS);
83 MemberModifier.field(OvsdbConnectionInstance.class, "txInvoker").set(ovsdbConnectionInstance, txInvoker);
84 MemberModifier.field(OvsdbConnectionInstance.class, "connectionInfo").set(ovsdbConnectionInstance, key);
85 MemberModifier.field(OvsdbConnectionInstance.class, "instanceIdentifier").set(ovsdbConnectionInstance, instanceIdentifier);
86 MemberModifier.field(OvsdbConnectionInstance.class, "hasDeviceOwnership").set(ovsdbConnectionInstance, false);
89 @SuppressWarnings({ "unchecked", "rawtypes" })
91 public void testTransact() throws Exception {
92 TransactCommand command = mock(TransactCommand.class);
93 transactInvokers = new HashMap();
95 //init instance variables
96 TransactInvoker transactInvoker1 = mock(TransactInvoker.class);
97 TransactInvoker transactInvoker2 = mock(TransactInvoker.class);
98 transactInvokers.put(mock(DatabaseSchema.class), transactInvoker1);
99 transactInvokers.put(mock(DatabaseSchema.class), transactInvoker2);
100 MemberModifier.field(OvsdbConnectionInstance.class, "transactInvokers").set(ovsdbConnectionInstance , transactInvokers);
102 ovsdbConnectionInstance.transact(command);
103 verify(transactInvoker1).invoke(any(TransactCommand.class));
104 verify(transactInvoker2).invoke(any(TransactCommand.class));
107 @SuppressWarnings("unchecked")
109 public void testRegisterCallbacks() throws Exception {
111 //callback not null case
112 MemberModifier.field(OvsdbConnectionInstance.class, "callback").set(ovsdbConnectionInstance , callback);
113 ovsdbConnectionInstance.registerCallbacks();
114 verify(ovsdbConnectionInstance, times(0)).getDatabases();
117 MemberModifier.field(OvsdbConnectionInstance.class, "callback").set(ovsdbConnectionInstance , null);
118 ListenableFuture<List<String>> listenableFuture = mock(ListenableFuture.class);
119 List<String> databases = new ArrayList<>();
120 databases.add("Open_vSwitch");
122 doReturn(listenableFuture).when(ovsdbConnectionInstance).getDatabases();
123 when(listenableFuture.get()).thenReturn(databases);
125 ListenableFuture<DatabaseSchema> listenableDbSchema = mock(ListenableFuture.class);
126 DatabaseSchema dbSchema= mock(DatabaseSchema.class);
127 doReturn(listenableDbSchema).when(ovsdbConnectionInstance).getSchema(anyString());
128 when(listenableDbSchema.get()).thenReturn(dbSchema);
130 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionInstance.class, "monitorAllTables", String.class,DatabaseSchema.class));
131 ovsdbConnectionInstance.registerCallbacks();
132 PowerMockito.verifyPrivate(ovsdbConnectionInstance, times(1)).invoke("monitorAllTables", anyString(), any(DatabaseSchema.class));
135 @SuppressWarnings({ "unchecked", "rawtypes" })
137 public void testCreateTransactInvokers() throws Exception {
138 //transactInvokers not null case
139 transactInvokers = new HashMap();
140 MemberModifier.field(OvsdbConnectionInstance.class, "transactInvokers").set(ovsdbConnectionInstance , transactInvokers);
141 ovsdbConnectionInstance.createTransactInvokers();
142 verify(ovsdbConnectionInstance, times(0)).getDatabases();
144 //transactInvokers null case
145 MemberModifier.field(OvsdbConnectionInstance.class, "transactInvokers").set(ovsdbConnectionInstance , null);
146 ListenableFuture<List<String>> listenableFuture = mock(ListenableFuture.class);
147 List<String> databases = new ArrayList<>();
148 databases.add("database1");
149 databases.add("database2");
150 doReturn(listenableFuture).when(ovsdbConnectionInstance).getDatabases();
151 when(listenableFuture.get()).thenReturn(databases);
153 ListenableFuture<DatabaseSchema> listenableDbSchema = mock(ListenableFuture.class);
154 DatabaseSchema dbSchema= mock(DatabaseSchema.class);
155 DatabaseSchema dbSchema1= mock(DatabaseSchema.class);
156 doReturn(listenableDbSchema).when(ovsdbConnectionInstance).getSchema(anyString());
157 when(listenableDbSchema.get()).thenReturn(dbSchema).thenReturn(dbSchema1);
159 ovsdbConnectionInstance.createTransactInvokers();
160 verify(ovsdbConnectionInstance).getDatabases();
161 verify(ovsdbConnectionInstance, times(2)).getSchema(anyString());
163 Map<DatabaseSchema,TransactInvoker> testTransactInvokers = Whitebox.getInternalState(ovsdbConnectionInstance, "transactInvokers");
164 assertEquals("Error, size of the hashmap is incorrect", 2, testTransactInvokers.size());
167 @SuppressWarnings("unchecked")
169 public void testMonitorAllTables() throws Exception {
170 Set<String> tables = new HashSet<>();
171 tables.add("tableName1");
172 tables.add("tableName2");
173 DatabaseSchema dbSchema = mock(DatabaseSchema.class);
174 when(dbSchema.getName()).thenReturn(SouthboundConstants.OPEN_V_SWITCH);
175 when(dbSchema.getTables()).thenReturn(tables);
176 GenericTableSchema tableSchema = mock(GenericTableSchema.class);
177 when(dbSchema.table(anyString(), eq(GenericTableSchema.class))).thenReturn(tableSchema);
179 Set<String> columns = new HashSet<>();
180 columns.add("columnName1");
181 columns.add("columnName2");
182 when(tableSchema.getColumns()).thenReturn(columns);
183 MonitorRequestBuilder<GenericTableSchema> monitorBuilder = mock(MonitorRequestBuilder.class);
184 PowerMockito.mockStatic(MonitorRequestBuilder.class);
185 when(MonitorRequestBuilder.builder(any(GenericTableSchema.class))).thenReturn(monitorBuilder);
186 when(monitorBuilder.addColumn(anyString())).thenReturn(monitorBuilder);
187 MonitorRequest monitorReq = mock(MonitorRequest.class);
188 when(monitorBuilder.with(any(MonitorSelect.class))).thenReturn(monitorBuilder);
189 when(monitorBuilder.build()).thenReturn(monitorReq);
191 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionInstance.class, "monitor", DatabaseSchema.class, List.class, MonitorCallBack.class));
192 TableUpdates tableUpdates = mock(TableUpdates.class);
193 when(ovsdbConnectionInstance.monitor(any(DatabaseSchema.class), any(List.class), any(MonitorCallBack.class))).thenReturn(tableUpdates);
194 MemberModifier.field(OvsdbConnectionInstance.class, "callback").set(ovsdbConnectionInstance, callback);
195 doNothing().when(callback).update(any(TableUpdates.class), any(DatabaseSchema.class));
197 Whitebox.invokeMethod(ovsdbConnectionInstance, "monitorAllTables", "database", dbSchema);
198 PowerMockito.verifyPrivate(ovsdbConnectionInstance, times(1)).invoke("monitorAllTables", anyString(), any(DatabaseSchema.class));
200 verify(monitorBuilder, times(4)).addColumn(anyString());
203 @SuppressWarnings({ "unchecked" })
205 public void testOvsdbConnectionInstance() throws Exception {
206 MemberModifier.field(OvsdbConnectionInstance.class, "client").set(ovsdbConnectionInstance, client);
207 DatabaseSchema databaseSchema = mock(DatabaseSchema.class);
209 //test getDatabases()
210 ListenableFuture<List<String>> listenableFuture = mock(ListenableFuture.class);
211 when(client.getDatabases()).thenReturn(listenableFuture);
212 assertEquals("Error, did not return correct ListenableFuture<List<String>> object", listenableFuture, ovsdbConnectionInstance.getDatabases());
213 verify(client).getDatabases();
216 ListenableFuture<DatabaseSchema> futureDatabaseSchema = mock(ListenableFuture.class);
217 when(client.getSchema(anyString())).thenReturn(futureDatabaseSchema);
218 assertEquals("Error, did not return correct ListenableFuture<DatabaseSchema> object", futureDatabaseSchema, ovsdbConnectionInstance.getSchema(anyString()));
219 verify(client).getSchema(anyString());
221 //test transactBuilder()
222 TransactionBuilder transactionBuilder = mock(TransactionBuilder.class);
223 when(client.transactBuilder(any(DatabaseSchema.class))).thenReturn(transactionBuilder);
224 assertEquals("Error, did not return correct TransactionBuilder object", transactionBuilder, ovsdbConnectionInstance.transactBuilder(any(DatabaseSchema.class)));
225 verify(client).transactBuilder(any(DatabaseSchema.class));
228 ListenableFuture<List<OperationResult>> futureOperationResult = mock(ListenableFuture.class);
229 when(client.transact(any(DatabaseSchema.class), any(List.class))).thenReturn(futureOperationResult);
230 assertEquals("Error, did not return correct ListenableFuture<List<OperationResult>> object", futureOperationResult, ovsdbConnectionInstance.transact(any(DatabaseSchema.class), any(List.class)));
231 verify(client).transact(any(DatabaseSchema.class), any(List.class));
234 TableUpdates tableUpdates = mock(TableUpdates.class);
235 when(client.monitor(any(DatabaseSchema.class), any(List.class), any(MonitorCallBack.class))).thenReturn(tableUpdates);
236 assertEquals("Error, did not return correct TableUpdates object", tableUpdates, ovsdbConnectionInstance.monitor(any(DatabaseSchema.class), any(List.class), any(MonitorCallBack.class)));
237 verify(client).monitor(any(DatabaseSchema.class), any(List.class), any(MonitorCallBack.class));
239 //test cancelMonitor()
240 doNothing().when(client).cancelMonitor(any(MonitorHandle.class));
241 MonitorHandle monitorHandle = mock(MonitorHandle.class);
242 ovsdbConnectionInstance.cancelMonitor(monitorHandle);
243 verify(client).cancelMonitor(any(MonitorHandle.class));
246 doNothing().when(client).lock(anyString(), any(LockAquisitionCallback.class), any(LockStolenCallback.class));
247 LockAquisitionCallback lockAquisitionCallback = mock(LockAquisitionCallback.class);
248 LockStolenCallback lockStolenCallback = mock(LockStolenCallback.class);
249 ovsdbConnectionInstance.lock("lockId", lockAquisitionCallback, lockStolenCallback);
250 verify(client).lock(anyString(), any(LockAquisitionCallback.class), any(LockStolenCallback.class));
253 ListenableFuture<Boolean> futureBoolean = mock(ListenableFuture.class);
254 when(client.steal(anyString())).thenReturn(futureBoolean);
255 assertEquals("Error, did not return correct ListenableFuture<Boolean> object", futureBoolean, ovsdbConnectionInstance.steal(anyString()));
256 verify(client).steal(anyString());
259 when(client.unLock(anyString())).thenReturn(futureBoolean);
260 assertEquals("Error, did not return correct ListenableFuture<Boolean> object", futureBoolean, ovsdbConnectionInstance.unLock(anyString()));
261 verify(client).unLock(anyString());
263 //test startEchoService()
264 EchoServiceCallbackFilters echoServiceCallbackFilters = mock(EchoServiceCallbackFilters.class);
265 doNothing().when(client).startEchoService(any(EchoServiceCallbackFilters.class));
266 ovsdbConnectionInstance.startEchoService(echoServiceCallbackFilters);
267 verify(client).startEchoService(any(EchoServiceCallbackFilters.class));
269 //test stopEchoService()
270 doNothing().when(client).stopEchoService();
271 ovsdbConnectionInstance.stopEchoService();
272 verify(client).stopEchoService();
275 when(client.isActive()).thenReturn(true);
276 assertEquals("Error, does not match isActive()", true, ovsdbConnectionInstance.isActive());
277 verify(client).isActive();
280 doNothing().when(client).disconnect();
281 ovsdbConnectionInstance.disconnect();
282 verify(client).disconnect();
284 //test getDatabaseSchema()
285 when(client.getDatabaseSchema(anyString())).thenReturn(databaseSchema);
286 assertEquals("Error, did not return correct DatabaseSchema object", databaseSchema, ovsdbConnectionInstance.getDatabaseSchema(anyString()));
287 verify(client).getDatabaseSchema(anyString());
289 //test getConnectionInfo()
290 OvsdbConnectionInfo ovsdbConnectionInfo = mock(OvsdbConnectionInfo.class);
291 when(client.getConnectionInfo()).thenReturn(ovsdbConnectionInfo);
292 assertEquals("Error, did not return correct OvsdbConnectionInfo object", ovsdbConnectionInfo, ovsdbConnectionInstance.getConnectionInfo());
293 verify(client).getConnectionInfo();
295 //test getMDConnectionInfo()
296 assertEquals("Error, incorrect connectionInfo", key, ovsdbConnectionInstance.getMDConnectionInfo());
298 //test setMDConnectionInfo()
299 ovsdbConnectionInstance.setMDConnectionInfo(key);
300 assertEquals("Error, incorrect ConnectionInfo", key, Whitebox.getInternalState(ovsdbConnectionInstance, "connectionInfo"));
302 //test getInstanceIdentifier()
303 assertEquals("Error, incorrect instanceIdentifier", instanceIdentifier, ovsdbConnectionInstance.getInstanceIdentifier());
306 NodeKey nodeKey = mock(NodeKey.class);
307 NodeId nodeId = mock(NodeId.class);
308 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionInstance.class, "getNodeKey"));
309 when(ovsdbConnectionInstance.getNodeKey()).thenReturn(nodeKey);
310 when(nodeKey.getNodeId()).thenReturn(nodeId);
311 assertEquals("Error, incorrect NodeId object", nodeId, ovsdbConnectionInstance.getNodeId());
313 //test setInstanceIdentifier()
314 ovsdbConnectionInstance.setInstanceIdentifier(instanceIdentifier);
315 assertEquals("Error, incorrect instanceIdentifier", instanceIdentifier, Whitebox.getInternalState(ovsdbConnectionInstance, "instanceIdentifier"));
318 MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionInstance.class, "monitor", DatabaseSchema.class, List.class, MonitorHandle.class, MonitorCallBack.class));
319 when(ovsdbConnectionInstance.monitor(any(DatabaseSchema.class), any(List.class), any(MonitorHandle.class), any(MonitorCallBack.class))).thenReturn(null);
320 assertNull(ovsdbConnectionInstance.monitor(any(DatabaseSchema.class), any(List.class), any(MonitorHandle.class), any(MonitorCallBack.class)));