2 * Copyright (c) 2016 Cisco Systems, Inc. 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;
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.Captor;
21 import org.mockito.InOrder;
22 import org.mockito.Matchers;
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.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 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 = new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
77 private SalGroupService salGroupService;
79 private FlowCapableTransactionService transactionService;
81 private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
83 private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
85 private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
87 private SalGroupsBatchServiceImpl salGroupsBatchService;
91 public void setUp() throws Exception {
92 salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
94 Mockito.when(transactionService.sendBarrier(Matchers.<SendBarrierInput>any()))
95 .thenReturn(RpcResultBuilder.<Void>success().buildFuture());
99 public void tearDown() throws Exception {
100 Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
104 public void testUpdateGroupsBatch_success() throws Exception {
105 Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
106 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
108 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
110 .setBarrierAfter(true)
111 .setBatchUpdateGroups(Lists.newArrayList(
112 createEmptyBatchUpdateGroup(42L),
113 createEmptyBatchUpdateGroup(44L)))
116 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
118 Assert.assertTrue(resultFuture.isDone());
119 Assert.assertTrue(resultFuture.get().isSuccessful());
121 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
122 inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
123 final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
124 Assert.assertEquals(2, allValues.size());
125 Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
126 Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
127 Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
128 Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
130 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
134 public void testUpdateGroupsBatch_failure() throws Exception {
135 Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
136 .thenReturn(RpcResultBuilder.<UpdateGroupOutput>failed()
137 .withError(RpcError.ErrorType.APPLICATION, "ur-groupUpdateError")
140 final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
142 .setBarrierAfter(true)
143 .setBatchUpdateGroups(Lists.newArrayList(
144 createEmptyBatchUpdateGroup(42L),
145 createEmptyBatchUpdateGroup(44L)))
148 final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
150 Assert.assertTrue(resultFuture.isDone());
151 Assert.assertFalse(resultFuture.get().isSuccessful());
152 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
153 Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
154 Assert.assertEquals(45L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
155 Assert.assertEquals(2, resultFuture.get().getErrors().size());
158 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
159 inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
160 final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
161 Assert.assertEquals(2, allValues.size());
162 Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
163 Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
164 Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
165 Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
167 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
172 public void testAddGroupsBatch_success() throws Exception {
173 Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
174 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
176 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
178 .setBarrierAfter(true)
179 .setBatchAddGroups(Lists.newArrayList(
180 createEmptyBatchAddGroup(42L),
181 createEmptyBatchAddGroup(43L)))
184 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
186 Assert.assertTrue(resultFuture.isDone());
187 Assert.assertTrue(resultFuture.get().isSuccessful());
189 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
190 inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
191 final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
192 Assert.assertEquals(2, allValues.size());
193 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
194 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
196 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
200 public void testAddGroupsBatch_failure() throws Exception {
201 Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
202 .thenReturn(RpcResultBuilder.<AddGroupOutput>failed().withError(RpcError.ErrorType.APPLICATION, "ut-groupAddError")
205 final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
207 .setBarrierAfter(true)
208 .setBatchAddGroups(Lists.newArrayList(
209 createEmptyBatchAddGroup(42L),
210 createEmptyBatchAddGroup(43L)))
213 final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
215 Assert.assertTrue(resultFuture.isDone());
216 Assert.assertFalse(resultFuture.get().isSuccessful());
217 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
218 Assert.assertEquals(42L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
219 Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
220 Assert.assertEquals(2, resultFuture.get().getErrors().size());
223 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
224 inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
225 final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
226 Assert.assertEquals(2, allValues.size());
227 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
228 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
230 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
234 public void testRemoveGroupsBatch_success() throws Exception {
235 Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
236 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
238 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
240 .setBarrierAfter(true)
241 .setBatchRemoveGroups(Lists.newArrayList(
242 createEmptyBatchRemoveGroup(42L),
243 createEmptyBatchRemoveGroup(43L)))
246 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
248 Assert.assertTrue(resultFuture.isDone());
249 Assert.assertTrue(resultFuture.get().isSuccessful());
251 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
253 inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
254 final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
255 Assert.assertEquals(2, allValues.size());
256 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
257 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
259 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
263 public void testRemoveGroupsBatch_failure() throws Exception {
264 Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
265 .thenReturn(RpcResultBuilder.<RemoveGroupOutput>failed().withError(RpcError.ErrorType.APPLICATION, "ut-groupRemoveError")
268 final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
270 .setBarrierAfter(true)
271 .setBatchRemoveGroups(Lists.newArrayList(
272 createEmptyBatchRemoveGroup(42L),
273 createEmptyBatchRemoveGroup(43L)))
276 final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
278 Assert.assertTrue(resultFuture.isDone());
279 Assert.assertFalse(resultFuture.get().isSuccessful());
280 Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
281 Assert.assertEquals(42L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
282 Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
283 Assert.assertEquals(2, resultFuture.get().getErrors().size());
285 final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
287 inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
288 final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
289 Assert.assertEquals(2, allValues.size());
290 Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
291 Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
293 inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
296 private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
297 return new BatchAddGroupsBuilder()
298 .setGroupId(new GroupId(groupIdValue))
302 private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
303 return new BatchRemoveGroupsBuilder()
304 .setGroupId(new GroupId(groupIdValue))
308 private static BatchUpdateGroups createEmptyBatchUpdateGroup(final long groupIdValue) {
309 return new BatchUpdateGroupsBuilder()
310 .setOriginalBatchedGroup(new OriginalBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue)).build())
311 .setUpdatedBatchedGroup(new UpdatedBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue+1)).build())