2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowplugin.applications.frsync.impl.strategy;
10 import com.google.common.collect.Lists;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import java.util.Collections;
13 import java.util.HashMap;
14 import java.util.LinkedHashMap;
15 import java.util.List;
17 import java.util.concurrent.Future;
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.InOrder;
26 import org.mockito.Mock;
27 import org.mockito.Mockito;
28 import org.mockito.junit.MockitoJUnitRunner;
29 import org.mockito.stubbing.Answer;
30 import org.opendaylight.mdsal.binding.api.DataBroker;
31 import org.opendaylight.openflowplugin.applications.frsync.impl.DSInputFactory;
32 import org.opendaylight.openflowplugin.applications.frsync.util.ItemSyncBox;
33 import org.opendaylight.openflowplugin.applications.frsync.util.SyncCrudCounters;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutputBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutputBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutputBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterOutputBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutputBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder;
59 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
60 import org.opendaylight.yangtools.yang.common.RpcResult;
61 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
64 * Test for {@link SyncPlanPushStrategyIncrementalImpl}.
66 @RunWith(MockitoJUnitRunner.class)
67 public class SyncPlanPushStrategyIncrementalImplTest {
69 private static final NodeId NODE_ID = new NodeId("unit-nodeId");
70 private static final InstanceIdentifier<FlowCapableNode> NODE_IDENT = InstanceIdentifier.create(Nodes.class)
71 .child(Node.class, new NodeKey(NODE_ID)).augmentation(FlowCapableNode.class);
73 private SyncPlanPushStrategyIncrementalImpl syncPlanPushStrategy;
76 private DataBroker db;
78 private GroupForwarder groupCommitter;
80 private FlowForwarder flowCommitter;
82 private MeterForwarder meterCommitter;
84 private TableForwarder tableCommitter;
86 private FlowCapableTransactionService flowCapableTxService;
89 private ArgumentCaptor<Group> groupCaptor;
91 private ArgumentCaptor<Group> groupUpdateCaptor;
93 private ArgumentCaptor<Flow> flowCaptor;
95 private ArgumentCaptor<Flow> flowUpdateCaptor;
97 private ArgumentCaptor<Meter> meterCaptor;
99 private ArgumentCaptor<Meter> meterUpdateCaptor;
101 private ArgumentCaptor<TableFeatures> tableFeaturesCaptor;
103 private SyncCrudCounters counters;
105 private final List<ItemSyncBox<Group>> groupsToAddOrUpdate;
106 private final List<ItemSyncBox<Group>> groupsToRemove;
107 private final ItemSyncBox<Meter> metersToAddOrUpdate;
108 private final ItemSyncBox<Meter> metersToRemove;
109 private final Map<TableKey, ItemSyncBox<Flow>> flowsToAddOrUpdate;
110 private final Map<TableKey, ItemSyncBox<Flow>> flowsToRemove;
112 public SyncPlanPushStrategyIncrementalImplTest() {
113 groupsToAddOrUpdate = Lists.newArrayList(DiffInputFactory.createGroupSyncBox(1, 2, 3),
114 DiffInputFactory.createGroupSyncBoxWithUpdates(4, 5, 6));
115 groupsToRemove = Lists.newArrayList(DiffInputFactory.createGroupSyncBox(1, 2, 3),
116 DiffInputFactory.createGroupSyncBox(4, 5, 6));
118 metersToAddOrUpdate = DiffInputFactory.createMeterSyncBoxWithUpdates(1, 2, 3);
119 metersToRemove = DiffInputFactory.createMeterSyncBox(1, 2, 3);
121 flowsToAddOrUpdate = new HashMap<>();
122 flowsToAddOrUpdate.put(new TableKey((short) 0), DiffInputFactory.createFlowSyncBox("1", "2", "3"));
123 flowsToAddOrUpdate.put(new TableKey((short) 1), DiffInputFactory.createFlowSyncBoxWithUpdates("4", "5", "6"));
124 flowsToRemove = new HashMap<>();
125 flowsToRemove.put(new TableKey((short) 0), DiffInputFactory.createFlowSyncBox("1", "2", "3"));
126 flowsToRemove.put(new TableKey((short) 1), DiffInputFactory.createFlowSyncBox("4", "5", "6"));
130 public void testExecuteSyncStrategy() throws Exception {
131 final SynchronizationDiffInput diffInput = new SynchronizationDiffInput(NODE_IDENT,
132 groupsToAddOrUpdate, metersToAddOrUpdate, flowsToAddOrUpdate, flowsToRemove,
133 metersToRemove, groupsToRemove);
135 final SyncCrudCounters syncCounters = new SyncCrudCounters();
136 final ListenableFuture<RpcResult<Void>> rpcResult = syncPlanPushStrategy.executeSyncStrategy(
137 RpcResultBuilder.<Void>success().buildFuture(), diffInput, syncCounters);
139 Mockito.verify(groupCommitter, Mockito.times(6)).add(ArgumentMatchers.any(),
140 ArgumentMatchers.any(), ArgumentMatchers.any());
141 Mockito.verify(groupCommitter, Mockito.times(3)).update(ArgumentMatchers.any(),
142 ArgumentMatchers.any(), ArgumentMatchers.any(),
143 ArgumentMatchers.any());
144 Mockito.verify(groupCommitter, Mockito.times(6)).remove(ArgumentMatchers.any(),
145 ArgumentMatchers.any(), ArgumentMatchers.any());
146 Mockito.verify(flowCommitter, Mockito.times(6)).add(ArgumentMatchers.any(),
147 ArgumentMatchers.any(), ArgumentMatchers.any());
148 Mockito.verify(flowCommitter, Mockito.times(3)).update(ArgumentMatchers.any(),
149 ArgumentMatchers.any(), ArgumentMatchers.any(),
150 ArgumentMatchers.any());
151 Mockito.verify(flowCommitter, Mockito.times(6)).remove(ArgumentMatchers.any(),
152 ArgumentMatchers.any(), ArgumentMatchers.any());
153 Mockito.verify(meterCommitter, Mockito.times(3)).add(ArgumentMatchers.any(),
154 ArgumentMatchers.any(), ArgumentMatchers.any());
155 Mockito.verify(meterCommitter, Mockito.times(3)).update(ArgumentMatchers.any(),
156 ArgumentMatchers.any(), ArgumentMatchers.any(),
157 ArgumentMatchers.any());
158 Mockito.verify(meterCommitter, Mockito.times(3)).remove(ArgumentMatchers.any(),
159 ArgumentMatchers.any(), ArgumentMatchers.any());
161 Assert.assertTrue(rpcResult.isDone());
162 Assert.assertTrue(rpcResult.get().isSuccessful());
164 Assert.assertEquals(6, syncCounters.getFlowCrudCounts().getAdded());
165 Assert.assertEquals(3, syncCounters.getFlowCrudCounts().getUpdated());
166 Assert.assertEquals(6, syncCounters.getFlowCrudCounts().getRemoved());
168 Assert.assertEquals(6, syncCounters.getGroupCrudCounts().getAdded());
169 Assert.assertEquals(3, syncCounters.getGroupCrudCounts().getUpdated());
170 Assert.assertEquals(6, syncCounters.getGroupCrudCounts().getRemoved());
172 Assert.assertEquals(3, syncCounters.getMeterCrudCounts().getAdded());
173 Assert.assertEquals(3, syncCounters.getMeterCrudCounts().getUpdated());
174 Assert.assertEquals(3, syncCounters.getMeterCrudCounts().getRemoved());
178 public void setUp() {
179 Mockito.when(flowCapableTxService.sendBarrier(ArgumentMatchers.any()))
180 .thenReturn(RpcResultBuilder.success((SendBarrierOutput) null).buildFuture());
182 Mockito.doAnswer(createSalServiceFutureAnswer()).when(groupCommitter).add(
183 ArgumentMatchers.any(), ArgumentMatchers.any(),
184 ArgumentMatchers.any());
185 Mockito.doAnswer(createSalServiceFutureAnswer()).when(groupCommitter).update(
186 ArgumentMatchers.any(), ArgumentMatchers.any(),
187 ArgumentMatchers.any(),
188 ArgumentMatchers.any());
189 Mockito.doAnswer(createSalServiceFutureAnswer()).when(groupCommitter).remove(
190 ArgumentMatchers.any(), ArgumentMatchers.any(),
191 ArgumentMatchers.any());
193 Mockito.doAnswer(createSalServiceFutureAnswer()).when(flowCommitter).add(
194 ArgumentMatchers.any(), ArgumentMatchers.any(),
195 ArgumentMatchers.any());
196 Mockito.doAnswer(createSalServiceFutureAnswer()).when(flowCommitter).update(
197 ArgumentMatchers.any(), ArgumentMatchers.any(),
198 ArgumentMatchers.any(), ArgumentMatchers.any());
199 Mockito.doAnswer(createSalServiceFutureAnswer()).when(flowCommitter).remove(
200 ArgumentMatchers.any(), ArgumentMatchers.any(),
201 ArgumentMatchers.any());
203 Mockito.doAnswer(createSalServiceFutureAnswer()).when(meterCommitter).add(
204 ArgumentMatchers.any(), ArgumentMatchers.any(),
205 ArgumentMatchers.any());
206 Mockito.doAnswer(createSalServiceFutureAnswer()).when(meterCommitter).update(
207 ArgumentMatchers.any(), ArgumentMatchers.any(),
208 ArgumentMatchers.any(), ArgumentMatchers.any());
209 Mockito.doAnswer(createSalServiceFutureAnswer()).when(meterCommitter).remove(
210 ArgumentMatchers.any(), ArgumentMatchers.any(),
211 ArgumentMatchers.any());
213 Mockito.doAnswer(createSalServiceFutureAnswer()).when(tableCommitter).update(
214 ArgumentMatchers.any(), ArgumentMatchers.any(),
215 ArgumentMatchers.any(), ArgumentMatchers.any());
217 syncPlanPushStrategy = new SyncPlanPushStrategyIncrementalImpl()
218 .setMeterForwarder(meterCommitter)
219 .setTableForwarder(tableCommitter)
220 .setGroupForwarder(groupCommitter)
221 .setFlowForwarder(flowCommitter)
222 .setTransactionService(flowCapableTxService);
224 counters = new SyncCrudCounters();
227 private <O> Answer<Future<RpcResult<O>>> createSalServiceFutureAnswer() {
228 return invocation -> RpcResultBuilder.<O>success().buildFuture();
232 public void testAddMissingFlows() throws Exception {
233 Mockito.when(flowCommitter.add(ArgumentMatchers.any(), flowCaptor.capture(),
234 ArgumentMatchers.same(NODE_IDENT)))
235 .thenReturn(RpcResultBuilder.success(new AddFlowOutputBuilder().build()).buildFuture());
237 final ItemSyncBox<Flow> flowBox = new ItemSyncBox<>();
238 flowBox.getItemsToPush().add(DSInputFactory.createFlow("f3", 3));
239 flowBox.getItemsToPush().add(DSInputFactory.createFlow("f4", 4));
241 final Map<TableKey, ItemSyncBox<Flow>> flowBoxMap = new LinkedHashMap<>();
242 flowBoxMap.put(new TableKey((short) 0), flowBox);
244 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.addMissingFlows(
245 NODE_ID, NODE_IDENT, flowBoxMap, counters);
247 Assert.assertTrue(result.isDone());
248 Assert.assertTrue(result.get().isSuccessful());
250 final List<Flow> flowCaptorAllValues = flowCaptor.getAllValues();
251 Assert.assertEquals(2, flowCaptorAllValues.size());
252 Assert.assertEquals("f3", flowCaptorAllValues.get(0).getId().getValue());
253 Assert.assertEquals("f4", flowCaptorAllValues.get(1).getId().getValue());
255 final InOrder inOrderFlow = Mockito.inOrder(flowCapableTxService, flowCommitter);
256 inOrderFlow.verify(flowCommitter, Mockito.times(2)).add(ArgumentMatchers.any(),
257 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
258 //TODO: uncomment when enabled in impl
259 // inOrderFlow.verify(flowCapableTxService).sendBarrier(Matchers.<SendBarrierInput>any());
260 inOrderFlow.verifyNoMoreInteractions();
264 public void testRemoveRedundantFlows() throws Exception {
265 Mockito.when(flowCommitter.remove(ArgumentMatchers.any(), flowCaptor.capture(),
266 ArgumentMatchers.same(NODE_IDENT)))
267 .thenReturn(RpcResultBuilder.success(new RemoveFlowOutputBuilder().build()).buildFuture());
269 final ItemSyncBox<Flow> flowBox = new ItemSyncBox<>();
270 flowBox.getItemsToPush().add(DSInputFactory.createFlow("f3", 3));
271 flowBox.getItemsToPush().add(DSInputFactory.createFlow("f4", 4));
273 final Map<TableKey, ItemSyncBox<Flow>> flowBoxMap = new LinkedHashMap<>();
274 flowBoxMap.put(new TableKey((short) 0), flowBox);
276 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.removeRedundantFlows(
277 NODE_ID, NODE_IDENT, flowBoxMap, counters);
279 Assert.assertTrue(result.isDone());
280 Assert.assertTrue(result.get().isSuccessful());
282 final List<Flow> flowCaptorAllValues = flowCaptor.getAllValues();
283 Assert.assertEquals(2, flowCaptorAllValues.size());
284 Assert.assertEquals("f3", flowCaptorAllValues.get(0).getId().getValue());
285 Assert.assertEquals("f4", flowCaptorAllValues.get(1).getId().getValue());
287 final InOrder inOrderFlow = Mockito.inOrder(flowCapableTxService, flowCommitter);
288 inOrderFlow.verify(flowCommitter, Mockito.times(2)).remove(ArgumentMatchers.any(),
289 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
290 inOrderFlow.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
291 inOrderFlow.verifyNoMoreInteractions();
296 public void testAddMissingFlows_withUpdate() throws Exception {
297 Mockito.when(flowCommitter.add(ArgumentMatchers.any(), flowCaptor.capture(),
298 ArgumentMatchers.same(NODE_IDENT)))
299 .thenReturn(RpcResultBuilder.success(new AddFlowOutputBuilder().build()).buildFuture());
301 Mockito.when(flowCommitter.update(ArgumentMatchers.any(),
302 flowUpdateCaptor.capture(), flowUpdateCaptor.capture(),
303 ArgumentMatchers.same(NODE_IDENT)))
304 .thenReturn(RpcResultBuilder.success(new UpdateFlowOutputBuilder().build()).buildFuture());
306 final ItemSyncBox<Flow> flowBox = new ItemSyncBox<>();
307 flowBox.getItemsToPush().add(DSInputFactory.createFlow("f3", 3));
308 flowBox.getItemsToPush().add(DSInputFactory.createFlow("f4", 4));
309 flowBox.getItemsToUpdate().add(new ItemSyncBox.ItemUpdateTuple<>(
310 DSInputFactory.createFlow("f1", 1), DSInputFactory.createFlowWithInstruction("f1", 1)));
312 final Map<TableKey, ItemSyncBox<Flow>> flowBoxMap = new LinkedHashMap<>();
313 flowBoxMap.put(new TableKey((short) 0), flowBox);
317 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.addMissingFlows(
318 NODE_ID, NODE_IDENT, flowBoxMap, counters);
320 Assert.assertTrue(result.isDone());
321 Assert.assertTrue(result.get().isSuccessful());
323 final List<Flow> flowCaptorAllValues = flowCaptor.getAllValues();
324 Assert.assertEquals(2, flowCaptorAllValues.size());
325 Assert.assertEquals("f3", flowCaptorAllValues.get(0).getId().getValue());
326 Assert.assertEquals("f4", flowCaptorAllValues.get(1).getId().getValue());
328 final List<Flow> flowUpdateCaptorAllValues = flowUpdateCaptor.getAllValues();
329 Assert.assertEquals(2, flowUpdateCaptorAllValues.size());
330 Assert.assertEquals("f1", flowUpdateCaptorAllValues.get(0).getId().getValue());
331 Assert.assertEquals("f1", flowUpdateCaptorAllValues.get(1).getId().getValue());
333 final InOrder inOrderFlow = Mockito.inOrder(flowCapableTxService, flowCommitter);
335 inOrderFlow.verify(flowCommitter, Mockito.times(2)).add(ArgumentMatchers.any(),
336 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
338 inOrderFlow.verify(flowCommitter).update(ArgumentMatchers.any(),
339 ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
340 //TODO: uncomment when enabled in impl
341 // inOrderFlow.verify(flowCapableTxService).sendBarrier(Matchers.<SendBarrierInput>any());
343 inOrderFlow.verifyNoMoreInteractions();
347 public void testAddMissingMeters() throws Exception {
348 Mockito.when(meterCommitter.add(ArgumentMatchers.any(), meterCaptor.capture(),
349 ArgumentMatchers.same(NODE_IDENT)))
350 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
352 final ItemSyncBox<Meter> meterSyncBox = new ItemSyncBox<>();
353 meterSyncBox.getItemsToPush().add(DSInputFactory.createMeter(2L));
354 meterSyncBox.getItemsToPush().add(DSInputFactory.createMeter(4L));
356 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.addMissingMeters(
357 NODE_ID, NODE_IDENT, meterSyncBox, counters);
359 Assert.assertTrue(result.isDone());
360 Assert.assertTrue(result.get().isSuccessful());
362 final List<Meter> metercaptorAllValues = meterCaptor.getAllValues();
363 Assert.assertEquals(2, metercaptorAllValues.size());
364 Assert.assertEquals(2L, metercaptorAllValues.get(0).getMeterId().getValue().longValue());
365 Assert.assertEquals(4L, metercaptorAllValues.get(1).getMeterId().getValue().longValue());
367 final InOrder inOrderMeter = Mockito.inOrder(flowCapableTxService, meterCommitter);
368 inOrderMeter.verify(meterCommitter, Mockito.times(2)).add(ArgumentMatchers.any(),
369 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
370 //TODO: uncomment when enabled in impl
371 // inOrderMeter.verify(flowCapableTxService).sendBarrier(Matchers.<SendBarrierInput>any());
372 inOrderMeter.verifyNoMoreInteractions();
376 public void testAddMissingMeters_withUpdate() throws Exception {
377 Mockito.when(meterCommitter.add(ArgumentMatchers.any(), meterCaptor.capture(),
378 ArgumentMatchers.same(NODE_IDENT)))
379 .thenReturn(RpcResultBuilder.success(new AddMeterOutputBuilder().build()).buildFuture());
381 Mockito.when(meterCommitter.update(ArgumentMatchers.any(),
382 meterUpdateCaptor.capture(), meterUpdateCaptor.capture(), ArgumentMatchers.same(NODE_IDENT)))
383 .thenReturn(RpcResultBuilder.success(new UpdateMeterOutputBuilder().build()).buildFuture());
385 final ItemSyncBox<Meter> meterSyncBox = new ItemSyncBox<>();
386 meterSyncBox.getItemsToPush().add(DSInputFactory.createMeter(2L));
387 meterSyncBox.getItemsToPush().add(DSInputFactory.createMeter(4L));
388 meterSyncBox.getItemsToUpdate().add(new ItemSyncBox.ItemUpdateTuple<>(
389 DSInputFactory.createMeter(1L), DSInputFactory.createMeterWithBody(1L)));
391 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.addMissingMeters(
392 NODE_ID, NODE_IDENT, meterSyncBox, counters);
394 Assert.assertTrue(result.isDone());
395 Assert.assertTrue(result.get().isSuccessful());
397 final List<Meter> meterCaptorAllValues = meterCaptor.getAllValues();
398 Assert.assertEquals(2, meterCaptorAllValues.size());
399 Assert.assertEquals(2L, meterCaptorAllValues.get(0).getMeterId().getValue().longValue());
400 Assert.assertEquals(4L, meterCaptorAllValues.get(1).getMeterId().getValue().longValue());
403 final List<Meter> meterUpdateCaptorAllValues = meterUpdateCaptor.getAllValues();
404 Assert.assertEquals(2, meterUpdateCaptorAllValues.size());
405 Assert.assertEquals(1L, meterUpdateCaptorAllValues.get(0).getMeterId().getValue().longValue());
406 Assert.assertEquals(1L, meterUpdateCaptorAllValues.get(1).getMeterId().getValue().longValue());
408 final InOrder inOrderMeters = Mockito.inOrder(flowCapableTxService, meterCommitter);
409 inOrderMeters.verify(meterCommitter, Mockito.times(2)).add(ArgumentMatchers.any(),
410 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
411 inOrderMeters.verify(meterCommitter).update(ArgumentMatchers.any(),
412 ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
413 //TODO: uncomment when enabled in impl
414 // inOrderMeters.verify(flowCapableTxService).sendBarrier(Matchers.<SendBarrierInput>any());
416 inOrderMeters.verifyNoMoreInteractions();
420 public void testRemoveRedundantMeters() throws Exception {
421 Mockito.when(meterCommitter.remove(ArgumentMatchers.any(), meterCaptor.capture(),
422 ArgumentMatchers.same(NODE_IDENT)))
423 .thenReturn(RpcResultBuilder.success(new RemoveMeterOutputBuilder().build()).buildFuture());
425 final ItemSyncBox<Meter> meterSyncBox = new ItemSyncBox<>();
426 meterSyncBox.getItemsToPush().add(DSInputFactory.createMeter(2L));
427 meterSyncBox.getItemsToPush().add(DSInputFactory.createMeter(4L));
428 meterSyncBox.getItemsToUpdate().add(new ItemSyncBox.ItemUpdateTuple<>(
429 DSInputFactory.createMeter(1L), DSInputFactory.createMeterWithBody(1L)));
431 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.removeRedundantMeters(
432 NODE_ID, NODE_IDENT, meterSyncBox, counters);
434 Assert.assertTrue(result.isDone());
435 Assert.assertTrue(result.get().isSuccessful());
437 final List<Meter> metercaptorAllValues = meterCaptor.getAllValues();
438 Assert.assertEquals(2, metercaptorAllValues.size());
439 Assert.assertEquals(2L, metercaptorAllValues.get(0).getMeterId().getValue().longValue());
440 Assert.assertEquals(4L, metercaptorAllValues.get(1).getMeterId().getValue().longValue());
442 final InOrder inOrderMeter = Mockito.inOrder(flowCapableTxService, meterCommitter);
443 inOrderMeter.verify(meterCommitter, Mockito.times(2)).remove(ArgumentMatchers.any(),
444 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
445 //TODO: uncomment when enabled in impl
446 // inOrderMeter.verify(flowCapableTxService).sendBarrier(Matchers.<SendBarrierInput>any());
447 inOrderMeter.verifyNoMoreInteractions();
451 public void testAddMissingGroups() throws Exception {
452 Mockito.when(groupCommitter.add(ArgumentMatchers.any(), groupCaptor.capture(),
453 ArgumentMatchers.same(NODE_IDENT)))
454 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
456 ItemSyncBox<Group> groupBox1 = new ItemSyncBox<>();
457 groupBox1.getItemsToPush().add(DSInputFactory.createGroup(2L));
459 ItemSyncBox<Group> groupBox2 = new ItemSyncBox<>();
460 groupBox2.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(3L, 2L));
461 groupBox2.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(4L, 2L));
463 ItemSyncBox<Group> groupBox3 = new ItemSyncBox<>();
464 groupBox3.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(5L, 3L, 4L));
466 final List<ItemSyncBox<Group>> groupBoxLot = Lists.newArrayList(groupBox1, groupBox2, groupBox3);
468 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.addMissingGroups(
469 NODE_ID, NODE_IDENT, groupBoxLot, counters);
471 Assert.assertTrue(result.isDone());
472 Assert.assertTrue(result.get().isSuccessful());
474 final List<Group> groupCaptorAllValues = groupCaptor.getAllValues();
475 Assert.assertEquals(4, groupCaptorAllValues.size());
476 Assert.assertEquals(2L, groupCaptorAllValues.get(0).getGroupId().getValue().longValue());
477 Assert.assertEquals(3L, groupCaptorAllValues.get(1).getGroupId().getValue().longValue());
478 Assert.assertEquals(4L, groupCaptorAllValues.get(2).getGroupId().getValue().longValue());
479 Assert.assertEquals(5L, groupCaptorAllValues.get(3).getGroupId().getValue().longValue());
481 final InOrder inOrderGroups = Mockito.inOrder(flowCapableTxService, groupCommitter);
483 inOrderGroups.verify(groupCommitter).add(ArgumentMatchers.any(),
484 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
485 inOrderGroups.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
487 inOrderGroups.verify(groupCommitter, Mockito.times(2)).add(ArgumentMatchers.any(),
488 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
489 inOrderGroups.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
491 inOrderGroups.verify(groupCommitter).add(ArgumentMatchers.any(),
492 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
493 inOrderGroups.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
495 inOrderGroups.verifyNoMoreInteractions();
499 public void testAddMissingGroups_withUpdate() throws Exception {
500 Mockito.when(groupCommitter.add(ArgumentMatchers.any(), groupCaptor.capture(),
501 ArgumentMatchers.same(NODE_IDENT)))
502 .thenReturn(RpcResultBuilder.success(new AddGroupOutputBuilder().build()).buildFuture());
504 Mockito.when(groupCommitter.update(ArgumentMatchers.any(),
505 groupUpdateCaptor.capture(), groupUpdateCaptor.capture(),
506 ArgumentMatchers.same(NODE_IDENT)))
507 .thenReturn(RpcResultBuilder.success(new UpdateGroupOutputBuilder().build()).buildFuture());
509 ItemSyncBox<Group> groupBox1 = new ItemSyncBox<>();
510 groupBox1.getItemsToPush().add(DSInputFactory.createGroup(2L));
511 groupBox1.getItemsToUpdate().add(new ItemSyncBox.ItemUpdateTuple<>(
512 DSInputFactory.createGroup(1L), DSInputFactory.createGroupWithAction(1L)));
514 ItemSyncBox<Group> groupBox2 = new ItemSyncBox<>();
515 groupBox2.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(3L, 2L));
516 groupBox2.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(4L, 2L));
518 ItemSyncBox<Group> groupBox3 = new ItemSyncBox<>();
519 groupBox3.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(5L, 3L, 4L));
521 final List<ItemSyncBox<Group>> groupBoxLot = Lists.newArrayList(groupBox1, groupBox2, groupBox3);
522 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.addMissingGroups(
523 NODE_ID, NODE_IDENT, groupBoxLot, counters);
525 Assert.assertTrue(result.isDone());
526 Assert.assertTrue(result.get().isSuccessful());
528 final List<Group> groupCaptorAllValues = groupCaptor.getAllValues();
529 Assert.assertEquals(4, groupCaptorAllValues.size());
530 Assert.assertEquals(2L, groupCaptorAllValues.get(0).getGroupId().getValue().longValue());
531 Assert.assertEquals(3L, groupCaptorAllValues.get(1).getGroupId().getValue().longValue());
532 Assert.assertEquals(4L, groupCaptorAllValues.get(2).getGroupId().getValue().longValue());
533 Assert.assertEquals(5L, groupCaptorAllValues.get(3).getGroupId().getValue().longValue());
535 final List<Group> groupUpdateCaptorAllValues = groupUpdateCaptor.getAllValues();
536 Assert.assertEquals(2, groupUpdateCaptorAllValues.size());
537 Assert.assertEquals(1L, groupUpdateCaptorAllValues.get(0).getGroupId().getValue().longValue());
538 Assert.assertEquals(1L, groupUpdateCaptorAllValues.get(1).getGroupId().getValue().longValue());
540 final InOrder inOrderGroups = Mockito.inOrder(flowCapableTxService, groupCommitter);
543 inOrderGroups.verify(groupCommitter).add(ArgumentMatchers.any(),
544 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
545 inOrderGroups.verify(groupCommitter).update(ArgumentMatchers.any(),
546 ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
547 inOrderGroups.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
550 inOrderGroups.verify(groupCommitter, Mockito.times(2)).add(ArgumentMatchers.any(),
551 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
552 inOrderGroups.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
554 inOrderGroups.verify(groupCommitter).add(ArgumentMatchers.any(),
555 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
556 inOrderGroups.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
558 inOrderGroups.verifyNoMoreInteractions();
562 public void testRemoveRedundantGroups() throws Exception {
563 Mockito.when(groupCommitter.remove(ArgumentMatchers.any(), groupCaptor.capture(),
564 ArgumentMatchers.same(NODE_IDENT)))
565 .thenReturn(RpcResultBuilder.success(new RemoveGroupOutputBuilder().build()).buildFuture());
567 ItemSyncBox<Group> groupBox1 = new ItemSyncBox<>();
568 groupBox1.getItemsToPush().add(DSInputFactory.createGroup(2L));
569 groupBox1.getItemsToUpdate().add(new ItemSyncBox.ItemUpdateTuple<>(
570 DSInputFactory.createGroup(1L), DSInputFactory.createGroupWithAction(1L)));
572 ItemSyncBox<Group> groupBox2 = new ItemSyncBox<>();
573 groupBox2.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(3L, 2L));
574 groupBox2.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(4L, 2L));
576 ItemSyncBox<Group> groupBox3 = new ItemSyncBox<>();
577 groupBox3.getItemsToPush().add(DSInputFactory.createGroupWithPreconditions(5L, 3L, 4L));
579 final List<ItemSyncBox<Group>> groupBoxLot = Lists.newArrayList(groupBox1, groupBox2, groupBox3);
580 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.removeRedundantGroups(
581 NODE_ID, NODE_IDENT, groupBoxLot, counters);
583 Assert.assertTrue(result.isDone());
584 Assert.assertTrue(result.get().isSuccessful());
586 final List<Group> groupCaptorAllValues = groupCaptor.getAllValues();
587 Assert.assertEquals(4, groupCaptorAllValues.size());
588 Assert.assertEquals(5L, groupCaptorAllValues.get(0).getGroupId().getValue().longValue());
589 Assert.assertEquals(3L, groupCaptorAllValues.get(1).getGroupId().getValue().longValue());
590 Assert.assertEquals(4L, groupCaptorAllValues.get(2).getGroupId().getValue().longValue());
591 Assert.assertEquals(2L, groupCaptorAllValues.get(3).getGroupId().getValue().longValue());
593 final InOrder inOrderGroup = Mockito.inOrder(flowCapableTxService, groupCommitter);
595 inOrderGroup.verify(groupCommitter).remove(ArgumentMatchers.any(),
596 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
597 inOrderGroup.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
599 inOrderGroup.verify(groupCommitter, Mockito.times(2)).remove(ArgumentMatchers.any(),
600 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
601 inOrderGroup.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
603 inOrderGroup.verify(groupCommitter).remove(ArgumentMatchers.any(),
604 ArgumentMatchers.any(), ArgumentMatchers.eq(NODE_IDENT));
605 inOrderGroup.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());
607 inOrderGroup.verifyNoMoreInteractions();
611 public void testUpdateTableFeatures() throws Exception {
612 Mockito.lenient().when(tableCommitter.update(ArgumentMatchers.any(),
613 ArgumentMatchers.isNull(TableFeatures.class), tableFeaturesCaptor.capture(),
614 ArgumentMatchers.same(NODE_IDENT)))
615 .thenReturn(RpcResultBuilder.success(new UpdateTableOutputBuilder().build()).buildFuture());
617 final FlowCapableNode operational = new FlowCapableNodeBuilder()
618 .setTable(Collections.singletonList(new TableBuilder()
621 .setTableFeatures(Collections.singletonList(new TableFeaturesBuilder()
622 .setName("test table features")
623 .setTableId((short) 1)
627 final ListenableFuture<RpcResult<Void>> result = syncPlanPushStrategy.updateTableFeatures(
628 NODE_IDENT, operational);
630 Assert.assertTrue(result.isDone());
631 Assert.assertTrue(result.get().isSuccessful());
633 final List<TableFeatures> groupCaptorAllValues = tableFeaturesCaptor.getAllValues();
634 //TODO: uncomment when enabled in impl
635 // Assert.assertEquals(1, groupCaptorAllValues.size());
636 // Assert.assertEquals("test table features", groupCaptorAllValues.get(0).getName());
637 // Assert.assertEquals(1, groupCaptorAllValues.get(0).getTableId().intValue());
639 Mockito.verify(flowCapableTxService).sendBarrier(ArgumentMatchers.any());