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 com.google.common.collect.Lists;
12 import java.util.List;
13 import java.util.concurrent.Future;
14 import org.junit.After;
15 import org.junit.Assert;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 import org.mockito.ArgumentCaptor;
20 import org.mockito.Captor;
21 import org.mockito.InOrder;
22 import org.mockito.Matchers;
23 import org.mockito.Mock;
24 import org.mockito.Mockito;
25 import org.mockito.runners.MockitoJUnitRunner;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutputBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchOutput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInputBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchOutput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInputBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMeters;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMetersBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.OriginalBatchedMeterBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.UpdatedBatchedMeterBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMeters;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMetersBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMetersBuilder;
61 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
62 import org.opendaylight.yangtools.yang.common.RpcError;
63 import org.opendaylight.yangtools.yang.common.RpcResult;
64 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
67 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
69 @RunWith(MockitoJUnitRunner.class)
70 public class SalMetersBatchServiceImplTest {
72 public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
73 public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
74 public static final NodeRef NODE_REF =
75 new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
78 private SalMeterService salMeterService;
80 private FlowCapableTransactionService transactionService;
82 private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
84 private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
86 private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
88 private SalMetersBatchServiceImpl salMetersBatchService;
91 public void setUp() throws Exception {
92 salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
94 Mockito.when(transactionService.sendBarrier(Matchers.<SendBarrierInput>any()))
95 .thenReturn(RpcResultBuilder.<Void>success().buildFuture());
99 public void tearDown() throws Exception {
100 Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
104 public void testUpdateMetersBatch_success() throws Exception {
105 Mockito.when(salMeterService.updateMeter(Mockito.<UpdateMeterInput>any()))
106 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
108 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
110 .setBarrierAfter(true)
111 .setBatchUpdateMeters(Lists.newArrayList(
112 createEmptyBatchUpdateMeter(42L),
113 createEmptyBatchUpdateMeter(44L)))
116 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
118 Assert.assertTrue(resultFuture.isDone());
119 Assert.assertTrue(resultFuture.get().isSuccessful());
121 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
122 inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
123 final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
124 Assert.assertEquals(2, allValues.size());
125 Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
126 Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
127 Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
128 Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
130 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
134 public void testUpdateMetersBatch_failure() throws Exception {
135 Mockito.when(salMeterService.updateMeter(Mockito.<UpdateMeterInput>any()))
136 .thenReturn(RpcResultBuilder.<UpdateMeterOutput>failed()
137 .withError(RpcError.ErrorType.APPLICATION, "ur-groupUpdateError")
140 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
142 .setBarrierAfter(true)
143 .setBatchUpdateMeters(Lists.newArrayList(
144 createEmptyBatchUpdateMeter(42L),
145 createEmptyBatchUpdateMeter(44L)))
148 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
150 Assert.assertTrue(resultFuture.isDone());
151 Assert.assertFalse(resultFuture.get().isSuccessful());
152 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
153 Assert.assertEquals(43L,
154 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
155 Assert.assertEquals(45L,
156 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
157 Assert.assertEquals(2, resultFuture.get().getErrors().size());
160 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
161 inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
162 final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
163 Assert.assertEquals(2, allValues.size());
164 Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
165 Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
166 Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
167 Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
169 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
174 public void testAddMetersBatch_success() throws Exception {
175 Mockito.when(salMeterService.addMeter(Mockito.<AddMeterInput>any()))
176 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
178 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
180 .setBarrierAfter(true)
181 .setBatchAddMeters(Lists.newArrayList(
182 createEmptyBatchAddMeter(42L),
183 createEmptyBatchAddMeter(43L)))
186 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
188 Assert.assertTrue(resultFuture.isDone());
189 Assert.assertTrue(resultFuture.get().isSuccessful());
191 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
192 inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
193 final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
194 Assert.assertEquals(2, allValues.size());
195 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
196 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
198 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
202 public void testAddMetersBatch_failure() throws Exception {
203 Mockito.when(salMeterService.addMeter(Mockito.<AddMeterInput>any()))
204 .thenReturn(RpcResultBuilder.<AddMeterOutput>failed()
205 .withError(RpcError.ErrorType.APPLICATION, "ut-groupAddError")
208 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
210 .setBarrierAfter(true)
211 .setBatchAddMeters(Lists.newArrayList(
212 createEmptyBatchAddMeter(42L),
213 createEmptyBatchAddMeter(43L)))
216 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
218 Assert.assertTrue(resultFuture.isDone());
219 Assert.assertFalse(resultFuture.get().isSuccessful());
220 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
221 Assert.assertEquals(42L,
222 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
223 Assert.assertEquals(43L,
224 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
225 Assert.assertEquals(2, resultFuture.get().getErrors().size());
228 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
229 inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
230 final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
231 Assert.assertEquals(2, allValues.size());
232 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
233 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
235 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
239 public void testRemoveMetersBatch_success() throws Exception {
240 Mockito.when(salMeterService.removeMeter(Mockito.<RemoveMeterInput>any()))
241 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
243 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
245 .setBarrierAfter(true)
246 .setBatchRemoveMeters(Lists.newArrayList(
247 createEmptyBatchRemoveMeter(42L),
248 createEmptyBatchRemoveMeter(43L)))
251 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
253 Assert.assertTrue(resultFuture.isDone());
254 Assert.assertTrue(resultFuture.get().isSuccessful());
256 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
258 inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
259 final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
260 Assert.assertEquals(2, allValues.size());
261 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
262 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
264 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
268 public void testRemoveMetersBatch_failure() throws Exception {
269 Mockito.when(salMeterService.removeMeter(Mockito.<RemoveMeterInput>any()))
270 .thenReturn(RpcResultBuilder.<RemoveMeterOutput>failed()
271 .withError(RpcError.ErrorType.APPLICATION, "ut-groupRemoveError")
274 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
276 .setBarrierAfter(true)
277 .setBatchRemoveMeters(Lists.newArrayList(
278 createEmptyBatchRemoveMeter(42L),
279 createEmptyBatchRemoveMeter(43L)))
282 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
284 Assert.assertTrue(resultFuture.isDone());
285 Assert.assertFalse(resultFuture.get().isSuccessful());
286 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
287 Assert.assertEquals(42L,
288 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
289 Assert.assertEquals(43L,
290 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
291 Assert.assertEquals(2, resultFuture.get().getErrors().size());
293 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
295 inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
296 final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
297 Assert.assertEquals(2, allValues.size());
298 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
299 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
301 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
304 private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
305 return new BatchAddMetersBuilder()
306 .setMeterId(new MeterId(groupIdValue))
310 private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
311 return new BatchRemoveMetersBuilder()
312 .setMeterId(new MeterId(groupIdValue))
316 private static BatchUpdateMeters createEmptyBatchUpdateMeter(final long groupIdValue) {
317 return new BatchUpdateMetersBuilder()
318 .setOriginalBatchedMeter(
319 new OriginalBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue)).build())
320 .setUpdatedBatchedMeter(
321 new UpdatedBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue + 1)).build())