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
8 package org.opendaylight.openflowplugin.impl.services.sal;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.inOrder;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verifyNoMoreInteractions;
17 import static org.mockito.Mockito.when;
19 import java.util.List;
20 import org.junit.After;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.ArgumentCaptor;
25 import org.mockito.Captor;
26 import org.mockito.Mock;
27 import org.mockito.junit.MockitoJUnitRunner;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroup;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroup;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroup;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchInputBuilder;
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.UpdateGroupsBatchInputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.add.groups.batch.input.BatchAddGroups;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.add.groups.batch.input.BatchAddGroupsBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.OriginalBatchedGroupBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.input.update.grouping.UpdatedBatchedGroupBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroups;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.remove.groups.batch.input.BatchRemoveGroupsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroups;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroupsBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
59 import org.opendaylight.yangtools.binding.util.BindingMap;
60 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
61 import org.opendaylight.yangtools.yang.common.ErrorType;
62 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
63 import org.opendaylight.yangtools.yang.common.Uint32;
66 * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl}.
68 @RunWith(MockitoJUnitRunner.class)
69 public class SalGroupsBatchServiceImplTest {
70 public static final NodeId NODE_ID = new NodeId("ut-dummy-node");
71 public static final NodeKey NODE_KEY = new NodeKey(NODE_ID);
72 public static final NodeRef NODE_REF =
73 new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY).toIdentifier());
76 private AddGroup addGroup;
78 private RemoveGroup removeGroup;
80 private UpdateGroup updateGroup;
82 private SendBarrier sendBarrier;
84 private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
86 private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
88 private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
90 private AddGroupsBatchImpl addGroupsBatch;
91 private RemoveGroupsBatchImpl removeGroupsBatch;
92 private UpdateGroupsBatchImpl updateGroupsBatch;
96 addGroupsBatch = new AddGroupsBatchImpl(addGroup, sendBarrier);
97 removeGroupsBatch = new RemoveGroupsBatchImpl(removeGroup, sendBarrier);
98 updateGroupsBatch = new UpdateGroupsBatchImpl(updateGroup, sendBarrier);
100 when(sendBarrier.invoke(any())).thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
104 public void tearDown() {
105 verifyNoMoreInteractions(addGroup, removeGroup, updateGroup, sendBarrier);
109 public void testUpdateGroupsBatch_success() throws Exception {
110 when(updateGroup.invoke(any()))
111 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
113 final var input = new UpdateGroupsBatchInputBuilder()
115 .setBarrierAfter(true)
116 .setBatchUpdateGroups(List.of(
117 createEmptyBatchUpdateGroup(42L),
118 createEmptyBatchUpdateGroup(44L)))
121 final var resultFuture = updateGroupsBatch.invoke(input);
123 assertTrue(resultFuture.isDone());
124 assertTrue(resultFuture.get().isSuccessful());
126 final var inOrder = inOrder(updateGroup, sendBarrier);
127 inOrder.verify(updateGroup, times(2)).invoke(updateGroupInputCpt.capture());
128 final var allValues = updateGroupInputCpt.getAllValues();
129 assertEquals(2, allValues.size());
130 assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
131 assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
132 assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
133 assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
135 inOrder.verify(sendBarrier).invoke(any());
139 public void testUpdateGroupsBatch_failure() throws Exception {
140 when(updateGroup.invoke(any()))
141 .thenReturn(RpcResultBuilder.<UpdateGroupOutput>failed()
142 .withError(ErrorType.APPLICATION, "ur-groupUpdateError")
145 final var input = new UpdateGroupsBatchInputBuilder()
147 .setBarrierAfter(true)
148 .setBatchUpdateGroups(List.of(
149 createEmptyBatchUpdateGroup(42L),
150 createEmptyBatchUpdateGroup(44L)))
153 final var resultFuture = updateGroupsBatch.invoke(input);
154 final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
155 .values().iterator();
157 assertTrue(resultFuture.isDone());
158 assertFalse(resultFuture.get().isSuccessful());
159 assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
160 assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
161 assertEquals(45L, iterator.next().getGroupId().getValue().longValue());
162 assertEquals(2, resultFuture.get().getErrors().size());
165 final var inOrder = inOrder(updateGroup, sendBarrier);
166 inOrder.verify(updateGroup, times(2)).invoke(updateGroupInputCpt.capture());
167 final var allValues = updateGroupInputCpt.getAllValues();
168 assertEquals(2, allValues.size());
169 assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
170 assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
171 assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
172 assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
174 inOrder.verify(sendBarrier).invoke(any());
179 public void testAddGroupsBatch_success() throws Exception {
180 when(addGroup.invoke(any()))
181 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
183 final var input = new AddGroupsBatchInputBuilder()
185 .setBarrierAfter(true)
186 .setBatchAddGroups(BindingMap.ordered(
187 createEmptyBatchAddGroup(42L),
188 createEmptyBatchAddGroup(43L)))
191 final var resultFuture = addGroupsBatch.invoke(input);
193 assertTrue(resultFuture.isDone());
194 assertTrue(resultFuture.get().isSuccessful());
196 final var inOrder = inOrder(addGroup, sendBarrier);
197 inOrder.verify(addGroup, times(2)).invoke(addGroupInputCpt.capture());
198 final var allValues = addGroupInputCpt.getAllValues();
199 assertEquals(2, allValues.size());
200 assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
201 assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
203 inOrder.verify(sendBarrier).invoke(any());
207 public void testAddGroupsBatch_failure() throws Exception {
208 when(addGroup.invoke(any()))
209 .thenReturn(RpcResultBuilder.<AddGroupOutput>failed()
210 .withError(ErrorType.APPLICATION, "ut-groupAddError")
213 final var input = new AddGroupsBatchInputBuilder()
215 .setBarrierAfter(true)
216 .setBatchAddGroups(BindingMap.ordered(
217 createEmptyBatchAddGroup(42L),
218 createEmptyBatchAddGroup(43L)))
221 final var resultFuture = addGroupsBatch.invoke(input);
222 final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().values().iterator();
224 assertTrue(resultFuture.isDone());
225 assertFalse(resultFuture.get().isSuccessful());
226 assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
227 assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
228 assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
229 assertEquals(2, resultFuture.get().getErrors().size());
232 final var inOrder = inOrder(addGroup, sendBarrier);
233 inOrder.verify(addGroup, times(2)).invoke(addGroupInputCpt.capture());
234 final var allValues = addGroupInputCpt.getAllValues();
235 assertEquals(2, allValues.size());
236 assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
237 assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
239 inOrder.verify(sendBarrier).invoke(any());
243 public void testRemoveGroupsBatch_success() throws Exception {
244 when(removeGroup.invoke(any()))
245 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
247 final var input = new RemoveGroupsBatchInputBuilder()
249 .setBarrierAfter(true)
250 .setBatchRemoveGroups(BindingMap.ordered(
251 createEmptyBatchRemoveGroup(42L),
252 createEmptyBatchRemoveGroup(43L)))
255 final var resultFuture = removeGroupsBatch.invoke(input);
257 assertTrue(resultFuture.isDone());
258 assertTrue(resultFuture.get().isSuccessful());
260 final var inOrder = inOrder(removeGroup, sendBarrier);
262 inOrder.verify(removeGroup, times(2)).invoke(removeGroupInputCpt.capture());
263 final var allValues = removeGroupInputCpt.getAllValues();
264 assertEquals(2, allValues.size());
265 assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
266 assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
268 inOrder.verify(sendBarrier).invoke(any());
272 public void testRemoveGroupsBatch_failure() throws Exception {
273 when(removeGroup.invoke(any()))
274 .thenReturn(RpcResultBuilder.<RemoveGroupOutput>failed()
275 .withError(ErrorType.APPLICATION, "ut-groupRemoveError")
278 final var input = new RemoveGroupsBatchInputBuilder()
280 .setBarrierAfter(true)
281 .setBatchRemoveGroups(BindingMap.ordered(
282 createEmptyBatchRemoveGroup(42L),
283 createEmptyBatchRemoveGroup(43L)))
286 final var resultFuture = removeGroupsBatch.invoke(input);
287 final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().values().iterator();
289 assertTrue(resultFuture.isDone());
290 assertFalse(resultFuture.get().isSuccessful());
291 assertEquals(2, resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().size());
292 assertEquals(42L, iterator.next().getGroupId().getValue().longValue());
293 assertEquals(43L, iterator.next().getGroupId().getValue().longValue());
294 assertEquals(2, resultFuture.get().getErrors().size());
296 final var inOrder = inOrder(removeGroup, sendBarrier);
298 inOrder.verify(removeGroup, times(2)).invoke(removeGroupInputCpt.capture());
299 final var allValues = removeGroupInputCpt.getAllValues();
300 assertEquals(2, allValues.size());
301 assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
302 assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
304 inOrder.verify(sendBarrier).invoke(any());
307 private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
308 return new BatchAddGroupsBuilder()
309 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
313 private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
314 return new BatchRemoveGroupsBuilder()
315 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
319 private static BatchUpdateGroups createEmptyBatchUpdateGroup(final long groupIdValue) {
320 return new BatchUpdateGroupsBuilder()
321 .setOriginalBatchedGroup(
322 new OriginalBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue)).build())
323 .setUpdatedBatchedGroup(
324 new UpdatedBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue + 1)).build())