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