flowrule service : apply batch tests
Change-Id: I8e8660e979a2d250496a5ae3100e66e48a67290a
Showing
2 changed files
with
114 additions
and
6 deletions
| ... | @@ -25,6 +25,7 @@ import org.onlab.onos.net.Device; | ... | @@ -25,6 +25,7 @@ import org.onlab.onos.net.Device; |
| 25 | import org.onlab.onos.net.DeviceId; | 25 | import org.onlab.onos.net.DeviceId; |
| 26 | import org.onlab.onos.net.device.DeviceService; | 26 | import org.onlab.onos.net.device.DeviceService; |
| 27 | import org.onlab.onos.net.flow.CompletedBatchOperation; | 27 | import org.onlab.onos.net.flow.CompletedBatchOperation; |
| 28 | +import org.onlab.onos.net.flow.DefaultFlowEntry; | ||
| 28 | import org.onlab.onos.net.flow.FlowEntry; | 29 | import org.onlab.onos.net.flow.FlowEntry; |
| 29 | import org.onlab.onos.net.flow.FlowRule; | 30 | import org.onlab.onos.net.flow.FlowRule; |
| 30 | import org.onlab.onos.net.flow.FlowRuleBatchEntry; | 31 | import org.onlab.onos.net.flow.FlowRuleBatchEntry; |
| ... | @@ -472,6 +473,7 @@ public class FlowRuleManager | ... | @@ -472,6 +473,7 @@ public class FlowRuleManager |
| 472 | fbe.getOperator() == FlowRuleOperation.MODIFY) { | 473 | fbe.getOperator() == FlowRuleOperation.MODIFY) { |
| 473 | store.deleteFlowRule(fbe.getTarget()); | 474 | store.deleteFlowRule(fbe.getTarget()); |
| 474 | } else if (fbe.getOperator() == FlowRuleOperation.REMOVE) { | 475 | } else if (fbe.getOperator() == FlowRuleOperation.REMOVE) { |
| 476 | + store.removeFlowRule(new DefaultFlowEntry(fbe.getTarget())); | ||
| 475 | store.storeFlowRule(fbe.getTarget()); | 477 | store.storeFlowRule(fbe.getTarget()); |
| 476 | } | 478 | } |
| 477 | } | 479 | } | ... | ... |
| 1 | package org.onlab.onos.net.flow.impl; | 1 | package org.onlab.onos.net.flow.impl; |
| 2 | 2 | ||
| 3 | -import static org.junit.Assert.assertEquals; | 3 | +import static java.util.Collections.EMPTY_LIST; |
| 4 | -import static org.junit.Assert.assertFalse; | 4 | +import static org.junit.Assert.*; |
| 5 | -import static org.junit.Assert.assertNotNull; | ||
| 6 | -import static org.junit.Assert.assertTrue; | ||
| 7 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_ADDED; | 5 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_ADDED; |
| 8 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; | 6 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; |
| 9 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_UPDATED; | 7 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_UPDATED; |
| ... | @@ -12,7 +10,10 @@ import java.util.ArrayList; | ... | @@ -12,7 +10,10 @@ import java.util.ArrayList; |
| 12 | import java.util.Collections; | 10 | import java.util.Collections; |
| 13 | import java.util.List; | 11 | import java.util.List; |
| 14 | import java.util.Set; | 12 | import java.util.Set; |
| 13 | +import java.util.concurrent.ExecutionException; | ||
| 15 | import java.util.concurrent.Future; | 14 | import java.util.concurrent.Future; |
| 15 | +import java.util.concurrent.TimeUnit; | ||
| 16 | +import java.util.concurrent.TimeoutException; | ||
| 16 | 17 | ||
| 17 | import org.junit.After; | 18 | import org.junit.After; |
| 18 | import org.junit.Before; | 19 | import org.junit.Before; |
| ... | @@ -36,6 +37,7 @@ import org.onlab.onos.net.flow.FlowEntry; | ... | @@ -36,6 +37,7 @@ import org.onlab.onos.net.flow.FlowEntry; |
| 36 | import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; | 37 | import org.onlab.onos.net.flow.FlowEntry.FlowEntryState; |
| 37 | import org.onlab.onos.net.flow.FlowRule; | 38 | import org.onlab.onos.net.flow.FlowRule; |
| 38 | import org.onlab.onos.net.flow.FlowRuleBatchEntry; | 39 | import org.onlab.onos.net.flow.FlowRuleBatchEntry; |
| 40 | +import org.onlab.onos.net.flow.FlowRuleBatchOperation; | ||
| 39 | import org.onlab.onos.net.flow.FlowRuleEvent; | 41 | import org.onlab.onos.net.flow.FlowRuleEvent; |
| 40 | import org.onlab.onos.net.flow.FlowRuleListener; | 42 | import org.onlab.onos.net.flow.FlowRuleListener; |
| 41 | import org.onlab.onos.net.flow.FlowRuleProvider; | 43 | import org.onlab.onos.net.flow.FlowRuleProvider; |
| ... | @@ -167,6 +169,7 @@ public class FlowRuleManagerTest { | ... | @@ -167,6 +169,7 @@ public class FlowRuleManagerTest { |
| 167 | //backing store is sensitive to the order of additions/removals | 169 | //backing store is sensitive to the order of additions/removals |
| 168 | private boolean validateState(FlowEntryState... state) { | 170 | private boolean validateState(FlowEntryState... state) { |
| 169 | Iterable<FlowEntry> rules = service.getFlowEntries(DID); | 171 | Iterable<FlowEntry> rules = service.getFlowEntries(DID); |
| 172 | + System.out.println(rules); | ||
| 170 | int i = 0; | 173 | int i = 0; |
| 171 | for (FlowEntry f : rules) { | 174 | for (FlowEntry f : rules) { |
| 172 | if (f.state() != state[i]) { | 175 | if (f.state() != state[i]) { |
| ... | @@ -337,6 +340,79 @@ public class FlowRuleManagerTest { | ... | @@ -337,6 +340,79 @@ public class FlowRuleManagerTest { |
| 337 | validateState(FlowEntryState.PENDING_REMOVE, FlowEntryState.PENDING_REMOVE); | 340 | validateState(FlowEntryState.PENDING_REMOVE, FlowEntryState.PENDING_REMOVE); |
| 338 | } | 341 | } |
| 339 | 342 | ||
| 343 | + @Test | ||
| 344 | + public void applyBatch() { | ||
| 345 | + FlowRule f1 = flowRule(1, 1); | ||
| 346 | + FlowRule f2 = flowRule(2, 2); | ||
| 347 | + | ||
| 348 | + | ||
| 349 | + mgr.applyFlowRules(f1); | ||
| 350 | + | ||
| 351 | + FlowEntry fe1 = new DefaultFlowEntry(f1); | ||
| 352 | + providerService.pushFlowMetrics(DID, Collections.<FlowEntry>singletonList(fe1)); | ||
| 353 | + | ||
| 354 | + FlowRuleBatchEntry fbe1 = new FlowRuleBatchEntry( | ||
| 355 | + FlowRuleBatchEntry.FlowRuleOperation.REMOVE, f1); | ||
| 356 | + | ||
| 357 | + FlowRuleBatchEntry fbe2 = new FlowRuleBatchEntry( | ||
| 358 | + FlowRuleBatchEntry.FlowRuleOperation.ADD, f2); | ||
| 359 | + | ||
| 360 | + FlowRuleBatchOperation fbo = new FlowRuleBatchOperation( | ||
| 361 | + Lists.newArrayList(fbe1, fbe2)); | ||
| 362 | + Future<CompletedBatchOperation> future = mgr.applyBatch(fbo); | ||
| 363 | + assertTrue("Entries in wrong state", | ||
| 364 | + validateState(FlowEntryState.PENDING_REMOVE, FlowEntryState.PENDING_ADD)); | ||
| 365 | + CompletedBatchOperation completed = null; | ||
| 366 | + try { | ||
| 367 | + completed = future.get(); | ||
| 368 | + } catch (InterruptedException | ExecutionException e) { | ||
| 369 | + fail("Unexpected exception: " + e); | ||
| 370 | + } | ||
| 371 | + if (!completed.isSuccess()) { | ||
| 372 | + fail("Installation should be a success"); | ||
| 373 | + } | ||
| 374 | + | ||
| 375 | + } | ||
| 376 | + | ||
| 377 | + @Test | ||
| 378 | + public void cancelBatch() { | ||
| 379 | + FlowRule f1 = flowRule(1, 1); | ||
| 380 | + FlowRule f2 = flowRule(2, 2); | ||
| 381 | + | ||
| 382 | + | ||
| 383 | + mgr.applyFlowRules(f1); | ||
| 384 | + | ||
| 385 | + FlowEntry fe1 = new DefaultFlowEntry(f1); | ||
| 386 | + providerService.pushFlowMetrics(DID, Collections.<FlowEntry>singletonList(fe1)); | ||
| 387 | + | ||
| 388 | + FlowRuleBatchEntry fbe1 = new FlowRuleBatchEntry( | ||
| 389 | + FlowRuleBatchEntry.FlowRuleOperation.REMOVE, f1); | ||
| 390 | + | ||
| 391 | + FlowRuleBatchEntry fbe2 = new FlowRuleBatchEntry( | ||
| 392 | + FlowRuleBatchEntry.FlowRuleOperation.ADD, f2); | ||
| 393 | + | ||
| 394 | + FlowRuleBatchOperation fbo = new FlowRuleBatchOperation( | ||
| 395 | + Lists.newArrayList(fbe1, fbe2)); | ||
| 396 | + Future<CompletedBatchOperation> future = mgr.applyBatch(fbo); | ||
| 397 | + | ||
| 398 | + future.cancel(true); | ||
| 399 | + | ||
| 400 | + assertTrue(flowCount() == 2); | ||
| 401 | + | ||
| 402 | + /* | ||
| 403 | + * Rule f1 should be re-added to the list and therefore be in a pending add | ||
| 404 | + * state. | ||
| 405 | + */ | ||
| 406 | + assertTrue("Entries in wrong state", | ||
| 407 | + validateState(FlowEntryState.PENDING_REMOVE, | ||
| 408 | + FlowEntryState.PENDING_ADD)); | ||
| 409 | + | ||
| 410 | + | ||
| 411 | + | ||
| 412 | + } | ||
| 413 | + | ||
| 414 | + | ||
| 415 | + | ||
| 340 | private static class TestListener implements FlowRuleListener { | 416 | private static class TestListener implements FlowRuleListener { |
| 341 | final List<FlowRuleEvent> events = new ArrayList<>(); | 417 | final List<FlowRuleEvent> events = new ArrayList<>(); |
| 342 | 418 | ||
| ... | @@ -414,10 +490,40 @@ public class FlowRuleManagerTest { | ... | @@ -414,10 +490,40 @@ public class FlowRuleManagerTest { |
| 414 | @Override | 490 | @Override |
| 415 | public Future<CompletedBatchOperation> executeBatch( | 491 | public Future<CompletedBatchOperation> executeBatch( |
| 416 | BatchOperation<FlowRuleBatchEntry> batch) { | 492 | BatchOperation<FlowRuleBatchEntry> batch) { |
| 417 | - // TODO Auto-generated method stub | 493 | + return new TestInstallationFuture(); |
| 418 | - return null; | ||
| 419 | } | 494 | } |
| 420 | 495 | ||
| 496 | + private class TestInstallationFuture | ||
| 497 | + implements Future<CompletedBatchOperation> { | ||
| 498 | + | ||
| 499 | + @Override | ||
| 500 | + public boolean cancel(boolean mayInterruptIfRunning) { | ||
| 501 | + return true; | ||
| 502 | + } | ||
| 503 | + | ||
| 504 | + @Override | ||
| 505 | + public boolean isCancelled() { | ||
| 506 | + return true; | ||
| 507 | + } | ||
| 508 | + | ||
| 509 | + @Override | ||
| 510 | + public boolean isDone() { | ||
| 511 | + return false; | ||
| 512 | + } | ||
| 513 | + | ||
| 514 | + @Override | ||
| 515 | + public CompletedBatchOperation get() | ||
| 516 | + throws InterruptedException, ExecutionException { | ||
| 517 | + return new CompletedBatchOperation(true, EMPTY_LIST); | ||
| 518 | + } | ||
| 519 | + | ||
| 520 | + @Override | ||
| 521 | + public CompletedBatchOperation get(long timeout, TimeUnit unit) | ||
| 522 | + throws InterruptedException, | ||
| 523 | + ExecutionException, TimeoutException { | ||
| 524 | + return null; | ||
| 525 | + } | ||
| 526 | + } | ||
| 421 | 527 | ||
| 422 | } | 528 | } |
| 423 | 529 | ... | ... |
-
Please register or login to post a comment