2 * Copyright (c) 2015 Inocybe and others. All rights reserved.
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
9 package org.opendaylight.ovsdb.openstack.netvirt;
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;
20 import java.lang.reflect.Field;
21 import java.net.HttpURLConnection;
22 import java.util.ArrayList;
23 import java.util.List;
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.ovsdb.openstack.netvirt.translator.NeutronNetwork;
32 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
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;
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;
50 * Unit test for {@link NetworkHandler}
52 @RunWith(PowerMockRunner.class)
53 @PrepareForTest(ServiceHelper.class)
54 public class NetworkHandlerTest {
56 @InjectMocks private NetworkHandler networkHandler;
58 @Mock private NeutronNetwork sharedNeutronNetwork;
59 @Mock private NeutronNetwork nonSharedNeutronNetwork;
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;
70 when(sharedNeutronNetwork.isShared()).thenReturn(true);
71 when(nonSharedNeutronNetwork.isShared()).thenReturn(false);
75 * Test method {@link NetworkHandler#canCreateNetwork(NeutronNetwork)}
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));
84 * Test method {@link NetworkHandler#canUpdateNetwork(NeutronNetwork, NeutronNetwork)}
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));
93 * Test method {@link NetworkHandler#canDeleteNetwork(NeutronNetwork)}
96 public void testCanDeleteNetwork() {
97 assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_OK, networkHandler.canDeleteNetwork(nonSharedNeutronNetwork));
101 * Test method {@link NetworkHandler#processEvent(AbstractEvent)}
104 public void testProcessEvent() {
105 NetworkHandler networkHandlerSpy = Mockito.spy(networkHandler);
107 NorthboundEvent ev = mock(NorthboundEvent.class);
108 when(ev.getNeutronNetwork()).thenReturn(nonSharedNeutronNetwork);
110 when(ev.getAction()).thenReturn(Action.ADD);
111 networkHandlerSpy.processEvent(ev);
112 verify(neutronL3Adapter, times(1)).handleNeutronNetworkEvent(any(NeutronNetwork.class), same(Action.ADD));
114 when(ev.getAction()).thenReturn(Action.UPDATE);
115 networkHandlerSpy.processEvent(ev);
116 verify(neutronL3Adapter, times(1)).handleNeutronNetworkEvent(any(NeutronNetwork.class), same(Action.UPDATE));
118 String portName = "portName";
120 List<NeutronNetwork> networks = new ArrayList<>();
121 when(neutronNetworkCache.getAllNetworks()).thenReturn(networks);
123 List<Node> nodes = new ArrayList<>();
124 nodes.add(mock(Node.class));
125 when(nodeCacheManager.getNodes()).thenReturn(nodes);
127 List<String> phyIfName = new ArrayList<>();
128 phyIfName.add(portName);
129 when(bridgeConfigurationManager.getAllPhysicalInterfaceNames(any(Node.class))).thenReturn(phyIfName );
131 List<OvsdbTerminationPointAugmentation> ports = new ArrayList<>();
132 OvsdbTerminationPointAugmentation port = mock(OvsdbTerminationPointAugmentation.class);
133 when(port.getName()).thenReturn(portName);
135 when(southbound.getTerminationPointsOfBridge(any(Node.class))).thenReturn(ports);
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());
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);
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);
167 networkHandler.setDependencies(mock(ServiceReference.class));
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);
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);
184 private Object getField(String fieldName) throws Exception {
185 Field field = NetworkHandler.class.getDeclaredField(fieldName);
186 field.setAccessible(true);
187 return field.get(networkHandler);