DeviceState changes
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / services / SalGroupsBatchServiceImplTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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;
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.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;
65
66 /**
67  * Test for {@link SalGroupsBatchServiceImpl}.
68  */
69 @RunWith(MockitoJUnitRunner.class)
70 public class SalGroupsBatchServiceImplTest {
71
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));
75
76     @Mock
77     private SalGroupService salGroupService;
78     @Mock
79     private FlowCapableTransactionService transactionService;
80     @Captor
81     private ArgumentCaptor<RemoveGroupInput> removeGroupInputCpt;
82     @Captor
83     private ArgumentCaptor<UpdateGroupInput> updateGroupInputCpt;
84     @Captor
85     private ArgumentCaptor<AddGroupInput> addGroupInputCpt;
86
87     private SalGroupsBatchServiceImpl salGroupsBatchService;
88
89
90     @Before
91     public void setUp() throws Exception {
92         salGroupsBatchService = new SalGroupsBatchServiceImpl(salGroupService, transactionService);
93
94         Mockito.when(transactionService.sendBarrier(Matchers.<SendBarrierInput>any()))
95                 .thenReturn(RpcResultBuilder.<Void>success().buildFuture());
96     }
97
98     @After
99     public void tearDown() throws Exception {
100         Mockito.verifyNoMoreInteractions(salGroupService, transactionService);
101     }
102
103     @Test
104     public void testUpdateGroupsBatch_success() throws Exception {
105         Mockito.when(salGroupService.updateGroup(Mockito.<UpdateGroupInput>any()))
106                 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
107
108         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
109                 .setNode(NODE_REF)
110                 .setBarrierAfter(true)
111                 .setBatchUpdateGroups(Lists.newArrayList(
112                         createEmptyBatchUpdateGroup(42L),
113                         createEmptyBatchUpdateGroup(44L)))
114                 .build();
115
116         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
117
118         Assert.assertTrue(resultFuture.isDone());
119         Assert.assertTrue(resultFuture.get().isSuccessful());
120
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());
129
130         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
131     }
132
133     @Test
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")
138                         .buildFuture());
139
140         final UpdateGroupsBatchInput input = new UpdateGroupsBatchInputBuilder()
141                 .setNode(NODE_REF)
142                 .setBarrierAfter(true)
143                 .setBatchUpdateGroups(Lists.newArrayList(
144                         createEmptyBatchUpdateGroup(42L),
145                         createEmptyBatchUpdateGroup(44L)))
146                 .build();
147
148         final Future<RpcResult<UpdateGroupsBatchOutput>> resultFuture = salGroupsBatchService.updateGroupsBatch(input);
149
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());
156
157
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());
166
167         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
168     }
169
170
171     @Test
172     public void testAddGroupsBatch_success() throws Exception {
173         Mockito.when(salGroupService.addGroup(Mockito.<AddGroupInput>any()))
174                 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
175
176         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
177                 .setNode(NODE_REF)
178                 .setBarrierAfter(true)
179                 .setBatchAddGroups(Lists.newArrayList(
180                         createEmptyBatchAddGroup(42L),
181                         createEmptyBatchAddGroup(43L)))
182                 .build();
183
184         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
185
186         Assert.assertTrue(resultFuture.isDone());
187         Assert.assertTrue(resultFuture.get().isSuccessful());
188
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());
195
196         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
197     }
198
199     @Test
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")
203                         .buildFuture());
204
205         final AddGroupsBatchInput input = new AddGroupsBatchInputBuilder()
206                 .setNode(NODE_REF)
207                 .setBarrierAfter(true)
208                 .setBatchAddGroups(Lists.newArrayList(
209                         createEmptyBatchAddGroup(42L),
210                         createEmptyBatchAddGroup(43L)))
211                 .build();
212
213         final Future<RpcResult<AddGroupsBatchOutput>> resultFuture = salGroupsBatchService.addGroupsBatch(input);
214
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());
221
222
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());
229
230         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
231     }
232
233     @Test
234     public void testRemoveGroupsBatch_success() throws Exception {
235         Mockito.when(salGroupService.removeGroup(Mockito.<RemoveGroupInput>any()))
236                 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
237
238         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
239                 .setNode(NODE_REF)
240                 .setBarrierAfter(true)
241                 .setBatchRemoveGroups(Lists.newArrayList(
242                         createEmptyBatchRemoveGroup(42L),
243                         createEmptyBatchRemoveGroup(43L)))
244                 .build();
245
246         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
247
248         Assert.assertTrue(resultFuture.isDone());
249         Assert.assertTrue(resultFuture.get().isSuccessful());
250
251         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
252
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());
258
259         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
260     }
261
262     @Test
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")
266                         .buildFuture());
267
268         final RemoveGroupsBatchInput input = new RemoveGroupsBatchInputBuilder()
269                 .setNode(NODE_REF)
270                 .setBarrierAfter(true)
271                 .setBatchRemoveGroups(Lists.newArrayList(
272                         createEmptyBatchRemoveGroup(42L),
273                         createEmptyBatchRemoveGroup(43L)))
274                 .build();
275
276         final Future<RpcResult<RemoveGroupsBatchOutput>> resultFuture = salGroupsBatchService.removeGroupsBatch(input);
277
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());
284
285         final InOrder inOrder = Mockito.inOrder(salGroupService, transactionService);
286
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());
292
293         inOrder.verify(transactionService).sendBarrier(Matchers.<SendBarrierInput>any());
294     }
295
296     private static BatchAddGroups createEmptyBatchAddGroup(final long groupIdValue) {
297         return new BatchAddGroupsBuilder()
298                 .setGroupId(new GroupId(groupIdValue))
299                 .build();
300     }
301
302     private static BatchRemoveGroups createEmptyBatchRemoveGroup(final long groupIdValue) {
303         return new BatchRemoveGroupsBuilder()
304                 .setGroupId(new GroupId(groupIdValue))
305                 .build();
306     }
307
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())
312                 .build();
313     }
314 }