You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2017/10/03 14:23:55 UTC

[18/35] brooklyn-server git commit: more tests for edge case where cancel doesn't cause listeners to run, and more tests for cancel

more tests for edge case where cancel doesn't cause listeners to run, and more tests for cancel


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/26dffef4
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/26dffef4
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/26dffef4

Branch: refs/heads/master
Commit: 26dffef47d5d443b538d0b5a16dc133f01960372
Parents: 62359c6
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Sep 15 17:43:58 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Sep 16 03:29:04 2017 +0100

----------------------------------------------------------------------
 .../util/core/task/BasicTasksFutureTest.java    | 50 ++++++++++++--------
 1 file changed, 31 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26dffef4/core/src/test/java/org/apache/brooklyn/util/core/task/BasicTasksFutureTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/task/BasicTasksFutureTest.java b/core/src/test/java/org/apache/brooklyn/util/core/task/BasicTasksFutureTest.java
index 9d53532..a2bfd59 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/task/BasicTasksFutureTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/task/BasicTasksFutureTest.java
@@ -75,7 +75,7 @@ public class BasicTasksFutureTest {
 
     @Test
     public void testBlockAndGetWithTimeoutsAndListenableFuture() throws InterruptedException {
-        Task<String> t = waitForSemaphore(Duration.FIVE_SECONDS, true, "x");
+        Task<String> t = waitForSemaphore(Duration.FIVE_SECONDS, true, "x", true);
         
         Assert.assertFalse(t.blockUntilEnded(Duration.millis(1)));
         Assert.assertFalse(t.blockUntilEnded(Duration.ZERO));
@@ -149,11 +149,12 @@ public class BasicTasksFutureTest {
         Assert.fail("did not get data for '"+key+"' in time");
     }
 
-    private <T> Task<T> waitForSemaphore(final Duration time, final boolean requireSemaphore, final T result) {
-        return Tasks.<T>builder().body(new Callable<T>() {
+    private <T> Task<T> waitForSemaphore(final Duration time, final boolean requireSemaphore, final T result, boolean dynamic) {
+        return Tasks.<T>builder().dynamic(dynamic).body(new Callable<T>() {
             @Override
             public T call() { 
                 try {
+                    log.info("about to release semaphore");
                     started.release();
                     log.info("waiting up to "+time+" to acquire before returning "+result);
                     if (!waitInTask.tryAcquire(time.toMilliseconds(), TimeUnit.MILLISECONDS)) {
@@ -174,32 +175,43 @@ public class BasicTasksFutureTest {
     }
 
     @Test
-    public void testCancelAfterStartTriggersListenableFuture() throws Exception {
-        doTestCancelTriggersListenableFuture(Duration.millis(50));
+    public void testCancelAfterStartTriggersListenableFutureDynamic() throws Exception {
+        doTestCancelTriggersListenableFuture(Duration.millis(50), true);
     }
     @Test
-    public void testCancelImmediateTriggersListenableFuture() throws Exception {
+    public void testCancelImmediateTriggersListenableFutureDynamic() throws Exception {
         // if cancel fires after submit but before it passes to the executor,
-        // that needs handling separately; this doesn't guarantee this code path,
-        // but it happens sometimes (and it should be handled)
-        
-        // have seen this fail once, not getting "before", but can't see why, may be spurious
-        doTestCancelTriggersListenableFuture(Duration.ZERO);
+        // that needs handling separately as it falls into an edge where the future is set and cancelled
+        // so the executor won't run it, and our wrapper logic doesn't apply; 
+        // this test doesn't guarantee this code path, but makes it likely enough it happens once in a while.
+        doTestCancelTriggersListenableFuture(Duration.ZERO, true);
     }
     @Test
-    public void testCancelBeforeTriggersListenableFuture() throws Exception {
-        // if cancel fires after submit but before it passes to the executor,
-        // that needs handling separately; this doesn't guarantee this code path,
-        // but it happens sometimes (and it should be handled)
-        doTestCancelTriggersListenableFuture(Duration.millis(-50));
+    public void testCancelBeforeTriggersListenableFutureDynamic() throws Exception {
+        doTestCancelTriggersListenableFuture(Duration.millis(-50), true);
+    }
+    @Test
+    public void testCancelAfterStartTriggersListenableFutureSimple() throws Exception {
+        doTestCancelTriggersListenableFuture(Duration.millis(50), true);
+    }
+    @Test
+    public void testCancelImmediateTriggersListenableFutureSimple() throws Exception {
+        doTestCancelTriggersListenableFuture(Duration.ZERO, false);
+    }
+    @Test
+    public void testCancelBeforeTriggersListenableFutureSimple() throws Exception {
+        doTestCancelTriggersListenableFuture(Duration.millis(-50), false);
     }
-    public void doTestCancelTriggersListenableFuture(Duration delay) throws Exception {
-        Task<String> t = waitForSemaphore(Duration.TEN_SECONDS, true, "x");
+    public void doTestCancelTriggersListenableFuture(Duration delay, boolean dynamic) throws Exception {
+        Task<String> t = waitForSemaphore(Duration.TEN_SECONDS, true, "x", dynamic);
         addFutureListener(t, "before");
 
         Stopwatch watch = Stopwatch.createStarted();
         if (delay.isNegative()) {
-            new Thread(() -> { Time.sleep(delay.multiply(-1)); ec.submit(t); }).run(); 
+            new Thread(() -> {
+                Time.sleep(delay.multiply(-1)); 
+                ec.submit(t); 
+            }).start(); 
         } else {
             ec.submit(t);
         }