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