OPNFLWPLUG-1032: Neon-MRI: Bump odlparent, yangtools, mdsal
[openflowplugin.git] / applications / forwardingrules-sync / src / test / java / org / opendaylight / openflowplugin / applications / frsync / impl / strategy / SyncPlanPushStrategyFlatBatchImplTest.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.applications.frsync.impl.strategy;
10
11 import com.google.common.collect.Lists;
12 import com.google.common.collect.Range;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.List;
17 import java.util.Map;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.ArgumentCaptor;
23 import org.mockito.ArgumentMatchers;
24 import org.mockito.Captor;
25 import org.mockito.Mock;
26 import org.mockito.Mockito;
27 import org.mockito.runners.MockitoJUnitRunner;
28 import org.opendaylight.openflowplugin.applications.frsync.util.ItemSyncBox;
29 import org.opendaylight.openflowplugin.applications.frsync.util.SyncCrudCounters;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.SalFlatBatchService;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.Batch;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.BatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchAddFlowCase;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchAddFlowCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchAddGroupCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchAddGroupCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchAddMeterCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchAddMeterCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchRemoveFlowCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchRemoveFlowCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchRemoveGroupCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchRemoveGroupCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchRemoveMeterCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchRemoveMeterCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchUpdateFlowCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchUpdateFlowCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchUpdateGroupCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchUpdateGroupCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchUpdateMeterCase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.FlatBatchUpdateMeterCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
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.RpcResult;
64 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
65
66 /**
67  * Test for {@link SyncPlanPushStrategyFlatBatchImpl}.
68  */
69 @RunWith(MockitoJUnitRunner.class)
70 public class SyncPlanPushStrategyFlatBatchImplTest {
71
72     private static final NodeId NODE_ID = new NodeId("ut-node-id");
73     private static final InstanceIdentifier<FlowCapableNode> NODE_IDENT = InstanceIdentifier.create(Nodes.class)
74             .child(Node.class, new NodeKey(NODE_ID))
75             .augmentation(FlowCapableNode.class);
76     @Mock
77     private SalFlatBatchService flatBatchService;
78     @Mock
79     private TableForwarder tableForwarder;
80     @Captor
81     private ArgumentCaptor<ProcessFlatBatchInput> processFlatBatchInputCpt;
82
83     private final List<ItemSyncBox<Group>> groupsToAddOrUpdate;
84     private final List<ItemSyncBox<Group>> groupsToRemove;
85     private final ItemSyncBox<Meter> metersToAddOrUpdate;
86     private final ItemSyncBox<Meter> metersToRemove;
87     private final Map<TableKey, ItemSyncBox<Flow>> flowsToAddOrUpdate;
88     private final Map<TableKey, ItemSyncBox<Flow>> flowsToRemove;
89     private List<Batch> batchBag;
90
91     private SyncPlanPushStrategyFlatBatchImpl syncPlanPushStrategy;
92
93     public SyncPlanPushStrategyFlatBatchImplTest() {
94         groupsToAddOrUpdate = Lists.newArrayList(DiffInputFactory.createGroupSyncBox(1, 2, 3),
95                 DiffInputFactory.createGroupSyncBoxWithUpdates(4, 5, 6));
96         groupsToRemove = Lists.newArrayList(DiffInputFactory.createGroupSyncBox(1, 2, 3),
97                 DiffInputFactory.createGroupSyncBox(4, 5, 6));
98
99         metersToAddOrUpdate = DiffInputFactory.createMeterSyncBoxWithUpdates(1, 2, 3);
100         metersToRemove = DiffInputFactory.createMeterSyncBox(1, 2, 3);
101
102         flowsToAddOrUpdate = new HashMap<>();
103         flowsToAddOrUpdate.put(new TableKey((short) 0), DiffInputFactory.createFlowSyncBox("1", "2", "3"));
104         flowsToAddOrUpdate.put(new TableKey((short) 1), DiffInputFactory.createFlowSyncBoxWithUpdates("4", "5", "6"));
105         flowsToRemove = new HashMap<>();
106         flowsToRemove.put(new TableKey((short) 0), DiffInputFactory.createFlowSyncBox("1", "2", "3"));
107         flowsToRemove.put(new TableKey((short) 1), DiffInputFactory.createFlowSyncBox("4", "5", "6"));
108     }
109
110
111     @Before
112     public void setUp() throws Exception {
113         syncPlanPushStrategy = new SyncPlanPushStrategyFlatBatchImpl();
114         syncPlanPushStrategy.setFlatBatchService(flatBatchService);
115         syncPlanPushStrategy.setTableForwarder(tableForwarder);
116
117         batchBag = new ArrayList<>();
118     }
119
120     @Test
121     public void testExecuteSyncStrategy() throws Exception {
122         final SynchronizationDiffInput diffInput = new SynchronizationDiffInput(NODE_IDENT,
123                 groupsToAddOrUpdate, metersToAddOrUpdate, flowsToAddOrUpdate,
124                 flowsToRemove, metersToRemove, groupsToRemove);
125
126         Mockito.when(flatBatchService.processFlatBatch(ArgumentMatchers.<ProcessFlatBatchInput>any()))
127                 .thenReturn(RpcResultBuilder.success(new ProcessFlatBatchOutputBuilder().build()).buildFuture());
128
129         final SyncCrudCounters counters = new SyncCrudCounters();
130         final ListenableFuture<RpcResult<Void>> rpcResult = syncPlanPushStrategy.executeSyncStrategy(
131                 RpcResultBuilder.<Void>success().buildFuture(), diffInput, counters);
132
133         Mockito.verify(flatBatchService).processFlatBatch(processFlatBatchInputCpt.capture());
134
135         final ProcessFlatBatchInput processFlatBatchInput = processFlatBatchInputCpt.getValue();
136         Assert.assertFalse(processFlatBatchInput.isExitOnFirstError());
137         Assert.assertEquals(13, processFlatBatchInput.getBatch().size());
138
139         Assert.assertTrue(rpcResult.isDone());
140         Assert.assertTrue(rpcResult.get().isSuccessful());
141
142         Assert.assertEquals(6, counters.getFlowCrudCounts().getAdded());
143         Assert.assertEquals(3, counters.getFlowCrudCounts().getUpdated());
144         Assert.assertEquals(6, counters.getFlowCrudCounts().getRemoved());
145
146         Assert.assertEquals(6, counters.getGroupCrudCounts().getAdded());
147         Assert.assertEquals(3, counters.getGroupCrudCounts().getUpdated());
148         Assert.assertEquals(6, counters.getGroupCrudCounts().getRemoved());
149
150         Assert.assertEquals(3, counters.getMeterCrudCounts().getAdded());
151         Assert.assertEquals(3, counters.getMeterCrudCounts().getUpdated());
152         Assert.assertEquals(3, counters.getMeterCrudCounts().getRemoved());
153     }
154
155     @Test
156     public void testAssembleRemoveFlows() throws Exception {
157         final int lastOrder = SyncPlanPushStrategyFlatBatchImpl.assembleRemoveFlows(batchBag, 0, flowsToRemove);
158
159         Assert.assertEquals(6, lastOrder);
160         Assert.assertEquals(2, batchBag.size());
161         Assert.assertEquals(FlatBatchRemoveFlowCase.class, batchBag.get(0).getBatchChoice().getImplementedInterface());
162         Assert.assertEquals(3, ((FlatBatchRemoveFlowCase) batchBag.get(0).getBatchChoice())
163                 .getFlatBatchRemoveFlow().size());
164         Assert.assertEquals(FlatBatchRemoveFlowCase.class, batchBag.get(1).getBatchChoice().getImplementedInterface());
165         Assert.assertEquals(3, ((FlatBatchRemoveFlowCase) batchBag.get(1).getBatchChoice())
166                 .getFlatBatchRemoveFlow().size());
167     }
168
169     @Test
170     public void testAssembleAddOrUpdateGroups() throws Exception {
171         final int lastOrder = SyncPlanPushStrategyFlatBatchImpl.assembleAddOrUpdateGroups(
172                 batchBag, 0, groupsToAddOrUpdate);
173
174         Assert.assertEquals(9, lastOrder);
175         Assert.assertEquals(3, batchBag.size());
176         Assert.assertEquals(FlatBatchAddGroupCase.class, batchBag.get(0).getBatchChoice().getImplementedInterface());
177         Assert.assertEquals(3, ((FlatBatchAddGroupCase) batchBag.get(0).getBatchChoice())
178                 .getFlatBatchAddGroup().size());
179         Assert.assertEquals(FlatBatchAddGroupCase.class, batchBag.get(1).getBatchChoice().getImplementedInterface());
180         Assert.assertEquals(3, ((FlatBatchAddGroupCase) batchBag.get(1).getBatchChoice())
181                 .getFlatBatchAddGroup().size());
182         Assert.assertEquals(FlatBatchUpdateGroupCase.class, batchBag.get(2).getBatchChoice().getImplementedInterface());
183         Assert.assertEquals(3, ((FlatBatchUpdateGroupCase) batchBag.get(2).getBatchChoice())
184                 .getFlatBatchUpdateGroup().size());
185     }
186
187     @Test
188     public void testAssembleRemoveGroups() throws Exception {
189         final int lastOrder = SyncPlanPushStrategyFlatBatchImpl.assembleRemoveGroups(batchBag, 0, groupsToRemove);
190
191         Assert.assertEquals(6, lastOrder);
192         Assert.assertEquals(2, batchBag.size());
193         Assert.assertEquals(FlatBatchRemoveGroupCase.class, batchBag.get(0).getBatchChoice().getImplementedInterface());
194         Assert.assertEquals(3, ((FlatBatchRemoveGroupCase) batchBag.get(0).getBatchChoice())
195                 .getFlatBatchRemoveGroup().size());
196         Assert.assertEquals(FlatBatchRemoveGroupCase.class, batchBag.get(1).getBatchChoice().getImplementedInterface());
197         Assert.assertEquals(3, ((FlatBatchRemoveGroupCase) batchBag.get(1).getBatchChoice())
198                 .getFlatBatchRemoveGroup().size());
199     }
200
201     @Test
202     public void testAssembleAddOrUpdateMeters() throws Exception {
203         final int lastOrder = SyncPlanPushStrategyFlatBatchImpl.assembleAddOrUpdateMeters(
204                 batchBag, 0, metersToAddOrUpdate);
205
206         Assert.assertEquals(6, lastOrder);
207         Assert.assertEquals(2, batchBag.size());
208         Assert.assertEquals(FlatBatchAddMeterCase.class, batchBag.get(0).getBatchChoice().getImplementedInterface());
209         Assert.assertEquals(3, ((FlatBatchAddMeterCase) batchBag.get(0).getBatchChoice())
210                 .getFlatBatchAddMeter().size());
211         Assert.assertEquals(FlatBatchUpdateMeterCase.class, batchBag.get(1).getBatchChoice().getImplementedInterface());
212         Assert.assertEquals(3, ((FlatBatchUpdateMeterCase) batchBag.get(1).getBatchChoice())
213                 .getFlatBatchUpdateMeter().size());
214     }
215
216     @Test
217     public void testAssembleRemoveMeters() throws Exception {
218         final int lastOrder = SyncPlanPushStrategyFlatBatchImpl.assembleRemoveMeters(batchBag, 0, metersToRemove);
219
220         Assert.assertEquals(3, lastOrder);
221         Assert.assertEquals(1, batchBag.size());
222         Assert.assertEquals(FlatBatchRemoveMeterCase.class, batchBag.get(0).getBatchChoice().getImplementedInterface());
223         Assert.assertEquals(3, ((FlatBatchRemoveMeterCase) batchBag.get(0).getBatchChoice())
224                 .getFlatBatchRemoveMeter().size());
225     }
226
227     @Test
228     public void testAssembleAddOrUpdateFlows() throws Exception {
229         final int lastOrder = SyncPlanPushStrategyFlatBatchImpl.assembleAddOrUpdateFlows(
230                 batchBag, 0, flowsToAddOrUpdate);
231
232         Assert.assertEquals(9, lastOrder);
233         Assert.assertEquals(3, batchBag.size());
234         Assert.assertEquals(FlatBatchAddFlowCase.class, batchBag.get(0).getBatchChoice().getImplementedInterface());
235         Assert.assertEquals(3, ((FlatBatchAddFlowCase) batchBag.get(0).getBatchChoice())
236                 .getFlatBatchAddFlow().size());
237         Assert.assertEquals(FlatBatchUpdateFlowCase.class, batchBag.get(1).getBatchChoice().getImplementedInterface());
238         Assert.assertEquals(3, ((FlatBatchUpdateFlowCase) batchBag.get(1).getBatchChoice())
239                 .getFlatBatchUpdateFlow().size());
240         Assert.assertEquals(FlatBatchAddFlowCase.class, batchBag.get(2).getBatchChoice().getImplementedInterface());
241         Assert.assertEquals(3, ((FlatBatchAddFlowCase) batchBag.get(2).getBatchChoice())
242                 .getFlatBatchAddFlow().size());
243     }
244
245     @Test
246     public void testDecrementCounters() throws Exception {
247         final SyncCrudCounters counters = new SyncCrudCounters();
248         counters.getFlowCrudCounts().setAdded(100);
249         counters.getFlowCrudCounts().setUpdated(100);
250         counters.getFlowCrudCounts().setRemoved(100);
251
252         counters.getGroupCrudCounts().setAdded(100);
253         counters.getGroupCrudCounts().setUpdated(100);
254         counters.getGroupCrudCounts().setRemoved(100);
255
256         counters.getMeterCrudCounts().setAdded(100);
257         counters.getMeterCrudCounts().setUpdated(100);
258         counters.getMeterCrudCounts().setRemoved(100);
259
260         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchAddFlowCaseBuilder().build(), counters);
261         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchUpdateFlowCaseBuilder().build(), counters);
262         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchRemoveFlowCaseBuilder().build(), counters);
263
264         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchAddGroupCaseBuilder().build(), counters);
265         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchUpdateGroupCaseBuilder().build(), counters);
266         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchRemoveGroupCaseBuilder().build(), counters);
267
268         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchAddMeterCaseBuilder().build(), counters);
269         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchUpdateMeterCaseBuilder().build(), counters);
270         SyncPlanPushStrategyFlatBatchImpl.decrementCounters(new FlatBatchRemoveMeterCaseBuilder().build(), counters);
271
272         Assert.assertEquals(99, counters.getFlowCrudCounts().getAdded());
273         Assert.assertEquals(99, counters.getFlowCrudCounts().getUpdated());
274         Assert.assertEquals(99, counters.getFlowCrudCounts().getRemoved());
275
276         Assert.assertEquals(99, counters.getGroupCrudCounts().getAdded());
277         Assert.assertEquals(99, counters.getGroupCrudCounts().getUpdated());
278         Assert.assertEquals(99, counters.getGroupCrudCounts().getRemoved());
279
280         Assert.assertEquals(99, counters.getMeterCrudCounts().getAdded());
281         Assert.assertEquals(99, counters.getMeterCrudCounts().getUpdated());
282         Assert.assertEquals(99, counters.getMeterCrudCounts().getRemoved());
283     }
284
285     @Test
286     public void testMapBatchesToRanges() throws Exception {
287         final List<Batch> inputBatchBag = Lists.newArrayList(
288                 new BatchBuilder().setBatchOrder(0).build(),
289                 new BatchBuilder().setBatchOrder(5).build(),
290                 new BatchBuilder().setBatchOrder(9).build(),
291                 new BatchBuilder().setBatchOrder(15).build()
292         );
293         final Map<Range<Integer>, Batch> rangeBatchMap =
294                 SyncPlanPushStrategyFlatBatchImpl.mapBatchesToRanges(inputBatchBag, 42);
295
296         Assert.assertEquals(4, rangeBatchMap.size());
297         int idx = 0;
298         final int[] lower = new int[]{0, 5, 9, 15};
299         final int[] upper = new int[]{4, 8, 14, 41};
300         for (Map.Entry<Range<Integer>, Batch> rangeBatchEntry : rangeBatchMap.entrySet()) {
301             Assert.assertEquals(lower[idx], rangeBatchEntry.getKey().lowerEndpoint().intValue());
302             Assert.assertEquals(upper[idx], rangeBatchEntry.getKey().upperEndpoint().intValue());
303             Assert.assertSame(inputBatchBag.get(idx), rangeBatchEntry.getValue());
304             idx++;
305         }
306     }
307 }