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.common.RpcError;
67 import org.opendaylight.yangtools.yang.common.RpcResult;
68 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
71 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
73 @RunWith(MockitoJUnitRunner.class)
74 public class SalMetersBatchServiceImplTest {
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));
82 private SalMeterService salMeterService;
84 private FlowCapableTransactionService transactionService;
86 private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
88 private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
90 private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
92 private SalMetersBatchServiceImpl salMetersBatchService;
96 salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
98 Mockito.when(transactionService.sendBarrier(any()))
99 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
103 public void tearDown() {
104 Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
108 public void testUpdateMetersBatch_success() throws Exception {
109 Mockito.when(salMeterService.updateMeter(Mockito.any()))
110 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
112 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
114 .setBarrierAfter(true)
115 .setBatchUpdateMeters(Lists.newArrayList(
116 createEmptyBatchUpdateMeter(42L),
117 createEmptyBatchUpdateMeter(44L)))
120 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
122 Assert.assertTrue(resultFuture.isDone());
123 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
134 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
144 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
146 .setBarrierAfter(true)
147 .setBatchUpdateMeters(Lists.newArrayList(
148 createEmptyBatchUpdateMeter(42L),
149 createEmptyBatchUpdateMeter(44L)))
152 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
153 Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
154 .values().iterator();
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());
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());
173 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
178 public void testAddMetersBatch_success() throws Exception {
179 Mockito.when(salMeterService.addMeter(Mockito.any()))
180 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
182 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
184 .setBarrierAfter(true)
185 .setBatchAddMeters(Lists.newArrayList(
186 createEmptyBatchAddMeter(42L),
187 createEmptyBatchAddMeter(43L)))
190 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
192 Assert.assertTrue(resultFuture.isDone());
193 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
202 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
212 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
214 .setBarrierAfter(true)
215 .setBatchAddMeters(Lists.newArrayList(
216 createEmptyBatchAddMeter(42L),
217 createEmptyBatchAddMeter(43L)))
220 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
221 Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
222 .values().iterator();
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());
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());
239 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
243 public void testRemoveMetersBatch_success() throws Exception {
244 Mockito.when(salMeterService.removeMeter(Mockito.any()))
245 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
247 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
249 .setBarrierAfter(true)
250 .setBatchRemoveMeters(Lists.newArrayList(
251 createEmptyBatchRemoveMeter(42L),
252 createEmptyBatchRemoveMeter(43L)))
255 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
257 Assert.assertTrue(resultFuture.isDone());
258 Assert.assertTrue(resultFuture.get().isSuccessful());
260 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
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());
268 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
278 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
280 .setBarrierAfter(true)
281 .setBatchRemoveMeters(Lists.newArrayList(
282 createEmptyBatchRemoveMeter(42L),
283 createEmptyBatchRemoveMeter(43L)))
286 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
287 Iterator<BatchFailedMetersOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
288 .values().iterator();
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());
297 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
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());
305 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
308 private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
309 return new BatchAddMetersBuilder()
310 .setMeterId(new MeterId(groupIdValue))
314 private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
315 return new BatchRemoveMetersBuilder()
316 .setMeterId(new MeterId(groupIdValue))
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())