Bump MRI upstreams
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / services / sal / SalGroupsBatchServiceImplTest.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 com.google.common.collect.Lists;
12 import java.util.Iterator;
13 import java.util.List;
14 import java.util.concurrent.Future;
15 import org.junit.After;
16 import org.junit.Assert;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.junit.runner.RunWith;
20 import org.mockito.ArgumentCaptor;
21 import org.mockito.ArgumentMatchers;
22 import org.mockito.Captor;
23 import org.mockito.InOrder;
24 import org.mockito.Mock;
25 import org.mockito.Mockito;
26 import org.mockito.junit.MockitoJUnitRunner;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInputBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchInputBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.RemoveGroupsBatchOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInputBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchOutput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.add.groups.batch.input.BatchAddGroups;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.add.groups.batch.input.BatchAddGroupsBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.OriginalBatchedGroupBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.UpdatedBatchedGroupBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.output.list.grouping.BatchFailedGroupsOutput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroups;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroupsBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroups;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroupsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
64 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
65 import org.opendaylight.yangtools.yang.common.ErrorType;
66 import org.opendaylight.yangtools.yang.common.RpcResult;
67 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
68 import org.opendaylight.yangtools.yang.common.Uint32;
69
70 /**
71  * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl}.
72  */
73 @RunWith(MockitoJUnitRunner.class)
74 public class SalGroupsBatchServiceImplTest {
75
76     public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
77     public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
78     public static final NodeRef NODE_REF =
79             new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
80
81     @Mock
82     private SalGroupService salGroupService;
83     @Mock
84     private FlowCapableTransactionService transactionService;
85     @Captor
86     private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
87     @Captor
88     private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
89     @Captor
90     private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
91
92     private SalGroupsBatchServiceImpl salGroupsBatchService;
93
94
95     @Before
96     public void setUp() {
97         salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
98
99         Mockito.when(transactionService.sendBarrier(ArgumentMatchers.any()))
100                 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
101     }
102
103     @After
104     public void tearDown() {
105         Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
106     }
107
108     @Test
109     public void testUpdateGroupsBatch_success() throws Exception {
110         Mockito.when(salGroupService.updateGroup(Mockito.any()))
111                 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
112
113         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
114                 .setNode(NODE_REF)
115                 .setBarrierAfter(true)
116                 .setBatchUpdateGroups(Lists.newArrayList(
117                         createEmptyBatchUpdateGroup(42L),
118                         createEmptyBatchUpdateGroup(44L)))
119                 .build();
120
121         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
122
123         Assert.assertTrue(resultFuture.isDone());
124         Assert.assertTrue(resultFuture.get().isSuccessful());
125
126         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
127         inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
128         final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
129         Assert.assertEquals(2, allValues.size());
130         Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
131         Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
132         Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
133         Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
134
135         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
136     }
137
138     @Test
139     public void testUpdateGroupsBatch_failure() throws Exception {
140         Mockito.when(salGroupService.updateGroup(Mockito.any()))
141                 .thenReturn(RpcResultBuilder.<UpdateGroupOutput>failed()
142                         .withError(ErrorType.APPLICATION, "ur-groupUpdateError")
143                         .buildFuture());
144
145         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
146                 .setNode(NODE_REF)
147                 .setBarrierAfter(true)
148                 .setBatchUpdateGroups(Lists.newArrayList(
149                         createEmptyBatchUpdateGroup(42L),
150                         createEmptyBatchUpdateGroup(44L)))
151                 .build();
152
153         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
154         Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
155                 .values().iterator();
156
157         Assert.assertTrue(resultFuture.isDone());
158         Assert.assertFalse(resultFuture.get().isSuccessful());
159         Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
160         Assert.assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
161         Assert.assertEquals(45L, iterator.next().getGroupId().getValue().longValue());
162         Assert.assertEquals(2, resultFuture.get().getErrors().size());
163
164
165         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
166         inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
167         final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
168         Assert.assertEquals(2, allValues.size());
169         Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
170         Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
171         Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
172         Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
173
174         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
175     }
176
177
178     @Test
179     public void testAddGroupsBatch_success() throws Exception {
180         Mockito.when(salGroupService.addGroup(Mockito.any()))
181                 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
182
183         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
184                 .setNode(NODE_REF)
185                 .setBarrierAfter(true)
186                 .setBatchAddGroups(BindingMap.ordered(
187                         createEmptyBatchAddGroup(42L),
188                         createEmptyBatchAddGroup(43L)))
189                 .build();
190
191         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
192
193         Assert.assertTrue(resultFuture.isDone());
194         Assert.assertTrue(resultFuture.get().isSuccessful());
195
196         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
197         inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
198         final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
199         Assert.assertEquals(2, allValues.size());
200         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
201         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
202
203         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
204     }
205
206     @Test
207     public void testAddGroupsBatch_failure() throws Exception {
208         Mockito.when(salGroupService.addGroup(Mockito.any()))
209                 .thenReturn(RpcResultBuilder.<AddGroupOutput>failed()
210                         .withError(ErrorType.APPLICATION, "ut-groupAddError")
211                         .buildFuture());
212
213         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
214                 .setNode(NODE_REF)
215                 .setBarrierAfter(true)
216                 .setBatchAddGroups(BindingMap.ordered(
217                         createEmptyBatchAddGroup(42L),
218                         createEmptyBatchAddGroup(43L)))
219                 .build();
220
221         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
222         Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
223                 .values().iterator();
224
225         Assert.assertTrue(resultFuture.isDone());
226         Assert.assertFalse(resultFuture.get().isSuccessful());
227         Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
228         Assert.assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
229         Assert.assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
230         Assert.assertEquals(2, resultFuture.get().getErrors().size());
231
232
233         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
234         inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
235         final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
236         Assert.assertEquals(2, allValues.size());
237         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
238         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
239
240         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
241     }
242
243     @Test
244     public void testRemoveGroupsBatch_success() throws Exception {
245         Mockito.when(salGroupService.removeGroup(Mockito.any()))
246                 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
247
248         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
249                 .setNode(NODE_REF)
250                 .setBarrierAfter(true)
251                 .setBatchRemoveGroups(BindingMap.ordered(
252                         createEmptyBatchRemoveGroup(42L),
253                         createEmptyBatchRemoveGroup(43L)))
254                 .build();
255
256         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
257
258         Assert.assertTrue(resultFuture.isDone());
259         Assert.assertTrue(resultFuture.get().isSuccessful());
260
261         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
262
263         inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
264         final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
265         Assert.assertEquals(2, allValues.size());
266         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
267         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
268
269         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
270     }
271
272     @Test
273     public void testRemoveGroupsBatch_failure() throws Exception {
274         Mockito.when(salGroupService.removeGroup(Mockito.any()))
275                 .thenReturn(RpcResultBuilder.<RemoveGroupOutput>failed()
276                         .withError(ErrorType.APPLICATION, "ut-groupRemoveError")
277                         .buildFuture());
278
279         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
280                 .setNode(NODE_REF)
281                 .setBarrierAfter(true)
282                 .setBatchRemoveGroups(BindingMap.ordered(
283                         createEmptyBatchRemoveGroup(42L),
284                         createEmptyBatchRemoveGroup(43L)))
285                 .build();
286
287         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
288         Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
289                 .values().iterator();
290
291         Assert.assertTrue(resultFuture.isDone());
292         Assert.assertFalse(resultFuture.get().isSuccessful());
293         Assert.assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
294         Assert.assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
295         Assert.assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
296         Assert.assertEquals(2, resultFuture.get().getErrors().size());
297
298         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
299
300         inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
301         final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
302         Assert.assertEquals(2, allValues.size());
303         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
304         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
305
306         inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
307     }
308
309     private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
310         return new BatchAddGroupsBuilder()
311                 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
312                 .build();
313     }
314
315     private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
316         return new BatchRemoveGroupsBuilder()
317                 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
318                 .build();
319     }
320
321     private static BatchUpdateGroups createEmptyBatchUpdateGroup(final long groupIdValue) {
322         return new BatchUpdateGroupsBuilder()
323                 .setOriginalBatchedGroup(
324                         new OriginalBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue)).build())
325                 .setUpdatedBatchedGroup(
326                         new UpdatedBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue + 1)).build())
327                 .build();
328     }
329 }