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.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;
71 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl}.
73 @RunWith(MockitoJUnitRunner.class)
74 public class SalGroupsBatchServiceImplTest {
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));
82 private SalGroupService salGroupService;
84 private FlowCapableTransactionService transactionService;
86 private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
88 private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
90 private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
92 private SalGroupsBatchServiceImpl salGroupsBatchService;
97 salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
99 Mockito.when(transactionService.sendBarrier(ArgumentMatchers.any()))
100 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
104 public void tearDown() {
105 Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
109 public void testUpdateGroupsBatch_success() throws Exception {
110 Mockito.when(salGroupService.updateGroup(Mockito.any()))
111 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
113 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
115 .setBarrierAfter(true)
116 .setBatchUpdateGroups(Lists.newArrayList(
117 createEmptyBatchUpdateGroup(42L),
118 createEmptyBatchUpdateGroup(44L)))
121 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
123 Assert.assertTrue(resultFuture.isDone());
124 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
135 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
145 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
147 .setBarrierAfter(true)
148 .setBatchUpdateGroups(Lists.newArrayList(
149 createEmptyBatchUpdateGroup(42L),
150 createEmptyBatchUpdateGroup(44L)))
153 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
154 Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
155 .values().iterator();
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());
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());
174 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
179 public void testAddGroupsBatch_success() throws Exception {
180 Mockito.when(salGroupService.addGroup(Mockito.any()))
181 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
183 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
185 .setBarrierAfter(true)
186 .setBatchAddGroups(BindingMap.ordered(
187 createEmptyBatchAddGroup(42L),
188 createEmptyBatchAddGroup(43L)))
191 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
193 Assert.assertTrue(resultFuture.isDone());
194 Assert.assertTrue(resultFuture.get().isSuccessful());
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());
203 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
213 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
215 .setBarrierAfter(true)
216 .setBatchAddGroups(BindingMap.ordered(
217 createEmptyBatchAddGroup(42L),
218 createEmptyBatchAddGroup(43L)))
221 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
222 Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
223 .values().iterator();
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());
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());
240 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
244 public void testRemoveGroupsBatch_success() throws Exception {
245 Mockito.when(salGroupService.removeGroup(Mockito.any()))
246 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
248 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
250 .setBarrierAfter(true)
251 .setBatchRemoveGroups(BindingMap.ordered(
252 createEmptyBatchRemoveGroup(42L),
253 createEmptyBatchRemoveGroup(43L)))
256 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
258 Assert.assertTrue(resultFuture.isDone());
259 Assert.assertTrue(resultFuture.get().isSuccessful());
261 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
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());
269 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
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")
279 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
281 .setBarrierAfter(true)
282 .setBatchRemoveGroups(BindingMap.ordered(
283 createEmptyBatchRemoveGroup(42L),
284 createEmptyBatchRemoveGroup(43L)))
287 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
288 Iterator<BatchFailedGroupsOutput> iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
289 .values().iterator();
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());
298 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
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());
306 inOrder.verify(transactionService).sendBarrier(ArgumentMatchers.any());
309 private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
310 return new BatchAddGroupsBuilder()
311 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
315 private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
316 return new BatchRemoveGroupsBuilder()
317 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
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())