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