Add single layer deserialization support
[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.openflowplugin.impl.services.sal.SalGroupsBatchServiceImpl;
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.SendBarrierInput;
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 = new NodeRef(InstanceIdentifier.create(Nodes.class).child(Node.class, NODE_KEY));
76
77     @Mock
78     private SalGroupService salGroupService;
79     @Mock
80     private FlowCapableTransactionService transactionService;
81     @Captor
82     private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
83     @Captor
84     private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
85     @Captor
86     private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
87
88     private SalGroupsBatchServiceImpl salGroupsBatchService;
89
90
91     @Before
92     public void setUp() throws Exception {
93         salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
94
95         Mockito.when(transactionService.sendBarrier(Matchers.<SendBarrierInput>any()))
96                 .thenReturn(RpcResultBuilder.<Void>success().buildFuture());
97     }
98
99     @After
100     public void tearDown() throws Exception {
101         Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
102     }
103
104     @Test
105     public void testUpdateGroupsBatch_success() throws Exception {
106         Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
107                 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
108
109         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
110                 .setNode(NODE_REF)
111                 .setBarrierAfter(true)
112                 .setBatchUpdateGroups(Lists.newArrayList(
113                         createEmptyBatchUpdateGroup(42L),
114                         createEmptyBatchUpdateGroup(44L)))
115                 .build();
116
117         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
118
119         Assert.assertTrue(resultFuture.isDone());
120         Assert.assertTrue(resultFuture.get().isSuccessful());
121
122         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
123         inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
124         final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
125         Assert.assertEquals(2, allValues.size());
126         Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
127         Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
128         Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
129         Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
130
131         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
132     }
133
134     @Test
135     public void testUpdateGroupsBatch_failure() throws Exception {
136         Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
137                 .thenReturn(RpcResultBuilder.<UpdateGroupOutput>failed()
138                         .withError(RpcError.ErrorType.APPLICATION, "ur-groupUpdateError")
139                         .buildFuture());
140
141         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
142                 .setNode(NODE_REF)
143                 .setBarrierAfter(true)
144                 .setBatchUpdateGroups(Lists.newArrayList(
145                         createEmptyBatchUpdateGroup(42L),
146                         createEmptyBatchUpdateGroup(44L)))
147                 .build();
148
149         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
150
151         Assert.assertTrue(resultFuture.isDone());
152         Assert.assertFalse(resultFuture.get().isSuccessful());
153         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
154         Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
155         Assert.assertEquals(45L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
156         Assert.assertEquals(2, resultFuture.get().getErrors().size());
157
158
159         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
160         inOrder.verify(salGroupService, Mockito.times(2)).updateGroup(updateGroupInputCpt.capture());
161         final List<UpdateGroupInput> allValues = updateGroupInputCpt.getAllValues();
162         Assert.assertEquals(2, allValues.size());
163         Assert.assertEquals(42, allValues.get(0).getOriginalGroup().getGroupId().getValue().longValue());
164         Assert.assertEquals(43, allValues.get(0).getUpdatedGroup().getGroupId().getValue().longValue());
165         Assert.assertEquals(44, allValues.get(1).getOriginalGroup().getGroupId().getValue().longValue());
166         Assert.assertEquals(45, allValues.get(1).getUpdatedGroup().getGroupId().getValue().longValue());
167
168         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
169     }
170
171
172     @Test
173     public void testAddGroupsBatch_success() throws Exception {
174         Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
175                 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
176
177         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
178                 .setNode(NODE_REF)
179                 .setBarrierAfter(true)
180                 .setBatchAddGroups(Lists.newArrayList(
181                         createEmptyBatchAddGroup(42L),
182                         createEmptyBatchAddGroup(43L)))
183                 .build();
184
185         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
186
187         Assert.assertTrue(resultFuture.isDone());
188         Assert.assertTrue(resultFuture.get().isSuccessful());
189
190         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
191         inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
192         final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
193         Assert.assertEquals(2, allValues.size());
194         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
195         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
196
197         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
198     }
199
200     @Test
201     public void testAddGroupsBatch_failure() throws Exception {
202         Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
203                 .thenReturn(RpcResultBuilder.<AddGroupOutput>failed().withError(RpcError.ErrorType.APPLICATION, "ut-groupAddError")
204                         .buildFuture());
205
206         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
207                 .setNode(NODE_REF)
208                 .setBarrierAfter(true)
209                 .setBatchAddGroups(Lists.newArrayList(
210                         createEmptyBatchAddGroup(42L),
211                         createEmptyBatchAddGroup(43L)))
212                 .build();
213
214         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
215
216         Assert.assertTrue(resultFuture.isDone());
217         Assert.assertFalse(resultFuture.get().isSuccessful());
218         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
219         Assert.assertEquals(42L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
220         Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
221         Assert.assertEquals(2, resultFuture.get().getErrors().size());
222
223
224         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
225         inOrder.verify(salGroupService, Mockito.times(2)).addGroup(addGroupInputCpt.capture());
226         final List<AddGroupInput> allValues = addGroupInputCpt.getAllValues();
227         Assert.assertEquals(2, allValues.size());
228         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
229         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
230
231         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
232     }
233
234     @Test
235     public void testRemoveGroupsBatch_success() throws Exception {
236         Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
237                 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
238
239         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
240                 .setNode(NODE_REF)
241                 .setBarrierAfter(true)
242                 .setBatchRemoveGroups(Lists.newArrayList(
243                         createEmptyBatchRemoveGroup(42L),
244                         createEmptyBatchRemoveGroup(43L)))
245                 .build();
246
247         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
248
249         Assert.assertTrue(resultFuture.isDone());
250         Assert.assertTrue(resultFuture.get().isSuccessful());
251
252         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
253
254         inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
255         final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
256         Assert.assertEquals(2, allValues.size());
257         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
258         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
259
260         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
261     }
262
263     @Test
264     public void testRemoveGroupsBatch_failure() throws Exception {
265         Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
266                 .thenReturn(RpcResultBuilder.<RemoveGroupOutput>failed().withError(RpcError.ErrorType.APPLICATION, "ut-groupRemoveError")
267                         .buildFuture());
268
269         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
270                 .setNode(NODE_REF)
271                 .setBarrierAfter(true)
272                 .setBatchRemoveGroups(Lists.newArrayList(
273                         createEmptyBatchRemoveGroup(42L),
274                         createEmptyBatchRemoveGroup(43L)))
275                 .build();
276
277         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
278
279         Assert.assertTrue(resultFuture.isDone());
280         Assert.assertFalse(resultFuture.get().isSuccessful());
281         Assert.assertEquals(2, resultFuture.get().getResult().getBatchFailedGroupsOutput().size());
282         Assert.assertEquals(42L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(0).getGroupId().getValue().longValue());
283         Assert.assertEquals(43L, resultFuture.get().getResult().getBatchFailedGroupsOutput().get(1).getGroupId().getValue().longValue());
284         Assert.assertEquals(2, resultFuture.get().getErrors().size());
285
286         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
287
288         inOrder.verify(salGroupService, Mockito.times(2)).removeGroup(removeGroupInputCpt.capture());
289         final List<RemoveGroupInput> allValues = removeGroupInputCpt.getAllValues();
290         Assert.assertEquals(2, allValues.size());
291         Assert.assertEquals(42L, allValues.get(0).getGroupId().getValue().longValue());
292         Assert.assertEquals(43L, allValues.get(1).getGroupId().getValue().longValue());
293
294         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
295     }
296
297     private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
298         return new BatchAddGroupsBuilder()
299                 .setGroupId(new GroupId(groupIdValue))
300                 .build();
301     }
302
303     private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
304         return new BatchRemoveGroupsBuilder()
305                 .setGroupId(new GroupId(groupIdValue))
306                 .build();
307     }
308
309     private static BatchUpdateGroups createEmptyBatchUpdateGroup(final long groupIdValue) {
310         return new BatchUpdateGroupsBuilder()
311                 .setOriginalBatchedGroup(new OriginalBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue)).build())
312                 .setUpdatedBatchedGroup(new UpdatedBatchedGroupBuilder(createEmptyBatchAddGroup(groupIdValue+1)).build())
313                 .build();
314     }
315 }