Enable NetVirt Maven site
[netvirt.git] / openstack / net-virt-providers / src / test / java / org / opendaylight / netvirt / openstack / netvirt / providers / openflow13 / AbstractServiceInstanceTest.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.providers.openflow13;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Matchers.anyString;
16 import static org.mockito.Matchers.eq;
17 import static org.mockito.Mockito.mock;
18 import static org.mockito.Mockito.times;
19 import static org.mockito.Mockito.verify;
20 import static org.mockito.Mockito.when;
21
22 import java.lang.reflect.Field;
23 import java.util.concurrent.atomic.AtomicBoolean;
24
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.InjectMocks;
28 import org.mockito.Mock;
29 import org.mockito.Mockito;
30 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
31 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
32 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
33 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
34 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
35 import org.opendaylight.netvirt.openstack.netvirt.providers.NetvirtProvidersProvider;
36 import org.opendaylight.netvirt.openstack.netvirt.api.Constants;
37 import org.opendaylight.netvirt.openstack.netvirt.api.Southbound;
38 import org.opendaylight.netvirt.utils.servicehelper.ServiceHelper;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.osgi.framework.ServiceReference;
49 import org.powermock.api.support.membermodification.MemberModifier;
50 import org.powermock.modules.junit4.PowerMockRunner;
51
52 import com.google.common.base.Optional;
53 import com.google.common.util.concurrent.CheckedFuture;
54
55 /**
56  * Unit test for {@link AbstractServiceInstance}
57  */
58 @RunWith(PowerMockRunner.class)
59 @SuppressWarnings("unchecked")
60 public class AbstractServiceInstanceTest {
61
62     @InjectMocks private AbstractServiceInstance abstractServiceInstance = mock(AbstractServiceInstance.class, Mockito.CALLS_REAL_METHODS);
63
64     @Mock private DataBroker dataBroker;
65     @Mock private PipelineOrchestrator orchestrator;
66     @Mock private Southbound southbound;
67
68     private Service service = Service.L3_FORWARDING;
69
70     private final String ID = "5710881121";
71     private final String NODE_ID = Constants.INTEGRATION_BRIDGE + ":" +  ID;
72
73     /**
74      * Test method {@link AbstractServiceInstance#isBridgeInPipeline(Node)}
75      */
76     @Test
77     public void testIsBridgeInPipeline() {
78         when(southbound.getBridgeName(any(Node.class))).thenReturn(Constants.INTEGRATION_BRIDGE);
79         assertTrue("Error, isBridgeInPipeline() did not return the correct value", abstractServiceInstance.isBridgeInPipeline(mock(Node.class)));
80     }
81
82     /**
83      * Test method {@link AbstractServiceInstance#getTable()}
84      */
85     @Test
86     public void testGetTable() {
87         abstractServiceInstance.setService(service);
88         assertEquals("Error, getTable() did not return the correct value",
89                 service.getTable(), abstractServiceInstance.getTable());
90
91         when(orchestrator.getTableOffset()).thenReturn(Service.DIRECTOR.getTable());
92         assertEquals("Error, getTable() did not return the correct value",
93                 (short)(Service.DIRECTOR.getTable() + service.getTable()), abstractServiceInstance.getTable());
94     }
95
96     /**
97      * Test method {@link AbstractServiceInstance#getTable(Service)}
98      */
99     @Test
100     public void testGetTableWithService() {
101         when(orchestrator.getTableOffset()).thenReturn((short)0);
102         abstractServiceInstance.setService(service);
103         assertEquals("Error, getTables(service) did not return the correct value",
104                 Service.L2_FORWARDING.getTable(), abstractServiceInstance.getTable(Service.L2_FORWARDING));
105     }
106
107     @Test
108     public void testGetService() {
109         abstractServiceInstance.setService(service);
110         assertEquals("Error, getService() did not return the correct value", service, abstractServiceInstance.getService());
111     }
112
113     /**
114      * Test method {@link AbstractServiceInstance#createNodeBuilder(String)}
115      */
116     @Test
117     public void testCreateNodeBuilder() {
118         NodeId nodeId = mock(NodeId.class);
119         when(nodeId.getValue()).thenReturn(NODE_ID);
120
121         NodeBuilder nodeBuilder = abstractServiceInstance.createNodeBuilder(NODE_ID);
122         assertNotNull("Error, createNodeBuilder() did not return the correct value", nodeBuilder);
123         assertEquals("Error, createNodeBuilder() did not return the correct ID", NODE_ID, nodeBuilder.getId().getValue());
124         assertEquals("Error, createNodeBuilder() did not return the correct Key", new NodeKey(nodeBuilder.getId()), nodeBuilder.getKey());
125     }
126
127     /**
128      * Test method {@link AbstractServiceInstance#getMutablePipelineInstructionBuilder()}
129      */
130     @Test
131     public void testGetMutablePipelineInstructionBuilder() {
132         // service == null
133         assertNotNull("Error, getMutablePipelineInstructionBuilder() did not return the correct value", abstractServiceInstance.getMutablePipelineInstructionBuilder());
134         assertTrue("Error, getMutablePipelineInstructionBuilder() did not return a InstructionBuilder object", abstractServiceInstance.getMutablePipelineInstructionBuilder() instanceof InstructionBuilder);
135
136         when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
137
138         // service defined
139         assertNotNull("Error, getMutablePipelineInstructionBuilder() did not return the correct value", abstractServiceInstance.getMutablePipelineInstructionBuilder());
140         assertTrue("Error, getMutablePipelineInstructionBuilder() did not return a InstructionBuilder object", abstractServiceInstance.getMutablePipelineInstructionBuilder() instanceof InstructionBuilder);
141     }
142
143     /**
144      * Test method {@link AbstractServiceInstance#writeFlow(FlowBuilder, NodeBuilder)}
145      */
146     @Test
147     public void testWriteFlow() throws Exception {
148         WriteTransaction transaction = mock(WriteTransaction.class);
149         when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
150         CheckedFuture<Void, TransactionCommitFailedException> commitFuture = mock(CheckedFuture.class);
151         when(transaction.submit()).thenReturn(commitFuture);
152
153         NodeBuilder nodeBuilder = mock(NodeBuilder.class);
154         when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
155
156         FlowBuilder flowBuilder = mock(FlowBuilder.class);
157         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
158
159         NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
160         MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
161
162         abstractServiceInstance.writeFlow(flowBuilder, nodeBuilder);
163
164         //verify(transaction, times(1)).put(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(DataObject.class), eq(true));
165         //verify(transaction, times(1)).merge(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(DataObject.class), eq(true));
166         //verify(commitFuture, times(1)).get();
167     }
168
169     /**
170      * Test method {@link AbstractServiceInstance#removeFlow(FlowBuilder, NodeBuilder)}
171      */
172     @Test
173     public void testRemoveFlow() throws Exception {
174         WriteTransaction transaction = mock(WriteTransaction.class);
175         when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
176         CheckedFuture<Void, TransactionCommitFailedException> commitFuture = mock(CheckedFuture.class);
177         when(transaction.submit()).thenReturn(commitFuture);
178
179         NodeBuilder nodeBuilder = mock(NodeBuilder.class);
180         when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
181
182         FlowBuilder flowBuilder = mock(FlowBuilder.class);
183         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
184
185         NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
186         MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
187
188         abstractServiceInstance.removeFlow(flowBuilder, nodeBuilder);
189         verify(transaction, times(1)).delete(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class));
190         verify(commitFuture, times(1)).get();
191     }
192
193     /**
194      * Test method {@link AbstractServiceInstance#getFlow(FlowBuilder, NodeBuilder)}
195      */
196     @Test
197     public void testGetFlow() throws Exception {
198         ReadOnlyTransaction transaction = mock(ReadOnlyTransaction.class);
199         when(dataBroker.newReadOnlyTransaction()).thenReturn(transaction);
200         //when(mdsalConsumer.getDataBroker()).thenReturn(dataBrocker);
201
202         NodeBuilder nodeBuilder = mock(NodeBuilder.class);
203         when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
204
205         FlowBuilder flowBuilder = mock(FlowBuilder.class);
206         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
207
208         CheckedFuture dataRead = mock(CheckedFuture.class);
209         when(transaction.read(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class))).thenReturn(dataRead);
210         Optional<Flow> data = mock(Optional.class);
211         when(dataRead.get()).thenReturn(data);
212
213         abstractServiceInstance.getFlow(flowBuilder, nodeBuilder);
214         verify(transaction, times(1)).read(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class));
215     }
216
217     /**
218      * Test method {@link AbstractServiceInstance#programDefaultPipelineRule(Node)}
219      */
220     @Test
221     public void testProgramDefaultPipelineRule() {
222         when(southbound.getBridgeName(any(Node.class))).thenReturn(Constants.INTEGRATION_BRIDGE);
223         when(southbound.getDataPathId(any(Node.class))).thenReturn(261L);
224
225         when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
226
227         abstractServiceInstance.setService(service);
228
229         WriteTransaction transaction = mock(WriteTransaction.class);
230         when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
231         CheckedFuture<Void, TransactionCommitFailedException> commitFuture = mock(CheckedFuture.class);
232         when(transaction.submit()).thenReturn(commitFuture);
233
234         NodeBuilder nodeBuilder = mock(NodeBuilder.class);
235         when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
236
237         FlowBuilder flowBuilder = mock(FlowBuilder.class);
238         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
239
240         abstractServiceInstance.programDefaultPipelineRule(mock(Node.class));
241
242         verify(abstractServiceInstance, times(1)).isBridgeInPipeline(any(Node.class));
243         verify(abstractServiceInstance, times(1)).createNodeBuilder(anyString());
244         verify(abstractServiceInstance, times(1)).writeFlow(any(FlowBuilder.class), any(NodeBuilder.class));
245     }
246
247     @Test
248     public void testSetDependencies() throws Exception {
249         PipelineOrchestrator pipelineOrchestrator = mock(PipelineOrchestrator.class);
250         Southbound southbound = mock(Southbound.class);
251
252         ServiceHelper.overrideGlobalInstance(PipelineOrchestrator.class, pipelineOrchestrator);
253         ServiceHelper.overrideGlobalInstance(Southbound.class, southbound);
254
255         abstractServiceInstance.setDependencies(mock(ServiceReference.class), mock(AbstractServiceInstance.class));
256
257         assertEquals("Error, did not return the correct object", getField("orchestrator"), pipelineOrchestrator);
258         assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
259     }
260
261     private Object getField(String fieldName) throws Exception {
262         Field field = AbstractServiceInstance.class.getDeclaredField(fieldName);
263         field.setAccessible(true);
264         return field.get(abstractServiceInstance);
265     }
266 }