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.List;
15 import java.util.concurrent.Future;
16 import org.junit.After;
17 import org.junit.Assert;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.mockito.ArgumentCaptor;
22 import org.mockito.ArgumentMatchers;
23 import org.mockito.Captor;
24 import org.mockito.InOrder;
25 import org.mockito.Mock;
26 import org.mockito.Mockito;
27 import org.mockito.runners.MockitoJUnitRunner;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInput;
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.remove.meters.batch.input.BatchRemoveMeters;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMetersBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMetersBuilder;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
65 import org.opendaylight.yangtools.yang.common.RpcError;
66 import org.opendaylight.yangtools.yang.common.RpcResult;
67 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
70 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
72 @RunWith(MockitoJUnitRunner.class)
73 public class SalMetersBatchServiceImplTest {
75 public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
76 public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
77 public static final NodeRef NODE_REF =
78 new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
81 private SalMeterService salMeterService;
83 private FlowCapableTransactionService transactionService;
85 private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
87 private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
89 private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
91 private SalMetersBatchServiceImpl salMetersBatchService;
94 public void setUp() throws Exception {
95 salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
97 Mockito.when(transactionService.sendBarrier(any()))
98 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
102 public void tearDown() throws Exception {
103 Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
107 public void testUpdateMetersBatch_success() throws Exception {
108 Mockito.when(salMeterService.updateMeter(Mockito.<UpdateMeterInput>any()))
109 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
111 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
113 .setBarrierAfter(true)
114 .setBatchUpdateMeters(Lists.newArrayList(
115 createEmptyBatchUpdateMeter(42L),
116 createEmptyBatchUpdateMeter(44L)))
119 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
121 Assert.assertTrue(resultFuture.isDone());
122 Assert.assertTrue(resultFuture.get().isSuccessful());
124 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
125 inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
126 final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
127 Assert.assertEquals(2, allValues.size());
128 Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
129 Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
130 Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
131 Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
133 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
137 public void testUpdateMetersBatch_failure() throws Exception {
138 Mockito.when(salMeterService.updateMeter(Mockito.<UpdateMeterInput>any()))
139 .thenReturn(RpcResultBuilder.<UpdateMeterOutput>failed()
140 .withError(RpcError.ErrorType.APPLICATION, "ur-groupUpdateError")
143 final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
145 .setBarrierAfter(true)
146 .setBatchUpdateMeters(Lists.newArrayList(
147 createEmptyBatchUpdateMeter(42L),
148 createEmptyBatchUpdateMeter(44L)))
151 final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
153 Assert.assertTrue(resultFuture.isDone());
154 Assert.assertFalse(resultFuture.get().isSuccessful());
155 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
156 Assert.assertEquals(43L,
157 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
158 Assert.assertEquals(45L,
159 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
160 Assert.assertEquals(2, resultFuture.get().getErrors().size());
163 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
164 inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
165 final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
166 Assert.assertEquals(2, allValues.size());
167 Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
168 Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
169 Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
170 Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
172 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
177 public void testAddMetersBatch_success() throws Exception {
178 Mockito.when(salMeterService.addMeter(Mockito.<AddMeterInput>any()))
179 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
181 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
183 .setBarrierAfter(true)
184 .setBatchAddMeters(Lists.newArrayList(
185 createEmptyBatchAddMeter(42L),
186 createEmptyBatchAddMeter(43L)))
189 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
191 Assert.assertTrue(resultFuture.isDone());
192 Assert.assertTrue(resultFuture.get().isSuccessful());
194 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
195 inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
196 final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
197 Assert.assertEquals(2, allValues.size());
198 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
199 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
201 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
205 public void testAddMetersBatch_failure() throws Exception {
206 Mockito.when(salMeterService.addMeter(Mockito.<AddMeterInput>any()))
207 .thenReturn(RpcResultBuilder.<AddMeterOutput>failed()
208 .withError(RpcError.ErrorType.APPLICATION, "ut-groupAddError")
211 final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
213 .setBarrierAfter(true)
214 .setBatchAddMeters(Lists.newArrayList(
215 createEmptyBatchAddMeter(42L),
216 createEmptyBatchAddMeter(43L)))
219 final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
221 Assert.assertTrue(resultFuture.isDone());
222 Assert.assertFalse(resultFuture.get().isSuccessful());
223 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
224 Assert.assertEquals(42L,
225 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
226 Assert.assertEquals(43L,
227 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
228 Assert.assertEquals(2, resultFuture.get().getErrors().size());
231 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
232 inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
233 final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
234 Assert.assertEquals(2, allValues.size());
235 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
236 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
238 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
242 public void testRemoveMetersBatch_success() throws Exception {
243 Mockito.when(salMeterService.removeMeter(Mockito.<RemoveMeterInput>any()))
244 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
246 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
248 .setBarrierAfter(true)
249 .setBatchRemoveMeters(Lists.newArrayList(
250 createEmptyBatchRemoveMeter(42L),
251 createEmptyBatchRemoveMeter(43L)))
254 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
256 Assert.assertTrue(resultFuture.isDone());
257 Assert.assertTrue(resultFuture.get().isSuccessful());
259 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
261 inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
262 final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
263 Assert.assertEquals(2, allValues.size());
264 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
265 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
267 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
271 public void testRemoveMetersBatch_failure() throws Exception {
272 Mockito.when(salMeterService.removeMeter(Mockito.<RemoveMeterInput>any()))
273 .thenReturn(RpcResultBuilder.<RemoveMeterOutput>failed()
274 .withError(RpcError.ErrorType.APPLICATION, "ut-groupRemoveError")
277 final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
279 .setBarrierAfter(true)
280 .setBatchRemoveMeters(Lists.newArrayList(
281 createEmptyBatchRemoveMeter(42L),
282 createEmptyBatchRemoveMeter(43L)))
285 final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
287 Assert.assertTrue(resultFuture.isDone());
288 Assert.assertFalse(resultFuture.get().isSuccessful());
289 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
290 Assert.assertEquals(42L,
291 resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
292 Assert.assertEquals(43L,
293 resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
294 Assert.assertEquals(2, resultFuture.get().getErrors().size());
296 final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
298 inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
299 final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
300 Assert.assertEquals(2, allValues.size());
301 Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
302 Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
304 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
307 private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
308 return new BatchAddMetersBuilder()
309 .setMeterId(new MeterId(groupIdValue))
313 private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
314 return new BatchRemoveMetersBuilder()
315 .setMeterId(new MeterId(groupIdValue))
319 private static BatchUpdateMeters createEmptyBatchUpdateMeter(final long groupIdValue) {
320 return new BatchUpdateMetersBuilder()
321 .setOriginalBatchedMeter(
322 new OriginalBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue)).build())
323 .setUpdatedBatchedMeter(
324 new UpdatedBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue + 1)).build())