BUG-5574: bulk meters proposal
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / services / SalMetersBatchServiceImplTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.impl.services;
10
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;
65
66 /**
67  * Test for {@link SalMetersBatchServiceImpl}.
68  */
69 @RunWith(MockitoJUnitRunner.class)
70 public class SalMetersBatchServiceImplTest {
71
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 = new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
75
76     @Mock
77     private SalMeterService salMeterService;
78     @Mock
79     private FlowCapableTransactionService transactionService;
80     @Captor
81     private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
82     @Captor
83     private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
84     @Captor
85     private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
86
87     private SalMetersBatchServiceImpl salMetersBatchService;
88
89     @Before
90     public void setUp() throws Exception {
91         salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
92
93         Mockito.when(transactionService.sendBarrier(Matchers.<SendBarrierInput>any()))
94                 .thenReturn(RpcResultBuilder.<Void>success().buildFuture());
95     }
96
97     @After
98     public void tearDown() throws Exception {
99         Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
100     }
101
102     @Test
103     public void testUpdateMetersBatch_success() throws Exception {
104         Mockito.when(salMeterService.updateMeter(Mockito.<UpdateMeterInput>any()))
105                 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
106
107         final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
108                 .setNode(NODE_REF)
109                 .setBarrierAfter(true)
110                 .setBatchUpdateMeters(Lists.newArrayList(
111                         createEmptyBatchUpdateMeter(42L),
112                         createEmptyBatchUpdateMeter(44L)))
113                 .build();
114
115         final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
116
117         Assert.assertTrue(resultFuture.isDone());
118         Assert.assertTrue(resultFuture.get().isSuccessful());
119
120         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
121         inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
122         final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
123         Assert.assertEquals(2, allValues.size());
124         Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
125         Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
126         Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
127         Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
128
129         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
130     }
131
132     @Test
133     public void testUpdateMetersBatch_failure() throws Exception {
134         Mockito.when(salMeterService.updateMeter(Mockito.<UpdateMeterInput>any()))
135                 .thenReturn(RpcResultBuilder.<UpdateMeterOutput>failed()
136                         .withError(RpcError.ErrorType.APPLICATION, "ur-groupUpdateError")
137                         .buildFuture());
138
139         final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
140                 .setNode(NODE_REF)
141                 .setBarrierAfter(true)
142                 .setBatchUpdateMeters(Lists.newArrayList(
143                         createEmptyBatchUpdateMeter(42L),
144                         createEmptyBatchUpdateMeter(44L)))
145                 .build();
146
147         final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
148
149         Assert.assertTrue(resultFuture.isDone());
150         Assert.assertFalse(resultFuture.get().isSuccessful());
151         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
152         Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
153         Assert.assertEquals(45L, resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
154         Assert.assertEquals(2, resultFuture.get().getErrors().size());
155
156
157         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
158         inOrder.verify(salMeterService, Mockito.times(2)).updateMeter(updateMeterInputCpt.capture());
159         final List<UpdateMeterInput> allValues = updateMeterInputCpt.getAllValues();
160         Assert.assertEquals(2, allValues.size());
161         Assert.assertEquals(42, allValues.get(0).getOriginalMeter().getMeterId().getValue().longValue());
162         Assert.assertEquals(43, allValues.get(0).getUpdatedMeter().getMeterId().getValue().longValue());
163         Assert.assertEquals(44, allValues.get(1).getOriginalMeter().getMeterId().getValue().longValue());
164         Assert.assertEquals(45, allValues.get(1).getUpdatedMeter().getMeterId().getValue().longValue());
165
166         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
167     }
168
169
170     @Test
171     public void testAddMetersBatch_success() throws Exception {
172         Mockito.when(salMeterService.addMeter(Mockito.<AddMeterInput>any()))
173                 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
174
175         final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
176                 .setNode(NODE_REF)
177                 .setBarrierAfter(true)
178                 .setBatchAddMeters(Lists.newArrayList(
179                         createEmptyBatchAddMeter(42L),
180                         createEmptyBatchAddMeter(43L)))
181                 .build();
182
183         final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
184
185         Assert.assertTrue(resultFuture.isDone());
186         Assert.assertTrue(resultFuture.get().isSuccessful());
187
188         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
189         inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
190         final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
191         Assert.assertEquals(2, allValues.size());
192         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
193         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
194
195         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
196     }
197
198     @Test
199     public void testAddMetersBatch_failure() throws Exception {
200         Mockito.when(salMeterService.addMeter(Mockito.<AddMeterInput>any()))
201                 .thenReturn(RpcResultBuilder.<AddMeterOutput>failed().withError(RpcError.ErrorType.APPLICATION, "ut-groupAddError")
202                         .buildFuture());
203
204         final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
205                 .setNode(NODE_REF)
206                 .setBarrierAfter(true)
207                 .setBatchAddMeters(Lists.newArrayList(
208                         createEmptyBatchAddMeter(42L),
209                         createEmptyBatchAddMeter(43L)))
210                 .build();
211
212         final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
213
214         Assert.assertTrue(resultFuture.isDone());
215         Assert.assertFalse(resultFuture.get().isSuccessful());
216         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
217         Assert.assertEquals(42L, resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
218         Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
219         Assert.assertEquals(2, resultFuture.get().getErrors().size());
220
221
222         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
223         inOrder.verify(salMeterService, Mockito.times(2)).addMeter(addMeterInputCpt.capture());
224         final List<AddMeterInput> allValues = addMeterInputCpt.getAllValues();
225         Assert.assertEquals(2, allValues.size());
226         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
227         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
228
229         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
230     }
231
232     @Test
233     public void testRemoveMetersBatch_success() throws Exception {
234         Mockito.when(salMeterService.removeMeter(Mockito.<RemoveMeterInput>any()))
235                 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
236
237         final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
238                 .setNode(NODE_REF)
239                 .setBarrierAfter(true)
240                 .setBatchRemoveMeters(Lists.newArrayList(
241                         createEmptyBatchRemoveMeter(42L),
242                         createEmptyBatchRemoveMeter(43L)))
243                 .build();
244
245         final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
246
247         Assert.assertTrue(resultFuture.isDone());
248         Assert.assertTrue(resultFuture.get().isSuccessful());
249
250         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
251
252         inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
253         final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
254         Assert.assertEquals(2, allValues.size());
255         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
256         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
257
258         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
259     }
260
261     @Test
262     public void testRemoveMetersBatch_failure() throws Exception {
263         Mockito.when(salMeterService.removeMeter(Mockito.<RemoveMeterInput>any()))
264                 .thenReturn(RpcResultBuilder.<RemoveMeterOutput>failed().withError(RpcError.ErrorType.APPLICATION, "ut-groupRemoveError")
265                         .buildFuture());
266
267         final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
268                 .setNode(NODE_REF)
269                 .setBarrierAfter(true)
270                 .setBatchRemoveMeters(Lists.newArrayList(
271                         createEmptyBatchRemoveMeter(42L),
272                         createEmptyBatchRemoveMeter(43L)))
273                 .build();
274
275         final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
276
277         Assert.assertTrue(resultFuture.isDone());
278         Assert.assertFalse(resultFuture.get().isSuccessful());
279         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedMetersOutput().size());
280         Assert.assertEquals(42L, resultFuture.get().getResult().getBatchFailedMetersOutput().get(0).getMeterId().getValue().longValue());
281         Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedMetersOutput().get(1).getMeterId().getValue().longValue());
282         Assert.assertEquals(2, resultFuture.get().getErrors().size());
283
284         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
285
286         inOrder.verify(salMeterService, Mockito.times(2)).removeMeter(removeMeterInputCpt.capture());
287         final List<RemoveMeterInput> allValues = removeMeterInputCpt.getAllValues();
288         Assert.assertEquals(2, allValues.size());
289         Assert.assertEquals(42L, allValues.get(0).getMeterId().getValue().longValue());
290         Assert.assertEquals(43L, allValues.get(1).getMeterId().getValue().longValue());
291
292         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
293     }
294
295     private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
296         return new BatchAddMetersBuilder()
297                 .setMeterId(new MeterId(groupIdValue))
298                 .build();
299     }
300
301     private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
302         return new BatchRemoveMetersBuilder()
303                 .setMeterId(new MeterId(groupIdValue))
304                 .build();
305     }
306
307     private static BatchUpdateMeters createEmptyBatchUpdateMeter(final long groupIdValue) {
308         return new BatchUpdateMetersBuilder()
309                 .setOriginalBatchedMeter(new OriginalBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue)).build())
310                 .setUpdatedBatchedMeter(new UpdatedBatchedMeterBuilder(createEmptyBatchAddMeter(groupIdValue + 1)).build())
311                 .build();
312     }
313 }