Add UT for SouthboundMapper and SouthboundProvider
[netvirt.git] / openstack / net-virt / src / test / java / org / opendaylight / ovsdb / openstack / netvirt / NetworkHandlerTest.java
1 /*
2  * Copyright (c) 2015 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;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.anyString;
14 import static org.mockito.Matchers.same;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.times;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
19
20 import java.lang.reflect.Field;
21 import java.net.HttpURLConnection;
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.mockito.InjectMocks;
29 import org.mockito.Mock;
30 import org.mockito.Mockito;
31 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
32 import org.opendaylight.neutron.spi.NeutronNetwork;
33 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
34 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
35 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
36 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
37 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
38 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
39 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
40 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
43 import org.osgi.framework.BundleContext;
44 import org.osgi.framework.ServiceReference;
45 import org.powermock.api.mockito.PowerMockito;
46 import org.powermock.core.classloader.annotations.PrepareForTest;
47 import org.powermock.modules.junit4.PowerMockRunner;
48
49 /**
50  * Unit test for {@link NetworkHandler}
51  */
52 @RunWith(PowerMockRunner.class)
53 @PrepareForTest(ServiceHelper.class)
54 public class NetworkHandlerTest {
55
56     @InjectMocks private NetworkHandler networkHandler;
57
58     @Mock private NeutronNetwork sharedNeutronNetwork;
59     @Mock private NeutronNetwork nonSharedNeutronNetwork;
60
61     @Mock private NeutronL3Adapter neutronL3Adapter;
62     @Mock private TenantNetworkManager tenantNetworkManager;
63     @Mock private INeutronNetworkCRUD neutronNetworkCache;
64     @Mock private BridgeConfigurationManager bridgeConfigurationManager;
65     @Mock private NodeCacheManager nodeCacheManager;
66     @Mock private Southbound southbound;
67
68     @Before
69     public void setup() {
70         when(sharedNeutronNetwork.isShared()).thenReturn(true);
71         when(nonSharedNeutronNetwork.isShared()).thenReturn(false);
72     }
73
74     /**
75      * Test method {@link NetworkHandler#canCreateNetwork(NeutronNetwork)}
76      */
77     @Test
78     public void testCanCreateNetwork() {
79         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, networkHandler.canCreateNetwork(sharedNeutronNetwork));
80         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_OK, networkHandler.canCreateNetwork(nonSharedNeutronNetwork));
81     }
82
83     /**
84      * Test method {@link NetworkHandler#canUpdateNetwork(NeutronNetwork, NeutronNetwork)}
85      */
86     @Test
87     public void testCanUpdateNetwork() {
88         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_NOT_ACCEPTABLE, networkHandler.canUpdateNetwork(sharedNeutronNetwork, sharedNeutronNetwork));
89         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_OK, networkHandler.canUpdateNetwork(nonSharedNeutronNetwork, nonSharedNeutronNetwork));
90     }
91
92     /**
93      * Test method {@link NetworkHandler#canDeleteNetwork(NeutronNetwork)}
94      */
95     @Test
96     public void testCanDeleteNetwork() {
97         assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_OK, networkHandler.canDeleteNetwork(nonSharedNeutronNetwork));
98     }
99
100     /**
101      * Test method {@link NetworkHandler#processEvent(AbstractEvent)}
102      */
103     @Test
104     public void testProcessEvent() {
105         NetworkHandler networkHandlerSpy = Mockito.spy(networkHandler);
106
107         NorthboundEvent ev = mock(NorthboundEvent.class);
108         when(ev.getNeutronNetwork()).thenReturn(nonSharedNeutronNetwork);
109
110         when(ev.getAction()).thenReturn(Action.ADD);
111         networkHandlerSpy.processEvent(ev);
112         verify(neutronL3Adapter, times(1)).handleNeutronNetworkEvent(any(NeutronNetwork.class), same(Action.ADD));
113
114         when(ev.getAction()).thenReturn(Action.UPDATE);
115         networkHandlerSpy.processEvent(ev);
116         verify(neutronL3Adapter, times(1)).handleNeutronNetworkEvent(any(NeutronNetwork.class), same(Action.UPDATE));
117
118         String portName = "portName";
119
120         List<NeutronNetwork> networks = new ArrayList<>();
121         when(neutronNetworkCache.getAllNetworks()).thenReturn(networks);
122
123         List<Node> nodes = new ArrayList<>();
124         nodes.add(mock(Node.class));
125         when(nodeCacheManager.getNodes()).thenReturn(nodes);
126
127         List<String> phyIfName = new ArrayList<>();
128         phyIfName.add(portName);
129         when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName );
130
131         List<OvsdbTerminationPointAugmentation> ports = new ArrayList<>();
132         OvsdbTerminationPointAugmentation port = mock(OvsdbTerminationPointAugmentation.class);
133         when(port.getName()).thenReturn(portName);
134         ports.add(port);
135         when(southbound.getTerminationPointsOfBridge(any(Node.class))).thenReturn(ports);
136
137         when(ev.getAction()).thenReturn(Action.DELETE);
138         when(southbound.isTunnel(any(OvsdbTerminationPointAugmentation.class))).thenReturn(true);
139         networkHandlerSpy.processEvent(ev); // test delete with southbound.isTunnel(true)
140         when(southbound.isTunnel(any(OvsdbTerminationPointAugmentation.class))).thenReturn(false);
141         networkHandlerSpy.processEvent(ev); // test delete with southbound.isTunnel(false)
142         // the functions are called once per call to processEvent()
143         verify(neutronL3Adapter, times(2)).handleNeutronNetworkEvent(any(NeutronNetwork.class), same(Action.DELETE));
144         verify(tenantNetworkManager, times(2)).networkDeleted(anyString());
145         // depending on the southbound.isTunnel()
146         verify(southbound, times(2)).deleteTerminationPoint(any(Node.class), anyString());
147     }
148
149     @Test
150     public void testSetDependencies() throws Exception {
151         TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
152         BridgeConfigurationManager bridgeConfigurationManager = mock(BridgeConfigurationManager.class);
153         NodeCacheManager nodeCacheManager = mock(NodeCacheManager.class);
154         NeutronL3Adapter neutronL3Adapter = mock(NeutronL3Adapter.class);
155         Southbound southbound = mock(Southbound.class);
156         EventDispatcher eventDispatcher = mock(EventDispatcher.class);
157
158
159         PowerMockito.mockStatic(ServiceHelper.class);
160         PowerMockito.when(ServiceHelper.getGlobalInstance(TenantNetworkManager.class, networkHandler)).thenReturn(tenantNetworkManager);
161         PowerMockito.when(ServiceHelper.getGlobalInstance(BridgeConfigurationManager.class, networkHandler)).thenReturn(bridgeConfigurationManager);
162         PowerMockito.when(ServiceHelper.getGlobalInstance(NodeCacheManager.class, networkHandler)).thenReturn(nodeCacheManager);
163         PowerMockito.when(ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, networkHandler)).thenReturn(neutronL3Adapter);
164         PowerMockito.when(ServiceHelper.getGlobalInstance(Southbound.class, networkHandler)).thenReturn(southbound);
165         PowerMockito.when(ServiceHelper.getGlobalInstance(EventDispatcher.class, networkHandler)).thenReturn(eventDispatcher);
166
167         networkHandler.setDependencies(mock(BundleContext.class), mock(ServiceReference.class));
168
169         assertEquals("Error, did not return the correct object", getField("tenantNetworkManager"), tenantNetworkManager);
170         assertEquals("Error, did not return the correct object", getField("bridgeConfigurationManager"), bridgeConfigurationManager);
171         assertEquals("Error, did not return the correct object", getField("nodeCacheManager"), nodeCacheManager);
172         assertEquals("Error, did not return the correct object", getField("neutronL3Adapter"), neutronL3Adapter);
173         assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
174         assertEquals("Error, did not return the correct object", networkHandler.eventDispatcher, eventDispatcher);
175     }
176
177     @Test
178     public void testSetDependenciesObject() throws Exception{
179         INeutronNetworkCRUD iNeutronNetworkCRUD = mock(INeutronNetworkCRUD.class);
180         networkHandler.setDependencies(iNeutronNetworkCRUD);
181         assertEquals("Error, did not return the correct object", getField("neutronNetworkCache"), iNeutronNetworkCRUD);
182 }
183
184     private Object getField(String fieldName) throws Exception {
185         Field field = NetworkHandler.class.getDeclaredField(fieldName);
186         field.setAccessible(true);
187         return field.get(networkHandler);
188     }
189 }