Bug 4917 For fixing SG dangling flows. Extended port cache logic to
[ovsdb.git] / openstack / net-virt / src / test / java / org / opendaylight / ovsdb / openstack / netvirt / impl / NeutronL3AdapterTest.java
1 /*
2  * Copyright (c) 2015, 2016 Inocybe 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.openstack.netvirt.impl;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.anyBoolean;
14 import static org.mockito.Matchers.anyInt;
15 import static org.mockito.Matchers.anyLong;
16 import static org.mockito.Matchers.anyString;
17 import static org.mockito.Matchers.eq;
18 import static org.mockito.Mockito.mock;
19 import static org.mockito.Mockito.times;
20 import static org.mockito.Mockito.when;
21
22 import java.lang.reflect.Constructor;
23 import java.lang.reflect.Field;
24 import java.net.InetAddress;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.Set;
31
32 import org.apache.commons.lang3.tuple.Pair;
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.ovsdb.openstack.netvirt.translator.NeutronFloatingIP;
39 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork;
40 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronPort;
41 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter;
42 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter_Interface;
43 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSubnet;
44 import org.opendaylight.ovsdb.openstack.netvirt.translator.Neutron_IPs;
45 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
46 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronPortCRUD;
47 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronSubnetCRUD;
48 import org.opendaylight.ovsdb.openstack.netvirt.AbstractHandler;
49 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
50 import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
51 import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
52 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
53 import org.opendaylight.ovsdb.openstack.netvirt.api.InboundNatProvider;
54 import org.opendaylight.ovsdb.openstack.netvirt.api.L3ForwardingProvider;
55 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
56 import org.opendaylight.ovsdb.openstack.netvirt.api.OutboundNatProvider;
57 import org.opendaylight.ovsdb.openstack.netvirt.api.RoutingProvider;
58 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
59 import org.opendaylight.ovsdb.openstack.netvirt.api.Status;
60 import org.opendaylight.ovsdb.openstack.netvirt.api.StatusCode;
61 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
62 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
66 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
67 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
68
69 import org.osgi.framework.ServiceReference;
70 import org.powermock.api.mockito.PowerMockito;
71 import org.powermock.api.support.membermodification.MemberMatcher;
72 import org.powermock.api.support.membermodification.MemberModifier;
73 import org.powermock.core.classloader.annotations.PrepareForTest;
74 import org.powermock.modules.junit4.PowerMockRunner;
75 import org.powermock.reflect.Whitebox;
76
77 /**
78  * Unit test for {@link NeutronL3Adapter}
79  */
80 @PrepareForTest({ServiceHelper.class, InetAddress.class, NeutronL3Adapter.class, DistributedArpService.class})
81 @RunWith(PowerMockRunner.class)
82 public class NeutronL3AdapterTest {
83
84     @Mock private NeutronL3Adapter neutronL3Adapter;
85     @Mock private DistributedArpService distributedArpService;
86
87     private static final String ID = "45";
88     private static final String IP = "127.0.0.1";
89     private static final String MALFORM_IP = "127.0.0.1.5";
90     private static final String INTF_NAME = "br-int";
91     private static final String EXTERNAL_ROUTER_MAC_UPDATE = "";
92     private static final String UUID = "7da709ff-397f-4778-a0e8-994811272fdb";
93     private static final String FIXED_IP_ADDRESS = "192.168.1.0";
94     private static final String FLOATING_IP_ADDRESS = "192.168.1.1";
95     private static final String OWNER_ROUTER_INTERFACE = "network:router_interface";
96     private static final String OWNER_FLOATING_IP = "network:floatingip";
97     private static final String MAC_ADDRESS = "00:00:5E:00:02:01";
98     private static final String MAC_ADDRESS_2 = "00:00:5E:00:02:02";
99     private static final String PORT_INT = "port_int";
100     private static final String SEG_ID = "2";
101     private static final String CIDR = "192.168.100.0/24";
102     private static final String OFPort = "OFPort|45";
103     private static final String IP_MASK = "127.0.0.1/32";
104
105     @SuppressWarnings("rawtypes")
106     private Class floatingIpClass;
107     private Object floatingIpObject;
108
109     @Before
110     public void setUp() throws Exception{
111         neutronL3Adapter = PowerMockito.mock(NeutronL3Adapter.class, Mockito.CALLS_REAL_METHODS);
112         Whitebox.setInternalState(neutronL3Adapter, "distributedArpService", distributedArpService);
113         // init instance variables
114         MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter, true);
115
116         // floating ip (nested private class from NeutronL3Adapter)
117         floatingIpClass = Whitebox.getInnerClassType(NeutronL3Adapter.class, "FloatIpData");
118         floatingIpObject = createFloatingIpObject();
119     }
120
121     @Test
122     public void testUpdateExternalRouterMac() throws Exception {
123         // Suppress the called to these functions
124         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "flushExistingIpRewrite"));
125         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "rebuildExistingIpRewrite"));
126
127         neutronL3Adapter.updateExternalRouterMac(EXTERNAL_ROUTER_MAC_UPDATE);
128
129         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("flushExistingIpRewrite");
130         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("rebuildExistingIpRewrite");
131     }
132
133     @Test
134     public void testhandleNeutronSubnetEvent() throws Exception {
135         Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
136         INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
137         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
138         when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
139         // Mock variables
140         MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
141         MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
142         neutronL3Adapter.handleNeutronSubnetEvent(mock(NeutronSubnet.class), Action.ADD);
143     }
144
145     @Test
146     public void testHandleNeutronPortEvent() throws Exception {
147         Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache = new HashMap<>();
148         Map<String,NeutronPort> portCleanupCache = new HashMap<>();
149         // Mock variables
150         Neutron_IPs neutronIP = mock(Neutron_IPs.class);
151         when(neutronIP.getSubnetUUID()).thenReturn(UUID);
152         List<Neutron_IPs> list_neutronIP = new ArrayList<>();
153         list_neutronIP.add(neutronIP);
154         NeutronPort neutronPort = mock(NeutronPort.class);
155         when(neutronPort.getDeviceOwner()).thenReturn(OWNER_ROUTER_INTERFACE);
156         when(neutronPort.getFixedIPs()).thenReturn(list_neutronIP);
157
158         // init instance variables
159         MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , mock(INeutronPortCRUD.class));
160         subnetIdToRouterInterfaceCache.put(UUID, mock(NeutronRouter_Interface.class));
161         MemberModifier.field(NeutronL3Adapter.class, "subnetIdToRouterInterfaceCache").set(neutronL3Adapter , subnetIdToRouterInterfaceCache);
162         MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
163
164         // Suppress the called to these functions
165         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "updateL3ForNeutronPort", NeutronPort.class, boolean.class));
166         Mockito.doNothing().when(neutronL3Adapter).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), any(Action.class));
167
168         neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
169         Mockito.verify(neutronL3Adapter).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), eq(Action.ADD));
170
171         when(neutronPort.getDeviceOwner()).thenReturn("");
172         neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
173         Mockito.verify(neutronL3Adapter, times(2)).handleNeutronRouterInterfaceEvent(any(NeutronRouter.class), any(NeutronRouter_Interface.class), eq(Action.ADD));
174         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(false));
175
176         neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.DELETE);
177         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(true));
178     }
179
180     @Test
181     public void testhandleNeutronRouterEvent() throws Exception {
182         // Nothing to be done here
183         neutronL3Adapter.handleNeutronRouterEvent(mock(NeutronRouter.class), Action.ADD);
184     }
185
186     @Test
187     public void testHandleNeutronRouterInterfaceEvent() throws Exception {
188         // Mock variables
189         NeutronRouter_Interface neutronRouterInterface = mock(NeutronRouter_Interface.class);
190         when(neutronRouterInterface.getPortUUID()).thenReturn(UUID);
191         when(neutronRouterInterface.getSubnetUUID()).thenReturn(UUID);
192
193         Neutron_IPs neutronIP = mock(Neutron_IPs.class);
194         when(neutronIP.getSubnetUUID()).thenReturn(UUID);
195         NeutronPort neutronPort = mock(NeutronPort.class);
196         List<Neutron_IPs> list_neutronIP = new ArrayList<>();
197         list_neutronIP.add(neutronIP);
198         when(neutronPort.getFixedIPs()).thenReturn(list_neutronIP);
199         List<NeutronPort> list_neutronPort = new ArrayList<>();
200         list_neutronPort.add(neutronPort);
201         INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
202         when(neutronPortCache.getAllPorts()).thenReturn(list_neutronPort);
203
204         // init instance variables
205         MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
206
207         // Suppress the called to these functions
208         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForNeutronRouterInterface", NeutronRouter_Interface.class, Boolean.class));
209         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "updateL3ForNeutronPort", NeutronPort.class, boolean.class));
210
211         neutronL3Adapter.handleNeutronRouterInterfaceEvent(mock(NeutronRouter.class), neutronRouterInterface, Action.ADD);
212         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", any(NeutronRouter_Interface.class), eq(false));
213         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(false));
214
215         neutronL3Adapter.handleNeutronRouterInterfaceEvent(mock(NeutronRouter.class), neutronRouterInterface, Action.DELETE);
216         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", any(NeutronRouter_Interface.class), eq(true));
217         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("updateL3ForNeutronPort", any(NeutronPort.class), eq(true));
218     }
219
220     @Test
221     public void testHandleNeutronFloatingIPEvent() throws Exception {
222         // Mock variables
223         NeutronFloatingIP neutronFloatingIP = mock(NeutronFloatingIP.class);
224         when(neutronFloatingIP.getFixedIPAddress()).thenReturn(FIXED_IP_ADDRESS);
225         when(neutronFloatingIP.getFloatingIPAddress()).thenReturn(FLOATING_IP_ADDRESS);
226         when(neutronFloatingIP.getID()).thenReturn(UUID);
227
228         // Suppress the called to these functions
229         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPArpAdd", NeutronFloatingIP.class));
230         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPInbound", NeutronFloatingIP.class, Action.class));
231         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPOutbound", NeutronFloatingIP.class, Action.class));
232         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForFloatingIPArpDelete", String.class));
233
234         neutronL3Adapter.handleNeutronFloatingIPEvent(neutronFloatingIP, Action.ADD);
235         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPArpAdd", any(NeutronFloatingIP.class));
236         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPInbound", any(NeutronFloatingIP.class), eq(Action.ADD));
237         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPOutbound", any(NeutronFloatingIP.class), eq(Action.ADD));
238
239         neutronL3Adapter.handleNeutronFloatingIPEvent(neutronFloatingIP, Action.DELETE);
240         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPArpDelete", anyString());
241         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPInbound", any(NeutronFloatingIP.class), eq(Action.DELETE));
242         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForFloatingIPOutbound", any(NeutronFloatingIP.class), eq(Action.DELETE));
243     }
244
245     @SuppressWarnings({ "unchecked", "rawtypes" })
246     @Test
247     public void testProgramFlowsForFloatingIPInbound() throws Exception {
248         Map floatIpDataMapCache = new HashMap();
249
250         NeutronFloatingIP neutronFloatingIp = mock(NeutronFloatingIP.class);
251         when(neutronFloatingIp.getID()).thenReturn(ID);
252
253         // init instance variables
254         floatIpDataMapCache .put(ID, floatingIpObject);
255         MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
256
257         // Suppress the called to these functions
258         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programInboundIpRewriteStage1", Long.class, Long.class, String.class, String.class, String.class, Action.class));
259
260         Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPInbound", neutronFloatingIp, Action.ADD);
261         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage1", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
262     }
263
264     @SuppressWarnings({ "unchecked", "rawtypes" })
265     @Test
266     public void testProgramFlowsForFloatingIPOutbound() throws Exception {
267         Map floatIpDataMapCache = new HashMap();
268
269         NeutronFloatingIP neutronFloatingIp = mock(NeutronFloatingIP.class);
270         when(neutronFloatingIp.getID()).thenReturn(ID);
271
272         // init instance variables
273         floatIpDataMapCache.put(ID, floatingIpObject);
274         MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
275
276         // Suppress the called to these functions
277         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
278
279         Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPOutbound", neutronFloatingIp, Action.ADD);
280         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.ADD));
281     }
282
283     @SuppressWarnings({ "unchecked", "rawtypes" })
284     @Test
285     public void testFlushExistingIpRewrite() throws Exception {
286         Map floatIpDataMapCache = new HashMap();
287
288         // init instance variables
289         floatIpDataMapCache.put(ID, floatingIpObject);
290         MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
291
292         // Suppress the called to these functions
293         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
294         PowerMockito.doReturn(floatIpDataMapCache.values()).when(neutronL3Adapter, "getAllFloatingIPsWithMetadata");
295         Whitebox.invokeMethod(neutronL3Adapter, "flushExistingIpRewrite");
296         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.DELETE));
297     }
298
299     @SuppressWarnings({ "unchecked", "rawtypes" })
300     @Test
301     public void testRebuildExistingIpRewrite() throws Exception {
302         Map floatIpDataMapCache = new HashMap();
303
304         // init instance variables
305         floatIpDataMapCache.put(ID, floatingIpObject);
306         MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
307
308         // Suppress the called to these functions
309         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage1", floatingIpClass, Action.class));
310
311         PowerMockito.doReturn(floatIpDataMapCache.values()).when(neutronL3Adapter, "getAllFloatingIPsWithMetadata");
312         Whitebox.invokeMethod(neutronL3Adapter, "rebuildExistingIpRewrite");
313         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage1", any(floatingIpClass), eq(Action.ADD));
314     }
315
316     @SuppressWarnings({ "unchecked", "rawtypes" })
317     @Test
318     public void testProgramFlowsForFloatingIPArpAdd() throws Exception {
319         Map<String, Pair> neutronPortToDpIdCache = new HashMap<>();
320         Map<String, String> networkIdToRouterMacCache = new HashMap<>();
321         Map floatIpDataMapCache = new HashMap();
322
323         NeutronFloatingIP neutronFloatingIP = mock(NeutronFloatingIP.class);
324         when(neutronFloatingIP.getFixedIPAddress()).thenReturn(FIXED_IP_ADDRESS);
325         when(neutronFloatingIP.getFloatingIPAddress()).thenReturn(FLOATING_IP_ADDRESS);
326         when(neutronFloatingIP.getPortUUID()).thenReturn(UUID);
327         NeutronPort neutronPort = mock(NeutronPort.class);
328         when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
329         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
330         when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
331         when(neutronNetwork.getID()).thenReturn(ID);
332
333         // init instance variables
334         floatIpDataMapCache.put(ID, floatingIpObject);
335         neutronPortToDpIdCache.put(UUID, mock(Pair.class));
336         networkIdToRouterMacCache.put(ID, MAC_ADDRESS);
337         INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
338         when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
339         INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
340         when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
341         PowerMockito.doReturn(neutronPort).when(neutronL3Adapter, "findNeutronPortForFloatingIp", anyString());
342         PowerMockito.doReturn(15L).when(neutronL3Adapter, "findOFPortForExtPatch", anyLong());
343         MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
344         MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
345         MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
346         MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
347         MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
348
349         // Suppress the called to these functions
350         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "findNeutronPortForFloatingIp", String.class));
351         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "findOFPortForExtPatch", Long.class));
352
353         Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPArpAdd", neutronFloatingIP);
354         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("findNeutronPortForFloatingIp", anyString());
355         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("findOFPortForExtPatch", anyLong());
356     }
357
358     @SuppressWarnings({ "unchecked", "rawtypes" })
359     @Test
360     public void testProgramFlowsForFloatingIPArpDelete() throws Exception {
361         Map floatIpDataMapCache = new HashMap();
362
363      // init instance variables
364         floatIpDataMapCache.put(ID, floatingIpObject);
365         MemberModifier.field(NeutronL3Adapter.class, "floatIpDataMapCache").set(neutronL3Adapter , floatIpDataMapCache);
366
367         Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForFloatingIPArpDelete", ID);
368     }
369
370     @Test
371     public void testFindNeutronPortForFloatingIp() throws Exception {
372         NeutronPort neutronPort = mock(NeutronPort.class);
373         when(neutronPort.getDeviceOwner()).thenReturn(OWNER_FLOATING_IP);
374         when(neutronPort.getDeviceID()).thenReturn(ID);
375         List<NeutronPort> list_neutronPort = new ArrayList<>();
376         list_neutronPort.add(neutronPort);
377         INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
378         when(neutronPortCache.getAllPorts()).thenReturn(list_neutronPort);
379
380         MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
381
382         assertEquals("Error, did not return the correct NeutronPort", neutronPort, Whitebox.invokeMethod(neutronL3Adapter, "findNeutronPortForFloatingIp", ID));
383     }
384
385     @Test
386     public void testFindOFPortForExtPatch() throws Exception {
387         ConfigurationService configurationService = mock(ConfigurationService.class);
388         when(configurationService.getPatchPortName(any(Pair.class))).thenReturn(PORT_INT);
389         MemberModifier.field(NeutronL3Adapter.class, "configurationService").set(neutronL3Adapter , configurationService);
390         List<Node> nodes = new ArrayList<>();
391         nodes.add(mock(Node.class));
392         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
393         when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
394         MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
395         Southbound southbound = mock(Southbound.class);
396         when(southbound.getDataPathId(any(Node.class))).thenReturn(Long.valueOf(ID));
397         OvsdbTerminationPointAugmentation terminationPointOfBridge = mock(OvsdbTerminationPointAugmentation.class);
398         when(terminationPointOfBridge.getOfport()).thenReturn(Long.valueOf(ID));
399         when(southbound.getTerminationPointOfBridge(any(Node.class), anyString())).thenReturn(terminationPointOfBridge);
400         MemberModifier.field(NeutronL3Adapter.class, "southbound").set(neutronL3Adapter , southbound);
401
402         assertEquals("Error, did not return the correct NeutronPort", Long.valueOf(ID), Whitebox.invokeMethod(neutronL3Adapter, "findOFPortForExtPatch", Long.valueOf(ID)));
403     }
404
405     @Test
406     public void testHandleNeutronNetworkEvent() throws Exception {
407         // Nothing to be done here
408         Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
409         // Mock variables
410         MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
411         Whitebox.invokeMethod(neutronL3Adapter, "handleNeutronNetworkEvent", mock(NeutronNetwork.class), Action.ADD);
412     }
413
414     @Test
415     public void testHandleInterfaceEvent() throws Exception {
416         Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
417         // init instance variables
418         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
419         MemberModifier.field(NeutronL3Adapter.class, "tenantNetworkManager").set(neutronL3Adapter , tenantNetworkManager);
420         MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
421
422         // Mock variables
423         NodeId nodeId = mock(NodeId.class);
424         when(nodeId.getValue()).thenReturn(ID);
425         Node node = mock(Node.class);
426         when(node.getNodeId()).thenReturn(nodeId);
427
428         OvsdbTerminationPointAugmentation intf = mock(OvsdbTerminationPointAugmentation.class);
429         when(intf.getInterfaceUuid()).thenReturn(mock(Uuid.class));
430         when(intf.getName()).thenReturn(INTF_NAME);
431
432         NeutronPort neutronPort = mock(NeutronPort.class);
433         when(neutronPort.getPortUUID()).thenReturn(UUID);
434
435         when(tenantNetworkManager.getTenantPort(intf)).thenReturn(neutronPort);
436
437         // Suppress the called to these functions
438         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
439         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "handleInterfaceEventAdd", String.class, Long.class, Uuid.class));
440         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "handleInterfaceEventDelete", OvsdbTerminationPointAugmentation.class, Long.class));
441         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "storePortInCleanupCache", NeutronPort.class));
442
443         PowerMockito.when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class)).thenReturn(45L);
444         Mockito.doNothing().when(neutronL3Adapter).handleNeutronPortEvent(any(NeutronPort.class), any(Action.class));
445
446         neutronL3Adapter.handleInterfaceEvent(node, intf, mock(NeutronNetwork.class), Action.ADD);
447         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
448         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("handleInterfaceEventAdd", any(String.class), anyLong(), any(Uuid.class));
449         Mockito.verify(neutronL3Adapter).handleNeutronPortEvent(neutronPort, Action.ADD);
450
451         neutronL3Adapter.handleInterfaceEvent(node, intf, mock(NeutronNetwork.class), Action.DELETE);
452         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("handleInterfaceEventDelete", any(OvsdbTerminationPointAugmentation.class), anyLong());
453         Mockito.verify(neutronL3Adapter).handleNeutronPortEvent(neutronPort, Action.DELETE);
454     }
455
456     @Test
457     public void testHandleInterfaceEventAdd() throws Exception {
458         Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
459         // init instance variables
460         MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
461         int temp = neutronPortToDpIdCache.size();
462
463         Whitebox.invokeMethod(neutronL3Adapter, "handleInterfaceEventAdd", "", Long.valueOf(5), mock(Uuid.class));
464
465         assertEquals("Error, did not add the port", temp+1, neutronPortToDpIdCache.size());
466     }
467
468     @SuppressWarnings("unchecked")
469     @Test
470     public void testHandleInterfaceEventDelete() throws Exception {
471         Map<String, Pair<Long, Uuid>> neutronPortToDpIdCache = new HashMap<>();
472         OvsdbTerminationPointAugmentation intf = mock(OvsdbTerminationPointAugmentation.class);
473         Uuid uuid = mock(Uuid.class);
474         when(intf.getInterfaceUuid()).thenReturn(uuid );
475         Pair<Long, Uuid> pair = mock(Pair.class);
476         when(pair.getRight()).thenReturn(uuid);
477
478         // init instance variables
479         neutronPortToDpIdCache.put("key", pair);
480         MemberModifier.field(NeutronL3Adapter.class, "neutronPortToDpIdCache").set(neutronL3Adapter , neutronPortToDpIdCache);
481         int temp = neutronPortToDpIdCache.size();
482
483         Whitebox.invokeMethod(neutronL3Adapter, "handleInterfaceEventDelete", intf, Long.valueOf(ID));
484
485         assertEquals("Error, did not remove the port", temp-1, neutronPortToDpIdCache.size());
486     }
487
488     @Test
489     public void testUpdateL3ForNeutronPort() throws Exception {
490         Map<String, String> networkIdToRouterMacCache = new HashMap<>();
491
492         Neutron_IPs neutronIp = mock(Neutron_IPs.class);
493         when(neutronIp.getIpAddress()).thenReturn(FIXED_IP_ADDRESS);
494         List<Neutron_IPs> neutronIps = new ArrayList<>();
495         neutronIps.add(neutronIp);
496         NeutronPort neutronPort = mock(NeutronPort.class);
497         when(neutronPort.getNetworkUUID()).thenReturn(UUID);
498         when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS_2);
499         when(neutronPort.getFixedIPs()).thenReturn(neutronIps);
500         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
501         when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
502         List<Node> nodes = new ArrayList<>();
503         nodes.add(mock(Node.class));
504         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
505         MemberModifier.field(NeutronL3Adapter.class, "tenantNetworkManager").set(neutronL3Adapter , tenantNetworkManager);
506         when(tenantNetworkManager.isTenantNetworkPresentInNode(any(Node.class), eq(ID))).thenReturn(true);
507         PowerMockito.doReturn(15L).when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class));
508
509         // init instance variables
510         networkIdToRouterMacCache .put(UUID, MAC_ADDRESS);
511         MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
512         INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
513         when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
514         MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
515         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
516         when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
517         MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
518
519         // Suppress the called to these functions
520         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
521         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programL3ForwardingStage1", Node.class, Long.class, String.class, String.class, String.class, Action.class));
522
523         Whitebox.invokeMethod(neutronL3Adapter, "updateL3ForNeutronPort", neutronPort, false);
524         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
525         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
526
527         Whitebox.invokeMethod(neutronL3Adapter, "updateL3ForNeutronPort", neutronPort, true);
528         PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("getDpidForIntegrationBridge", any(Node.class));
529         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
530     }
531
532     @Test
533     public void testProgramL3ForwardingStage1() throws Exception {
534
535         NodeId nodeId = mock(NodeId.class);
536         when(nodeId.getValue()).thenReturn(ID);
537         Node node = mock(Node.class);
538         when(node.getNodeId()).thenReturn(nodeId);
539
540         // Suppress the called to these functions
541         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programL3ForwardingStage2", Node.class, Long.class, String.class, String.class, String.class, Action.class));
542
543         // init instance variables
544         PowerMockito.when(neutronL3Adapter, "programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD)).thenReturn(new Status(StatusCode.SUCCESS));
545         PowerMockito.when(neutronL3Adapter, "programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE)).thenReturn(new Status(StatusCode.SUCCESS));
546
547
548         Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage1", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD);
549         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
550
551
552         Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage1", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.DELETE);
553         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programL3ForwardingStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
554     }
555
556     @Test
557     public void testProgramL3ForwardingStage2() throws Exception {
558         NodeId nodeId = mock(NodeId.class);
559         when(nodeId.getValue()).thenReturn(ID);
560         Node node = mock(Node.class);
561         when(node.getNodeId()).thenReturn(nodeId);
562
563         assertEquals("Error, this not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage2", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, MALFORM_IP, Action.ADD));
564
565         PowerMockito.mockStatic(InetAddress.class);
566         InetAddress inetAddress = mock(InetAddress.class);
567         PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
568
569         assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programL3ForwardingStage2", node, Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD));
570     }
571
572     @Test
573     public void testProgramFlowsForNeutronRouterInterface() throws Exception {
574         Map<String, String> networkIdToRouterMacCache = new HashMap<>();
575         Map<String, List<Neutron_IPs>> networkIdToRouterIpListCache = new HashMap<>();
576         Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache = new HashMap<>();
577
578         NeutronRouter_Interface intf = mock(NeutronRouter_Interface.class);
579         when(intf.getPortUUID()).thenReturn(UUID);
580         when(intf.getSubnetUUID()).thenReturn(UUID);
581         Neutron_IPs neutronIp = mock(Neutron_IPs.class);
582         when(neutronIp.getIpAddress()).thenReturn(FIXED_IP_ADDRESS);
583         List<Neutron_IPs> ips = new ArrayList<>();
584         ips.add(neutronIp);
585         NeutronPort neutronPort = mock(NeutronPort.class);
586         when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
587         when(neutronPort.getFixedIPs()).thenReturn(ips);
588         when(neutronPort.getNetworkUUID()).thenReturn(UUID);
589         NeutronSubnet neutronSubnet = mock(NeutronSubnet.class);
590         when(neutronSubnet.getNetworkUUID()).thenReturn(UUID);
591         when(neutronSubnet.getGatewayIP()).thenReturn(IP);
592         when(neutronSubnet.getCidr()).thenReturn("cidr");
593         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
594         when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
595         when(neutronNetwork.getRouterExternal()).thenReturn(false); //might change that to true
596         when(neutronNetwork.getNetworkUUID()).thenReturn(UUID);
597         NeutronRouter neutronRouter = mock(NeutronRouter.class);
598
599         Node node = mock(Node.class);
600         List<Node> nodes = new ArrayList<>();
601         nodes.add(node);
602
603         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getDpidForIntegrationBridge", Node.class));
604         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowsForNeutronRouterInterfacePair", Node.class, Long.class, NeutronRouter_Interface.class, NeutronRouter_Interface.class, NeutronNetwork.class, String.class, String.class, String.class, int.class, Action.class, Boolean.class));
605         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programFlowForNetworkFromExternal", Node.class, Long.class, String.class, String.class, String.class, int.class, Action.class));
606         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programIpRewriteExclusionStage1", Node.class, Long.class, String.class, String.class, Action.class));
607
608         // init instance variables
609         INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
610         PowerMockito.when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
611         PowerMockito.when(neutronPortCache.getAllPorts()).thenReturn(new ArrayList<NeutronPort>());
612         INeutronSubnetCRUD neutronSubnetCache = mock(INeutronSubnetCRUD.class);
613         PowerMockito.when(neutronSubnetCache.getSubnet(anyString())).thenReturn(neutronSubnet);
614         INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
615         PowerMockito.when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
616         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
617         PowerMockito.when(nodeCacheManager.getBridgeNodes()).thenReturn(nodes);
618         MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterMacCache").set(neutronL3Adapter , networkIdToRouterMacCache);
619         MemberModifier.field(NeutronL3Adapter.class, "networkIdToRouterIpListCache").set(neutronL3Adapter , networkIdToRouterIpListCache);
620         MemberModifier.field(NeutronL3Adapter.class, "subnetIdToRouterInterfaceCache").set(neutronL3Adapter , subnetIdToRouterInterfaceCache);
621         MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
622         MemberModifier.field(NeutronL3Adapter.class, "neutronSubnetCache").set(neutronL3Adapter , neutronSubnetCache);
623         MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
624         MemberModifier.field(NeutronL3Adapter.class, "nodeCacheManager").set(neutronL3Adapter , nodeCacheManager);
625         PowerMockito.when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class)).thenReturn(45L);
626
627         int networkIdToRouterMacCacheSize, networkIdToRouterIpListCacheSize, subnetIdToRouterInterfaceCacheSize;
628         networkIdToRouterMacCacheSize = networkIdToRouterMacCache.size();
629         networkIdToRouterIpListCacheSize = networkIdToRouterIpListCache.size();
630         subnetIdToRouterInterfaceCacheSize = subnetIdToRouterInterfaceCache.size();
631
632         Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterface", intf, false);
633
634         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getDpidForIntegrationBridge", any(Node.class));
635         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterfacePair", any(Node.class), anyLong(), any(NeutronRouter_Interface.class), any(NeutronRouter_Interface.class), any(NeutronNetwork.class), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD), anyBoolean());
636         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowForNetworkFromExternal", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD));
637         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage1", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.ADD));
638         assertEquals("Error, did not add the RouterMac", networkIdToRouterMacCacheSize, networkIdToRouterMacCache.size() -1);
639         assertEquals("Error, did not add the RouterIP", networkIdToRouterIpListCacheSize, networkIdToRouterIpListCache.size() -1);
640         assertEquals("Error, did not add the RouterInterface", subnetIdToRouterInterfaceCacheSize, subnetIdToRouterInterfaceCache.size() -1);
641
642         networkIdToRouterMacCache.put(UUID, MAC_ADDRESS);
643         networkIdToRouterIpListCache.put(UUID, ips);
644         subnetIdToRouterInterfaceCache.put(UUID, intf);
645         networkIdToRouterMacCacheSize = networkIdToRouterMacCache.size();
646         networkIdToRouterIpListCacheSize = networkIdToRouterIpListCache.size();
647         subnetIdToRouterInterfaceCacheSize = subnetIdToRouterInterfaceCache.size();
648
649         Whitebox.invokeMethod(neutronL3Adapter, "handleNeutronRouterInterfaceEvent", neutronRouter, intf, Action.DELETE);
650
651         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowsForNeutronRouterInterface", intf, true);
652         PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("getDpidForIntegrationBridge", any(Node.class));
653         PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("programFlowsForNeutronRouterInterfacePair", any(Node.class), anyLong(), any(NeutronRouter_Interface.class), any(NeutronRouter_Interface.class), any(NeutronNetwork.class), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE), anyBoolean());
654         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programFlowForNetworkFromExternal", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE));
655         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage1", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.DELETE));
656         assertEquals("Error, did not remove the RouterMac", networkIdToRouterMacCacheSize, networkIdToRouterMacCache.size() +1);
657         assertEquals("Error, did not remove the RouterIP", networkIdToRouterIpListCacheSize, networkIdToRouterIpListCache.size() +1);
658         assertEquals("Error, did not remove the RouterInterface", subnetIdToRouterInterfaceCacheSize, subnetIdToRouterInterfaceCache.size() +1);
659     }
660
661     @Test
662     public void testProgramFlowForNetworkFromExternal() throws Exception {
663         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage1", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
664
665         Whitebox.invokeMethod(neutronL3Adapter, "programFlowForNetworkFromExternal", mock(Node.class), Long.valueOf(12), "", "", "", 4, Action.ADD);
666
667         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
668     }
669
670     @Test
671     public void testProgramFlowsForNeutronRouterInterfacePair() throws Exception {
672         NeutronRouter_Interface srcNeutronRouterInterface = mock(NeutronRouter_Interface.class);
673         when(srcNeutronRouterInterface.getSubnetUUID()).thenReturn(UUID);
674         when(srcNeutronRouterInterface.getID()).thenReturn(ID);
675         when(srcNeutronRouterInterface.getPortUUID()).thenReturn(UUID);
676         NeutronRouter_Interface dstNeutronRouterInterface = mock(NeutronRouter_Interface.class);
677         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
678         when(neutronNetwork.getTenantID()).thenReturn(ID);
679         when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
680         Neutron_IPs ip = mock(Neutron_IPs.class);
681         when(ip.getIpAddress()).thenReturn(IP);
682         List<Neutron_IPs> ips = new ArrayList<>();
683         ips.add(ip);
684         ips.add(ip);
685         ips.add(ip);
686         NeutronPort neutronPort = mock(NeutronPort.class);
687         when(neutronPort.getMacAddress()).thenReturn(MAC_ADDRESS);
688         when(neutronPort.getFixedIPs()).thenReturn(ips);
689         NeutronSubnet neutronSubnet = mock(NeutronSubnet.class);
690         when(neutronSubnet.getNetworkUUID()).thenReturn(UUID);
691         when(neutronSubnet.getCidr()).thenReturn(CIDR);
692
693         INeutronSubnetCRUD neutronSubnetCache = mock(INeutronSubnetCRUD.class);
694         PowerMockito.when(neutronSubnetCache.getSubnet(anyString())).thenReturn(neutronSubnet);
695         MemberModifier.field(NeutronL3Adapter.class, "neutronSubnetCache").set(neutronL3Adapter , neutronSubnetCache);
696         INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
697         PowerMockito.when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
698         MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
699         INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
700         PowerMockito.when(neutronPortCache.getPort(anyString())).thenReturn(neutronPort);
701         MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
702
703         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage1", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
704         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "getMaskLenFromCidr", String.class));
705
706         Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterfacePair", mock(Node.class), Long.valueOf(12), srcNeutronRouterInterface, dstNeutronRouterInterface, neutronNetwork, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD, false);
707         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
708
709         Whitebox.invokeMethod(neutronL3Adapter, "programFlowsForNeutronRouterInterfacePair", mock(Node.class), Long.valueOf(12), srcNeutronRouterInterface, dstNeutronRouterInterface, neutronNetwork, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD, true);
710         PowerMockito.verifyPrivate(neutronL3Adapter, times(2)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class));
711         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("getMaskLenFromCidr", anyString());
712         PowerMockito.verifyPrivate(neutronL3Adapter, times(4)).invoke("programFlowsForNeutronRouterInterfacePair", any(Node.class), anyLong(), any(NeutronRouter_Interface.class), any(NeutronRouter_Interface.class), any(NeutronNetwork.class), anyString(), anyString(), anyString(), anyInt(), any(Action.class), eq(false)); //3 + 1 above
713     }
714
715     @Test
716     public void testProgramRouterInterfaceStage1() throws Exception {
717
718         NodeId nodeId = mock(NodeId.class);
719         when(nodeId.getValue()).thenReturn(ID);
720         Node node = mock(Node.class);
721         when(node.getNodeId()).thenReturn(nodeId);
722
723         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programRouterInterfaceStage2", Node.class, Long.class, String.class, String.class, String.class, String.class, int.class, Action.class));
724
725         PowerMockito.when(neutronL3Adapter, "programRouterInterfaceStage2", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
726
727
728         Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage1", node, Long.valueOf(12), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD);
729
730         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), eq(Action.ADD));
731
732         Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage1", node, Long.valueOf(12), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.DELETE);
733
734         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programRouterInterfaceStage1", any(Node.class), anyLong(), anyString(), anyString(), anyString(), anyString(), anyInt(), eq(Action.DELETE));
735     }
736
737     @Test
738     public void testProgramRouterInterfaceStage2() throws Exception {
739         NodeId nodeId = mock(NodeId.class);
740         when(nodeId.getValue()).thenReturn(ID);
741         Node node = mock(Node.class);
742         when(node.getNodeId()).thenReturn(nodeId);
743
744         assertEquals("Error, this not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage2", node, Long.valueOf(45), SEG_ID, SEG_ID , MAC_ADDRESS, MALFORM_IP, 4, Action.ADD));
745
746         PowerMockito.mockStatic(InetAddress.class);
747         InetAddress inetAddress = mock(InetAddress.class);
748         PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
749
750         assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programRouterInterfaceStage2", node, Long.valueOf(45), SEG_ID, SEG_ID, MAC_ADDRESS, IP, 4, Action.ADD));
751
752     }
753
754     @Test
755     public void testProgramInboundIpRewriteStage1() throws Exception {
756
757         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programInboundIpRewriteStage2", Long.class, Long.class, String.class, String.class, String.class, Action.class));
758
759         PowerMockito.when(neutronL3Adapter, "programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
760
761
762         Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage1", Long.valueOf(12), Long.valueOf(12), PORT_INT, MAC_ADDRESS, IP, Action.ADD);
763
764         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.ADD));
765
766         Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage1", Long.valueOf(12), Long.valueOf(12),PORT_INT, MAC_ADDRESS, IP, Action.DELETE);
767
768         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programInboundIpRewriteStage2", anyLong(), anyLong(), anyString(), anyString(), anyString(), eq(Action.DELETE));
769     }
770
771     @Test
772     public void testProgramInboundIpRewriteStage2() throws Exception {
773         assertEquals("Error, this not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage2", Long.valueOf(45), Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD));
774
775         PowerMockito.mockStatic(InetAddress.class);
776         InetAddress inetAddress = mock(InetAddress.class);
777         PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
778
779         assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programInboundIpRewriteStage2", Long.valueOf(45), Long.valueOf(45), SEG_ID, MAC_ADDRESS, IP, Action.ADD));
780     }
781
782     @Test
783     public void testProgramIpRewriteExclusionStage1() throws Exception {
784
785         NodeId nodeId = mock(NodeId.class);
786         when(nodeId.getValue()).thenReturn(ID);
787         Node node = mock(Node.class);
788         when(node.getNodeId()).thenReturn(nodeId);
789
790         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programIpRewriteExclusionStage2", Node.class, Long.class, String.class, String.class, Action.class));
791
792         PowerMockito.when(neutronL3Adapter, "programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
793
794
795         Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage1", node, Long.valueOf(12), SEG_ID, CIDR, Action.ADD);
796
797         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.ADD));
798
799         Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage1", node, Long.valueOf(12), SEG_ID, CIDR, Action.DELETE);
800
801         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programIpRewriteExclusionStage2", any(Node.class), anyLong(), anyString(), anyString(), eq(Action.DELETE));
802     }
803
804     @Test
805     public void testProgramIpRewriteExclusionStage2() throws Exception {
806         NodeId nodeId = mock(NodeId.class);
807         when(nodeId.getValue()).thenReturn(ID);
808         Node node = mock(Node.class);
809         when(node.getNodeId()).thenReturn(nodeId);
810
811         assertEquals("Error, this not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programIpRewriteExclusionStage2", node, Long.valueOf(45), SEG_ID, CIDR, Action.ADD));
812     }
813
814     @SuppressWarnings("unchecked")
815     @Test
816     public void testProgramOutboundIpRewriteStage1() throws Exception{
817
818         MemberModifier.suppress(MemberMatcher.method(NeutronL3Adapter.class, "programOutboundIpRewriteStage2", floatingIpClass, Action.class));
819
820         PowerMockito.when(neutronL3Adapter, "programOutboundIpRewriteStage2", any(floatingIpClass), any(Action.class)).thenReturn(new Status(StatusCode.SUCCESS));
821
822
823         Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage1", floatingIpObject, Action.ADD);
824
825         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage2", any(floatingIpClass), eq(Action.ADD));
826
827         Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage1", floatingIpObject, Action.DELETE);
828
829         PowerMockito.verifyPrivate(neutronL3Adapter, times(1)).invoke("programOutboundIpRewriteStage2", any(floatingIpClass), eq(Action.DELETE));
830     }
831
832     /*@Test
833     public void testPrepareProgramOutboundIpRewriteStage2() throws Exception {
834         assertEquals("Error, did not return the correct status code", new Status(StatusCode.BADREQUEST), Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage2", floatingIpObject, Action.ADD));
835
836         PowerMockito.mockStatic(InetAddress.class);
837         InetAddress inetAddress = mock(InetAddress.class);
838         PowerMockito.when(InetAddress.getByName(anyString())).thenReturn(inetAddress);
839
840         assertEquals("Error, did not return the correct status code", new Status(StatusCode.SUCCESS), Whitebox.invokeMethod(neutronL3Adapter, "programOutboundIpRewriteStage2", floatingIpObject, Action.ADD));
841     }*/
842
843     @Test
844     public void testGetMaskLenFromCidr() throws Exception {
845         assertEquals("Error, did not return the correct mask", 32, (int) Whitebox.invokeMethod(neutronL3Adapter, "getMaskLenFromCidr", IP_MASK));
846     }
847
848     @Test
849     public void testGetDpidForIntegrationBridge() throws Exception {
850         Southbound southbound = mock(Southbound.class);
851         ConfigurationService configurationService = mock(ConfigurationService.class);
852
853         MemberModifier.field(NeutronL3Adapter.class, "southbound").set(neutronL3Adapter , southbound);
854         MemberModifier.field(NeutronL3Adapter.class, "configurationService").set(neutronL3Adapter , configurationService);
855
856         PowerMockito.when(southbound.getBridge(any(Node.class), anyString())).thenReturn(mock(OvsdbBridgeAugmentation.class));
857         PowerMockito.when(configurationService.getIntegrationBridgeName()).thenReturn("");
858         PowerMockito.when(southbound.getDataPathId(any(Node.class))).thenReturn(45L);
859
860         assertEquals("Error, did not return the correct Dpid", 45L, (long) Whitebox.invokeMethod(neutronL3Adapter, "getDpidForIntegrationBridge", mock(Node.class)));
861     }
862
863     @Test
864     public void testencodeExcplicitOFPort() throws Exception {
865         assertEquals("Error, did not correctly encode the port", OFPort, NeutronL3Adapter.encodeExcplicitOFPort(45L));
866     }
867
868     @Test
869     public void testSetDependencies() throws Exception {
870         Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
871         INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
872         NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
873         List <NeutronNetwork> neutronNetworkList = new ArrayList<NeutronNetwork>();
874         neutronNetworkList.add(neutronNetwork);
875         when(neutronNetworkCache.getAllNetworks()).thenReturn(neutronNetworkList);
876
877         Map<String,NeutronPort> portCleanupCache = new HashMap<>();
878         INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
879         NeutronPort neutronPort = mock(NeutronPort.class);
880         List <NeutronPort> neutronPortList = new ArrayList<NeutronPort>();
881         neutronPortList.add(neutronPort);
882         when(neutronPortCache.getAllPorts()).thenReturn(neutronPortList);
883         // Mock variables
884         MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
885         MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
886         MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
887         MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
888
889
890         when(neutronPort.getDeviceOwner()).thenReturn(OWNER_ROUTER_INTERFACE);
891         MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
892
893
894
895         EventDispatcher eventDispatcher = mock(EventDispatcher.class);
896         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
897         ConfigurationService configurationService = mock(ConfigurationService.class);
898         ArpProvider arpProvider = mock(ArpProvider.class);
899         DistributedArpService distributedArpService = mock(DistributedArpService.class);
900         InboundNatProvider inboundNatProvider = mock(InboundNatProvider.class);
901         OutboundNatProvider outboundNatProvider = mock(OutboundNatProvider.class);
902         RoutingProvider routingProvider = mock(RoutingProvider.class);
903         L3ForwardingProvider l3ForwardingProvider = mock(L3ForwardingProvider.class);
904         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
905         Southbound southbound = mock(Southbound.class);
906
907         ServiceHelper.overrideGlobalInstance(EventDispatcher.class, eventDispatcher);
908         ServiceHelper.overrideGlobalInstance(TenantNetworkManager.class, tenantNetworkManager);
909         ServiceHelper.overrideGlobalInstance(ConfigurationService.class, configurationService);
910         ServiceHelper.overrideGlobalInstance(ArpProvider.class, arpProvider);
911         ServiceHelper.overrideGlobalInstance(DistributedArpService.class, distributedArpService);
912         ServiceHelper.overrideGlobalInstance(InboundNatProvider.class, inboundNatProvider);
913         ServiceHelper.overrideGlobalInstance(OutboundNatProvider.class, outboundNatProvider);
914         ServiceHelper.overrideGlobalInstance(RoutingProvider.class, routingProvider);
915         ServiceHelper.overrideGlobalInstance(L3ForwardingProvider.class, l3ForwardingProvider);
916         ServiceHelper.overrideGlobalInstance(NodeCacheManager.class, nodeCacheManager);
917         ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
918
919         neutronL3Adapter.setDependencies(mock(ServiceReference.class));
920
921         assertEquals("Error, did not return the correct object", getAbstractHandlerField("eventDispatcher"),
922                 eventDispatcher);
923         assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
924         assertEquals("Error, did not return the correct object", getField("configurationService"), configurationService);
925         assertEquals("Error, did not return the correct object", getField("arpProvider"), arpProvider);
926         assertEquals("Error, did not return the correct object", getField("distributedArpService"), distributedArpService);
927         assertEquals("Error, did not return the correct object", getField("inboundNatProvider"), inboundNatProvider);
928         assertEquals("Error, did not return the correct object", getField("outboundNatProvider"), outboundNatProvider);
929         assertEquals("Error, did not return the correct object", getField("routingProvider"), routingProvider);
930         assertEquals("Error, did not return the correct object", getField("l3ForwardingProvider"), l3ForwardingProvider);
931         assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
932         assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
933     }
934
935     @Test
936     public void testSetDependenciesObject() throws Exception{
937         MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter , false);
938
939         INeutronNetworkCRUD iNeutronNetworkCRUD = mock(INeutronNetworkCRUD.class);
940         neutronL3Adapter.setDependencies(iNeutronNetworkCRUD);
941         assertEquals("Error, did not return the correct object", getField("neutronNetworkCache"), iNeutronNetworkCRUD);
942
943         INeutronPortCRUD iNeutronPortCRUD = mock(INeutronPortCRUD.class);
944         neutronL3Adapter.setDependencies(iNeutronPortCRUD);
945         assertEquals("Error, did not return the correct object", getField("neutronPortCache"), iNeutronPortCRUD);
946
947         INeutronSubnetCRUD iNeutronSubnetCRUD = mock(INeutronSubnetCRUD.class);
948         neutronL3Adapter.setDependencies(iNeutronSubnetCRUD);
949         assertEquals("Error, did not return the correct object", getField("neutronSubnetCache"), iNeutronSubnetCRUD);
950
951         ArpProvider arpProvider = mock(ArpProvider.class);
952         neutronL3Adapter.setDependencies(arpProvider);
953         assertEquals("Error, did not return the correct object", getField("arpProvider"), arpProvider);
954
955         InboundNatProvider inboundNatProvider = mock(InboundNatProvider.class);
956         neutronL3Adapter.setDependencies(inboundNatProvider);
957         assertEquals("Error, did not return the correct object", getField("inboundNatProvider"), inboundNatProvider);
958
959         OutboundNatProvider outboundNatProvider = mock(OutboundNatProvider.class);
960         neutronL3Adapter.setDependencies(outboundNatProvider);
961         assertEquals("Error, did not return the correct object", getField("outboundNatProvider"), outboundNatProvider);
962
963         RoutingProvider routingProvider = mock(RoutingProvider.class);
964         neutronL3Adapter.setDependencies(routingProvider);
965         assertEquals("Error, did not return the correct object", getField("routingProvider"), routingProvider);
966
967         L3ForwardingProvider l3ForwardingProvider = mock(L3ForwardingProvider.class);
968         neutronL3Adapter.setDependencies(l3ForwardingProvider);
969         assertEquals("Error, did not return the correct object", getField("l3ForwardingProvider"), l3ForwardingProvider);
970
971         MemberModifier.field(NeutronL3Adapter.class, "enabled").set(neutronL3Adapter , true);
972     }
973
974     private Object getAbstractHandlerField(String fieldName) throws Exception {
975         Field field = AbstractHandler.class.getDeclaredField(fieldName);
976         field.setAccessible(true);
977         return field.get(neutronL3Adapter);
978     }
979
980     private Object getField(String fieldName) throws Exception {
981         Field field = NeutronL3Adapter.class.getDeclaredField(fieldName);
982         field.setAccessible(true);
983         return field.get(neutronL3Adapter);
984     }
985
986     @SuppressWarnings("rawtypes")
987     private Object createFloatingIpObject() throws Exception{
988         Class clazz = Whitebox.getInnerClassType(NeutronL3Adapter.class, "FloatIpData");
989         Constructor [] constructors = clazz.getConstructors();
990         Constructor c  = constructors[0];
991         return c.newInstance(neutronL3Adapter, 415L, 415L, "a", "b", "c", "d", "e");
992     }
993 }