Merge "BUG-5614: Ovsdb should not flood the packets to compute nodes unless tenant...
[netvirt.git] / openstack / net-virt-providers / src / test / java / org / opendaylight / netvirt / openstack / netvirt / providers / openflow13 / OF13ProviderTest.java
1 /*
2  * Copyright (c) 2015, 2016 Inocybe Technologies.  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.netvirt.openstack.netvirt.providers.openflow13;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Matchers.anyBoolean;
16 import static org.mockito.Matchers.anyLong;
17 import static org.mockito.Matchers.anyShort;
18 import static org.mockito.Matchers.anyString;
19 import static org.mockito.Matchers.eq;
20 import static org.mockito.Matchers.same;
21 import static org.mockito.Mockito.mock;
22 import static org.mockito.Mockito.times;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.when;
25
26 import java.lang.reflect.Field;
27 import java.net.InetAddress;
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 import org.mockito.Mock;
37 import org.mockito.Mockito;
38 import org.opendaylight.netvirt.openstack.netvirt.NetworkHandler;
39 import org.opendaylight.netvirt.openstack.netvirt.api.ClassifierProvider;
40 import org.opendaylight.netvirt.openstack.netvirt.api.L2ForwardingProvider;
41 import org.opendaylight.netvirt.openstack.netvirt.api.NodeCacheManager;
42 import org.opendaylight.netvirt.openstack.netvirt.api.TenantNetworkManager;
43 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork;
44 import org.opendaylight.netvirt.openstack.netvirt.MdsalHelper;
45 import org.opendaylight.netvirt.openstack.netvirt.api.BridgeConfigurationManager;
46 import org.opendaylight.netvirt.openstack.netvirt.api.ConfigurationService;
47 import org.opendaylight.netvirt.openstack.netvirt.api.EgressAclProvider;
48 import org.opendaylight.netvirt.openstack.netvirt.api.IngressAclProvider;
49 import org.opendaylight.netvirt.openstack.netvirt.api.NetworkingProvider;
50 import org.opendaylight.netvirt.openstack.netvirt.api.NetworkingProviderManager;
51 import org.opendaylight.netvirt.openstack.netvirt.api.SecurityServicesManager;
52 import org.opendaylight.netvirt.openstack.netvirt.api.Southbound;
53 import org.opendaylight.netvirt.openstack.netvirt.api.Status;
54 import org.opendaylight.netvirt.openstack.netvirt.api.StatusCode;
55 import org.opendaylight.netvirt.utils.servicehelper.ServiceHelper;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
59 import org.osgi.framework.BundleContext;
60 import org.osgi.framework.ServiceReference;
61 import org.powermock.api.mockito.PowerMockito;
62 import org.powermock.api.support.membermodification.MemberMatcher;
63 import org.powermock.api.support.membermodification.MemberModifier;
64 import org.powermock.core.classloader.annotations.PrepareForTest;
65 import org.powermock.modules.junit4.PowerMockRunner;
66 import org.powermock.reflect.Whitebox;
67
68 /**
69  * Unit test for {@link OF13Provider}
70  */
71 @PrepareForTest({OF13Provider.class, InetAddress.class, MdsalHelper.class, ServiceHelper.class})
72 @RunWith(PowerMockRunner.class)
73 public class OF13ProviderTest {
74
75     @Mock private OF13Provider of13Provider;
76
77     private static final String TYPE = "gre";
78     private static final String IP = "127.0.0.1";
79     private static final String BR_INT = "br-int";
80     private static final String ID = "4";
81     private static final String PORT = "port-int";
82     private static final String SEG_ID = "5";
83     private static final String MAC_ADDRESS = "mac-address";
84     private static final long LOCAL_PORT = 3;
85
86     @Before
87     public void setUp() throws Exception{
88         of13Provider = PowerMockito.mock(OF13Provider.class, Mockito.CALLS_REAL_METHODS);
89     }
90
91     @Test
92     public void testGetName() {
93         assertEquals("Error, did not return the correct name",  OF13Provider.NAME, of13Provider.getName());
94     }
95
96     @Test
97     public void testSupportsServices() {
98         assertTrue("Error, did not return the correct boolean", of13Provider.supportsServices());
99     }
100
101     @Test
102     public void testHasPerTenantTunneling() {
103         assertFalse("Error, did not return the correct boolean", of13Provider.hasPerTenantTunneling());
104     }
105
106     @Test
107     public void testGetTunnelReadinessStatus() throws Exception {
108         ConfigurationService configurationService = mock(ConfigurationService.class);
109         BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
110         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
111
112         MemberModifier.field(OF13Provider.class, "configurationService").set(of13Provider , configurationService);
113         MemberModifier.field(OF13Provider.class, "bridgeConfigurationManager").set(of13Provider , bridgeConfigurationManager);
114         MemberModifier.field(OF13Provider.class, "tenantNetworkManager").set(of13Provider , tenantNetworkManager);
115
116         assertEquals("Error, did not return the correct status code", new Status(StatusCode.NOTFOUND), Whitebox.invokeMethod(of13Provider, "getTunnelReadinessStatus", mock(Node.class), ""));
117
118         when(configurationService.getTunnelEndPoint(any(Node.class))).thenReturn(mock(InetAddress.class));
119         when(bridgeConfigurationManager.isNodeNeutronReady(any(Node.class))).thenReturn(false, true);
120
121         assertEquals("Error, did not return the correct status code", new Status(StatusCode.NOTACCEPTABLE), Whitebox.invokeMethod(of13Provider, "getTunnelReadinessStatus", mock(Node.class), ""));
122
123         when(tenantNetworkManager.isTenantNetworkPresentInNode(any(Node.class), anyString())).thenReturn(false, true);
124
125         assertEquals("Error, did not return the correct status code", new Status(StatusCode.NOTACCEPTABLE), Whitebox.invokeMethod(of13Provider, "getTunnelReadinessStatus", mock(Node.class), ""));
126         assertEquals("Error, did not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(of13Provider, "getTunnelReadinessStatus", mock(Node.class), ""));
127     }
128
129     @Test
130     public void testGetTunnelName() throws Exception {
131         PowerMockito.mockStatic(InetAddress.class);
132         InetAddress inetAddress = mock(InetAddress.class);
133         PowerMockito.when(inetAddress.getHostAddress()).thenReturn(IP);
134
135         String ret = TYPE + "-" + inetAddress.getHostAddress();
136         assertEquals("Error, did not return the correct status code", ret, Whitebox.invokeMethod(of13Provider, "getTunnelName", TYPE, inetAddress));
137     }
138
139     @SuppressWarnings("unchecked")
140     @Test
141     public void testAddTunnelPort() throws Exception {
142         ConfigurationService configurationService = mock(ConfigurationService.class);
143         when(configurationService.getIntegrationBridgeName()).thenReturn(BR_INT);
144         Southbound southbound = mock(Southbound.class);
145         when(southbound.extractTerminationPointAugmentation(any(Node.class), anyString())).thenReturn(mock(OvsdbTerminationPointAugmentation.class));
146         NodeId nodeId = mock(NodeId.class);
147         when(nodeId.getValue()).thenReturn(ID);
148         Node node = mock(Node.class);
149         when(node.getNodeId()).thenReturn(nodeId);
150
151         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "getTunnelName", String.class, InetAddress.class));
152
153         MemberModifier.field(OF13Provider.class, "configurationService").set(of13Provider , configurationService);
154         MemberModifier.field(OF13Provider.class, "southbound").set(of13Provider , southbound);
155
156         assertTrue("Error, did not add the port", (boolean) Whitebox.invokeMethod(of13Provider, "addTunnelPort", node, TYPE, mock(InetAddress.class), mock(InetAddress.class)));
157
158         when(southbound.extractTerminationPointAugmentation(any(Node.class), anyString())).thenReturn(null);
159         when(southbound.addTunnelTerminationPoint(any(Node.class), anyString(), anyString(), anyString(), any(HashMap.class))).thenReturn(false);
160
161         assertFalse("Error, did add the port", (boolean) Whitebox.invokeMethod(of13Provider, "addTunnelPort", node, TYPE, mock(InetAddress.class), mock(InetAddress.class)));
162
163         when(southbound.addTunnelTerminationPoint(any(Node.class), anyString(), anyString(), anyString(), any(HashMap.class))).thenReturn(true);
164
165         assertTrue("Error, did not add the port", (boolean) Whitebox.invokeMethod(of13Provider, "addTunnelPort", node, TYPE, mock(InetAddress.class), mock(InetAddress.class)));
166         PowerMockito.verifyPrivate(of13Provider, times(3)).invoke("getTunnelName", anyString(), any(InetAddress.class));
167     }
168
169     @Test
170     public void testDeletePort() throws Exception {
171         Southbound southbound = mock(Southbound.class);
172         when(southbound.deleteTerminationPoint(any(Node.class), anyString())).thenReturn(false, true);
173         MemberModifier.field(OF13Provider.class, "southbound").set(of13Provider , southbound);
174
175         assertFalse("Error, did delete the port", (boolean) Whitebox.invokeMethod(of13Provider, "deletePort", mock(Node.class), TYPE, PORT));
176         assertTrue("Error, did not delete the port", (boolean) Whitebox.invokeMethod(of13Provider, "deletePort", mock(Node.class), TYPE, PORT));
177     }
178
179     @Test
180     public void testDeleteTunnelPort() throws Exception {
181         ConfigurationService configurationService = mock(ConfigurationService.class);
182         when(configurationService.getIntegrationBridgeName()).thenReturn(BR_INT);
183
184         MemberModifier.field(OF13Provider.class, "configurationService").set(of13Provider , configurationService);
185
186         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "getTunnelName", String.class, InetAddress.class));
187         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "deletePort", Node.class, String.class, String.class));
188
189         PowerMockito.when(of13Provider, "deletePort", any(Node.class), anyString(), anyString()).thenReturn(true);
190
191         assertTrue("Error, did not delete the tunnel", (boolean) Whitebox.invokeMethod(of13Provider, "deleteTunnelPort", mock(Node.class), TYPE, mock(InetAddress.class), mock(InetAddress.class)));
192
193         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("getTunnelName", anyString(), any(InetAddress.class));
194         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("deletePort", any(Node.class), anyString(), anyString());
195
196         PowerMockito.when(of13Provider, "deletePort", any(Node.class), anyString(), anyString()).thenReturn(false);
197
198         assertFalse("Error, did delete the tunnel", (boolean) Whitebox.invokeMethod(of13Provider, "deleteTunnelPort", mock(Node.class), TYPE, mock(InetAddress.class), mock(InetAddress.class)));
199
200         PowerMockito.verifyPrivate(of13Provider, times(2)).invoke("getTunnelName", anyString(), any(InetAddress.class));
201         PowerMockito.verifyPrivate(of13Provider, times(2)).invoke("deletePort", any(Node.class), anyString(), anyString());
202     }
203
204     @Test
205     public void testProgramLocalBridgeRules() throws Exception {
206         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalInPort", Long.class, Short.class, Short.class, String.class, Long.class, String.class, boolean.class));
207         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleDropSrcIface", Long.class, Long.class, boolean.class));
208         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalUcastOut", Long.class, Short.class, String.class, Long.class, String.class, boolean.class));
209         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalBcastOut", Long.class, Short.class, String.class, Long.class, boolean.class));
210         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelFloodOut", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
211         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelMiss", Long.class, Short.class, Short.class, String.class, boolean.class));
212         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalTableMiss", Long.class, Short.class, String.class, boolean.class));
213
214
215         Whitebox.invokeMethod(of13Provider, "programLocalBridgeRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT);
216
217         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalInPort", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
218         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleDropSrcIface", anyLong(), anyLong(), anyBoolean());
219         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalUcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
220         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalBcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyBoolean());
221         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelFloodOut", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
222         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelMiss", anyLong(), anyShort(), anyShort(), anyString(), anyBoolean());
223         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalTableMiss", anyLong(), anyShort(), anyString(), anyBoolean());
224     }
225
226     @Test
227     public void testRemoveLocalBridgeRules() throws Exception {
228         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalInPort", Long.class, Short.class, Short.class, String.class, Long.class, String.class, boolean.class));
229         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleDropSrcIface", Long.class, Long.class, boolean.class));
230         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalUcastOut", Long.class, Short.class, String.class, Long.class, String.class, boolean.class));
231         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalBcastOut", Long.class, Short.class, String.class, Long.class, boolean.class));
232         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelFloodOut", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
233
234
235         Whitebox.invokeMethod(of13Provider, "removeLocalBridgeRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT);
236
237         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalInPort", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
238         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleDropSrcIface", anyLong(), anyLong(), anyBoolean());
239         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalUcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
240         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalBcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyBoolean());
241         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelFloodOut", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
242     }
243
244     @Test
245     public void testProgramLocalIngressTunnelBridgeRules() throws Exception {
246         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelIn", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
247         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelFloodOut", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
248
249
250         Whitebox.invokeMethod(of13Provider, "programLocalIngressTunnelBridgeRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT, LOCAL_PORT);
251
252         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelIn", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
253         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelFloodOut", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
254     }
255
256     @Test
257     public void testProgramRemoteEgressTunnelBridgeRules() throws Exception {
258         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelOut", Long.class, Short.class, Short.class, String.class, Long.class, String.class, boolean.class));
259
260         Whitebox.invokeMethod(of13Provider, "programRemoteEgressTunnelBridgeRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT, LOCAL_PORT);
261
262         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelOut", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
263     }
264
265     @Test
266     public void testRemovePerTunnelRules() throws Exception {
267         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelIn", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
268         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelFloodOut", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
269         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleTunnelMiss", Long.class, Short.class, Short.class, String.class, boolean.class));
270         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalTableMiss", Long.class, Short.class, String.class, boolean.class));
271
272         Whitebox.invokeMethod(of13Provider, "removePerTunnelRules", mock(Node.class), Long.valueOf("45"), SEG_ID, LOCAL_PORT);
273
274         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelIn", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
275         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelFloodOut", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
276         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleTunnelMiss", anyLong(), anyShort(), anyShort(), anyString(), anyBoolean());
277         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalTableMiss", anyLong(), anyShort(), anyString(), anyBoolean());
278     }
279
280     @Test
281     public void testProgramLocalVlanRules() throws Exception {
282         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalInPortSetVlan", Long.class, Short.class, Short.class, String.class, Long.class, String.class, boolean.class));
283         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleDropSrcIface", Long.class, Long.class, boolean.class));
284         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalVlanUcastOut", Long.class, Short.class, String.class, Long.class, String.class, boolean.class));
285
286         Whitebox.invokeMethod(of13Provider, "programLocalVlanRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT);
287
288         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalInPortSetVlan", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
289         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleDropSrcIface", anyLong(), anyLong(), anyBoolean());
290         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalVlanUcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
291     }
292
293     @Test
294     public void testRemoveLocalVlanRules() throws Exception {
295         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalInPortSetVlan", Long.class, Short.class, Short.class, String.class, Long.class, String.class, boolean.class));
296         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleDropSrcIface", Long.class, Long.class, boolean.class));
297         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalVlanUcastOut", Long.class, Short.class, String.class, Long.class, String.class, boolean.class));
298
299         Whitebox.invokeMethod(of13Provider, "programLocalVlanRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT);
300
301         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalInPortSetVlan", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
302         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleDropSrcIface", anyLong(), anyLong(), anyBoolean());
303         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalVlanUcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyString(), anyBoolean());
304     }
305
306
307     @Test
308     public void testProgramLocalIngressVlanRules() throws Exception {
309         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleVlanIn", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
310         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalVlanBcastOut", Long.class, Short.class, String.class, Long.class, Long.class, boolean.class));
311
312         Whitebox.invokeMethod(of13Provider, "programLocalIngressVlanRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT, LOCAL_PORT);
313
314         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleVlanIn", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
315         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalVlanBcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyLong(), anyBoolean());
316     }
317
318     @Test
319     public void testProgramRemoteEgressVlanRules() throws Exception {
320         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleVlanMiss", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
321
322         Whitebox.invokeMethod(of13Provider, "programRemoteEgressVlanRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT);
323
324         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleVlanMiss", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
325     }
326
327     @Test
328     public void testRemoveRemoteEgressVlanRules() throws Exception {
329         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleLocalVlanBcastOut", Long.class, Short.class, String.class, Long.class, Long.class, boolean.class));
330
331         Whitebox.invokeMethod(of13Provider, "removeRemoteEgressVlanRules", mock(Node.class), Long.valueOf("45"), SEG_ID, MAC_ADDRESS, LOCAL_PORT, LOCAL_PORT);
332
333         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleLocalVlanBcastOut", anyLong(), anyShort(), anyString(), anyLong(), anyLong(), anyBoolean());
334     }
335
336     @Test
337     public void testRemovePerVlanRules() throws Exception {
338         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleVlanIn", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
339         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "handleVlanMiss", Long.class, Short.class, Short.class, String.class, Long.class, boolean.class));
340
341         Whitebox.invokeMethod(of13Provider, "removePerVlanRules", mock(Node.class), Long.valueOf("45"), SEG_ID, LOCAL_PORT, LOCAL_PORT);
342
343         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleVlanIn", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
344         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("handleVlanMiss", anyLong(), anyShort(), anyShort(), anyString(), anyLong(), anyBoolean());
345     }
346
347     @Test
348     public void testHandleInterfaceUpdate() throws Exception{
349         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
350         when(neutronNetwork.getProviderNetworkType()).thenReturn(NetworkHandler.NETWORK_TYPE_VLAN, NetworkHandler.NETWORK_TYPE_GRE);
351         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
352         Map<NodeId, Node> nodes = new HashMap<>();
353         nodes.put(mock(NodeId.class), mock(Node.class));
354         when(nodeCacheManager.getOvsdbNodes()).thenReturn(nodes);
355         Southbound southbound = mock(Southbound.class);
356         when(southbound.extractBridgeOvsdbNodeId(any(Node.class))).thenReturn(mock(NodeId.class));
357         when(southbound.getBridgeNode(any(Node.class), anyString())).thenReturn(mock(Node.class));
358         ConfigurationService configurationService = mock(ConfigurationService.class);
359         when(configurationService.getIntegrationBridgeName()).thenReturn(BR_INT);
360
361         MemberModifier.field(OF13Provider.class, "nodeCacheManager").set(of13Provider , nodeCacheManager);
362         MemberModifier.field(OF13Provider.class, "southbound").set(of13Provider , southbound);
363         MemberModifier.field(OF13Provider.class, "configurationService").set(of13Provider , configurationService);
364
365         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "programLocalRules", String.class, String.class, Node.class, OvsdbTerminationPointAugmentation.class));
366         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "programVlanRules", NeutronNetwork.class, Node.class, OvsdbTerminationPointAugmentation.class));
367
368         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
369         MemberModifier.field(OF13Provider.class, "tenantNetworkManager").set(of13Provider, tenantNetworkManager);
370         when(tenantNetworkManager.isTenantNetworkPresentInNode(any(Node.class), eq(ID))).thenReturn(true);
371
372         assertTrue("Error, did not update the interface correclty", of13Provider.handleInterfaceUpdate(neutronNetwork, mock(Node.class), mock(OvsdbTerminationPointAugmentation.class)));
373         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("programLocalRules", anyString(), anyString(), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
374         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("programVlanRules", any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
375
376         when(configurationService.getTunnelEndPoint(any(Node.class))).thenReturn(mock(InetAddress.class));
377         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "addTunnelPort", Node.class, String.class, InetAddress.class, InetAddress.class));
378         PowerMockito.when(of13Provider, "addTunnelPort", any(Node.class), anyString(), any(InetAddress.class), any(InetAddress.class)).thenReturn(true);
379         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "programTunnelRules", String.class, String.class, InetAddress.class, Node.class, OvsdbTerminationPointAugmentation.class, boolean.class));
380
381         assertTrue("Error, did not update the interface correclty", of13Provider.handleInterfaceUpdate(neutronNetwork, mock(Node.class), mock(OvsdbTerminationPointAugmentation.class)));
382         PowerMockito.verifyPrivate(of13Provider, times(2)).invoke("addTunnelPort", any(Node.class), anyString(), any(InetAddress.class), any(InetAddress.class));
383         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("programTunnelRules", anyString(), anyString(), any(InetAddress.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
384     }
385
386     private static final String INTF = "interface";
387
388     @SuppressWarnings("unchecked")
389     @Test
390     public void testHandlerInterfaceDelete() throws Exception {
391         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
392         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
393         NodeId nodeId = mock(NodeId.class);
394         when(nodeId.getValue()).thenReturn(ID);
395         Node node = mock(Node.class);
396         when(node.getNodeId()).thenReturn(nodeId);
397         Map<NodeId, Node> nodes = new HashMap<>();
398         nodes.put(mock(NodeId.class), node);
399         when(nodeCacheManager.getOvsdbNodes()).thenReturn(nodes);
400         Southbound southbound = mock(Southbound.class);
401         when(southbound.extractBridgeOvsdbNodeId(any(Node.class))).thenReturn(mock(NodeId.class));
402         when(southbound.isTunnel(any(OvsdbTerminationPointAugmentation.class))).thenReturn(true);
403         when(southbound.getOptionsValue(any(List.class), anyString())).thenReturn(IP);
404         OvsdbTerminationPointAugmentation intf = mock(OvsdbTerminationPointAugmentation.class);
405         when(intf.getName()).thenReturn(INTF);
406         List<String> intfs = new ArrayList<>();
407         intfs.add(INTF);
408         BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
409         when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(intfs);
410         ConfigurationService configurationService = mock(ConfigurationService.class);
411         when(configurationService.getTunnelEndPoint(any(Node.class))).thenReturn(mock(InetAddress.class));
412
413         PowerMockito.mockStatic(InetAddress.class);
414         PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(mock(InetAddress.class));
415
416         PowerMockito.mockStatic(MdsalHelper.class);
417         PowerMockito.when(MdsalHelper.createOvsdbInterfaceType(any(Class.class))).thenReturn(INTF);
418
419         MemberModifier.field(OF13Provider.class, "nodeCacheManager").set(of13Provider , nodeCacheManager);
420         MemberModifier.field(OF13Provider.class, "southbound").set(of13Provider , southbound);
421         MemberModifier.field(OF13Provider.class, "bridgeConfigurationManager").set(of13Provider , bridgeConfigurationManager);
422         MemberModifier.field(OF13Provider.class, "configurationService").set(of13Provider , configurationService);
423
424         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "deleteTunnelPort", Node.class, String.class, InetAddress.class, InetAddress.class));
425
426         assertTrue("Error, did not delete the interface correclty", of13Provider.handleInterfaceDelete(TYPE,  neutronNetwork, mock(Node.class), intf, false));
427         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("deleteTunnelPort", any(Node.class), anyString(), any(InetAddress.class), any(InetAddress.class));
428
429         when(southbound.isTunnel(any(OvsdbTerminationPointAugmentation.class))).thenReturn(false);
430         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "deletePhysicalPort", Node.class, String.class));
431
432         assertTrue("Error, did not delete the interface correclty", of13Provider.handleInterfaceDelete(TYPE,  neutronNetwork, mock(Node.class), intf, false));
433         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("deletePhysicalPort", any(Node.class), anyString());
434
435         intfs.clear();
436         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "removeLocalRules", String.class, String.class, Node.class, OvsdbTerminationPointAugmentation.class));
437         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "removeVlanRules", NeutronNetwork.class, Node.class, OvsdbTerminationPointAugmentation.class, boolean.class));
438         when(neutronNetwork.getProviderNetworkType()).thenReturn(NetworkHandler.NETWORK_TYPE_VLAN);
439
440         assertTrue("Error, did not delete the interface correclty", of13Provider.handleInterfaceDelete(TYPE,  neutronNetwork, mock(Node.class), intf, false));
441         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("removeLocalRules",  anyString(), anyString(), any(Node.class), any(OvsdbTerminationPointAugmentation.class));
442         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("removeVlanRules",  any(NeutronNetwork.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), anyBoolean());
443
444         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
445         MemberModifier.field(OF13Provider.class, "tenantNetworkManager").set(of13Provider, tenantNetworkManager);
446         when(tenantNetworkManager.isTenantNetworkPresentInNode(any(Node.class), eq(ID))).thenReturn(true);
447
448         when(neutronNetwork.getProviderNetworkType()).thenReturn(NetworkHandler.NETWORK_TYPE_GRE);
449         when(southbound.getBridgeNode(any(Node.class), anyString())).thenReturn(node);
450         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "removeTunnelRules", String.class, String.class, InetAddress.class, Node.class, OvsdbTerminationPointAugmentation.class, boolean.class, boolean.class));
451
452         assertTrue("Error, did not delete the interface correclty", of13Provider.handleInterfaceDelete(TYPE,  neutronNetwork, node, intf, false));
453         PowerMockito.verifyPrivate(of13Provider, times(3)).invoke("removeTunnelRules", anyString(), anyString(), any(InetAddress.class), any(Node.class), any(OvsdbTerminationPointAugmentation.class), any(boolean.class), any(boolean.class));
454     }
455
456     // Problem with methods signatures: initializeFlowRules(Node) has the same signature than initializeFlowRules(Node, String)
457 //    @Test
458 //    public void testInitializeFlowRules() throws Exception {
459 //        MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "initializeFlowRules", Node.class, String.class));
460 //        MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "triggerInterfaceUpdates", Node.class));
461 //
462 //        of13Provider.initializeFlowRules(mock(Node.class));
463 //
464 //        PowerMockito.verifyPrivate(of13Provider, times(2)).invoke("initializeFlowRules", any(Node.class), anyString());
465 //        PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("triggerInterfaceUpdates", any(Node.class));
466 //    }
467
468     @Test
469     public void testInitializeOFFlowRule() throws Exception{
470         Southbound southbound = mock(Southbound.class);
471         when(southbound.getBridgeName(any(Node.class))).thenReturn(BR_INT);
472         ConfigurationService configurationService = mock(ConfigurationService.class);
473         when(configurationService.getIntegrationBridgeName()).thenReturn(BR_INT);
474
475         MemberModifier.field(OF13Provider.class, "southbound").set(of13Provider , southbound);
476         MemberModifier.field(OF13Provider.class, "configurationService").set(of13Provider , configurationService);
477
478         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "initializeFlowRules", Node.class, String.class));
479         MemberModifier.suppress(MemberMatcher.method(OF13Provider.class, "triggerInterfaceUpdates", Node.class));
480
481         of13Provider.initializeOFFlowRules(mock(Node.class));
482
483         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("initializeFlowRules", any(Node.class), anyString());
484         PowerMockito.verifyPrivate(of13Provider, times(1)).invoke("triggerInterfaceUpdates", any(Node.class));
485     }
486
487     @Test
488     public void testSetDependencies() throws Exception {
489         ConfigurationService configurationService = mock(ConfigurationService.class);
490         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
491         BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
492         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
493         ClassifierProvider classifierProvider = mock(ClassifierProvider.class);
494         IngressAclProvider ingressAclProvider = mock(IngressAclProvider.class);
495         EgressAclProvider egressAclProvider = mock(EgressAclProvider.class);
496         L2ForwardingProvider l2ForwardingProvider = mock(L2ForwardingProvider.class);
497         SecurityServicesManager securityServicesManager = mock(SecurityServicesManager.class);
498         Southbound southbound = mock(Southbound.class);
499
500         ServiceHelper.overrideGlobalInstance(ConfigurationService.class, configurationService);
501         ServiceHelper.overrideGlobalInstance(TenantNetworkManager.class, tenantNetworkManager);
502         ServiceHelper.overrideGlobalInstance(BridgeConfigurationManager.class, bridgeConfigurationManager);
503         ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
504         ServiceHelper.overrideGlobalInstance(ClassifierProvider.class, classifierProvider);
505         ServiceHelper.overrideGlobalInstance(IngressAclProvider.class, ingressAclProvider);
506         ServiceHelper.overrideGlobalInstance(EgressAclProvider.class, egressAclProvider);
507         ServiceHelper.overrideGlobalInstance(L2ForwardingProvider.class, l2ForwardingProvider);
508         ServiceHelper.overrideGlobalInstance(SecurityServicesManager.class, securityServicesManager);
509         ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
510
511         of13Provider.setDependencies(mock(BundleContext.class), mock(ServiceReference.class));
512
513         assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
514         assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
515         assertEquals("Error, did not return the correct object", getField("bridgeConfigurationManager"), bridgeConfigurationManager);
516         assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
517         assertEquals("Error, did not return the correct object", getField("classifierProvider"), classifierProvider);
518         assertEquals("Error, did not return the correct object", getField("ingressAclProvider"), ingressAclProvider);
519         assertEquals("Error, did not return the correct object", getField("egressAclProvider"), egressAclProvider);
520         assertEquals("Error, did not return the correct object", getField("l2ForwardingProvider"), l2ForwardingProvider);
521         assertEquals("Error, did not return the correct object", getField("securityServicesManager"), securityServicesManager);
522         assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
523     }
524
525     @SuppressWarnings("unchecked")
526     @Test
527     public void testSetDependenciesObject() throws Exception{
528         NetworkingProviderManager networkingProviderManager = mock(NetworkingProviderManager.class);
529         BundleContext bundleContext = mock(BundleContext.class);
530         when(bundleContext.getServiceReference(NetworkingProvider.class.getName())).thenReturn(mock(ServiceReference.class));
531
532         MemberModifier.field(OF13Provider.class, "bundleContext").set(of13Provider, bundleContext);
533
534         of13Provider.setDependencies(networkingProviderManager);
535         verify(networkingProviderManager).providerAdded(any(ServiceReference.class), same(of13Provider));
536     }
537
538     private Object getField(String fieldName) throws Exception {
539         Field field = OF13Provider.class.getDeclaredField(fieldName);
540         field.setAccessible(true);
541         return field.get(of13Provider);
542     }
543 }