Remove plugin dependencies
[ovsdb.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.Matchers.same;
18 import static org.mockito.Mockito.mock;
19 import static org.mockito.Mockito.times;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.when;
22
23 import java.util.ArrayList;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.Set;
27 import java.util.concurrent.ConcurrentHashMap;
28 import java.util.concurrent.ConcurrentMap;
29
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 import org.mockito.InjectMocks;
33 import org.mockito.Mock;
34 import org.mockito.Mockito;
35 import org.mockito.runners.MockitoJUnitRunner;
36 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
37 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
38 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
39 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
40 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
41 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
42 import org.opendaylight.ovsdb.lib.notation.Column;
43 import org.opendaylight.ovsdb.lib.notation.Row;
44 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
45 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
46 /* TODO SB_MIGRATION */
47 //import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
48 //import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
49 import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
50 import org.opendaylight.ovsdb.utils.mdsal.openflow.InstructionUtils;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
59 import org.opendaylight.yangtools.yang.binding.DataObject;
60 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
61 import org.powermock.core.classloader.annotations.PrepareForTest;
62
63 import com.google.common.base.Optional;
64 import com.google.common.util.concurrent.CheckedFuture;
65
66 /**
67  * Unit test for {@link AbstractServiceInstance}
68  */
69 @RunWith(MockitoJUnitRunner.class)
70 public class AbstractServiceInstanceTest {
71
72     @InjectMocks AbstractServiceInstance abstractServiceInstance = mock(AbstractServiceInstance.class, Mockito.CALLS_REAL_METHODS);
73
74     /* TODO SB_MIGRATION */
75     //@Mock private OvsdbConfigurationService ovsdbConfigService;
76     //@Mock private OvsdbConnectionService connectionService;
77     @Mock private PipelineOrchestrator orchestrator;
78     @Mock private MdsalConsumer mdsalConsumer;
79
80
81     private Service service = Service.L3_FORWARDING;
82
83     private final String ID = "5710881121";
84     private final String NODE_ID = Constants.INTEGRATION_BRIDGE + ":" +  ID;
85     private final String DPID = "154652161";
86
87     /**
88      * Test method {@link AbstractServiceInstance#isBridgeInPipeline(String)}
89      */
90     @Test
91     public void testIsBridgeInPipeline() {
92         Node node = mock(Node.class);
93         when(node.getId()).thenReturn(mock(NodeId.class));
94
95         List<Node> nodes = new ArrayList();
96         nodes.add(node);
97         /* TODO SB_MIGRATION */
98         //when(connectionService.getNodes()).thenReturn(nodes);
99
100         ConcurrentMap<String, Row> bridges = new ConcurrentHashMap();
101         bridges.put("key", mock(Row.class));
102         //when(ovsdbConfigService.getRows(any(Node.class), anyString())).thenReturn(bridges);
103
104         Bridge bridge = mock(Bridge.class);
105         Column<GenericTableSchema, Set<String>> datapathIdColumn = mock(Column.class);
106         when(bridge.getDatapathIdColumn()).thenReturn(datapathIdColumn);
107         when(bridge.getName()).thenReturn(Constants.INTEGRATION_BRIDGE);
108         Set<String> dpids = new HashSet();
109         dpids.add(DPID);
110         when(datapathIdColumn.getData()).thenReturn(dpids);
111         //when(ovsdbConfigService.getTypedRow(any(Node.class), same(Bridge.class), any(Row.class))).thenReturn(bridge);
112
113         /* TODO SB_MIGRATION */
114         //assertTrue("Error, isBridgeInPipeline() did not return the correct value", abstractServiceInstance.isBridgeInPipeline(NODE_ID));
115     }
116
117     /**
118      * Test method {@link AbstractServiceInstance#getTable()}
119      */
120     @Test
121     public void testGetTable() {
122         abstractServiceInstance.setService(service);
123         assertEquals("Error, getTable() did not return the correct value", 70, abstractServiceInstance.getTable());
124     }
125
126     /**
127      * Test method {@link AbstractServiceInstance#createNodeBuilder(String)}
128      */
129     @Test
130     public void testCreateNodeBuilder() {
131         NodeId id = new NodeId(NODE_ID);
132
133         NodeBuilder nodeBuilder = abstractServiceInstance.createNodeBuilder(NODE_ID);
134         assertNotNull("Error, createNodeBuilder() did not return the correct value", nodeBuilder);
135         assertEquals("Error, createNodeBuilder() did not return the correct ID", id, nodeBuilder.getId());
136         assertEquals("Error, createNodeBuilder() did not return the correct Key", new NodeKey(id), nodeBuilder.getKey());
137     }
138
139     /**
140      * Test method {@link AbstractServiceInstance#getMutablePipelineInstructionBuilder()}
141      */
142     @Test
143     public void testGetMutablePipelineInstructionBuilder() {
144         // service == null
145         assertNotNull("Error, getMutablePipelineInstructionBuilder() did not return the correct value", abstractServiceInstance.getMutablePipelineInstructionBuilder());
146         assertTrue("Error, getMutablePipelineInstructionBuilder() did not return a InstructionBuilder object", abstractServiceInstance.getMutablePipelineInstructionBuilder() instanceof InstructionBuilder);
147
148         when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
149
150         // service defined
151         assertNotNull("Error, getMutablePipelineInstructionBuilder() did not return the correct value", abstractServiceInstance.getMutablePipelineInstructionBuilder());
152         assertTrue("Error, getMutablePipelineInstructionBuilder() did not return a InstructionBuilder object", abstractServiceInstance.getMutablePipelineInstructionBuilder() instanceof InstructionBuilder);
153     }
154
155     /**
156      * Test method {@link AbstractServiceInstance#writeFlow(FlowBuilder, NodeBuilder)}
157      */
158     @Test
159     public void testWriteFlow() throws Exception {
160         DataBroker dataBrocker = mock(DataBroker.class);
161         ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
162         when(dataBrocker.newReadWriteTransaction()).thenReturn(transaction);
163         when(mdsalConsumer.getDataBroker()).thenReturn(dataBrocker);
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         abstractServiceInstance.writeFlow(flowBuilder, nodeBuilder);
174
175         verify(transaction, times(2)).put(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(DataObject.class), eq(true));
176         verify(commitFuture, times(1)).get();
177     }
178
179     /**
180      * Test method {@link AbstractServiceInstance#removeFlow(FlowBuilder, NodeBuilder)}
181      */
182     @Test
183     public void testRemoveFlow() throws Exception {
184         DataBroker dataBrocker = mock(DataBroker.class);
185         WriteTransaction transaction = mock(WriteTransaction.class);
186         when(dataBrocker.newWriteOnlyTransaction()).thenReturn(transaction);
187         when(mdsalConsumer.getDataBroker()).thenReturn(dataBrocker);
188         CheckedFuture<Void, TransactionCommitFailedException> commitFuture = mock(CheckedFuture.class);
189         when(transaction.submit()).thenReturn(commitFuture);
190
191         NodeBuilder nodeBuilder = mock(NodeBuilder.class);
192         when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
193
194         FlowBuilder flowBuilder = mock(FlowBuilder.class);
195         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
196
197         abstractServiceInstance.removeFlow(flowBuilder, nodeBuilder);
198         verify(transaction, times(1)).delete(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class));
199         verify(commitFuture, times(1)).get();
200     }
201
202     /**
203      * Test method {@link AbstractServiceInstance#getFlow(FlowBuilder, NodeBuilder)}
204      */
205     @Test
206     public void testGetFlow() throws Exception {
207         DataBroker dataBrocker = mock(DataBroker.class);
208         ReadOnlyTransaction transaction = mock(ReadOnlyTransaction.class);
209         when(dataBrocker.newReadOnlyTransaction()).thenReturn(transaction);
210         when(mdsalConsumer.getDataBroker()).thenReturn(dataBrocker);
211
212         NodeBuilder nodeBuilder = mock(NodeBuilder.class);
213         when(nodeBuilder.getKey()).thenReturn(mock(NodeKey.class));
214
215         FlowBuilder flowBuilder = mock(FlowBuilder.class);
216         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
217
218         CheckedFuture dataRead = mock(CheckedFuture.class);
219         when(transaction.read(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class))).thenReturn(dataRead);
220         Optional<Flow> data = mock(Optional.class);
221         when(dataRead.get()).thenReturn(data);
222
223         abstractServiceInstance.getFlow(flowBuilder, nodeBuilder);
224         verify(transaction, times(1)).read(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class));
225     }
226
227     /**
228      * Test method {@link AbstractServiceInstance#programDefaultPipelineRule(String)}
229      */
230     @Test
231     public void testProgramDefaultPipelineRule() {
232         Node node = mock(Node.class);
233         when(node.getId()).thenReturn(mock(NodeId.class));
234
235         List<Node> nodes = new ArrayList();
236         nodes.add(node);
237         /* TODO SB_MIGRATION */
238         //when(connectionService.getNodes()).thenReturn(nodes);
239
240         ConcurrentMap<String, Row> bridges = new ConcurrentHashMap();
241         bridges.put("key", mock(Row.class));
242         //when(ovsdbConfigService.getRows(any(Node.class), anyString())).thenReturn(bridges);
243
244         Bridge bridge = mock(Bridge.class);
245         Column<GenericTableSchema, Set<String>> datapathIdColumn = mock(Column.class);
246         when(bridge.getDatapathIdColumn()).thenReturn(datapathIdColumn);
247         when(bridge.getName()).thenReturn(Constants.INTEGRATION_BRIDGE);
248         Set<String> dpids = new HashSet();
249         dpids.add(DPID);
250         when(datapathIdColumn.getData()).thenReturn(dpids);
251         //when(ovsdbConfigService.getTypedRow(any(Node.class), same(Bridge.class), any(Row.class))).thenReturn(bridge);
252
253         abstractServiceInstance.setService(service);
254
255         abstractServiceInstance.programDefaultPipelineRule(NODE_ID);
256
257         /* TODO SB_MIGRATION */
258         //verify(abstractServiceInstance, times(1)).isBridgeInPipeline(NODE_ID);
259         //verify(abstractServiceInstance, times(1)).writeFlow(any(FlowBuilder.class), any(NodeBuilder.class));
260     }
261 }