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