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