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