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.runners.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.SendBarrierInput;
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.remove.groups.batch.input.BatchRemoveGroups;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroupsBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroups;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroupsBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
62 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
63 import org.opendaylight.yangtools.yang.common.RpcError;
64 import org.opendaylight.yangtools.yang.common.RpcResult;
65 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
68 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl}.
70 @RunWith(MockitoJUnitRunner.class)
71 public class SalGroupsBatchServiceImplTest {
73 public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
74 public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
75 public static final NodeRef NODE_REF =
76 new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
79 private SalGroupService salGroupService;
81 private FlowCapableTransactionService transactionService;
83 private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
85 private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
87 private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
89 private SalGroupsBatchServiceImpl salGroupsBatchService;
93 public void setUp() throws Exception {
94 salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
96 Mockito.when(transactionService.sendBarrier(ArgumentMatchers.<SendBarrierInput>any()))
97 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
101 public void tearDown() throws Exception {
102 Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
106 public void testUpdateGroupsBatch_success() throws Exception {
107 Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
108 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
110 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
112 .setBarrierAfter(true)
113 .setBatchUpdateGroups(Lists.newArrayList(
114 createEmptyBatchUpdateGroup(42L),
115 createEmptyBatchUpdateGroup(44L)))
118 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
120 Assert.assertTrue(resultFuture.isDone());
121 Assert.assertTrue(resultFuture.get().isSuccessful());
123 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
124 inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
125 final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
126 Assert.assertEquals(2, allValues.size());
127 Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
128 Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
129 Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
130 Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
132 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
136 public void testUpdateGroupsBatch_failure() throws Exception {
137 Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
138 .thenReturn(RpcResultBuilder.<UpdateGroupOutput>failed()
139 .withError(RpcError.ErrorType.APPLICATION, "ur-groupUpdateError")
142 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
144 .setBarrierAfter(true)
145 .setBatchUpdateGroups(Lists.newArrayList(
146 createEmptyBatchUpdateGroup(42L),
147 createEmptyBatchUpdateGroup(44L)))
150 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
152 Assert.assertTrue(resultFuture.isDone());
153 Assert.assertFalse(resultFuture.get().isSuccessful());
154 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
155 Assert.assertEquals(43L,
156 resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
157 Assert.assertEquals(45L,
158 resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
159 Assert.assertEquals(2, resultFuture.get().getErrors().size());
162 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
163 inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
164 final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
165 Assert.assertEquals(2, allValues.size());
166 Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
167 Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
168 Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
169 Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
171 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
176 public void testAddGroupsBatch_success() throws Exception {
177 Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
178 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
180 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
182 .setBarrierAfter(true)
183 .setBatchAddGroups(Lists.newArrayList(
184 createEmptyBatchAddGroup(42L),
185 createEmptyBatchAddGroup(43L)))
188 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
190 Assert.assertTrue(resultFuture.isDone());
191 Assert.assertTrue(resultFuture.get().isSuccessful());
193 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
194 inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
195 final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
196 Assert.assertEquals(2, allValues.size());
197 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
198 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
200 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
204 public void testAddGroupsBatch_failure() throws Exception {
205 Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
206 .thenReturn(RpcResultBuilder.<AddGroupOutput>failed()
207 .withError(RpcError.ErrorType.APPLICATION, "ut-groupAddError")
210 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
212 .setBarrierAfter(true)
213 .setBatchAddGroups(Lists.newArrayList(
214 createEmptyBatchAddGroup(42L),
215 createEmptyBatchAddGroup(43L)))
218 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
220 Assert.assertTrue(resultFuture.isDone());
221 Assert.assertFalse(resultFuture.get().isSuccessful());
222 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
223 Assert.assertEquals(42L,
224 resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
225 Assert.assertEquals(43L,
226 resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
227 Assert.assertEquals(2, resultFuture.get().getErrors().size());
230 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
231 inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
232 final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
233 Assert.assertEquals(2, allValues.size());
234 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
235 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
237 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
241 public void testRemoveGroupsBatch_success() throws Exception {
242 Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
243 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
245 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
247 .setBarrierAfter(true)
248 .setBatchRemoveGroups(Lists.newArrayList(
249 createEmptyBatchRemoveGroup(42L),
250 createEmptyBatchRemoveGroup(43L)))
253 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
255 Assert.assertTrue(resultFuture.isDone());
256 Assert.assertTrue(resultFuture.get().isSuccessful());
258 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
260 inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
261 final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
262 Assert.assertEquals(2, allValues.size());
263 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
264 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
266 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
270 public void testRemoveGroupsBatch_failure() throws Exception {
271 Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
272 .thenReturn(RpcResultBuilder.<RemoveGroupOutput>failed()
273 .withError(RpcError.ErrorType.APPLICATION, "ut-groupRemoveError")
276 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
278 .setBarrierAfter(true)
279 .setBatchRemoveGroups(Lists.newArrayList(
280 createEmptyBatchRemoveGroup(42L),
281 createEmptyBatchRemoveGroup(43L)))
284 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
286 Assert.assertTrue(resultFuture.isDone());
287 Assert.assertFalse(resultFuture.get().isSuccessful());
288 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
289 Assert.assertEquals(42L,
290 resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
291 Assert.assertEquals(43L,
292 resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
293 Assert.assertEquals(2, resultFuture.get().getErrors().size());
295 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
297 inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
298 final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
299 Assert.assertEquals(2, allValues.size());
300 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
301 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
303 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.<SendBarrierInput>any());
306 private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
307 return new BatchAddGroupsBuilder()
308 .setGroupId(new GroupId(groupIdValue))
312 private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
313 return new BatchRemoveGroupsBuilder()
314 .setGroupId(new GroupId(groupIdValue))
318 private static BatchUpdateGroups createEmptyBatchUpdateGroup(final long groupIdValue) {
319 return new BatchUpdateGroupsBuilder()
320 .setOriginalBatchedGroup(
321 new OriginalBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue)).build())
322 .setUpdatedBatchedGroup(
323 new UpdatedBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue + 1)).build())