2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.services.sal;
11 import static org.mockito.ArgumentMatchers.any;
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;
73 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
75 @RunWith(MockitoJUnitRunner.class)
76 public class SalMetersBatchServiceImplTest {
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));
84 private SalMeterService salMeterService;
86 private FlowCapableTransactionService transactionService;
88 private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
90 private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
92 private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
94 private SalMetersBatchServiceImpl salMetersBatchService;
98 salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
100 Mockito.when(transactionService.sendBarrier(any()))
101 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
105 public void tearDown() {
106 Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
110 public void testUpdateMetersBatch_success() throws Exception {
111 Mockito.when(salMeterService.updateMeter(Mockito.any()))
112 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
114 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
116 .setBarrierAfter(true)
117 .setBatchUpdateMeters(Lists.newArrayList(
118 createEmptyBatchUpdateMeter(42L),
119 createEmptyBatchUpdateMeter(44L)))
122 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
124 Assert.assertTrue(resultFuture.isDone());
125 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
136 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
146 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
148 .setBarrierAfter(true)
149 .setBatchUpdateMeters(Lists.newArrayList(
150 createEmptyBatchUpdateMeter(42L),
151 createEmptyBatchUpdateMeter(44L)))
154 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
155 Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
156 .values().iterator();
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());
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());
175 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
180 public void testAddMetersBatch_success() throws Exception {
181 Mockito.when(salMeterService.addMeter(Mockito.any()))
182 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
184 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
186 .setBarrierAfter(true)
187 .setBatchAddMeters(BindingMap.ordered(
188 createEmptyBatchAddMeter(42L),
189 createEmptyBatchAddMeter(43L)))
192 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
194 Assert.assertTrue(resultFuture.isDone());
195 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
204 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
214 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
216 .setBarrierAfter(true)
217 .setBatchAddMeters(BindingMap.ordered(
218 createEmptyBatchAddMeter(42L),
219 createEmptyBatchAddMeter(43L)))
222 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
223 Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
224 .values().iterator();
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());
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());
241 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
245 public void testRemoveMetersBatch_success() throws Exception {
246 Mockito.when(salMeterService.removeMeter(Mockito.any()))
247 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
249 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
251 .setBarrierAfter(true)
252 .setBatchRemoveMeters(BindingMap.ordered(
253 createEmptyBatchRemoveMeter(42L),
254 createEmptyBatchRemoveMeter(43L)))
257 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
259 Assert.assertTrue(resultFuture.isDone());
260 Assert.assertTrue(resultFuture.get().isSuccessful());
262 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
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());
270 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
280 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
282 .setBarrierAfter(true)
283 .setBatchRemoveMeters(BindingMap.ordered(
284 createEmptyBatchRemoveMeter(42L),
285 createEmptyBatchRemoveMeter(43L)))
288 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
289 Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
290 .values().iterator();
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());
299 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
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());
307 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
310 private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
311 return new BatchAddMetersBuilder()
312 .setMeterId(new MeterId(Uint32.valueOf(groupIdValue)))
316 private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
317 return new BatchRemoveMetersBuilder()
318 .setMeterId(new MeterId(Uint32.valueOf(groupIdValue)))
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())