2940240945c33e45e78b780b9816e85c14595a21
[openflowplugin.git] / applications / bulk-o-matic / src / test / java / org / opendaylight / openflowplugin / applications / bulk / o / matic / SalBulkFlowServiceImplTest.java
1 /**
2  * Copyright (c) 2016 Cisco Systems, Inc. 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.openflowplugin.applications.bulk.o.matic;
10
11 import static org.mockito.Mockito.times;
12 import static org.mockito.Mockito.verify;
13 import static org.mockito.Mockito.when;
14
15 import com.google.common.base.Optional;
16 import com.google.common.util.concurrent.Futures;
17 import java.util.ArrayList;
18 import java.util.List;
19 import java.util.concurrent.Future;
20 import org.junit.Assert;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.ArgumentCaptor;
25 import org.mockito.Captor;
26 import org.mockito.Matchers;
27 import org.mockito.Mock;
28 import org.mockito.Mockito;
29 import org.mockito.runners.MockitoJUnitRunner;
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.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.AddFlowsDsInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.AddFlowsDsInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.AddFlowsRpcInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.AddFlowsRpcInputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.FlowRpcAddMultipleInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.FlowRpcAddMultipleInputBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.FlowRpcAddTestInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.FlowRpcAddTestInputBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.FlowTestInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.FlowTestInputBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.ReadFlowTestInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.ReadFlowTestInputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.RemoveFlowsDsInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.RemoveFlowsDsInputBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.RemoveFlowsRpcInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.RemoveFlowsRpcInputBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.bulk.flow.ds.list.grouping.BulkFlowDsItem;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.bulk.flow.ds.list.grouping.BulkFlowDsItemBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.bulk.flow.list.grouping.BulkFlowItem;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.bulk.flow.service.rev150608.bulk.flow.list.grouping.BulkFlowItemBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutputBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
65 import org.opendaylight.yangtools.yang.common.RpcResult;
66 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
67 import org.slf4j.Logger;
68 import org.slf4j.LoggerFactory;
69
70 /**
71  * Test for {@link SalBulkFlowServiceImpl}.
72  */
73 @RunWith(MockitoJUnitRunner.class)
74 public class SalBulkFlowServiceImplTest {
75
76     private static final Logger LOG = LoggerFactory.getLogger(SalBulkFlowServiceImplTest.class);
77
78     @Mock
79     private DataBroker mockDataBroker;
80     @Mock
81     private SalFlowService mockSalFlowService;
82     @Mock
83     private WriteTransaction wTx;
84     @Mock
85     private ReadOnlyTransaction rTx;
86     @Mock
87     private Nodes mockNodes;
88     @Mock
89     private Node mockNode;
90     @Captor
91     private ArgumentCaptor<Flow> flowArgumentCaptor;
92
93     private SalBulkFlowServiceImpl salBulkFlowService;
94
95     @Before
96     public void setUp() throws Exception {
97         when(mockDataBroker.newWriteOnlyTransaction()).thenReturn(wTx);
98         when(mockDataBroker.newReadOnlyTransaction()).thenReturn(rTx);
99         when(rTx.read(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<Node>>any()))
100                 .thenReturn(Futures.immediateCheckedFuture(Optional.of(mockNode)));
101         salBulkFlowService = new SalBulkFlowServiceImpl(mockSalFlowService, mockDataBroker);
102     }
103
104     @Test
105     public void testAddRemoveFlowsDs() throws Exception {
106         Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
107
108         final BulkFlowDsItemBuilder bulkFlowDsItemBuilder = new BulkFlowDsItemBuilder()
109             .setFlowId(new FlowId("1"))
110             .setTableId((short)2);
111
112         final InstanceIdentifier<Node> nodeId = BulkOMaticUtils.getFlowCapableNodeId("1");
113         bulkFlowDsItemBuilder.setNode(new NodeRef(nodeId));
114         final BulkFlowDsItem bulkFlowDsItem = bulkFlowDsItemBuilder.build();
115
116         final List<BulkFlowDsItem> bulkFlowDsItems = new ArrayList<>();
117         bulkFlowDsItems.add(bulkFlowDsItem);
118
119         final AddFlowsDsInputBuilder addFlowsDsInputBuilder = new AddFlowsDsInputBuilder();
120         addFlowsDsInputBuilder.setBulkFlowDsItem(bulkFlowDsItems);
121
122         final AddFlowsDsInput addFlowsDsInput = addFlowsDsInputBuilder.build();
123         salBulkFlowService.addFlowsDs(addFlowsDsInput);
124
125         verify(wTx).submit();
126         verify(wTx).put(Matchers.<LogicalDatastoreType>any(), Matchers.<InstanceIdentifier<Flow>>any(), flowArgumentCaptor.capture(), Mockito.anyBoolean());
127
128         Flow flow = flowArgumentCaptor.getValue();
129         Assert.assertEquals("1", flow.getId().getValue());
130         Assert.assertEquals((short) 2, flow.getTableId().shortValue());
131
132         final RemoveFlowsDsInputBuilder removeFlowsDsInputBuilder = new RemoveFlowsDsInputBuilder();
133         removeFlowsDsInputBuilder.setBulkFlowDsItem(bulkFlowDsItems);
134
135         final RemoveFlowsDsInput removeFlowsDsInput = removeFlowsDsInputBuilder.build();
136
137         salBulkFlowService.removeFlowsDs(removeFlowsDsInput);
138         verify(wTx).delete(Matchers.<LogicalDatastoreType>any(), Matchers.<InstanceIdentifier<Flow>>any());
139         verify(wTx,times(2)).submit();
140     }
141
142     @Test
143     public void testAddRemoveFlowsRpc() throws Exception {
144         Mockito.when(mockSalFlowService.addFlow(Matchers.<AddFlowInput>any()))
145                 .thenReturn(RpcResultBuilder.success(new AddFlowOutputBuilder().build()).buildFuture());
146
147         Mockito.when(mockSalFlowService.removeFlow(Matchers.<RemoveFlowInput>any()))
148                 .thenReturn(RpcResultBuilder.success(new RemoveFlowOutputBuilder().build()).buildFuture());
149
150         final BulkFlowItemBuilder bulkFlowItemBuilder = new BulkFlowItemBuilder();
151         final InstanceIdentifier<Node> nodeId = BulkOMaticUtils.getFlowCapableNodeId("1");
152         bulkFlowItemBuilder.setNode(new NodeRef(nodeId));
153         final BulkFlowItem bulkFlowItem = bulkFlowItemBuilder.build();
154
155         final List<BulkFlowItem> bulkFlowItems = new ArrayList<>();
156         bulkFlowItems.add(bulkFlowItem);
157
158         final AddFlowsRpcInputBuilder addFlowsRpcInputBuilder = new AddFlowsRpcInputBuilder();
159         addFlowsRpcInputBuilder.setBulkFlowItem(bulkFlowItems);
160
161         final AddFlowsRpcInput addFlowsRpcInput = addFlowsRpcInputBuilder.build();
162         salBulkFlowService.addFlowsRpc(addFlowsRpcInput);
163
164         verify(mockSalFlowService).addFlow(Matchers.<AddFlowInput>any());
165
166         final RemoveFlowsRpcInputBuilder removeFlowsRpcInputBuilder = new RemoveFlowsRpcInputBuilder();
167         removeFlowsRpcInputBuilder.setBulkFlowItem(bulkFlowItems);
168
169         final RemoveFlowsRpcInput removeFlowsRpcInput = removeFlowsRpcInputBuilder.build();
170         salBulkFlowService.removeFlowsRpc(removeFlowsRpcInput);
171
172         verify(mockSalFlowService).removeFlow(Matchers.<RemoveFlowInput>any());
173     }
174
175     @Test
176     public void testReadFlowTest() throws Exception {
177         final ReadFlowTestInputBuilder readFlowTestInputBuilder = new ReadFlowTestInputBuilder()
178             .setDpnCount(1L)
179             .setStartTableId(1L)
180             .setEndTableId(2L)
181             .setIsConfigDs(false)
182             .setFlowsPerDpn(1L)
183             .setVerbose(true);
184
185         final ReadFlowTestInput readFlowTestInput = readFlowTestInputBuilder.build();
186         final Future<RpcResult<Void>> resultFuture = salBulkFlowService.readFlowTest(readFlowTestInput);
187
188         Assert.assertTrue(resultFuture.get().isSuccessful());
189     }
190
191     @Test
192     public void testFlowRpcAddTest() throws Exception {
193         when(rTx.read(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<Nodes>>any()))
194                 .thenReturn(Futures.immediateCheckedFuture(Optional.of(mockNodes)));
195
196         final FlowRpcAddTestInputBuilder flowRpcAddTestInputBuilder = new FlowRpcAddTestInputBuilder()
197                 .setFlowCount(1L)
198                 .setDpnId("1")
199                 .setRpcBatchSize(1L);
200
201         final FlowRpcAddTestInput flowRpcAddTestInput = flowRpcAddTestInputBuilder.build();
202         final Future<RpcResult<Void>> resultFuture = salBulkFlowService.flowRpcAddTest(flowRpcAddTestInput);
203
204         Assert.assertTrue(resultFuture.get().isSuccessful());
205     }
206
207     @Test
208     public void testFlowTest() throws Exception {
209         final FlowTestInputBuilder flowTestInputBuilder = new FlowTestInputBuilder()
210                 .setBatchSize(1L)
211                 .setDpnCount(1L)
212                 .setEndTableId(2L)
213                 .setFlowsPerDpn(1L)
214                 .setIsAdd(true)
215                 .setSeq(true)
216                 .setSleepAfter(20L)
217                 .setSleepFor(1L)
218                 .setStartTableId(1L)
219                 .setTxChain(true);
220
221         FlowTestInput flowTestInput = flowTestInputBuilder.build();
222
223         Assert.assertTrue(salBulkFlowService.flowTest(flowTestInput).get().isSuccessful());
224
225         flowTestInputBuilder.setIsAdd(false);
226         flowTestInput = flowTestInputBuilder.build();
227
228         Assert.assertTrue(salBulkFlowService.flowTest(flowTestInput).get().isSuccessful());
229
230         flowTestInputBuilder.setTxChain(false);
231         flowTestInput = flowTestInputBuilder.build();
232
233         Assert.assertTrue(salBulkFlowService.flowTest(flowTestInput).get().isSuccessful());
234
235         flowTestInputBuilder.setIsAdd(true);
236         flowTestInput = flowTestInputBuilder.build();
237
238         Assert.assertTrue(salBulkFlowService.flowTest(flowTestInput).get().isSuccessful());
239
240         flowTestInputBuilder.setSeq(false);
241         flowTestInput = flowTestInputBuilder.build();
242
243         Assert.assertTrue(salBulkFlowService.flowTest(flowTestInput).get().isSuccessful());
244
245         flowTestInputBuilder.setIsAdd(false);
246         flowTestInput = flowTestInputBuilder.build();
247
248         Assert.assertTrue(salBulkFlowService.flowTest(flowTestInput).get().isSuccessful());
249     }
250
251     @Test
252     public void testFlowRpcAddMultiple() throws Exception {
253         when(rTx.read(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<Nodes>>any()))
254                 .thenReturn(Futures.immediateCheckedFuture(Optional.of(mockNodes)));
255
256         final FlowRpcAddMultipleInputBuilder flowRpcAddMultipleInputBuilder = new FlowRpcAddMultipleInputBuilder()
257                 .setFlowCount(1L)
258                 .setRpcBatchSize(1L);
259
260         final FlowRpcAddMultipleInput flowRpcAddMultipleInput = flowRpcAddMultipleInputBuilder.build();
261
262         Assert.assertTrue(salBulkFlowService.flowRpcAddMultiple(flowRpcAddMultipleInput).get().isSuccessful());
263     }
264 }