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