Decompose RPC implementation classes
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / services / sal / SalGroupsBatchServiceImplTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.openflowplugin.impl.services.sal;
9
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;
18
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.yang.binding.InstanceIdentifier;
60 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
61 import org.opendaylight.yangtools.yang.common.ErrorType;
62 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
63 import org.opendaylight.yangtools.yang.common.Uint32;
64
65 /**
66  * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl}.
67  */
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));
74
75     @Mock
76     private AddGroup addGroup;
77     @Mock
78     private RemoveGroup removeGroup;
79     @Mock
80     private UpdateGroup updateGroup;
81     @Mock
82     private SendBarrier sendBarrier;
83     @Captor
84     private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
85     @Captor
86     private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
87     @Captor
88     private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
89
90     private AddGroupsBatchImpl addGroupsBatch;
91     private RemoveGroupsBatchImpl removeGroupsBatch;
92     private UpdateGroupsBatchImpl updateGroupsBatch;
93
94     @Before
95     public void setUp() {
96         addGroupsBatch = new AddGroupsBatchImpl(addGroup, sendBarrier);
97         removeGroupsBatch = new RemoveGroupsBatchImpl(removeGroup, sendBarrier);
98         updateGroupsBatch = new UpdateGroupsBatchImpl(updateGroup, sendBarrier);
99
100         when(sendBarrier.invoke(any())).thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
101     }
102
103     @After
104     public void tearDown() {
105         verifyNoMoreInteractions(addGroup, removeGroup, updateGroup, sendBarrier);
106     }
107
108     @Test
109     public void testUpdateGroupsBatch_success() throws Exception {
110         when(updateGroup.invoke(any()))
111                 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
112
113         final var input = new UpdateGroupsBatchInputBuilder()
114                 .setNode(NODE_REF)
115                 .setBarrierAfter(true)
116                 .setBatchUpdateGroups(List.of(
117                         createEmptyBatchUpdateGroup(42L),
118                         createEmptyBatchUpdateGroup(44L)))
119                 .build();
120
121         final var resultFuture = updateGroupsBatch.invoke(input);
122
123         assertTrue(resultFuture.isDone());
124         assertTrue(resultFuture.get().isSuccessful());
125
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());
134
135         inOrder.verify(sendBarrier).invoke(any());
136     }
137
138     @Test
139     public void testUpdateGroupsBatch_failure() throws Exception {
140         when(updateGroup.invoke(any()))
141                 .thenReturn(RpcResultBuilder.<UpdateGroupOutput>failed()
142                         .withError(ErrorType.APPLICATION, "ur-groupUpdateError")
143                         .buildFuture());
144
145         final var input = new UpdateGroupsBatchInputBuilder()
146                 .setNode(NODE_REF)
147                 .setBarrierAfter(true)
148                 .setBatchUpdateGroups(List.of(
149                         createEmptyBatchUpdateGroup(42L),
150                         createEmptyBatchUpdateGroup(44L)))
151                 .build();
152
153         final var resultFuture = updateGroupsBatch.invoke(input);
154         final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput()
155                 .values().iterator();
156
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());
163
164
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());
173
174         inOrder.verify(sendBarrier).invoke(any());
175     }
176
177
178     @Test
179     public void testAddGroupsBatch_success() throws Exception {
180         when(addGroup.invoke(any()))
181                 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
182
183         final var input = new AddGroupsBatchInputBuilder()
184                 .setNode(NODE_REF)
185                 .setBarrierAfter(true)
186                 .setBatchAddGroups(BindingMap.ordered(
187                         createEmptyBatchAddGroup(42L),
188                         createEmptyBatchAddGroup(43L)))
189                 .build();
190
191         final var resultFuture = addGroupsBatch.invoke(input);
192
193         assertTrue(resultFuture.isDone());
194         assertTrue(resultFuture.get().isSuccessful());
195
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());
202
203         inOrder.verify(sendBarrier).invoke(any());
204     }
205
206     @Test
207     public void testAddGroupsBatch_failure() throws Exception {
208         when(addGroup.invoke(any()))
209                 .thenReturn(RpcResultBuilder.<AddGroupOutput>failed()
210                         .withError(ErrorType.APPLICATION, "ut-groupAddError")
211                         .buildFuture());
212
213         final var input = new AddGroupsBatchInputBuilder()
214                 .setNode(NODE_REF)
215                 .setBarrierAfter(true)
216                 .setBatchAddGroups(BindingMap.ordered(
217                         createEmptyBatchAddGroup(42L),
218                         createEmptyBatchAddGroup(43L)))
219                 .build();
220
221         final var resultFuture = addGroupsBatch.invoke(input);
222         final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().values().iterator();
223
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());
230
231
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());
238
239         inOrder.verify(sendBarrier).invoke(any());
240     }
241
242     @Test
243     public void testRemoveGroupsBatch_success() throws Exception {
244         when(removeGroup.invoke(any()))
245                 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
246
247         final var input = new RemoveGroupsBatchInputBuilder()
248                 .setNode(NODE_REF)
249                 .setBarrierAfter(true)
250                 .setBatchRemoveGroups(BindingMap.ordered(
251                         createEmptyBatchRemoveGroup(42L),
252                         createEmptyBatchRemoveGroup(43L)))
253                 .build();
254
255         final var resultFuture = removeGroupsBatch.invoke(input);
256
257         assertTrue(resultFuture.isDone());
258         assertTrue(resultFuture.get().isSuccessful());
259
260         final var inOrder = inOrder(removeGroup, sendBarrier);
261
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());
267
268         inOrder.verify(sendBarrier).invoke(any());
269     }
270
271     @Test
272     public void testRemoveGroupsBatch_failure() throws Exception {
273         when(removeGroup.invoke(any()))
274                 .thenReturn(RpcResultBuilder.<RemoveGroupOutput>failed()
275                         .withError(ErrorType.APPLICATION, "ut-groupRemoveError")
276                         .buildFuture());
277
278         final var input = new RemoveGroupsBatchInputBuilder()
279                 .setNode(NODE_REF)
280                 .setBarrierAfter(true)
281                 .setBatchRemoveGroups(BindingMap.ordered(
282                         createEmptyBatchRemoveGroup(42L),
283                         createEmptyBatchRemoveGroup(43L)))
284                 .build();
285
286         final var resultFuture = removeGroupsBatch.invoke(input);
287         final var iterator = resultFuture.get().getResult().nonnullBatchFailedGroupsOutput().values().iterator();
288
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());
295
296         final var inOrder = inOrder(removeGroup, sendBarrier);
297
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());
303
304         inOrder.verify(sendBarrier).invoke(any());
305     }
306
307     private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
308         return new BatchAddGroupsBuilder()
309                 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
310                 .build();
311     }
312
313     private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
314         return new BatchRemoveGroupsBuilder()
315                 .setGroupId(new GroupId(Uint32.valueOf(groupIdValue)))
316                 .build();
317     }
318
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())
325                 .build();
326     }
327 }