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