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