Merge "IllegalArgumentException with metadata field in learn action"
[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
9 package org.opendaylight.openflowplugin.impl.services.sal;
10
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.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;
66
67 /**
68  * Test for {@link org.opendaylight.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl}.
69  */
70 @RunWith(MockitoJUnitRunner.class)
71 public class SalGroupsBatchServiceImplTest {
72
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));
77
78     @Mock
79     private SalGroupService salGroupService;
80     @Mock
81     private FlowCapableTransactionService transactionService;
82     @Captor
83     private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
84     @Captor
85     private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
86     @Captor
87     private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
88
89     private SalGroupsBatchServiceImpl salGroupsBatchService;
90
91
92     @Before
93     public void setUp() throws Exception {
94         salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
95
96         Mockito.when(transactionService.sendBarrier(Matchers.<SendBarrierInput>any()))
97                 .thenReturn(RpcResultBuilder.<SendBarrierOutput>success().buildFuture());
98     }
99
100     @After
101     public void tearDown() throws Exception {
102         Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
103     }
104
105     @Test
106     public void testUpdateGroupsBatch_success() throws Exception {
107         Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
108                 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
109
110         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
111                 .setNode(NODE_REF)
112                 .setBarrierAfter(true)
113                 .setBatchUpdateGroups(Lists.newArrayList(
114                         createEmptyBatchUpdateGroup(42L),
115                         createEmptyBatchUpdateGroup(44L)))
116                 .build();
117
118         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
119
120         Assert.assertTrue(resultFuture.isDone());
121         Assert.assertTrue(resultFuture.get().isSuccessful());
122
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());
131
132         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
133     }
134
135     @Test
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")
140                         .buildFuture());
141
142         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
143                 .setNode(NODE_REF)
144                 .setBarrierAfter(true)
145                 .setBatchUpdateGroups(Lists.newArrayList(
146                         createEmptyBatchUpdateGroup(42L),
147                         createEmptyBatchUpdateGroup(44L)))
148                 .build();
149
150         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
151
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());
160
161
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());
170
171         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
172     }
173
174
175     @Test
176     public void testAddGroupsBatch_success() throws Exception {
177         Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
178                 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
179
180         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
181                 .setNode(NODE_REF)
182                 .setBarrierAfter(true)
183                 .setBatchAddGroups(Lists.newArrayList(
184                         createEmptyBatchAddGroup(42L),
185                         createEmptyBatchAddGroup(43L)))
186                 .build();
187
188         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
189
190         Assert.assertTrue(resultFuture.isDone());
191         Assert.assertTrue(resultFuture.get().isSuccessful());
192
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());
199
200         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
201     }
202
203     @Test
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")
208                         .buildFuture());
209
210         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
211                 .setNode(NODE_REF)
212                 .setBarrierAfter(true)
213                 .setBatchAddGroups(Lists.newArrayList(
214                         createEmptyBatchAddGroup(42L),
215                         createEmptyBatchAddGroup(43L)))
216                 .build();
217
218         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
219
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());
228
229
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());
236
237         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
238     }
239
240     @Test
241     public void testRemoveGroupsBatch_success() throws Exception {
242         Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
243                 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
244
245         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
246                 .setNode(NODE_REF)
247                 .setBarrierAfter(true)
248                 .setBatchRemoveGroups(Lists.newArrayList(
249                         createEmptyBatchRemoveGroup(42L),
250                         createEmptyBatchRemoveGroup(43L)))
251                 .build();
252
253         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
254
255         Assert.assertTrue(resultFuture.isDone());
256         Assert.assertTrue(resultFuture.get().isSuccessful());
257
258         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
259
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());
265
266         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
267     }
268
269     @Test
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")
274                         .buildFuture());
275
276         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
277                 .setNode(NODE_REF)
278                 .setBarrierAfter(true)
279                 .setBatchRemoveGroups(Lists.newArrayList(
280                         createEmptyBatchRemoveGroup(42L),
281                         createEmptyBatchRemoveGroup(43L)))
282                 .build();
283
284         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
285
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());
294
295         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
296
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());
302
303         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
304     }
305
306     private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
307         return new BatchAddGroupsBuilder()
308                 .setGroupId(new GroupId(groupIdValue))
309                 .build();
310     }
311
312     private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
313         return new BatchRemoveGroupsBuilder()
314                 .setGroupId(new GroupId(groupIdValue))
315                 .build();
316     }
317
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())
324                 .build();
325     }
326 }