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