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