f5343fd5bc361d7df273e079de583931479511c3
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / services / sal / SalMetersBatchServiceImplTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.impl.services.sal;
10
11 import static org.mockito.ArgumentMatchers.any;
12
13 import com.google.common.collect.Lists;
14 import java.util.List;
15 import java.util.concurrent.Future;
16 import org.junit.After;
17 import org.junit.Assert;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.mockito.ArgumentCaptor;
22 import org.mockito.ArgumentMatchers;
23 import org.mockito.Captor;
24 import org.mockito.InOrder;
25 import org.mockito.Mock;
26 import org.mockito.Mockito;
27 import org.mockito.junit.MockitoJUnitRunner;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutputBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInputBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchOutput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInputBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMeters;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMetersBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.OriginalBatchedMeterBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.UpdatedBatchedMeterBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMeters;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMetersBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMetersBuilder;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
64 import org.opendaylight.yangtools.yang.common.RpcError;
65 import org.opendaylight.yangtools.yang.common.RpcResult;
66 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
67
68 /**
69  * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
70  */
71 @RunWith(MockitoJUnitRunner.class)
72 public class SalMetersBatchServiceImplTest {
73
74     public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
75     public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
76     public static final NodeRef NODE_REF =
77             new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
78
79     @Mock
80     private SalMeterService salMeterService;
81     @Mock
82     private FlowCapableTransactionService transactionService;
83     @Captor
84     private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
85     @Captor
86     private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
87     @Captor
88     private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
89
90     private SalMetersBatchServiceImpl salMetersBatchService;
91
92     @Before
93     public void setUp() {
94         salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
95
96         Mockito.when(transactionService.sendBarrier(any()))
97                 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
98     }
99
100     @After
101     public void tearDown() {
102         Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
103     }
104
105     @Test
106     public void testUpdateMetersBatch_success() throws Exception {
107         Mockito.when(salMeterService.updateMeter(Mockito.any()))
108                 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
109
110         final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
111                 .setNode(NODE_REF)
112                 .setBarrierAfter(true)
113                 .setBatchUpdateMeters(Lists.newArrayList(
114                         createEmptyBatchUpdateMeter(42L),
115                         createEmptyBatchUpdateMeter(44L)))
116                 .build();
117
118         final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
119
120         Assert.assertTrue(resultFuture.isDone());
121         Assert.assertTrue(resultFuture.get().isSuccessful());
122
123         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
124         inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
125         final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
126         Assert.assertEquals(2, allValues.size());
127         Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
128         Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
129         Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
130         Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
131
132         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
133     }
134
135     @Test
136     public void testUpdateMetersBatch_failure() throws Exception {
137         Mockito.when(salMeterService.updateMeter(Mockito.any()))
138                 .thenReturn(RpcResultBuilder.<UpdateMeterOutput>failed()
139                         .withError(RpcError.ErrorType.APPLICATION, "ur-groupUpdateError")
140                         .buildFuture());
141
142         final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
143                 .setNode(NODE_REF)
144                 .setBarrierAfter(true)
145                 .setBatchUpdateMeters(Lists.newArrayList(
146                         createEmptyBatchUpdateMeter(42L),
147                         createEmptyBatchUpdateMeter(44L)))
148                 .build();
149
150         final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
151
152         Assert.assertTrue(resultFuture.isDone());
153         Assert.assertFalse(resultFuture.get().isSuccessful());
154         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
155         Assert.assertEquals(43L,
156                 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
157         Assert.assertEquals(45L,
158                 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
159         Assert.assertEquals(2, resultFuture.get().getErrors().size());
160
161
162         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
163         inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
164         final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
165         Assert.assertEquals(2, allValues.size());
166         Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
167         Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
168         Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
169         Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
170
171         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
172     }
173
174
175     @Test
176     public void testAddMetersBatch_success() throws Exception {
177         Mockito.when(salMeterService.addMeter(Mockito.any()))
178                 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
179
180         final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
181                 .setNode(NODE_REF)
182                 .setBarrierAfter(true)
183                 .setBatchAddMeters(Lists.newArrayList(
184                         createEmptyBatchAddMeter(42L),
185                         createEmptyBatchAddMeter(43L)))
186                 .build();
187
188         final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
189
190         Assert.assertTrue(resultFuture.isDone());
191         Assert.assertTrue(resultFuture.get().isSuccessful());
192
193         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
194         inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
195         final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
196         Assert.assertEquals(2, allValues.size());
197         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
198         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
199
200         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
201     }
202
203     @Test
204     public void testAddMetersBatch_failure() throws Exception {
205         Mockito.when(salMeterService.addMeter(Mockito.any()))
206                 .thenReturn(RpcResultBuilder.<AddMeterOutput>failed()
207                         .withError(RpcError.ErrorType.APPLICATION, "ut-groupAddError")
208                         .buildFuture());
209
210         final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
211                 .setNode(NODE_REF)
212                 .setBarrierAfter(true)
213                 .setBatchAddMeters(Lists.newArrayList(
214                         createEmptyBatchAddMeter(42L),
215                         createEmptyBatchAddMeter(43L)))
216                 .build();
217
218         final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
219
220         Assert.assertTrue(resultFuture.isDone());
221         Assert.assertFalse(resultFuture.get().isSuccessful());
222         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
223         Assert.assertEquals(42L,
224                 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
225         Assert.assertEquals(43L,
226                 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
227         Assert.assertEquals(2, resultFuture.get().getErrors().size());
228
229
230         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
231         inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
232         final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
233         Assert.assertEquals(2, allValues.size());
234         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
235         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
236
237         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
238     }
239
240     @Test
241     public void testRemoveMetersBatch_success() throws Exception {
242         Mockito.when(salMeterService.removeMeter(Mockito.any()))
243                 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
244
245         final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
246                 .setNode(NODE_REF)
247                 .setBarrierAfter(true)
248                 .setBatchRemoveMeters(Lists.newArrayList(
249                         createEmptyBatchRemoveMeter(42L),
250                         createEmptyBatchRemoveMeter(43L)))
251                 .build();
252
253         final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
254
255         Assert.assertTrue(resultFuture.isDone());
256         Assert.assertTrue(resultFuture.get().isSuccessful());
257
258         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
259
260         inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
261         final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
262         Assert.assertEquals(2, allValues.size());
263         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
264         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
265
266         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
267     }
268
269     @Test
270     public void testRemoveMetersBatch_failure() throws Exception {
271         Mockito.when(salMeterService.removeMeter(Mockito.any()))
272                 .thenReturn(RpcResultBuilder.<RemoveMeterOutput>failed()
273                         .withError(RpcError.ErrorType.APPLICATION, "ut-groupRemoveError")
274                         .buildFuture());
275
276         final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
277                 .setNode(NODE_REF)
278                 .setBarrierAfter(true)
279                 .setBatchRemoveMeters(Lists.newArrayList(
280                         createEmptyBatchRemoveMeter(42L),
281                         createEmptyBatchRemoveMeter(43L)))
282                 .build();
283
284         final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
285
286         Assert.assertTrue(resultFuture.isDone());
287         Assert.assertFalse(resultFuture.get().isSuccessful());
288         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
289         Assert.assertEquals(42L,
290                 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
291         Assert.assertEquals(43L,
292                 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
293         Assert.assertEquals(2, resultFuture.get().getErrors().size());
294
295         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
296
297         inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
298         final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
299         Assert.assertEquals(2, allValues.size());
300         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
301         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
302
303         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
304     }
305
306     private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
307         return new BatchAddMetersBuilder()
308                 .setMeterId(new MeterId(groupIdValue))
309                 .build();
310     }
311
312     private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
313         return new BatchRemoveMetersBuilder()
314                 .setMeterId(new MeterId(groupIdValue))
315                 .build();
316     }
317
318     private static BatchUpdateMeters createEmptyBatchUpdateMeter(final long groupIdValue) {
319         return new BatchUpdateMetersBuilder()
320                 .setOriginalBatchedMeter(
321                         new OriginalBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue)).build())
322                 .setUpdatedBatchedMeter(
323                         new UpdatedBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue + 1)).build())
324                 .build();
325     }
326 }