use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testWhenComplete_sourceCancelled.
/**
* whenComplete action executes on cancelled source, propagating
* CancellationException.
*/
public void testWhenComplete_sourceCancelled() {
for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) for (boolean createIncomplete : new boolean[] { true, false }) {
final AtomicInteger a = new AtomicInteger(0);
final CompletableFuture<Integer> f = new CompletableFuture<>();
if (!createIncomplete)
assertTrue(f.cancel(mayInterruptIfRunning));
final CompletableFuture<Integer> g = m.whenComplete(f, (Integer result, Throwable t) -> {
m.checkExecutionMode();
threadAssertNull(result);
threadAssertTrue(t instanceof CancellationException);
a.getAndIncrement();
});
if (createIncomplete)
assertTrue(f.cancel(mayInterruptIfRunning));
checkCompletedWithWrappedCancellationException(g);
checkCancelled(f);
assertEquals(1, a.get());
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testHandle_normalCompletion.
/**
* handle action completes normally with function value on normal
* completion of source
*/
public void testHandle_normalCompletion() {
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);
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();
return inc(v1);
});
if (createIncomplete)
assertTrue(f.complete(v1));
checkCompletedNormally(g, inc(v1));
checkCompletedNormally(f, v1);
assertEquals(1, a.get());
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testRunAfterEither_sourceCancelled.
/**
* runAfterEither result completes exceptionally if either source cancelled
*/
public void testRunAfterEither_sourceCancelled() {
for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) for (Integer v1 : new Integer[] { 1, null }) {
final CompletableFuture<Integer> f = new CompletableFuture<>();
final CompletableFuture<Integer> g = new CompletableFuture<>();
final Noop[] rs = new Noop[6];
for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
checkIncomplete(h0);
checkIncomplete(h1);
rs[0].assertNotInvoked();
rs[1].assertNotInvoked();
f.cancel(mayInterruptIfRunning);
checkCompletedWithWrappedCancellationException(h0);
checkCompletedWithWrappedCancellationException(h1);
final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
checkCompletedWithWrappedCancellationException(h2);
checkCompletedWithWrappedCancellationException(h3);
assertTrue(g.complete(v1));
// unspecified behavior - both source completions available
final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
try {
assertNull(h4.join());
rs[4].assertInvoked();
} catch (CompletionException ok) {
checkCompletedWithWrappedCancellationException(h4);
rs[4].assertNotInvoked();
}
try {
assertNull(h5.join());
rs[5].assertInvoked();
} catch (CompletionException ok) {
checkCompletedWithWrappedCancellationException(h5);
rs[5].assertNotInvoked();
}
checkCancelled(f);
checkCompletedNormally(g, v1);
checkCompletedWithWrappedCancellationException(h0);
checkCompletedWithWrappedCancellationException(h1);
checkCompletedWithWrappedCancellationException(h2);
checkCompletedWithWrappedCancellationException(h3);
for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testNewIncompleteFuture.
// jdk9
/**
* newIncompleteFuture returns an incomplete CompletableFuture
*/
public void testNewIncompleteFuture() {
for (Integer v1 : new Integer[] { 1, null }) {
CompletableFuture<Integer> f = new CompletableFuture<>();
CompletableFuture<Integer> g = f.newIncompleteFuture();
checkIncomplete(f);
checkIncomplete(g);
f.complete(v1);
checkCompletedNormally(f, v1);
checkIncomplete(g);
g.complete(v1);
checkCompletedNormally(g, v1);
assertSame(g.getClass(), CompletableFuture.class);
}
}
use of java8.util.concurrent.CompletableFuture in project streamsupport by stefan-zobel.
the class CompletableFutureTest method testRunAfterEither_exceptionalCompletion2.
public void testRunAfterEither_exceptionalCompletion2() {
for (ExecutionMode m : ExecutionMode.values()) for (boolean fFirst : new boolean[] { true, false }) for (Integer v1 : new Integer[] { 1, null }) {
final CompletableFuture<Integer> f = new CompletableFuture<>();
final CompletableFuture<Integer> g = new CompletableFuture<>();
final CFException ex = new CFException();
final Noop[] rs = new Noop[6];
for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
// unspecified behavior - both source completions available
try {
assertNull(h0.join());
rs[0].assertInvoked();
} catch (CompletionException ok) {
checkCompletedWithWrappedException(h0, ex);
rs[0].assertNotInvoked();
}
try {
assertNull(h1.join());
rs[1].assertInvoked();
} catch (CompletionException ok) {
checkCompletedWithWrappedException(h1, ex);
rs[1].assertNotInvoked();
}
try {
assertNull(h2.join());
rs[2].assertInvoked();
} catch (CompletionException ok) {
checkCompletedWithWrappedException(h2, ex);
rs[2].assertNotInvoked();
}
try {
assertNull(h3.join());
rs[3].assertInvoked();
} catch (CompletionException ok) {
checkCompletedWithWrappedException(h3, ex);
rs[3].assertNotInvoked();
}
checkCompletedNormally(f, v1);
checkCompletedExceptionally(g, ex);
}
}
Aggregations