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