2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.services.sal;
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;
67 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl}.
69 @RunWith(MockitoJUnitRunner.class)
70 public class SalGroupsBatchServiceImplTest {
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));
78 private SalGroupService salGroupService;
80 private FlowCapableTransactionService transactionService;
82 private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
84 private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
86 private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
88 private SalGroupsBatchServiceImpl salGroupsBatchService;
93 salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
95 Mockito.when(transactionService.sendBarrier(ArgumentMatchers.any()))
96 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
100 public void tearDown() {
101 Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
105 public void testUpdateGroupsBatch_success() throws Exception {
106 Mockito.when(salGroupService.updateGroup(Mockito.any()))
107 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
109 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
111 .setBarrierAfter(true)
112 .setBatchUpdateGroups(Lists.newArrayList(
113 createEmptyBatchUpdateGroup(42L),
114 createEmptyBatchUpdateGroup(44L)))
117 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
119 Assert.assertTrue(resultFuture.isDone());
120 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
131 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
141 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
143 .setBarrierAfter(true)
144 .setBatchUpdateGroups(Lists.newArrayList(
145 createEmptyBatchUpdateGroup(42L),
146 createEmptyBatchUpdateGroup(44L)))
149 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
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());
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());
170 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
175 public void testAddGroupsBatch_success() throws Exception {
176 Mockito.when(salGroupService.addGroup(Mockito.any()))
177 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
179 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
181 .setBarrierAfter(true)
182 .setBatchAddGroups(Lists.newArrayList(
183 createEmptyBatchAddGroup(42L),
184 createEmptyBatchAddGroup(43L)))
187 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
189 Assert.assertTrue(resultFuture.isDone());
190 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
199 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
209 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
211 .setBarrierAfter(true)
212 .setBatchAddGroups(Lists.newArrayList(
213 createEmptyBatchAddGroup(42L),
214 createEmptyBatchAddGroup(43L)))
217 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
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());
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());
236 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
240 public void testRemoveGroupsBatch_success() throws Exception {
241 Mockito.when(salGroupService.removeGroup(Mockito.any()))
242 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
244 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
246 .setBarrierAfter(true)
247 .setBatchRemoveGroups(Lists.newArrayList(
248 createEmptyBatchRemoveGroup(42L),
249 createEmptyBatchRemoveGroup(43L)))
252 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
254 Assert.assertTrue(resultFuture.isDone());
255 Assert.assertTrue(resultFuture.get().isSuccessful());
257 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
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());
265 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
275 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
277 .setBarrierAfter(true)
278 .setBatchRemoveGroups(Lists.newArrayList(
279 createEmptyBatchRemoveGroup(42L),
280 createEmptyBatchRemoveGroup(43L)))
283 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
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());
294 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
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());
302 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
305 private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
306 return new BatchAddGroupsBuilder()
307 .setGroupId(new GroupId(groupIdValue))
311 private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
312 return new BatchRemoveGroupsBuilder()
313 .setGroupId(new GroupId(groupIdValue))
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())