--- jsr166/src/test/tck/CompletableFutureTest.java 2016/07/03 19:35:50 1.165 +++ jsr166/src/test/tck/CompletableFutureTest.java 2016/07/18 17:19:01 1.168 @@ -3967,6 +3967,7 @@ public class CompletableFutureTest exten List> stages = new ArrayList<>(); stages.add(new CompletableFuture().minimalCompletionStage()); stages.add(CompletableFuture.completedStage(1)); + stages.add(CompletableFuture.failedStage(new CFException())); List bugs = new ArrayList<>(); for (Method method : allMethods) { @@ -4241,12 +4242,11 @@ public class CompletableFutureTest exten } } - /* - * Tests below currently fail in stress mode due to memory retention. - * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest tck + /** + * Checks for garbage retention with anyOf. + * Following used to fail with OOME: + * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testAnyOfGarbageRetention tck */ - - /** Checks for garbage retention with anyOf. */ public void testAnyOfGarbageRetention() throws Throwable { for (Integer v : new Integer[] { 1, null }) { @@ -4260,7 +4260,12 @@ public class CompletableFutureTest exten checkCompletedNormally(CompletableFuture.anyOf(fs), v); }} - /** Checks for garbage retention with allOf. */ + /** + * Checks for garbage retention with allOf. + * + * As of 2016-07, fails with OOME: + * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testCancelledAllOfGarbageRetention tck + */ public void testCancelledAllOfGarbageRetention() throws Throwable { final int n = expensiveTests ? 100_000 : 10; CompletableFuture[] fs @@ -4271,6 +4276,20 @@ public class CompletableFutureTest exten assertTrue(CompletableFuture.allOf(fs).cancel(false)); } + /** + * Checks for garbage retention when a dependent future is + * cancelled and garbage-collected. + * + * As of 2016-07, fails with OOME: + * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testCancelledGarbageRetention tck + */ + public void testCancelledGarbageRetention() throws Throwable { + final int n = expensiveTests ? 100_000 : 10; + CompletableFuture neverCompleted = new CompletableFuture<>(); + for (int i = 0; i < n; i++) + assertTrue(neverCompleted.thenRun(() -> {}).cancel(true)); + } + // static U join(CompletionStage stage) { // CompletableFuture f = new CompletableFuture<>(); // stage.whenComplete((v, ex) -> {