OPNFLWPLUG-1032: Neon-MRI: Bump odlparent, yangtools, mdsal
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / services / sal / SalMetersBatchServiceImplTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.sal;
10
11 import static org.mockito.ArgumentMatchers.any;
12
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;
68
69 /**
70  * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
71  */
72 @RunWith(MockitoJUnitRunner.class)
73 public class SalMetersBatchServiceImplTest {
74
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));
79
80     @Mock
81     private SalMeterService salMeterService;
82     @Mock
83     private FlowCapableTransactionService transactionService;
84     @Captor
85     private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
86     @Captor
87     private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
88     @Captor
89     private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
90
91     private SalMetersBatchServiceImpl salMetersBatchService;
92
93     @Before
94     public void setUp() throws Exception {
95         salMetersBatchService = new SalMetersBatchServiceImpl(salMeterService, transactionService);
96
97         Mockito.when(transactionService.sendBarrier(any()))
98                 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
99     }
100
101     @After
102     public void tearDown() throws Exception {
103         Mockito.verifyNoMoreInteractions(salMeterService, transactionService);
104     }
105
106     @Test
107     public void testUpdateMetersBatch_success() throws Exception {
108         Mockito.when(salMeterService.updateMeter(Mockito.<UpdateMeterInput>any()))
109                 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
110
111         final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
112                 .setNode(NODE_REF)
113                 .setBarrierAfter(true)
114                 .setBatchUpdateMeters(Lists.newArrayList(
115                         createEmptyBatchUpdateMeter(42L),
116                         createEmptyBatchUpdateMeter(44L)))
117                 .build();
118
119         final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
120
121         Assert.assertTrue(resultFuture.isDone());
122         Assert.assertTrue(resultFuture.get().isSuccessful());
123
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());
132
133         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
134     }
135
136     @Test
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")
141                         .buildFuture());
142
143         final UpdateMetersBatchInput input = new UpdateMetersBatchInputBuilder()
144                 .setNode(NODE_REF)
145                 .setBarrierAfter(true)
146                 .setBatchUpdateMeters(Lists.newArrayList(
147                         createEmptyBatchUpdateMeter(42L),
148                         createEmptyBatchUpdateMeter(44L)))
149                 .build();
150
151         final Future<RpcResult<UpdateMetersBatchOutput>> resultFuture = salMetersBatchService.updateMetersBatch(input);
152
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());
161
162
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());
171
172         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
173     }
174
175
176     @Test
177     public void testAddMetersBatch_success() throws Exception {
178         Mockito.when(salMeterService.addMeter(Mockito.<AddMeterInput>any()))
179                 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
180
181         final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
182                 .setNode(NODE_REF)
183                 .setBarrierAfter(true)
184                 .setBatchAddMeters(Lists.newArrayList(
185                         createEmptyBatchAddMeter(42L),
186                         createEmptyBatchAddMeter(43L)))
187                 .build();
188
189         final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
190
191         Assert.assertTrue(resultFuture.isDone());
192         Assert.assertTrue(resultFuture.get().isSuccessful());
193
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());
200
201         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
202     }
203
204     @Test
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")
209                         .buildFuture());
210
211         final AddMetersBatchInput input = new AddMetersBatchInputBuilder()
212                 .setNode(NODE_REF)
213                 .setBarrierAfter(true)
214                 .setBatchAddMeters(Lists.newArrayList(
215                         createEmptyBatchAddMeter(42L),
216                         createEmptyBatchAddMeter(43L)))
217                 .build();
218
219         final Future<RpcResult<AddMetersBatchOutput>> resultFuture = salMetersBatchService.addMetersBatch(input);
220
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());
229
230
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());
237
238         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
239     }
240
241     @Test
242     public void testRemoveMetersBatch_success() throws Exception {
243         Mockito.when(salMeterService.removeMeter(Mockito.<RemoveMeterInput>any()))
244                 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
245
246         final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
247                 .setNode(NODE_REF)
248                 .setBarrierAfter(true)
249                 .setBatchRemoveMeters(Lists.newArrayList(
250                         createEmptyBatchRemoveMeter(42L),
251                         createEmptyBatchRemoveMeter(43L)))
252                 .build();
253
254         final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
255
256         Assert.assertTrue(resultFuture.isDone());
257         Assert.assertTrue(resultFuture.get().isSuccessful());
258
259         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
260
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());
266
267         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
268     }
269
270     @Test
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")
275                         .buildFuture());
276
277         final RemoveMetersBatchInput input = new RemoveMetersBatchInputBuilder()
278                 .setNode(NODE_REF)
279                 .setBarrierAfter(true)
280                 .setBatchRemoveMeters(Lists.newArrayList(
281                         createEmptyBatchRemoveMeter(42L),
282                         createEmptyBatchRemoveMeter(43L)))
283                 .build();
284
285         final Future<RpcResult<RemoveMetersBatchOutput>> resultFuture = salMetersBatchService.removeMetersBatch(input);
286
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());
295
296         final InOrder inOrder = Mockito.inOrder(salMeterService, transactionService);
297
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());
303
304         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
305     }
306
307     private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
308         return new BatchAddMetersBuilder()
309                 .setMeterId(new MeterId(groupIdValue))
310                 .build();
311     }
312
313     private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
314         return new BatchRemoveMetersBuilder()
315                 .setMeterId(new MeterId(groupIdValue))
316                 .build();
317     }
318
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())
325                 .build();
326     }
327 }