Upgrade powermock to 2.0.0
[ovsdb.git] / southbound / southbound-impl / src / test / java / org / opendaylight / ovsdb / southbound / OvsdbConnectionManagerTest.java
1 /*
2  * Copyright © 2015, 2017 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.mockito.ArgumentMatchers.any;
13 import static org.mockito.ArgumentMatchers.anyInt;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.mock;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
19 import static org.powermock.api.support.membermodification.MemberMatcher.field;
20 import static org.powermock.api.support.membermodification.MemberModifier.suppress;
21
22 import com.google.common.base.Optional;
23 import com.google.common.util.concurrent.CheckedFuture;
24 import com.google.common.util.concurrent.Futures;
25 import java.net.InetAddress;
26 import java.util.Collections;
27 import java.util.HashMap;
28 import java.util.Map;
29 import java.util.concurrent.ConcurrentHashMap;
30 import org.junit.Before;
31 import org.junit.Ignore;
32 import org.junit.Test;
33 import org.junit.runner.RunWith;
34 import org.mockito.Mock;
35 import org.mockito.Mockito;
36 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
37 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
38 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
39 import org.opendaylight.mdsal.eos.binding.api.Entity;
40 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipChange;
41 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
42 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState;
43 import org.opendaylight.ovsdb.lib.OvsdbClient;
44 import org.opendaylight.ovsdb.lib.OvsdbConnection;
45 import org.opendaylight.ovsdb.lib.OvsdbConnectionInfo;
46 import org.opendaylight.ovsdb.lib.impl.OvsdbConnectionService;
47 import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationManager;
48 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionCommand;
49 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAttributes;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
56 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
57 import org.powermock.api.mockito.PowerMockito;
58 import org.powermock.api.support.membermodification.MemberMatcher;
59 import org.powermock.api.support.membermodification.MemberModifier;
60 import org.powermock.core.classloader.annotations.PrepareForTest;
61 import org.powermock.modules.junit4.PowerMockRunner;
62 import org.powermock.reflect.Whitebox;
63
64 @RunWith(PowerMockRunner.class)
65 @PrepareForTest({ SouthboundMapper.class, OvsdbConnectionManager.class, OvsdbConnectionService.class,
66         InstanceIdentifier.class, SouthboundUtil.class, Optional.class })
67 public class OvsdbConnectionManagerTest {
68
69     @Mock private OvsdbConnectionManager ovsdbConnManager;
70     @Mock private DataBroker db;
71     @Mock private TransactionInvoker txInvoker;
72     @Mock private EntityOwnershipService entityOwnershipService;
73     @Mock private OvsdbConnection ovsdbConnection;
74     @Mock private OvsdbClient externalClient;
75     @Mock private ReconciliationManager reconciliationManager;
76     private Map<ConnectionInfo,OvsdbConnectionInstance> clients;
77     private Map<ConnectionInfo,InstanceIdentifier<Node>> instanceIdentifiers;
78     private Map<Entity, OvsdbConnectionInstance> entityConnectionMap;
79
80     @Mock private InstanceIdentifier<Node> iid;
81
82     @Before
83     public void setUp() throws Exception {
84         ovsdbConnManager = PowerMockito.mock(OvsdbConnectionManager.class, Mockito.CALLS_REAL_METHODS);
85         field(OvsdbConnectionManager.class, "db").set(ovsdbConnManager, db);
86         field(OvsdbConnectionManager.class, "txInvoker").set(ovsdbConnManager, txInvoker);
87         field(OvsdbConnectionManager.class, "entityOwnershipService").set(ovsdbConnManager, entityOwnershipService);
88         field(OvsdbConnectionManager.class, "reconciliationManager").set(ovsdbConnManager, reconciliationManager);
89         field(OvsdbConnectionManager.class, "ovsdbConnection").set(ovsdbConnManager, ovsdbConnection);
90         entityConnectionMap = new ConcurrentHashMap<>();
91
92         OvsdbConnectionInfo info = mock(OvsdbConnectionInfo.class);
93         doReturn(mock(InetAddress.class)).when(info).getRemoteAddress();
94         doReturn(8080).when(info).getRemotePort();
95         doReturn(mock(InetAddress.class)).when(info).getLocalAddress();
96         doReturn(8080).when(info).getLocalPort();
97
98         externalClient = mock(OvsdbClient.class, Mockito.RETURNS_DEEP_STUBS);
99         doReturn(info).when(externalClient).getConnectionInfo();
100         doReturn(Futures.immediateFuture(Collections.singletonList("Open_vSwitch"))).when(externalClient)
101             .getDatabases();
102
103         PowerMockito.mockStatic(SouthboundUtil.class);
104         when(SouthboundUtil.connectionInfoToString(any(ConnectionInfo.class))).thenReturn("192.18.120.31:8080");
105     }
106
107     @Test
108     public void testConnected() throws Exception {
109         OvsdbConnectionInstance client = mock(OvsdbConnectionInstance.class);
110         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "connectedButCallBacksNotRegistered",
111                 OvsdbClient.class));
112         when(ovsdbConnManager.connectedButCallBacksNotRegistered(any(OvsdbClient.class))).thenReturn(client);
113         doNothing().when(client).registerCallbacks(any());
114
115         //TODO: Write unit tests for EntityOwnershipService
116         when(client.getInstanceIdentifier()).thenReturn(mock(InstanceIdentifier.class));
117         field(OvsdbConnectionManager.class, "entityConnectionMap").set(ovsdbConnManager, entityConnectionMap);
118         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getEntityFromConnectionInstance",
119                 OvsdbConnectionInstance.class));
120
121         //TODO: Write unit tests for entity ownership service related code.
122         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "registerEntityForOwnership",
123                 OvsdbConnectionInstance.class));
124
125         ReadOnlyTransaction tx = mock(ReadOnlyTransaction.class);
126         when(db.newReadOnlyTransaction()).thenReturn(tx);
127         when(tx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
128                 .thenReturn(mock(CheckedFuture.class));
129         when(client.getInstanceIdentifier()).thenReturn(mock(InstanceIdentifier.class));
130
131         ovsdbConnManager.connected(externalClient);
132     }
133
134     @SuppressWarnings("unchecked")
135     @Test
136     public void testConnectedButCallBacksNotRegistered() throws Exception {
137         ConnectionInfo key = mock(ConnectionInfo.class);
138
139         PowerMockito.mockStatic(SouthboundMapper.class);
140         when(SouthboundMapper.createConnectionInfo(any(OvsdbClient.class))).thenReturn(key);
141
142         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getInstanceIdentifier", ConnectionInfo.class));
143         when(ovsdbConnManager.getInstanceIdentifier(key)).thenReturn(mock(InstanceIdentifier.class));
144
145         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
146         when(ovsdbConnManager.getConnectionInstance(key)).thenReturn(null);
147
148         OvsdbConnectionInstance client = mock(OvsdbConnectionInstance.class);
149         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "putConnectionInstance", ConnectionInfo.class,
150                 OvsdbConnectionInstance.class));
151         doNothing().when(client).createTransactInvokers();
152         PowerMockito.whenNew(OvsdbConnectionInstance.class).withArguments(any(ConnectionInfo.class),
153                 any(OvsdbClient.class), any(TransactionInvoker.class), any(InstanceIdentifier.class))
154                 .thenReturn(client);
155
156         assertEquals("Error, did not receive correct OvsdbConnectionInstance object", client,
157                 ovsdbConnManager.connectedButCallBacksNotRegistered(externalClient));
158     }
159
160     @Test
161     public void testDisconnected() throws Exception {
162         ConnectionInfo key = mock(ConnectionInfo.class);
163         PowerMockito.mockStatic(SouthboundMapper.class);
164         when(SouthboundMapper.createConnectionInfo(any(OvsdbClient.class))).thenReturn(key);
165
166         OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
167         clients = new ConcurrentHashMap<>();
168         clients.put(key, ovsdbConnectionInstance);
169         MemberModifier.field(OvsdbConnectionManager.class, "clients").set(ovsdbConnManager, clients);
170
171         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
172         when(ovsdbConnManager.getConnectionInstance(any(ConnectionInfo.class))).thenReturn(ovsdbConnectionInstance);
173         doNothing().when(txInvoker).invoke(any(TransactionCommand.class));
174
175         when(SouthboundMapper.suppressLocalIpPort(any(ConnectionInfo.class))).thenReturn(key);
176
177         // TODO: Write unit tests for EntityOwnershipService
178         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "unregisterEntityForOwnership",
179                 OvsdbConnectionInstance.class));
180         instanceIdentifiers = new ConcurrentHashMap<>();
181         field(OvsdbConnectionManager.class, "instanceIdentifiers").set(ovsdbConnManager, instanceIdentifiers);
182         field(OvsdbConnectionManager.class, "nodeIdVsConnectionInstance").set(ovsdbConnManager, new HashMap<>());
183
184         MemberModifier.suppress(MemberMatcher.method(OvsdbConnectionManager.class, "reconcileConnection",
185                 InstanceIdentifier.class, OvsdbNodeAugmentation.class));
186         ReadOnlyTransaction tx = mock(ReadOnlyTransaction.class);
187         when(db.newReadOnlyTransaction()).thenReturn(tx);
188         when(tx.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
189                 .thenReturn(mock(CheckedFuture.class));
190         when(ovsdbConnectionInstance.getInstanceIdentifier()).thenReturn(mock(InstanceIdentifier.class));
191         ovsdbConnManager.disconnected(externalClient);
192         Map<ConnectionInfo, OvsdbConnectionInstance> testClients = Whitebox.getInternalState(ovsdbConnManager,
193                 "clients");
194         assertEquals("Error, size of the hashmap is incorrect", 0, testClients.size());
195     }
196
197     @Test
198     public void testDisconnect() throws Exception {
199         OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
200         ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
201         when(ovsdbNode.getConnectionInfo()).thenReturn(connectionInfo);
202         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
203         OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
204         when(ovsdbConnManager.getConnectionInstance(any(ConnectionInfo.class))).thenReturn(ovsdbConnectionInstance);
205         when(ovsdbConnectionInstance.getInstanceIdentifier()).thenReturn(mock(InstanceIdentifier.class));
206
207         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "removeInstanceIdentifier", ConnectionInfo.class));
208
209         // TODO: Write unit tests for entity ownership service related code.
210         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "unregisterEntityForOwnership",
211                 OvsdbConnectionInstance.class));
212         ovsdbConnManager.disconnect(ovsdbNode);
213         verify(ovsdbConnectionInstance).disconnect();
214     }
215
216     @Test
217     @Ignore
218     public void testInit() {
219         mock(ConnectionInfo.class);
220         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
221         OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
222         when(ovsdbConnManager.getConnectionInstance(any(ConnectionInfo.class))).thenReturn(ovsdbConnectionInstance);
223
224         // client not null
225         // ovsdbConnectionManager.init(key);
226         verify(ovsdbConnectionInstance).registerCallbacks(any());
227     }
228
229     @Test
230     public void testClose() throws Exception {
231         ConnectionInfo key1 = mock(ConnectionInfo.class);
232         ConnectionInfo key2 = mock(ConnectionInfo.class);
233         OvsdbConnectionInstance ovsdbConnectionInstance1 = mock(OvsdbConnectionInstance.class);
234         OvsdbConnectionInstance ovsdbConnectionInstance2 = mock(OvsdbConnectionInstance.class);
235         clients = new ConcurrentHashMap<>();
236         clients.put(key1, ovsdbConnectionInstance1);
237         clients.put(key2, ovsdbConnectionInstance2);
238         MemberModifier.field(OvsdbConnectionManager.class, "clients").set(ovsdbConnManager, clients);
239         ovsdbConnManager.close();
240         verify(ovsdbConnectionInstance1).disconnect();
241         verify(ovsdbConnectionInstance2).disconnect();
242     }
243
244     @Test
245     public void testPutAndGetConnectionInstance() throws Exception {
246         ConnectionInfo key = mock(ConnectionInfo.class);
247         ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
248         PowerMockito.mockStatic(SouthboundMapper.class);
249         when(SouthboundMapper.suppressLocalIpPort(key)).thenReturn(connectionInfo);
250
251         clients = new ConcurrentHashMap<>();
252         MemberModifier.field(OvsdbConnectionManager.class, "clients").set(ovsdbConnManager, clients);
253
254         // Test putConnectionInstance()
255         OvsdbConnectionInstance instance = mock(OvsdbConnectionInstance.class);
256         Whitebox.invokeMethod(ovsdbConnManager, "putConnectionInstance", key, instance);
257         Map<ConnectionInfo, OvsdbConnectionInstance> testClients = Whitebox.getInternalState(ovsdbConnManager,
258                 "clients");
259         assertEquals("Error, size of the hashmap is incorrect", 1, testClients.size());
260
261         // Test getConnectionInstance(ConnectionInfo key)
262         assertEquals("Error, returned incorrect OvsdbConnectionInstance object", instance,
263                 ovsdbConnManager.getConnectionInstance(key));
264     }
265
266     @Test
267     public void testPutandGetInstanceIdentifier() throws Exception {
268         ConnectionInfo key = mock(ConnectionInfo.class);
269         ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
270         PowerMockito.mockStatic(SouthboundMapper.class);
271         when(SouthboundMapper.suppressLocalIpPort(key)).thenReturn(connectionInfo);
272
273         instanceIdentifiers = new ConcurrentHashMap<>();
274         field(OvsdbConnectionManager.class, "instanceIdentifiers").set(ovsdbConnManager, instanceIdentifiers);
275
276         //Test putInstanceIdentifier()
277         Whitebox.invokeMethod(ovsdbConnManager, "putInstanceIdentifier", key, iid);
278         Map<ConnectionInfo, OvsdbConnectionInstance> testIids = Whitebox.getInternalState(ovsdbConnManager,
279                 "instanceIdentifiers");
280         assertEquals("Error, size of the hashmap is incorrect", 1, testIids.size());
281
282         //Test getInstanceIdentifier()
283         assertEquals("Error returning correct InstanceIdentifier object", iid,
284                 ovsdbConnManager.getInstanceIdentifier(key));
285
286         //Test removeInstanceIdentifier()
287         Whitebox.invokeMethod(ovsdbConnManager, "removeInstanceIdentifier", key);
288         Map<ConnectionInfo, OvsdbConnectionInstance> testRemoveIids = Whitebox.getInternalState(ovsdbConnManager,
289                 "instanceIdentifiers");
290         assertEquals("Error, size of the hashmap is incorrect", 0, testRemoveIids.size());
291     }
292
293     @Test
294     public void testGetClient() {
295         OvsdbConnectionInstance ovsdbClient = mock(OvsdbConnectionInstance.class);
296         OvsdbClient client = mock(OvsdbClient.class);
297         when(ovsdbClient.getOvsdbClient()).thenReturn(client);
298
299         //Test getClient(ConnectionInfo connectionInfo)
300         ConnectionInfo key = mock(ConnectionInfo.class);
301         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", ConnectionInfo.class));
302         when(ovsdbConnManager.getConnectionInstance(key)).thenReturn(ovsdbClient);
303         assertEquals("Error getting correct OvsdbClient object", ovsdbClient.getOvsdbClient(),
304                 ovsdbConnManager.getClient(key));
305
306         //Test getClient(OvsdbBridgeAttributes mn)
307         OvsdbBridgeAttributes mn = mock(OvsdbBridgeAttributes.class);
308         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance",
309                 OvsdbBridgeAttributes.class));
310         when(ovsdbConnManager.getConnectionInstance(mn)).thenReturn(ovsdbClient);
311         assertEquals("Error getting correct OvsdbClient object", ovsdbClient.getOvsdbClient(),
312                 ovsdbConnManager.getClient(mn));
313
314         //Test getClient(Node node)
315         Node node = mock(Node.class);
316         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getConnectionInstance", Node.class));
317         when(ovsdbConnManager.getConnectionInstance(node)).thenReturn(ovsdbClient);
318         assertEquals("Error getting correct OvsdbClient object", ovsdbClient.getOvsdbClient(),
319                 ovsdbConnManager.getClient(node));
320     }
321
322     @SuppressWarnings("unchecked")
323     @Test
324     public void testConnect() throws Exception {
325         OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
326         ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
327         when(ovsdbNode.getConnectionInfo()).thenReturn(connectionInfo);
328         IpAddress ipAddr = mock(IpAddress.class);
329         when(connectionInfo.getRemoteIp()).thenReturn(ipAddr);
330
331         PowerMockito.mockStatic(SouthboundMapper.class);
332         InetAddress ip = mock(InetAddress.class);
333         when(SouthboundMapper.createInetAddress(any(IpAddress.class))).thenReturn(ip);
334
335         PowerMockito.mockStatic(OvsdbConnectionService.class);
336 //        when(OvsdbConnectionService.getService()).thenReturn(ovsdbConnection);
337         PortNumber port = mock(PortNumber.class);
338         when(connectionInfo.getRemotePort()).thenReturn(port);
339         when(port.getValue()).thenReturn(8080);
340         OvsdbClient client = mock(OvsdbClient.class);
341         when(ovsdbConnection.connect(any(InetAddress.class), anyInt())).thenReturn(client);
342
343         //client not null case
344         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "putInstanceIdentifier", ConnectionInfo.class,
345                 InstanceIdentifier.class));
346         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "connectedButCallBacksNotRegistered",
347                 OvsdbClient.class));
348
349         doNothing().when(ovsdbConnManager).putInstanceIdentifier(any(ConnectionInfo.class),
350             any(InstanceIdentifier.class));
351
352         OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
353         when(ovsdbConnManager.connectedButCallBacksNotRegistered(any(OvsdbClient.class)))
354                 .thenReturn(ovsdbConnectionInstance);
355
356         when(ovsdbConnectionInstance.getInstanceIdentifier()).thenReturn(mock(InstanceIdentifier.class));
357         field(OvsdbConnectionManager.class, "entityConnectionMap").set(ovsdbConnManager, entityConnectionMap);
358         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "getEntityFromConnectionInstance",
359                 OvsdbConnectionInstance.class));
360         //TODO: Write unit tests for entity ownership service related code.
361         suppress(MemberMatcher.method(OvsdbConnectionManager.class, "registerEntityForOwnership",
362                 OvsdbConnectionInstance.class));
363         assertEquals("ERROR", client, ovsdbConnManager.connect(PowerMockito.mock(InstanceIdentifier.class), ovsdbNode));
364     }
365
366     @Test
367     public void testHandleOwnershipChanged() throws Exception {
368         Entity entity = new Entity("entityType", "entityName");
369         ConnectionInfo key = mock(ConnectionInfo.class);
370
371         OvsdbConnectionInstance ovsdbConnInstance = new OvsdbConnectionInstance(key, externalClient, txInvoker, iid);
372         entityConnectionMap.put(entity, ovsdbConnInstance);
373
374         field(OvsdbConnectionManager.class, "entityConnectionMap").set(ovsdbConnManager, entityConnectionMap);
375         doNothing().when(ovsdbConnManager).putConnectionInstance(any(ConnectionInfo.class),
376             any(OvsdbConnectionInstance.class));
377         EntityOwnershipChange ownershipChange = new EntityOwnershipChange(entity,
378                 EntityOwnershipChangeState.from(true, false, false));
379         Whitebox.invokeMethod(ovsdbConnManager, "handleOwnershipChanged", ownershipChange);
380         verify(ovsdbConnManager).putConnectionInstance(key, ovsdbConnInstance);
381     }
382 }