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.providers.openflow13;
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;
22 import java.lang.reflect.Field;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.InjectMocks;
27 import org.mockito.Mock;
28 import org.mockito.Mockito;
29 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
30 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
31 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
32 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
33 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
34 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
35 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
36 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
45 import org.opendaylight.yangtools.yang.binding.DataObject;
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
47 import org.osgi.framework.ServiceReference;
48 import org.powermock.api.mockito.PowerMockito;
49 import org.powermock.modules.junit4.PowerMockRunner;
51 import com.google.common.base.Optional;
52 import com.google.common.util.concurrent.CheckedFuture;
55 * Unit test for {@link AbstractServiceInstance}
57 //@PrepareForTest(ServiceHelper.class)
58 @RunWith(PowerMockRunner.class)
59 @SuppressWarnings("unchecked")
60 public class AbstractServiceInstanceTest {
62 @InjectMocks private AbstractServiceInstance abstractServiceInstance = mock(AbstractServiceInstance.class, Mockito.CALLS_REAL_METHODS);
64 @Mock private DataBroker dataBroker;
65 @Mock private PipelineOrchestrator orchestrator;
66 @Mock private Southbound southbound;
68 private Service service = Service.L3_FORWARDING;
70 private final String ID = "5710881121";
71 private final String NODE_ID = Constants.INTEGRATION_BRIDGE + ":" + ID;
74 * Test method {@link AbstractServiceInstance#isBridgeInPipeline(String)}
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)));
83 * Test method {@link AbstractServiceInstance#getTable()}
86 public void testGetTable() {
87 abstractServiceInstance.setService(service);
88 assertEquals("Error, getTable() did not return the correct value", 70, abstractServiceInstance.getTable());
92 public void testGetService() {
93 abstractServiceInstance.setService(service);
94 assertEquals("Error, getService() did not return the correct value", service, abstractServiceInstance.getService());
98 * Test method {@link AbstractServiceInstance#createNodeBuilder(String)}
101 public void testCreateNodeBuilder() {
102 NodeId nodeId = mock(NodeId.class);
103 when(nodeId.getValue()).thenReturn(NODE_ID);
105 NodeBuilder nodeBuilder = abstractServiceInstance.createNodeBuilder(NODE_ID);
106 assertNotNull("Error, createNodeBuilder() did not return the correct value", nodeBuilder);
107 assertEquals("Error, createNodeBuilder() did not return the correct ID", NODE_ID, nodeBuilder.getId().getValue());
108 assertEquals("Error, createNodeBuilder() did not return the correct Key", new NodeKey(nodeBuilder.getId()), nodeBuilder.getKey());
112 * Test method {@link AbstractServiceInstance#getMutablePipelineInstructionBuilder()}
115 public void testGetMutablePipelineInstructionBuilder() {
117 assertNotNull("Error, getMutablePipelineInstructionBuilder() did not return the correct value", abstractServiceInstance.getMutablePipelineInstructionBuilder());
118 assertTrue("Error, getMutablePipelineInstructionBuilder() did not return a InstructionBuilder object", abstractServiceInstance.getMutablePipelineInstructionBuilder() instanceof InstructionBuilder);
120 when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
123 assertNotNull("Error, getMutablePipelineInstructionBuilder() did not return the correct value", abstractServiceInstance.getMutablePipelineInstructionBuilder());
124 assertTrue("Error, getMutablePipelineInstructionBuilder() did not return a InstructionBuilder object", abstractServiceInstance.getMutablePipelineInstructionBuilder() instanceof InstructionBuilder);
128 * Test method {@link AbstractServiceInstance#writeFlow(FlowBuilder, NodeBuilder)}
131 public void testWriteFlow() throws Exception {
132 WriteTransaction transaction = mock(WriteTransaction.class);
133 when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
134 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = mock(CheckedFuture.class);
135 when(transaction.submit()).thenReturn(commitFuture);
137 NodeBuilder nodeBuilder = mock(NodeBuilder.class);
138 when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
140 FlowBuilder flowBuilder = mock(FlowBuilder.class);
141 when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
143 abstractServiceInstance.writeFlow(flowBuilder, nodeBuilder);
145 verify(transaction, times(1)).put(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(DataObject.class), eq(true));
146 verify(transaction, times(1)).merge(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(DataObject.class), eq(true));
147 verify(commitFuture, times(1)).get();
151 * Test method {@link AbstractServiceInstance#removeFlow(FlowBuilder, NodeBuilder)}
154 public void testRemoveFlow() throws Exception {
155 WriteTransaction transaction = mock(WriteTransaction.class);
156 when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
157 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = mock(CheckedFuture.class);
158 when(transaction.submit()).thenReturn(commitFuture);
160 NodeBuilder nodeBuilder = mock(NodeBuilder.class);
161 when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
163 FlowBuilder flowBuilder = mock(FlowBuilder.class);
164 when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
166 abstractServiceInstance.removeFlow(flowBuilder, nodeBuilder);
167 verify(transaction, times(1)).delete(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class));
168 verify(commitFuture, times(1)).get();
172 * Test method {@link AbstractServiceInstance#getFlow(FlowBuilder, NodeBuilder)}
175 public void testGetFlow() throws Exception {
176 ReadOnlyTransaction transaction = mock(ReadOnlyTransaction.class);
177 when(dataBroker.newReadOnlyTransaction()).thenReturn(transaction);
178 //when(mdsalConsumer.getDataBroker()).thenReturn(dataBrocker);
180 NodeBuilder nodeBuilder = mock(NodeBuilder.class);
181 when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
183 FlowBuilder flowBuilder = mock(FlowBuilder.class);
184 when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
186 CheckedFuture dataRead = mock(CheckedFuture.class);
187 when(transaction.read(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class))).thenReturn(dataRead);
188 Optional<Flow> data = mock(Optional.class);
189 when(dataRead.get()).thenReturn(data);
191 abstractServiceInstance.getFlow(flowBuilder, nodeBuilder);
192 verify(transaction, times(1)).read(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class));
196 * Test method {@link AbstractServiceInstance#programDefaultPipelineRule(String)}
199 public void testProgramDefaultPipelineRule() {
200 when(southbound.getBridgeName(any(Node.class))).thenReturn(Constants.INTEGRATION_BRIDGE);
201 when(southbound.getDataPathId(any(Node.class))).thenReturn(261L);
203 when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
205 abstractServiceInstance.setService(service);
207 WriteTransaction transaction = mock(WriteTransaction.class);
208 when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
209 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = mock(CheckedFuture.class);
210 when(transaction.submit()).thenReturn(commitFuture);
212 NodeBuilder nodeBuilder = mock(NodeBuilder.class);
213 when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
215 FlowBuilder flowBuilder = mock(FlowBuilder.class);
216 when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
218 abstractServiceInstance.programDefaultPipelineRule(mock(Node.class));
220 verify(abstractServiceInstance, times(1)).isBridgeInPipeline(any(Node.class));
221 verify(abstractServiceInstance, times(1)).createNodeBuilder(anyString());
222 verify(abstractServiceInstance, times(1)).writeFlow(any(FlowBuilder.class), any(NodeBuilder.class));
225 // @Test TODO - re-activate test
226 public void testSetDependencies() throws Exception {
227 PipelineOrchestrator pipelineOrchestrator = mock(PipelineOrchestrator.class);
228 Southbound southbound = mock(Southbound.class);
230 PowerMockito.mockStatic(ServiceHelper.class);
231 PowerMockito.when(ServiceHelper.getGlobalInstance(PipelineOrchestrator.class, abstractServiceInstance)).thenReturn(pipelineOrchestrator);
232 PowerMockito.when(ServiceHelper.getGlobalInstance(Southbound.class, abstractServiceInstance)).thenReturn(southbound);
234 abstractServiceInstance.setDependencies(mock(ServiceReference.class), mock(AbstractServiceInstance.class));
236 assertEquals("Error, did not return the correct object", getField("pipelineOrchestrator"), pipelineOrchestrator);
237 assertEquals("Error, did not return the correct object", getField("southbound"), southbound);
240 private Object getField(String fieldName) throws Exception {
241 Field field = AbstractServiceInstance.class.getDeclaredField(fieldName);
242 field.setAccessible(true);
243 return field.get(abstractServiceInstance);