use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testApplyToEither_normalCompletion.
/**
* applyToEither result completes normally after normal completion
* of either source
*/
public void testApplyToEither_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 IncFunction[] rs = new IncFunction[6];
for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
checkIncomplete(h0);
checkIncomplete(h1);
rs[0].assertNotInvoked();
rs[1].assertNotInvoked();
f.complete(v1);
checkCompletedNormally(h0, inc(v1));
checkCompletedNormally(h1, inc(v1));
final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
checkCompletedNormally(h2, inc(v1));
checkCompletedNormally(h3, inc(v1));
g.complete(v2);
// unspecified behavior - both source completions available
final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
rs[4].assertValue(h4.join());
rs[5].assertValue(h5.join());
assertTrue(Objects.equals(inc(v1), h4.join()) || Objects.equals(inc(v2), h4.join()));
assertTrue(Objects.equals(inc(v1), h5.join()) || Objects.equals(inc(v2), h5.join()));
checkCompletedNormally(f, v1);
checkCompletedNormally(g, v2);
checkCompletedNormally(h0, inc(v1));
checkCompletedNormally(h1, inc(v1));
checkCompletedNormally(h2, inc(v1));
checkCompletedNormally(h3, inc(v1));
for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testOrTimeout_completed.
/**
* orTimeout completes normally if completed before timeout
*/
public void testOrTimeout_completed() {
for (Integer v1 : new Integer[] { 1, null }) {
CompletableFuture<Integer> f = new CompletableFuture<>();
CompletableFuture<Integer> g = new CompletableFuture<>();
long startTime = System.nanoTime();
f.complete(v1);
assertSame(f, f.orTimeout(LONG_DELAY_MS, MILLISECONDS));
assertSame(g, g.orTimeout(LONG_DELAY_MS, MILLISECONDS));
g.complete(v1);
checkCompletedNormally(f, v1);
checkCompletedNormally(g, v1);
assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testHandle_exceptionalCompletion.
/**
* handle action completes normally with function value on
* exceptional completion of source
*/
public void testHandle_exceptionalCompletion() {
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)
f.completeExceptionally(ex);
final CompletableFuture<Integer> g = m.handle(f, (Integer result, Throwable t) -> {
m.checkExecutionMode();
threadAssertNull(result);
threadAssertSame(t, ex);
a.getAndIncrement();
return v1;
});
if (createIncomplete)
f.completeExceptionally(ex);
checkCompletedNormally(g, v1);
checkCompletedExceptionally(f, ex);
assertEquals(1, a.get());
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testRunAfterEither_actionFailed.
/**
* runAfterEither result completes exceptionally if action does
*/
public void testRunAfterEither_actionFailed() {
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 FailingRunnable[] rs = new FailingRunnable[6];
for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
assertTrue(f.complete(v1));
final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
checkCompletedWithWrappedException(h0, rs[0].ex);
checkCompletedWithWrappedException(h1, rs[1].ex);
checkCompletedWithWrappedException(h2, rs[2].ex);
checkCompletedWithWrappedException(h3, rs[3].ex);
for (int i = 0; i < 4; i++) rs[i].assertInvoked();
assertTrue(g.complete(v2));
final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
checkCompletedWithWrappedException(h4, rs[4].ex);
checkCompletedWithWrappedException(h5, rs[5].ex);
checkCompletedNormally(f, v1);
checkCompletedNormally(g, v2);
for (int i = 0; i < 6; i++) rs[i].assertInvoked();
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testThenCompose_actionFailed.
/**
* thenCompose result completes exceptionally if action does
*/
public void testThenCompose_actionFailed() {
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 FailingCompletableFutureFunction r = new FailingCompletableFutureFunction(m);
if (!createIncomplete)
assertTrue(f.complete(v1));
final CompletableFuture<Integer> g = m.thenCompose(f, r);
if (createIncomplete)
assertTrue(f.complete(v1));
checkCompletedWithWrappedException(g, r.ex);
checkCompletedNormally(f, v1);
}
}
Aggregations