Decompose RPC implementation classes
[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 package org.opendaylight.openflowplugin.impl.services.sal;
9
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;
18
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;
64
65 /**
66  * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalMetersBatchServiceImpl}.
67  */
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));
74
75     @Mock
76     private AddMeter addMeter;
77     @Mock
78     private RemoveMeter removeMeter;
79     @Mock
80     private UpdateMeter updateMeter;
81     @Mock
82     private SendBarrier sendBarrier;
83     @Captor
84     private ArgumentCaptor<RemoveMeterInput> removeMeterInputCpt;
85     @Captor
86     private ArgumentCaptor<UpdateMeterInput> updateMeterInputCpt;
87     @Captor
88     private ArgumentCaptor<AddMeterInput> addMeterInputCpt;
89
90     private AddMetersBatchImpl addMetersBatch;
91     private RemoveMetersBatchImpl removeMetersBatch;
92     private UpdateMetersBatchImpl updateMetersBatch;
93
94     @Before
95     public void setUp() {
96         addMetersBatch = new AddMetersBatchImpl(addMeter, sendBarrier);
97         removeMetersBatch = new RemoveMetersBatchImpl(removeMeter, sendBarrier);
98         updateMetersBatch = new UpdateMetersBatchImpl(updateMeter, sendBarrier);
99
100         when(sendBarrier.invoke(any())).thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
101     }
102
103     @After
104     public void tearDown() {
105         verifyNoMoreInteractions(addMeter, removeMeter, updateMeter, sendBarrier);
106     }
107
108     @Test
109     public void testUpdateMetersBatch_success() throws Exception {
110         when(updateMeter.invoke(any()))
111                 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
112
113         final var input = new UpdateMetersBatchInputBuilder()
114                 .setNode(NODE_REF)
115                 .setBarrierAfter(true)
116                 .setBatchUpdateMeters(List.of(
117                         createEmptyBatchUpdateMeter(42L),
118                         createEmptyBatchUpdateMeter(44L)))
119                 .build();
120
121         final var resultFuture = updateMetersBatch.invoke(input);
122
123         assertTrue(resultFuture.isDone());
124         assertTrue(resultFuture.get().isSuccessful());
125
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());
134
135         inOrder.verify(sendBarrier).invoke(any());
136     }
137
138     @Test
139     public void testUpdateMetersBatch_failure() throws Exception {
140         when(updateMeter.invoke(any()))
141                 .thenReturn(RpcResultBuilder.<UpdateMeterOutput>failed()
142                         .withError(ErrorType.APPLICATION, "ur-groupUpdateError")
143                         .buildFuture());
144
145         final var input = new UpdateMetersBatchInputBuilder()
146                 .setNode(NODE_REF)
147                 .setBarrierAfter(true)
148                 .setBatchUpdateMeters(List.of(
149                         createEmptyBatchUpdateMeter(42L),
150                         createEmptyBatchUpdateMeter(44L)))
151                 .build();
152
153         final var resultFuture = updateMetersBatch.invoke(input);
154         final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput()
155                 .values().iterator();
156
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());
163
164
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());
173
174         inOrder.verify(sendBarrier).invoke(any());
175     }
176
177     @Test
178     public void testAddMetersBatch_success() throws Exception {
179         when(addMeter.invoke(any()))
180                 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
181
182         final var input = new AddMetersBatchInputBuilder()
183                 .setNode(NODE_REF)
184                 .setBarrierAfter(true)
185                 .setBatchAddMeters(BindingMap.ordered(
186                         createEmptyBatchAddMeter(42L),
187                         createEmptyBatchAddMeter(43L)))
188                 .build();
189
190         final var resultFuture = addMetersBatch.invoke(input);
191
192         assertTrue(resultFuture.isDone());
193         assertTrue(resultFuture.get().isSuccessful());
194
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());
201
202         inOrder.verify(sendBarrier).invoke(any());
203     }
204
205     @Test
206     public void testAddMetersBatch_failure() throws Exception {
207         when(addMeter.invoke(any()))
208                 .thenReturn(RpcResultBuilder.<AddMeterOutput>failed()
209                         .withError(ErrorType.APPLICATION, "ut-groupAddError")
210                         .buildFuture());
211
212         final var input = new AddMetersBatchInputBuilder()
213                 .setNode(NODE_REF)
214                 .setBarrierAfter(true)
215                 .setBatchAddMeters(BindingMap.ordered(
216                         createEmptyBatchAddMeter(42L),
217                         createEmptyBatchAddMeter(43L)))
218                 .build();
219
220         final var resultFuture = addMetersBatch.invoke(input);
221         final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput().values().iterator();
222
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());
229
230
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());
237
238         inOrder.verify(sendBarrier).invoke(any());
239     }
240
241     @Test
242     public void testRemoveMetersBatch_success() throws Exception {
243         when(removeMeter.invoke(any()))
244                 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
245
246         final var input = new RemoveMetersBatchInputBuilder()
247                 .setNode(NODE_REF)
248                 .setBarrierAfter(true)
249                 .setBatchRemoveMeters(BindingMap.ordered(
250                         createEmptyBatchRemoveMeter(42L),
251                         createEmptyBatchRemoveMeter(43L)))
252                 .build();
253
254         final var resultFuture = removeMetersBatch.invoke(input);
255
256         assertTrue(resultFuture.isDone());
257         assertTrue(resultFuture.get().isSuccessful());
258
259         final var inOrder = inOrder(removeMeter, sendBarrier);
260
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());
266
267         inOrder.verify(sendBarrier).invoke(any());
268     }
269
270     @Test
271     public void testRemoveMetersBatch_failure() throws Exception {
272         when(removeMeter.invoke(any()))
273                 .thenReturn(RpcResultBuilder.<RemoveMeterOutput>failed()
274                         .withError(ErrorType.APPLICATION, "ut-groupRemoveError")
275                         .buildFuture());
276
277         final var input = new RemoveMetersBatchInputBuilder()
278                 .setNode(NODE_REF)
279                 .setBarrierAfter(true)
280                 .setBatchRemoveMeters(BindingMap.ordered(
281                         createEmptyBatchRemoveMeter(42L),
282                         createEmptyBatchRemoveMeter(43L)))
283                 .build();
284
285         final var resultFuture = removeMetersBatch.invoke(input);
286         final var iterator = resultFuture.get().getResult().nonnullBatchFailedMetersOutput().values().iterator();
287
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());
294
295         final var inOrder = inOrder(removeMeter, sendBarrier);
296
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());
302
303         inOrder.verify(sendBarrier).invoke(any());
304     }
305
306     private static BatchAddMeters createEmptyBatchAddMeter(final long groupIdValue) {
307         return new BatchAddMetersBuilder()
308                 .setMeterId(new MeterId(Uint32.valueOf(groupIdValue)))
309                 .build();
310     }
311
312     private static BatchRemoveMeters createEmptyBatchRemoveMeter(final long groupIdValue) {
313         return new BatchRemoveMetersBuilder()
314                 .setMeterId(new MeterId(Uint32.valueOf(groupIdValue)))
315                 .build();
316     }
317
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())
324                 .build();
325     }
326 }