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
8 package org.opendaylight.openflowplugin.impl.services.sal;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.inOrder;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verifyNoMoreInteractions;
17 import static org.mockito.Mockito.when;
19 import java.util.List;
20 import org.junit.After;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.ArgumentCaptor;
25 import org.mockito.Captor;
26 import org.mockito.Mock;
27 import org.mockito.junit.MockitoJUnitRunner;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeter;
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.RemoveMeter;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutputBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeter;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
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.RemoveMetersBatchInputBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMeters;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMetersBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.OriginalBatchedMeterBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.input.update.grouping.UpdatedBatchedMeterBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMeters;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMetersBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMetersBuilder;
59 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
60 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
61 import org.opendaylight.yangtools.yang.common.ErrorType;
62 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
63 import org.opendaylight.yangtools.yang.common.Uint32;
66 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
68 @RunWith(MockitoJUnitRunner.class)
69 public class SalMetersBatchServiceImplTest {
70 public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
71 public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
72 public static final NodeRef NODE_REF =
73 new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
76 private AddMeter addMeter;
78 private RemoveMeter removeMeter;
80 private UpdateMeter updateMeter;
82 private SendBarrier sendBarrier;
84 private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
86 private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
88 private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
90 private AddMetersBatchImpl addMetersBatch;
91 private RemoveMetersBatchImpl removeMetersBatch;
92 private UpdateMetersBatchImpl updateMetersBatch;
96 addMetersBatch = new AddMetersBatchImpl(addMeter, sendBarrier);
97 removeMetersBatch = new RemoveMetersBatchImpl(removeMeter, sendBarrier);
98 updateMetersBatch = new UpdateMetersBatchImpl(updateMeter, sendBarrier);
100 when(sendBarrier.invoke(any())).thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
104 public void tearDown() {
105 verifyNoMoreInteractions(addMeter, removeMeter, updateMeter, sendBarrier);
109 public void testUpdateMetersBatch_success() throws Exception {
110 when(updateMeter.invoke(any()))
111 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
113 final var input = new UpdateMetersBatchInputBuilder()
115 .setBarrierAfter(true)
116 .setBatchUpdateMeters(List.of(
117 createEmptyBatchUpdateMeter(42L),
118 createEmptyBatchUpdateMeter(44L)))
121 final var resultFuture = updateMetersBatch.invoke(input);
123 assertTrue(resultFuture.isDone());
124 assertTrue(resultFuture.get().isSuccessful());
126 final var inOrder = inOrder(updateMeter, sendBarrier);
127 inOrder.verify(updateMeter, times(2)).invoke(updateMeterInputCpt.capture());
128 final var allValues = updateMeterInputCpt.getAllValues();
129 assertEquals(2, allValues.size());
130 assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
131 assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
132 assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
133 assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
135 inOrder.verify(sendBarrier).invoke(any());
139 public void testUpdateMetersBatch_failure() throws Exception {
140 when(updateMeter.invoke(any()))
141 .thenReturn(RpcResultBuilder.<UpdateMeterOutput>failed()
142 .withError(ErrorType.APPLICATION, "ur-groupUpdateError")
145 final var input = new UpdateMetersBatchInputBuilder()
147 .setBarrierAfter(true)
148 .setBatchUpdateMeters(List.of(
149 createEmptyBatchUpdateMeter(42L),
150 createEmptyBatchUpdateMeter(44L)))
153 final var resultFuture = updateMetersBatch.invoke(input);
154 final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
155 .values().iterator();
157 assertTrue(resultFuture.isDone());
158 assertFalse(resultFuture.get().isSuccessful());
159 assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
160 assertEquals(43L, iterator.next().getMeterId().getValue().longValue());
161 assertEquals(45L,iterator.next().getMeterId().getValue().longValue());
162 assertEquals(2, resultFuture.get().getErrors().size());
165 final var inOrder = inOrder(updateMeter, sendBarrier);
166 inOrder.verify(updateMeter, times(2)).invoke(updateMeterInputCpt.capture());
167 final var allValues = updateMeterInputCpt.getAllValues();
168 assertEquals(2, allValues.size());
169 assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
170 assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
171 assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
172 assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
174 inOrder.verify(sendBarrier).invoke(any());
178 public void testAddMetersBatch_success() throws Exception {
179 when(addMeter.invoke(any()))
180 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
182 final var input = new AddMetersBatchInputBuilder()
184 .setBarrierAfter(true)
185 .setBatchAddMeters(BindingMap.ordered(
186 createEmptyBatchAddMeter(42L),
187 createEmptyBatchAddMeter(43L)))
190 final var resultFuture = addMetersBatch.invoke(input);
192 assertTrue(resultFuture.isDone());
193 assertTrue(resultFuture.get().isSuccessful());
195 final var inOrder = inOrder(addMeter, sendBarrier);
196 inOrder.verify(addMeter, times(2)).invoke(addMeterInputCpt.capture());
197 final var allValues = addMeterInputCpt.getAllValues();
198 assertEquals(2, allValues.size());
199 assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
200 assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
202 inOrder.verify(sendBarrier).invoke(any());
206 public void testAddMetersBatch_failure() throws Exception {
207 when(addMeter.invoke(any()))
208 .thenReturn(RpcResultBuilder.<AddMeterOutput>failed()
209 .withError(ErrorType.APPLICATION, "ut-groupAddError")
212 final var input = new AddMetersBatchInputBuilder()
214 .setBarrierAfter(true)
215 .setBatchAddMeters(BindingMap.ordered(
216 createEmptyBatchAddMeter(42L),
217 createEmptyBatchAddMeter(43L)))
220 final var resultFuture = addMetersBatch.invoke(input);
221 final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput().values().iterator();
223 assertTrue(resultFuture.isDone());
224 assertFalse(resultFuture.get().isSuccessful());
225 assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
226 assertEquals(42L, iterator.next().getMeterId().getValue().longValue());
227 assertEquals(43L,iterator.next().getMeterId().getValue().longValue());
228 assertEquals(2, resultFuture.get().getErrors().size());
231 final var inOrder = inOrder(addMeter, sendBarrier);
232 inOrder.verify(addMeter, times(2)).invoke(addMeterInputCpt.capture());
233 final var allValues = addMeterInputCpt.getAllValues();
234 assertEquals(2, allValues.size());
235 assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
236 assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
238 inOrder.verify(sendBarrier).invoke(any());
242 public void testRemoveMetersBatch_success() throws Exception {
243 when(removeMeter.invoke(any()))
244 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
246 final var input = new RemoveMetersBatchInputBuilder()
248 .setBarrierAfter(true)
249 .setBatchRemoveMeters(BindingMap.ordered(
250 createEmptyBatchRemoveMeter(42L),
251 createEmptyBatchRemoveMeter(43L)))
254 final var resultFuture = removeMetersBatch.invoke(input);
256 assertTrue(resultFuture.isDone());
257 assertTrue(resultFuture.get().isSuccessful());
259 final var inOrder = inOrder(removeMeter, sendBarrier);
261 inOrder.verify(removeMeter, times(2)).invoke(removeMeterInputCpt.capture());
262 final var allValues = removeMeterInputCpt.getAllValues();
263 assertEquals(2, allValues.size());
264 assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
265 assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
267 inOrder.verify(sendBarrier).invoke(any());
271 public void testRemoveMetersBatch_failure() throws Exception {
272 when(removeMeter.invoke(any()))
273 .thenReturn(RpcResultBuilder.<RemoveMeterOutput>failed()
274 .withError(ErrorType.APPLICATION, "ut-groupRemoveError")
277 final var input = new RemoveMetersBatchInputBuilder()
279 .setBarrierAfter(true)
280 .setBatchRemoveMeters(BindingMap.ordered(
281 createEmptyBatchRemoveMeter(42L),
282 createEmptyBatchRemoveMeter(43L)))
285 final var resultFuture = removeMetersBatch.invoke(input);
286 final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput().values().iterator();
288 assertTrue(resultFuture.isDone());
289 assertFalse(resultFuture.get().isSuccessful());
290 assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedMetersOutput().size());
291 assertEquals(42L, iterator.next().getMeterId().getValue().longValue());
292 assertEquals(43L, iterator.next().getMeterId().getValue().longValue());
293 assertEquals(2, resultFuture.get().getErrors().size());
295 final var inOrder = inOrder(removeMeter, sendBarrier);
297 inOrder.verify(removeMeter, times(2)).invoke(removeMeterInputCpt.capture());
298 final var allValues = removeMeterInputCpt.getAllValues();
299 assertEquals(2, allValues.size());
300 assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
301 assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
303 inOrder.verify(sendBarrier).invoke(any());
306 private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
307 return new BatchAddMetersBuilder()
308 .setMeterId(new MeterId(Uint32.valueOf(groupIdValue)))
312 private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
313 return new BatchRemoveMetersBuilder()
314 .setMeterId(new MeterId(Uint32.valueOf(groupIdValue)))
318 private static BatchUpdateMeters createEmptyBatchUpdateMeter(final long groupIdValue) {
319 return new BatchUpdateMetersBuilder()
320 .setOriginalBatchedMeter(
321 new OriginalBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue)).build())
322 .setUpdatedBatchedMeter(
323 new UpdatedBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue + 1)).build())