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