use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testThenCombine_sourceCancelled.
/**
* thenCombine result completes exceptionally if either source cancelled
*/
public void testThenCombine_sourceCancelled() throws Throwable {
for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) for (boolean fFirst : new boolean[] { true, false }) for (boolean failFirst : new boolean[] { true, false }) for (Integer v1 : new Integer[] { 1, null }) {
final CompletableFuture<Integer> f = new CompletableFuture<>();
final CompletableFuture<Integer> g = new CompletableFuture<>();
final SubtractFunction r1 = new SubtractFunction(m);
final SubtractFunction r2 = new SubtractFunction(m);
final SubtractFunction r3 = new SubtractFunction(m);
final CompletableFuture<Integer> fst = fFirst ? f : g;
final CompletableFuture<Integer> snd = !fFirst ? f : g;
final Callable<Boolean> complete1 = failFirst ? () -> fst.cancel(mayInterruptIfRunning) : () -> fst.complete(v1);
final Callable<Boolean> complete2 = failFirst ? () -> snd.complete(v1) : () -> snd.cancel(mayInterruptIfRunning);
final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
assertTrue(complete1.call());
final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
checkIncomplete(h1);
checkIncomplete(h2);
assertTrue(complete2.call());
final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
checkCompletedWithWrappedCancellationException(h1);
checkCompletedWithWrappedCancellationException(h2);
checkCompletedWithWrappedCancellationException(h3);
r1.assertNotInvoked();
r2.assertNotInvoked();
r3.assertNotInvoked();
checkCompletedNormally(failFirst ? snd : fst, v1);
checkCancelled(failFirst ? fst : snd);
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testAcceptEither_normalCompletion.
/**
* acceptEither result completes normally after normal completion
* of either source
*/
public void testAcceptEither_normalCompletion() {
for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) for (Integer v2 : new Integer[] { 2, null }) {
final CompletableFuture<Integer> f = new CompletableFuture<>();
final CompletableFuture<Integer> g = new CompletableFuture<>();
final NoopConsumer[] rs = new NoopConsumer[6];
for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
checkIncomplete(h0);
checkIncomplete(h1);
rs[0].assertNotInvoked();
rs[1].assertNotInvoked();
f.complete(v1);
checkCompletedNormally(h0, null);
checkCompletedNormally(h1, null);
rs[0].assertValue(v1);
rs[1].assertValue(v1);
final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
checkCompletedNormally(h2, null);
checkCompletedNormally(h3, null);
rs[2].assertValue(v1);
rs[3].assertValue(v1);
g.complete(v2);
// unspecified behavior - both source completions available
final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
checkCompletedNormally(h4, null);
checkCompletedNormally(h5, null);
assertTrue(Objects.equals(v1, rs[4].value) || Objects.equals(v2, rs[4].value));
assertTrue(Objects.equals(v1, rs[5].value) || Objects.equals(v2, rs[5].value));
checkCompletedNormally(f, v1);
checkCompletedNormally(g, v2);
checkCompletedNormally(h0, null);
checkCompletedNormally(h1, null);
checkCompletedNormally(h2, null);
checkCompletedNormally(h3, null);
for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testHandle_sourceCompletedNormallyActionFailed.
/**
* If a "handle action" throws an exception when triggered by
* a normal completion, it completes exceptionally
*/
public void testHandle_sourceCompletedNormallyActionFailed() {
for (ExecutionMode m : ExecutionMode.values()) for (boolean createIncomplete : new boolean[] { true, false }) for (Integer v1 : new Integer[] { 1, null }) {
final CompletableFuture<Integer> f = new CompletableFuture<>();
final AtomicInteger a = new AtomicInteger(0);
final CFException ex = new CFException();
if (!createIncomplete)
assertTrue(f.complete(v1));
final CompletableFuture<Integer> g = m.handle(f, (Integer result, Throwable t) -> {
m.checkExecutionMode();
threadAssertSame(result, v1);
threadAssertNull(t);
a.getAndIncrement();
throw ex;
});
if (createIncomplete)
assertTrue(f.complete(v1));
checkCompletedWithWrappedException(g, ex);
checkCompletedNormally(f, v1);
assertEquals(1, a.get());
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testDefaultExecutor.
/**
* defaultExecutor by default returns the commonPool if
* it supports more than one thread.
*/
public void testDefaultExecutor() {
CompletableFuture<Integer> f = new CompletableFuture<>();
Executor e = f.defaultExecutor();
Executor c = ForkJoinPool.commonPool();
if (ForkJoinPool.getCommonPoolParallelism() > 1)
assertSame(e, c);
else
assertNotSame(e, c);
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testAnyOfGarbageRetention.
/**
* Reproduction recipe for:
* 8160402: Garbage retention with CompletableFuture.anyOf
* cvs update -D '2016-05-01' ./src/main/java/util/concurrent/CompletableFuture.java && ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testAnyOfGarbageRetention tck; cvs update -A
*/
public void testAnyOfGarbageRetention() throws Throwable {
for (Integer v : new Integer[] { 1, null }) {
final int n = expensiveTests ? 100_000 : 10;
CompletableFuture<Integer>[] fs = (CompletableFuture<Integer>[]) new CompletableFuture<?>[100];
for (int i = 0; i < fs.length; i++) fs[i] = new CompletableFuture<>();
fs[fs.length - 1].complete(v);
for (int i = 0; i < n; i++) checkCompletedNormally(CompletableFuture.anyOf(fs), v);
}
}
Aggregations