ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.161
Committed: Tue Jun 28 14:49:48 2016 UTC (7 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.160: +6 -10 lines
Log Message:
use more locally consistent indentation style

File Contents

# Content
1 /*
2 * Written by Doug Lea and Martin Buchholz with assistance from
3 * members of JCP JSR-166 Expert Group and released to the public
4 * domain, as explained at
5 * http://creativecommons.org/publicdomain/zero/1.0/
6 */
7
8 import static java.util.concurrent.TimeUnit.MILLISECONDS;
9 import static java.util.concurrent.TimeUnit.SECONDS;
10 import static java.util.concurrent.CompletableFuture.completedFuture;
11 import static java.util.concurrent.CompletableFuture.failedFuture;
12
13 import java.lang.reflect.Method;
14 import java.lang.reflect.Modifier;
15
16 import java.util.stream.Collectors;
17 import java.util.stream.Stream;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.List;
22 import java.util.Objects;
23 import java.util.Set;
24 import java.util.concurrent.Callable;
25 import java.util.concurrent.CancellationException;
26 import java.util.concurrent.CompletableFuture;
27 import java.util.concurrent.CompletionException;
28 import java.util.concurrent.CompletionStage;
29 import java.util.concurrent.ExecutionException;
30 import java.util.concurrent.Executor;
31 import java.util.concurrent.ForkJoinPool;
32 import java.util.concurrent.ForkJoinTask;
33 import java.util.concurrent.RejectedExecutionException;
34 import java.util.concurrent.TimeoutException;
35 import java.util.concurrent.TimeUnit;
36 import java.util.concurrent.atomic.AtomicInteger;
37 import java.util.concurrent.atomic.AtomicReference;
38 import java.util.function.BiConsumer;
39 import java.util.function.BiFunction;
40 import java.util.function.Consumer;
41 import java.util.function.Function;
42 import java.util.function.Predicate;
43 import java.util.function.Supplier;
44
45 import junit.framework.AssertionFailedError;
46 import junit.framework.Test;
47 import junit.framework.TestSuite;
48
49 public class CompletableFutureTest extends JSR166TestCase {
50
51 public static void main(String[] args) {
52 main(suite(), args);
53 }
54 public static Test suite() {
55 return new TestSuite(CompletableFutureTest.class);
56 }
57
58 static class CFException extends RuntimeException {}
59
60 void checkIncomplete(CompletableFuture<?> f) {
61 assertFalse(f.isDone());
62 assertFalse(f.isCancelled());
63 assertTrue(f.toString().contains("Not completed"));
64 try {
65 assertNull(f.getNow(null));
66 } catch (Throwable fail) { threadUnexpectedException(fail); }
67 try {
68 f.get(0L, SECONDS);
69 shouldThrow();
70 }
71 catch (TimeoutException success) {}
72 catch (Throwable fail) { threadUnexpectedException(fail); }
73 }
74
75 <T> void checkCompletedNormally(CompletableFuture<T> f, T value) {
76 checkTimedGet(f, value);
77
78 try {
79 assertEquals(value, f.join());
80 } catch (Throwable fail) { threadUnexpectedException(fail); }
81 try {
82 assertEquals(value, f.getNow(null));
83 } catch (Throwable fail) { threadUnexpectedException(fail); }
84 try {
85 assertEquals(value, f.get());
86 } catch (Throwable fail) { threadUnexpectedException(fail); }
87 assertTrue(f.isDone());
88 assertFalse(f.isCancelled());
89 assertFalse(f.isCompletedExceptionally());
90 assertTrue(f.toString().contains("[Completed normally]"));
91 }
92
93 /**
94 * Returns the "raw" internal exceptional completion of f,
95 * without any additional wrapping with CompletionException.
96 */
97 <U> Throwable exceptionalCompletion(CompletableFuture<U> f) {
98 // handle (and whenComplete) can distinguish between "direct"
99 // and "wrapped" exceptional completion
100 return f.handle((U u, Throwable t) -> t).join();
101 }
102
103 void checkCompletedExceptionally(CompletableFuture<?> f,
104 boolean wrapped,
105 Consumer<Throwable> checker) {
106 Throwable cause = exceptionalCompletion(f);
107 if (wrapped) {
108 assertTrue(cause instanceof CompletionException);
109 cause = cause.getCause();
110 }
111 checker.accept(cause);
112
113 long startTime = System.nanoTime();
114 try {
115 f.get(LONG_DELAY_MS, MILLISECONDS);
116 shouldThrow();
117 } catch (ExecutionException success) {
118 assertSame(cause, success.getCause());
119 } catch (Throwable fail) { threadUnexpectedException(fail); }
120 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
121
122 try {
123 f.join();
124 shouldThrow();
125 } catch (CompletionException success) {
126 assertSame(cause, success.getCause());
127 } catch (Throwable fail) { threadUnexpectedException(fail); }
128
129 try {
130 f.getNow(null);
131 shouldThrow();
132 } catch (CompletionException success) {
133 assertSame(cause, success.getCause());
134 } catch (Throwable fail) { threadUnexpectedException(fail); }
135
136 try {
137 f.get();
138 shouldThrow();
139 } catch (ExecutionException success) {
140 assertSame(cause, success.getCause());
141 } catch (Throwable fail) { threadUnexpectedException(fail); }
142
143 assertFalse(f.isCancelled());
144 assertTrue(f.isDone());
145 assertTrue(f.isCompletedExceptionally());
146 assertTrue(f.toString().contains("[Completed exceptionally]"));
147 }
148
149 void checkCompletedWithWrappedCFException(CompletableFuture<?> f) {
150 checkCompletedExceptionally(f, true,
151 (t) -> assertTrue(t instanceof CFException));
152 }
153
154 void checkCompletedWithWrappedCancellationException(CompletableFuture<?> f) {
155 checkCompletedExceptionally(f, true,
156 (t) -> assertTrue(t instanceof CancellationException));
157 }
158
159 void checkCompletedWithTimeoutException(CompletableFuture<?> f) {
160 checkCompletedExceptionally(f, false,
161 (t) -> assertTrue(t instanceof TimeoutException));
162 }
163
164 void checkCompletedWithWrappedException(CompletableFuture<?> f,
165 Throwable ex) {
166 checkCompletedExceptionally(f, true, (t) -> assertSame(t, ex));
167 }
168
169 void checkCompletedExceptionally(CompletableFuture<?> f, Throwable ex) {
170 checkCompletedExceptionally(f, false, (t) -> assertSame(t, ex));
171 }
172
173 void checkCancelled(CompletableFuture<?> f) {
174 long startTime = System.nanoTime();
175 try {
176 f.get(LONG_DELAY_MS, MILLISECONDS);
177 shouldThrow();
178 } catch (CancellationException success) {
179 } catch (Throwable fail) { threadUnexpectedException(fail); }
180 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
181
182 try {
183 f.join();
184 shouldThrow();
185 } catch (CancellationException success) {}
186 try {
187 f.getNow(null);
188 shouldThrow();
189 } catch (CancellationException success) {}
190 try {
191 f.get();
192 shouldThrow();
193 } catch (CancellationException success) {
194 } catch (Throwable fail) { threadUnexpectedException(fail); }
195
196 assertTrue(exceptionalCompletion(f) instanceof CancellationException);
197
198 assertTrue(f.isDone());
199 assertTrue(f.isCompletedExceptionally());
200 assertTrue(f.isCancelled());
201 assertTrue(f.toString().contains("[Completed exceptionally]"));
202 }
203
204 /**
205 * A newly constructed CompletableFuture is incomplete, as indicated
206 * by methods isDone, isCancelled, and getNow
207 */
208 public void testConstructor() {
209 CompletableFuture<Integer> f = new CompletableFuture<>();
210 checkIncomplete(f);
211 }
212
213 /**
214 * complete completes normally, as indicated by methods isDone,
215 * isCancelled, join, get, and getNow
216 */
217 public void testComplete() {
218 for (Integer v1 : new Integer[] { 1, null })
219 {
220 CompletableFuture<Integer> f = new CompletableFuture<>();
221 checkIncomplete(f);
222 assertTrue(f.complete(v1));
223 assertFalse(f.complete(v1));
224 checkCompletedNormally(f, v1);
225 }}
226
227 /**
228 * completeExceptionally completes exceptionally, as indicated by
229 * methods isDone, isCancelled, join, get, and getNow
230 */
231 public void testCompleteExceptionally() {
232 CompletableFuture<Integer> f = new CompletableFuture<>();
233 CFException ex = new CFException();
234 checkIncomplete(f);
235 f.completeExceptionally(ex);
236 checkCompletedExceptionally(f, ex);
237 }
238
239 /**
240 * cancel completes exceptionally and reports cancelled, as indicated by
241 * methods isDone, isCancelled, join, get, and getNow
242 */
243 public void testCancel() {
244 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
245 {
246 CompletableFuture<Integer> f = new CompletableFuture<>();
247 checkIncomplete(f);
248 assertTrue(f.cancel(mayInterruptIfRunning));
249 assertTrue(f.cancel(mayInterruptIfRunning));
250 assertTrue(f.cancel(!mayInterruptIfRunning));
251 checkCancelled(f);
252 }}
253
254 /**
255 * obtrudeValue forces completion with given value
256 */
257 public void testObtrudeValue() {
258 CompletableFuture<Integer> f = new CompletableFuture<>();
259 checkIncomplete(f);
260 assertTrue(f.complete(one));
261 checkCompletedNormally(f, one);
262 f.obtrudeValue(three);
263 checkCompletedNormally(f, three);
264 f.obtrudeValue(two);
265 checkCompletedNormally(f, two);
266 f = new CompletableFuture<>();
267 f.obtrudeValue(three);
268 checkCompletedNormally(f, three);
269 f.obtrudeValue(null);
270 checkCompletedNormally(f, null);
271 f = new CompletableFuture<>();
272 f.completeExceptionally(new CFException());
273 f.obtrudeValue(four);
274 checkCompletedNormally(f, four);
275 }
276
277 /**
278 * obtrudeException forces completion with given exception
279 */
280 public void testObtrudeException() {
281 for (Integer v1 : new Integer[] { 1, null })
282 {
283 CFException ex;
284 CompletableFuture<Integer> f;
285
286 f = new CompletableFuture<>();
287 assertTrue(f.complete(v1));
288 for (int i = 0; i < 2; i++) {
289 f.obtrudeException(ex = new CFException());
290 checkCompletedExceptionally(f, ex);
291 }
292
293 f = new CompletableFuture<>();
294 for (int i = 0; i < 2; i++) {
295 f.obtrudeException(ex = new CFException());
296 checkCompletedExceptionally(f, ex);
297 }
298
299 f = new CompletableFuture<>();
300 f.completeExceptionally(ex = new CFException());
301 f.obtrudeValue(v1);
302 checkCompletedNormally(f, v1);
303 f.obtrudeException(ex = new CFException());
304 checkCompletedExceptionally(f, ex);
305 f.completeExceptionally(new CFException());
306 checkCompletedExceptionally(f, ex);
307 assertFalse(f.complete(v1));
308 checkCompletedExceptionally(f, ex);
309 }}
310
311 /**
312 * getNumberOfDependents returns number of dependent tasks
313 */
314 public void testGetNumberOfDependents() {
315 for (ExecutionMode m : ExecutionMode.values())
316 for (Integer v1 : new Integer[] { 1, null })
317 {
318 CompletableFuture<Integer> f = new CompletableFuture<>();
319 assertEquals(0, f.getNumberOfDependents());
320 final CompletableFuture<Void> g = m.thenRun(f, new Noop(m));
321 assertEquals(1, f.getNumberOfDependents());
322 assertEquals(0, g.getNumberOfDependents());
323 final CompletableFuture<Void> h = m.thenRun(f, new Noop(m));
324 assertEquals(2, f.getNumberOfDependents());
325 assertEquals(0, h.getNumberOfDependents());
326 assertTrue(f.complete(v1));
327 checkCompletedNormally(g, null);
328 checkCompletedNormally(h, null);
329 assertEquals(0, f.getNumberOfDependents());
330 assertEquals(0, g.getNumberOfDependents());
331 assertEquals(0, h.getNumberOfDependents());
332 }}
333
334 /**
335 * toString indicates current completion state
336 */
337 public void testToString() {
338 CompletableFuture<String> f;
339
340 f = new CompletableFuture<String>();
341 assertTrue(f.toString().contains("[Not completed]"));
342
343 assertTrue(f.complete("foo"));
344 assertTrue(f.toString().contains("[Completed normally]"));
345
346 f = new CompletableFuture<String>();
347 assertTrue(f.completeExceptionally(new IndexOutOfBoundsException()));
348 assertTrue(f.toString().contains("[Completed exceptionally]"));
349
350 for (boolean mayInterruptIfRunning : new boolean[] { true, false }) {
351 f = new CompletableFuture<String>();
352 assertTrue(f.cancel(mayInterruptIfRunning));
353 assertTrue(f.toString().contains("[Completed exceptionally]"));
354 }
355 }
356
357 /**
358 * completedFuture returns a completed CompletableFuture with given value
359 */
360 public void testCompletedFuture() {
361 CompletableFuture<String> f = CompletableFuture.completedFuture("test");
362 checkCompletedNormally(f, "test");
363 }
364
365 abstract class CheckedAction {
366 int invocationCount = 0;
367 final ExecutionMode m;
368 CheckedAction(ExecutionMode m) { this.m = m; }
369 void invoked() {
370 m.checkExecutionMode();
371 assertEquals(0, invocationCount++);
372 }
373 void assertNotInvoked() { assertEquals(0, invocationCount); }
374 void assertInvoked() { assertEquals(1, invocationCount); }
375 }
376
377 abstract class CheckedIntegerAction extends CheckedAction {
378 Integer value;
379 CheckedIntegerAction(ExecutionMode m) { super(m); }
380 void assertValue(Integer expected) {
381 assertInvoked();
382 assertEquals(expected, value);
383 }
384 }
385
386 class IntegerSupplier extends CheckedAction
387 implements Supplier<Integer>
388 {
389 final Integer value;
390 IntegerSupplier(ExecutionMode m, Integer value) {
391 super(m);
392 this.value = value;
393 }
394 public Integer get() {
395 invoked();
396 return value;
397 }
398 }
399
400 // A function that handles and produces null values as well.
401 static Integer inc(Integer x) {
402 return (x == null) ? null : x + 1;
403 }
404
405 class NoopConsumer extends CheckedIntegerAction
406 implements Consumer<Integer>
407 {
408 NoopConsumer(ExecutionMode m) { super(m); }
409 public void accept(Integer x) {
410 invoked();
411 value = x;
412 }
413 }
414
415 class IncFunction extends CheckedIntegerAction
416 implements Function<Integer,Integer>
417 {
418 IncFunction(ExecutionMode m) { super(m); }
419 public Integer apply(Integer x) {
420 invoked();
421 return value = inc(x);
422 }
423 }
424
425 // Choose non-commutative actions for better coverage
426 // A non-commutative function that handles and produces null values as well.
427 static Integer subtract(Integer x, Integer y) {
428 return (x == null && y == null) ? null :
429 ((x == null) ? 42 : x.intValue())
430 - ((y == null) ? 99 : y.intValue());
431 }
432
433 class SubtractAction extends CheckedIntegerAction
434 implements BiConsumer<Integer, Integer>
435 {
436 SubtractAction(ExecutionMode m) { super(m); }
437 public void accept(Integer x, Integer y) {
438 invoked();
439 value = subtract(x, y);
440 }
441 }
442
443 class SubtractFunction extends CheckedIntegerAction
444 implements BiFunction<Integer, Integer, Integer>
445 {
446 SubtractFunction(ExecutionMode m) { super(m); }
447 public Integer apply(Integer x, Integer y) {
448 invoked();
449 return value = subtract(x, y);
450 }
451 }
452
453 class Noop extends CheckedAction implements Runnable {
454 Noop(ExecutionMode m) { super(m); }
455 public void run() {
456 invoked();
457 }
458 }
459
460 class FailingSupplier extends CheckedAction
461 implements Supplier<Integer>
462 {
463 final CFException ex;
464 FailingSupplier(ExecutionMode m) { super(m); ex = new CFException(); }
465 public Integer get() {
466 invoked();
467 throw ex;
468 }
469 }
470
471 class FailingConsumer extends CheckedIntegerAction
472 implements Consumer<Integer>
473 {
474 final CFException ex;
475 FailingConsumer(ExecutionMode m) { super(m); ex = new CFException(); }
476 public void accept(Integer x) {
477 invoked();
478 value = x;
479 throw ex;
480 }
481 }
482
483 class FailingBiConsumer extends CheckedIntegerAction
484 implements BiConsumer<Integer, Integer>
485 {
486 final CFException ex;
487 FailingBiConsumer(ExecutionMode m) { super(m); ex = new CFException(); }
488 public void accept(Integer x, Integer y) {
489 invoked();
490 value = subtract(x, y);
491 throw ex;
492 }
493 }
494
495 class FailingFunction extends CheckedIntegerAction
496 implements Function<Integer, Integer>
497 {
498 final CFException ex;
499 FailingFunction(ExecutionMode m) { super(m); ex = new CFException(); }
500 public Integer apply(Integer x) {
501 invoked();
502 value = x;
503 throw ex;
504 }
505 }
506
507 class FailingBiFunction extends CheckedIntegerAction
508 implements BiFunction<Integer, Integer, Integer>
509 {
510 final CFException ex;
511 FailingBiFunction(ExecutionMode m) { super(m); ex = new CFException(); }
512 public Integer apply(Integer x, Integer y) {
513 invoked();
514 value = subtract(x, y);
515 throw ex;
516 }
517 }
518
519 class FailingRunnable extends CheckedAction implements Runnable {
520 final CFException ex;
521 FailingRunnable(ExecutionMode m) { super(m); ex = new CFException(); }
522 public void run() {
523 invoked();
524 throw ex;
525 }
526 }
527
528 class CompletableFutureInc extends CheckedIntegerAction
529 implements Function<Integer, CompletableFuture<Integer>>
530 {
531 CompletableFutureInc(ExecutionMode m) { super(m); }
532 public CompletableFuture<Integer> apply(Integer x) {
533 invoked();
534 value = x;
535 CompletableFuture<Integer> f = new CompletableFuture<>();
536 assertTrue(f.complete(inc(x)));
537 return f;
538 }
539 }
540
541 class FailingCompletableFutureFunction extends CheckedIntegerAction
542 implements Function<Integer, CompletableFuture<Integer>>
543 {
544 final CFException ex;
545 FailingCompletableFutureFunction(ExecutionMode m) { super(m); ex = new CFException(); }
546 public CompletableFuture<Integer> apply(Integer x) {
547 invoked();
548 value = x;
549 throw ex;
550 }
551 }
552
553 static class CountingRejectingExecutor implements Executor {
554 final RejectedExecutionException ex = new RejectedExecutionException();
555 final AtomicInteger count = new AtomicInteger(0);
556 public void execute(Runnable r) {
557 count.getAndIncrement();
558 throw ex;
559 }
560 }
561
562 // Used for explicit executor tests
563 static final class ThreadExecutor implements Executor {
564 final AtomicInteger count = new AtomicInteger(0);
565 static final ThreadGroup tg = new ThreadGroup("ThreadExecutor");
566 static boolean startedCurrentThread() {
567 return Thread.currentThread().getThreadGroup() == tg;
568 }
569
570 public void execute(Runnable r) {
571 count.getAndIncrement();
572 new Thread(tg, r).start();
573 }
574 }
575
576 static final boolean defaultExecutorIsCommonPool
577 = ForkJoinPool.getCommonPoolParallelism() > 1;
578
579 /**
580 * Permits the testing of parallel code for the 3 different
581 * execution modes without copy/pasting all the test methods.
582 */
583 enum ExecutionMode {
584 SYNC {
585 public void checkExecutionMode() {
586 assertFalse(ThreadExecutor.startedCurrentThread());
587 assertNull(ForkJoinTask.getPool());
588 }
589 public CompletableFuture<Void> runAsync(Runnable a) {
590 throw new UnsupportedOperationException();
591 }
592 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
593 throw new UnsupportedOperationException();
594 }
595 public <T> CompletableFuture<Void> thenRun
596 (CompletableFuture<T> f, Runnable a) {
597 return f.thenRun(a);
598 }
599 public <T> CompletableFuture<Void> thenAccept
600 (CompletableFuture<T> f, Consumer<? super T> a) {
601 return f.thenAccept(a);
602 }
603 public <T,U> CompletableFuture<U> thenApply
604 (CompletableFuture<T> f, Function<? super T,U> a) {
605 return f.thenApply(a);
606 }
607 public <T,U> CompletableFuture<U> thenCompose
608 (CompletableFuture<T> f,
609 Function<? super T,? extends CompletionStage<U>> a) {
610 return f.thenCompose(a);
611 }
612 public <T,U> CompletableFuture<U> handle
613 (CompletableFuture<T> f,
614 BiFunction<? super T,Throwable,? extends U> a) {
615 return f.handle(a);
616 }
617 public <T> CompletableFuture<T> whenComplete
618 (CompletableFuture<T> f,
619 BiConsumer<? super T,? super Throwable> a) {
620 return f.whenComplete(a);
621 }
622 public <T,U> CompletableFuture<Void> runAfterBoth
623 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
624 return f.runAfterBoth(g, a);
625 }
626 public <T,U> CompletableFuture<Void> thenAcceptBoth
627 (CompletableFuture<T> f,
628 CompletionStage<? extends U> g,
629 BiConsumer<? super T,? super U> a) {
630 return f.thenAcceptBoth(g, a);
631 }
632 public <T,U,V> CompletableFuture<V> thenCombine
633 (CompletableFuture<T> f,
634 CompletionStage<? extends U> g,
635 BiFunction<? super T,? super U,? extends V> a) {
636 return f.thenCombine(g, a);
637 }
638 public <T> CompletableFuture<Void> runAfterEither
639 (CompletableFuture<T> f,
640 CompletionStage<?> g,
641 java.lang.Runnable a) {
642 return f.runAfterEither(g, a);
643 }
644 public <T> CompletableFuture<Void> acceptEither
645 (CompletableFuture<T> f,
646 CompletionStage<? extends T> g,
647 Consumer<? super T> a) {
648 return f.acceptEither(g, a);
649 }
650 public <T,U> CompletableFuture<U> applyToEither
651 (CompletableFuture<T> f,
652 CompletionStage<? extends T> g,
653 Function<? super T,U> a) {
654 return f.applyToEither(g, a);
655 }
656 },
657
658 ASYNC {
659 public void checkExecutionMode() {
660 assertEquals(defaultExecutorIsCommonPool,
661 (ForkJoinPool.commonPool() == ForkJoinTask.getPool()));
662 }
663 public CompletableFuture<Void> runAsync(Runnable a) {
664 return CompletableFuture.runAsync(a);
665 }
666 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
667 return CompletableFuture.supplyAsync(a);
668 }
669 public <T> CompletableFuture<Void> thenRun
670 (CompletableFuture<T> f, Runnable a) {
671 return f.thenRunAsync(a);
672 }
673 public <T> CompletableFuture<Void> thenAccept
674 (CompletableFuture<T> f, Consumer<? super T> a) {
675 return f.thenAcceptAsync(a);
676 }
677 public <T,U> CompletableFuture<U> thenApply
678 (CompletableFuture<T> f, Function<? super T,U> a) {
679 return f.thenApplyAsync(a);
680 }
681 public <T,U> CompletableFuture<U> thenCompose
682 (CompletableFuture<T> f,
683 Function<? super T,? extends CompletionStage<U>> a) {
684 return f.thenComposeAsync(a);
685 }
686 public <T,U> CompletableFuture<U> handle
687 (CompletableFuture<T> f,
688 BiFunction<? super T,Throwable,? extends U> a) {
689 return f.handleAsync(a);
690 }
691 public <T> CompletableFuture<T> whenComplete
692 (CompletableFuture<T> f,
693 BiConsumer<? super T,? super Throwable> a) {
694 return f.whenCompleteAsync(a);
695 }
696 public <T,U> CompletableFuture<Void> runAfterBoth
697 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
698 return f.runAfterBothAsync(g, a);
699 }
700 public <T,U> CompletableFuture<Void> thenAcceptBoth
701 (CompletableFuture<T> f,
702 CompletionStage<? extends U> g,
703 BiConsumer<? super T,? super U> a) {
704 return f.thenAcceptBothAsync(g, a);
705 }
706 public <T,U,V> CompletableFuture<V> thenCombine
707 (CompletableFuture<T> f,
708 CompletionStage<? extends U> g,
709 BiFunction<? super T,? super U,? extends V> a) {
710 return f.thenCombineAsync(g, a);
711 }
712 public <T> CompletableFuture<Void> runAfterEither
713 (CompletableFuture<T> f,
714 CompletionStage<?> g,
715 java.lang.Runnable a) {
716 return f.runAfterEitherAsync(g, a);
717 }
718 public <T> CompletableFuture<Void> acceptEither
719 (CompletableFuture<T> f,
720 CompletionStage<? extends T> g,
721 Consumer<? super T> a) {
722 return f.acceptEitherAsync(g, a);
723 }
724 public <T,U> CompletableFuture<U> applyToEither
725 (CompletableFuture<T> f,
726 CompletionStage<? extends T> g,
727 Function<? super T,U> a) {
728 return f.applyToEitherAsync(g, a);
729 }
730 },
731
732 EXECUTOR {
733 public void checkExecutionMode() {
734 assertTrue(ThreadExecutor.startedCurrentThread());
735 }
736 public CompletableFuture<Void> runAsync(Runnable a) {
737 return CompletableFuture.runAsync(a, new ThreadExecutor());
738 }
739 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
740 return CompletableFuture.supplyAsync(a, new ThreadExecutor());
741 }
742 public <T> CompletableFuture<Void> thenRun
743 (CompletableFuture<T> f, Runnable a) {
744 return f.thenRunAsync(a, new ThreadExecutor());
745 }
746 public <T> CompletableFuture<Void> thenAccept
747 (CompletableFuture<T> f, Consumer<? super T> a) {
748 return f.thenAcceptAsync(a, new ThreadExecutor());
749 }
750 public <T,U> CompletableFuture<U> thenApply
751 (CompletableFuture<T> f, Function<? super T,U> a) {
752 return f.thenApplyAsync(a, new ThreadExecutor());
753 }
754 public <T,U> CompletableFuture<U> thenCompose
755 (CompletableFuture<T> f,
756 Function<? super T,? extends CompletionStage<U>> a) {
757 return f.thenComposeAsync(a, new ThreadExecutor());
758 }
759 public <T,U> CompletableFuture<U> handle
760 (CompletableFuture<T> f,
761 BiFunction<? super T,Throwable,? extends U> a) {
762 return f.handleAsync(a, new ThreadExecutor());
763 }
764 public <T> CompletableFuture<T> whenComplete
765 (CompletableFuture<T> f,
766 BiConsumer<? super T,? super Throwable> a) {
767 return f.whenCompleteAsync(a, new ThreadExecutor());
768 }
769 public <T,U> CompletableFuture<Void> runAfterBoth
770 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
771 return f.runAfterBothAsync(g, a, new ThreadExecutor());
772 }
773 public <T,U> CompletableFuture<Void> thenAcceptBoth
774 (CompletableFuture<T> f,
775 CompletionStage<? extends U> g,
776 BiConsumer<? super T,? super U> a) {
777 return f.thenAcceptBothAsync(g, a, new ThreadExecutor());
778 }
779 public <T,U,V> CompletableFuture<V> thenCombine
780 (CompletableFuture<T> f,
781 CompletionStage<? extends U> g,
782 BiFunction<? super T,? super U,? extends V> a) {
783 return f.thenCombineAsync(g, a, new ThreadExecutor());
784 }
785 public <T> CompletableFuture<Void> runAfterEither
786 (CompletableFuture<T> f,
787 CompletionStage<?> g,
788 java.lang.Runnable a) {
789 return f.runAfterEitherAsync(g, a, new ThreadExecutor());
790 }
791 public <T> CompletableFuture<Void> acceptEither
792 (CompletableFuture<T> f,
793 CompletionStage<? extends T> g,
794 Consumer<? super T> a) {
795 return f.acceptEitherAsync(g, a, new ThreadExecutor());
796 }
797 public <T,U> CompletableFuture<U> applyToEither
798 (CompletableFuture<T> f,
799 CompletionStage<? extends T> g,
800 Function<? super T,U> a) {
801 return f.applyToEitherAsync(g, a, new ThreadExecutor());
802 }
803 };
804
805 public abstract void checkExecutionMode();
806 public abstract CompletableFuture<Void> runAsync(Runnable a);
807 public abstract <U> CompletableFuture<U> supplyAsync(Supplier<U> a);
808 public abstract <T> CompletableFuture<Void> thenRun
809 (CompletableFuture<T> f, Runnable a);
810 public abstract <T> CompletableFuture<Void> thenAccept
811 (CompletableFuture<T> f, Consumer<? super T> a);
812 public abstract <T,U> CompletableFuture<U> thenApply
813 (CompletableFuture<T> f, Function<? super T,U> a);
814 public abstract <T,U> CompletableFuture<U> thenCompose
815 (CompletableFuture<T> f,
816 Function<? super T,? extends CompletionStage<U>> a);
817 public abstract <T,U> CompletableFuture<U> handle
818 (CompletableFuture<T> f,
819 BiFunction<? super T,Throwable,? extends U> a);
820 public abstract <T> CompletableFuture<T> whenComplete
821 (CompletableFuture<T> f,
822 BiConsumer<? super T,? super Throwable> a);
823 public abstract <T,U> CompletableFuture<Void> runAfterBoth
824 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a);
825 public abstract <T,U> CompletableFuture<Void> thenAcceptBoth
826 (CompletableFuture<T> f,
827 CompletionStage<? extends U> g,
828 BiConsumer<? super T,? super U> a);
829 public abstract <T,U,V> CompletableFuture<V> thenCombine
830 (CompletableFuture<T> f,
831 CompletionStage<? extends U> g,
832 BiFunction<? super T,? super U,? extends V> a);
833 public abstract <T> CompletableFuture<Void> runAfterEither
834 (CompletableFuture<T> f,
835 CompletionStage<?> g,
836 java.lang.Runnable a);
837 public abstract <T> CompletableFuture<Void> acceptEither
838 (CompletableFuture<T> f,
839 CompletionStage<? extends T> g,
840 Consumer<? super T> a);
841 public abstract <T,U> CompletableFuture<U> applyToEither
842 (CompletableFuture<T> f,
843 CompletionStage<? extends T> g,
844 Function<? super T,U> a);
845 }
846
847 /**
848 * exceptionally action is not invoked when source completes
849 * normally, and source result is propagated
850 */
851 public void testExceptionally_normalCompletion() {
852 for (boolean createIncomplete : new boolean[] { true, false })
853 for (Integer v1 : new Integer[] { 1, null })
854 {
855 final AtomicInteger a = new AtomicInteger(0);
856 final CompletableFuture<Integer> f = new CompletableFuture<>();
857 if (!createIncomplete) assertTrue(f.complete(v1));
858 final CompletableFuture<Integer> g = f.exceptionally
859 ((Throwable t) -> {
860 a.getAndIncrement();
861 threadFail("should not be called");
862 return null; // unreached
863 });
864 if (createIncomplete) assertTrue(f.complete(v1));
865
866 checkCompletedNormally(g, v1);
867 checkCompletedNormally(f, v1);
868 assertEquals(0, a.get());
869 }}
870
871 /**
872 * exceptionally action completes with function value on source
873 * exception
874 */
875 public void testExceptionally_exceptionalCompletion() {
876 for (boolean createIncomplete : new boolean[] { true, false })
877 for (Integer v1 : new Integer[] { 1, null })
878 {
879 final AtomicInteger a = new AtomicInteger(0);
880 final CFException ex = new CFException();
881 final CompletableFuture<Integer> f = new CompletableFuture<>();
882 if (!createIncomplete) f.completeExceptionally(ex);
883 final CompletableFuture<Integer> g = f.exceptionally
884 ((Throwable t) -> {
885 ExecutionMode.SYNC.checkExecutionMode();
886 threadAssertSame(t, ex);
887 a.getAndIncrement();
888 return v1;
889 });
890 if (createIncomplete) f.completeExceptionally(ex);
891
892 checkCompletedNormally(g, v1);
893 assertEquals(1, a.get());
894 }}
895
896 /**
897 * If an "exceptionally action" throws an exception, it completes
898 * exceptionally with that exception
899 */
900 public void testExceptionally_exceptionalCompletionActionFailed() {
901 for (boolean createIncomplete : new boolean[] { true, false })
902 {
903 final AtomicInteger a = new AtomicInteger(0);
904 final CFException ex1 = new CFException();
905 final CFException ex2 = new CFException();
906 final CompletableFuture<Integer> f = new CompletableFuture<>();
907 if (!createIncomplete) f.completeExceptionally(ex1);
908 final CompletableFuture<Integer> g = f.exceptionally
909 ((Throwable t) -> {
910 ExecutionMode.SYNC.checkExecutionMode();
911 threadAssertSame(t, ex1);
912 a.getAndIncrement();
913 throw ex2;
914 });
915 if (createIncomplete) f.completeExceptionally(ex1);
916
917 checkCompletedWithWrappedException(g, ex2);
918 checkCompletedExceptionally(f, ex1);
919 assertEquals(1, a.get());
920 }}
921
922 /**
923 * whenComplete action executes on normal completion, propagating
924 * source result.
925 */
926 public void testWhenComplete_normalCompletion() {
927 for (ExecutionMode m : ExecutionMode.values())
928 for (boolean createIncomplete : new boolean[] { true, false })
929 for (Integer v1 : new Integer[] { 1, null })
930 {
931 final AtomicInteger a = new AtomicInteger(0);
932 final CompletableFuture<Integer> f = new CompletableFuture<>();
933 if (!createIncomplete) assertTrue(f.complete(v1));
934 final CompletableFuture<Integer> g = m.whenComplete
935 (f,
936 (Integer result, Throwable t) -> {
937 m.checkExecutionMode();
938 threadAssertSame(result, v1);
939 threadAssertNull(t);
940 a.getAndIncrement();
941 });
942 if (createIncomplete) assertTrue(f.complete(v1));
943
944 checkCompletedNormally(g, v1);
945 checkCompletedNormally(f, v1);
946 assertEquals(1, a.get());
947 }}
948
949 /**
950 * whenComplete action executes on exceptional completion, propagating
951 * source result.
952 */
953 public void testWhenComplete_exceptionalCompletion() {
954 for (ExecutionMode m : ExecutionMode.values())
955 for (boolean createIncomplete : new boolean[] { true, false })
956 {
957 final AtomicInteger a = new AtomicInteger(0);
958 final CFException ex = new CFException();
959 final CompletableFuture<Integer> f = new CompletableFuture<>();
960 if (!createIncomplete) f.completeExceptionally(ex);
961 final CompletableFuture<Integer> g = m.whenComplete
962 (f,
963 (Integer result, Throwable t) -> {
964 m.checkExecutionMode();
965 threadAssertNull(result);
966 threadAssertSame(t, ex);
967 a.getAndIncrement();
968 });
969 if (createIncomplete) f.completeExceptionally(ex);
970
971 checkCompletedWithWrappedException(g, ex);
972 checkCompletedExceptionally(f, ex);
973 assertEquals(1, a.get());
974 }}
975
976 /**
977 * whenComplete action executes on cancelled source, propagating
978 * CancellationException.
979 */
980 public void testWhenComplete_sourceCancelled() {
981 for (ExecutionMode m : ExecutionMode.values())
982 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
983 for (boolean createIncomplete : new boolean[] { true, false })
984 {
985 final AtomicInteger a = new AtomicInteger(0);
986 final CompletableFuture<Integer> f = new CompletableFuture<>();
987 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
988 final CompletableFuture<Integer> g = m.whenComplete
989 (f,
990 (Integer result, Throwable t) -> {
991 m.checkExecutionMode();
992 threadAssertNull(result);
993 threadAssertTrue(t instanceof CancellationException);
994 a.getAndIncrement();
995 });
996 if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
997
998 checkCompletedWithWrappedCancellationException(g);
999 checkCancelled(f);
1000 assertEquals(1, a.get());
1001 }}
1002
1003 /**
1004 * If a whenComplete action throws an exception when triggered by
1005 * a normal completion, it completes exceptionally
1006 */
1007 public void testWhenComplete_sourceCompletedNormallyActionFailed() {
1008 for (boolean createIncomplete : new boolean[] { true, false })
1009 for (ExecutionMode m : ExecutionMode.values())
1010 for (Integer v1 : new Integer[] { 1, null })
1011 {
1012 final AtomicInteger a = new AtomicInteger(0);
1013 final CFException ex = new CFException();
1014 final CompletableFuture<Integer> f = new CompletableFuture<>();
1015 if (!createIncomplete) assertTrue(f.complete(v1));
1016 final CompletableFuture<Integer> g = m.whenComplete
1017 (f,
1018 (Integer result, Throwable t) -> {
1019 m.checkExecutionMode();
1020 threadAssertSame(result, v1);
1021 threadAssertNull(t);
1022 a.getAndIncrement();
1023 throw ex;
1024 });
1025 if (createIncomplete) assertTrue(f.complete(v1));
1026
1027 checkCompletedWithWrappedException(g, ex);
1028 checkCompletedNormally(f, v1);
1029 assertEquals(1, a.get());
1030 }}
1031
1032 /**
1033 * If a whenComplete action throws an exception when triggered by
1034 * a source completion that also throws an exception, the source
1035 * exception takes precedence (unlike handle)
1036 */
1037 public void testWhenComplete_sourceFailedActionFailed() {
1038 for (boolean createIncomplete : new boolean[] { true, false })
1039 for (ExecutionMode m : ExecutionMode.values())
1040 {
1041 final AtomicInteger a = new AtomicInteger(0);
1042 final CFException ex1 = new CFException();
1043 final CFException ex2 = new CFException();
1044 final CompletableFuture<Integer> f = new CompletableFuture<>();
1045
1046 if (!createIncomplete) f.completeExceptionally(ex1);
1047 final CompletableFuture<Integer> g = m.whenComplete
1048 (f,
1049 (Integer result, Throwable t) -> {
1050 m.checkExecutionMode();
1051 threadAssertSame(t, ex1);
1052 threadAssertNull(result);
1053 a.getAndIncrement();
1054 throw ex2;
1055 });
1056 if (createIncomplete) f.completeExceptionally(ex1);
1057
1058 checkCompletedWithWrappedException(g, ex1);
1059 checkCompletedExceptionally(f, ex1);
1060 if (testImplementationDetails) {
1061 assertEquals(1, ex1.getSuppressed().length);
1062 assertSame(ex2, ex1.getSuppressed()[0]);
1063 }
1064 assertEquals(1, a.get());
1065 }}
1066
1067 /**
1068 * handle action completes normally with function value on normal
1069 * completion of source
1070 */
1071 public void testHandle_normalCompletion() {
1072 for (ExecutionMode m : ExecutionMode.values())
1073 for (boolean createIncomplete : new boolean[] { true, false })
1074 for (Integer v1 : new Integer[] { 1, null })
1075 {
1076 final CompletableFuture<Integer> f = new CompletableFuture<>();
1077 final AtomicInteger a = new AtomicInteger(0);
1078 if (!createIncomplete) assertTrue(f.complete(v1));
1079 final CompletableFuture<Integer> g = m.handle
1080 (f,
1081 (Integer result, Throwable t) -> {
1082 m.checkExecutionMode();
1083 threadAssertSame(result, v1);
1084 threadAssertNull(t);
1085 a.getAndIncrement();
1086 return inc(v1);
1087 });
1088 if (createIncomplete) assertTrue(f.complete(v1));
1089
1090 checkCompletedNormally(g, inc(v1));
1091 checkCompletedNormally(f, v1);
1092 assertEquals(1, a.get());
1093 }}
1094
1095 /**
1096 * handle action completes normally with function value on
1097 * exceptional completion of source
1098 */
1099 public void testHandle_exceptionalCompletion() {
1100 for (ExecutionMode m : ExecutionMode.values())
1101 for (boolean createIncomplete : new boolean[] { true, false })
1102 for (Integer v1 : new Integer[] { 1, null })
1103 {
1104 final CompletableFuture<Integer> f = new CompletableFuture<>();
1105 final AtomicInteger a = new AtomicInteger(0);
1106 final CFException ex = new CFException();
1107 if (!createIncomplete) f.completeExceptionally(ex);
1108 final CompletableFuture<Integer> g = m.handle
1109 (f,
1110 (Integer result, Throwable t) -> {
1111 m.checkExecutionMode();
1112 threadAssertNull(result);
1113 threadAssertSame(t, ex);
1114 a.getAndIncrement();
1115 return v1;
1116 });
1117 if (createIncomplete) f.completeExceptionally(ex);
1118
1119 checkCompletedNormally(g, v1);
1120 checkCompletedExceptionally(f, ex);
1121 assertEquals(1, a.get());
1122 }}
1123
1124 /**
1125 * handle action completes normally with function value on
1126 * cancelled source
1127 */
1128 public void testHandle_sourceCancelled() {
1129 for (ExecutionMode m : ExecutionMode.values())
1130 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1131 for (boolean createIncomplete : new boolean[] { true, false })
1132 for (Integer v1 : new Integer[] { 1, null })
1133 {
1134 final CompletableFuture<Integer> f = new CompletableFuture<>();
1135 final AtomicInteger a = new AtomicInteger(0);
1136 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1137 final CompletableFuture<Integer> g = m.handle
1138 (f,
1139 (Integer result, Throwable t) -> {
1140 m.checkExecutionMode();
1141 threadAssertNull(result);
1142 threadAssertTrue(t instanceof CancellationException);
1143 a.getAndIncrement();
1144 return v1;
1145 });
1146 if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1147
1148 checkCompletedNormally(g, v1);
1149 checkCancelled(f);
1150 assertEquals(1, a.get());
1151 }}
1152
1153 /**
1154 * If a "handle action" throws an exception when triggered by
1155 * a normal completion, it completes exceptionally
1156 */
1157 public void testHandle_sourceCompletedNormallyActionFailed() {
1158 for (ExecutionMode m : ExecutionMode.values())
1159 for (boolean createIncomplete : new boolean[] { true, false })
1160 for (Integer v1 : new Integer[] { 1, null })
1161 {
1162 final CompletableFuture<Integer> f = new CompletableFuture<>();
1163 final AtomicInteger a = new AtomicInteger(0);
1164 final CFException ex = new CFException();
1165 if (!createIncomplete) assertTrue(f.complete(v1));
1166 final CompletableFuture<Integer> g = m.handle
1167 (f,
1168 (Integer result, Throwable t) -> {
1169 m.checkExecutionMode();
1170 threadAssertSame(result, v1);
1171 threadAssertNull(t);
1172 a.getAndIncrement();
1173 throw ex;
1174 });
1175 if (createIncomplete) assertTrue(f.complete(v1));
1176
1177 checkCompletedWithWrappedException(g, ex);
1178 checkCompletedNormally(f, v1);
1179 assertEquals(1, a.get());
1180 }}
1181
1182 /**
1183 * If a "handle action" throws an exception when triggered by
1184 * a source completion that also throws an exception, the action
1185 * exception takes precedence (unlike whenComplete)
1186 */
1187 public void testHandle_sourceFailedActionFailed() {
1188 for (boolean createIncomplete : new boolean[] { true, false })
1189 for (ExecutionMode m : ExecutionMode.values())
1190 {
1191 final AtomicInteger a = new AtomicInteger(0);
1192 final CFException ex1 = new CFException();
1193 final CFException ex2 = new CFException();
1194 final CompletableFuture<Integer> f = new CompletableFuture<>();
1195
1196 if (!createIncomplete) f.completeExceptionally(ex1);
1197 final CompletableFuture<Integer> g = m.handle
1198 (f,
1199 (Integer result, Throwable t) -> {
1200 m.checkExecutionMode();
1201 threadAssertNull(result);
1202 threadAssertSame(ex1, t);
1203 a.getAndIncrement();
1204 throw ex2;
1205 });
1206 if (createIncomplete) f.completeExceptionally(ex1);
1207
1208 checkCompletedWithWrappedException(g, ex2);
1209 checkCompletedExceptionally(f, ex1);
1210 assertEquals(1, a.get());
1211 }}
1212
1213 /**
1214 * runAsync completes after running Runnable
1215 */
1216 public void testRunAsync_normalCompletion() {
1217 ExecutionMode[] executionModes = {
1218 ExecutionMode.ASYNC,
1219 ExecutionMode.EXECUTOR,
1220 };
1221 for (ExecutionMode m : executionModes)
1222 {
1223 final Noop r = new Noop(m);
1224 final CompletableFuture<Void> f = m.runAsync(r);
1225 assertNull(f.join());
1226 checkCompletedNormally(f, null);
1227 r.assertInvoked();
1228 }}
1229
1230 /**
1231 * failing runAsync completes exceptionally after running Runnable
1232 */
1233 public void testRunAsync_exceptionalCompletion() {
1234 ExecutionMode[] executionModes = {
1235 ExecutionMode.ASYNC,
1236 ExecutionMode.EXECUTOR,
1237 };
1238 for (ExecutionMode m : executionModes)
1239 {
1240 final FailingRunnable r = new FailingRunnable(m);
1241 final CompletableFuture<Void> f = m.runAsync(r);
1242 checkCompletedWithWrappedException(f, r.ex);
1243 r.assertInvoked();
1244 }}
1245
1246 public void testRunAsync_rejectingExecutor() {
1247 CountingRejectingExecutor e = new CountingRejectingExecutor();
1248 try {
1249 CompletableFuture.runAsync(() -> {}, e);
1250 shouldThrow();
1251 } catch (Throwable t) {
1252 assertSame(e.ex, t);
1253 }
1254
1255 assertEquals(1, e.count.get());
1256 }
1257
1258 /**
1259 * supplyAsync completes with result of supplier
1260 */
1261 public void testSupplyAsync_normalCompletion() {
1262 ExecutionMode[] executionModes = {
1263 ExecutionMode.ASYNC,
1264 ExecutionMode.EXECUTOR,
1265 };
1266 for (ExecutionMode m : executionModes)
1267 for (Integer v1 : new Integer[] { 1, null })
1268 {
1269 final IntegerSupplier r = new IntegerSupplier(m, v1);
1270 final CompletableFuture<Integer> f = m.supplyAsync(r);
1271 assertSame(v1, f.join());
1272 checkCompletedNormally(f, v1);
1273 r.assertInvoked();
1274 }}
1275
1276 /**
1277 * Failing supplyAsync completes exceptionally
1278 */
1279 public void testSupplyAsync_exceptionalCompletion() {
1280 ExecutionMode[] executionModes = {
1281 ExecutionMode.ASYNC,
1282 ExecutionMode.EXECUTOR,
1283 };
1284 for (ExecutionMode m : executionModes)
1285 {
1286 FailingSupplier r = new FailingSupplier(m);
1287 CompletableFuture<Integer> f = m.supplyAsync(r);
1288 checkCompletedWithWrappedException(f, r.ex);
1289 r.assertInvoked();
1290 }}
1291
1292 public void testSupplyAsync_rejectingExecutor() {
1293 CountingRejectingExecutor e = new CountingRejectingExecutor();
1294 try {
1295 CompletableFuture.supplyAsync(() -> null, e);
1296 shouldThrow();
1297 } catch (Throwable t) {
1298 assertSame(e.ex, t);
1299 }
1300
1301 assertEquals(1, e.count.get());
1302 }
1303
1304 // seq completion methods
1305
1306 /**
1307 * thenRun result completes normally after normal completion of source
1308 */
1309 public void testThenRun_normalCompletion() {
1310 for (ExecutionMode m : ExecutionMode.values())
1311 for (Integer v1 : new Integer[] { 1, null })
1312 {
1313 final CompletableFuture<Integer> f = new CompletableFuture<>();
1314 final Noop[] rs = new Noop[6];
1315 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1316
1317 final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1318 final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1319 final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1320 checkIncomplete(h0);
1321 checkIncomplete(h1);
1322 checkIncomplete(h2);
1323 assertTrue(f.complete(v1));
1324 final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1325 final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1326 final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1327
1328 checkCompletedNormally(h0, null);
1329 checkCompletedNormally(h1, null);
1330 checkCompletedNormally(h2, null);
1331 checkCompletedNormally(h3, null);
1332 checkCompletedNormally(h4, null);
1333 checkCompletedNormally(h5, null);
1334 checkCompletedNormally(f, v1);
1335 for (Noop r : rs) r.assertInvoked();
1336 }}
1337
1338 /**
1339 * thenRun result completes exceptionally after exceptional
1340 * completion of source
1341 */
1342 public void testThenRun_exceptionalCompletion() {
1343 for (ExecutionMode m : ExecutionMode.values())
1344 {
1345 final CFException ex = new CFException();
1346 final CompletableFuture<Integer> f = new CompletableFuture<>();
1347 final Noop[] rs = new Noop[6];
1348 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1349
1350 final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1351 final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1352 final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1353 checkIncomplete(h0);
1354 checkIncomplete(h1);
1355 checkIncomplete(h2);
1356 assertTrue(f.completeExceptionally(ex));
1357 final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1358 final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1359 final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1360
1361 checkCompletedWithWrappedException(h0, ex);
1362 checkCompletedWithWrappedException(h1, ex);
1363 checkCompletedWithWrappedException(h2, ex);
1364 checkCompletedWithWrappedException(h3, ex);
1365 checkCompletedWithWrappedException(h4, ex);
1366 checkCompletedWithWrappedException(h5, ex);
1367 checkCompletedExceptionally(f, ex);
1368 for (Noop r : rs) r.assertNotInvoked();
1369 }}
1370
1371 /**
1372 * thenRun result completes exceptionally if source cancelled
1373 */
1374 public void testThenRun_sourceCancelled() {
1375 for (ExecutionMode m : ExecutionMode.values())
1376 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1377 {
1378 final CompletableFuture<Integer> f = new CompletableFuture<>();
1379 final Noop[] rs = new Noop[6];
1380 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1381
1382 final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1383 final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1384 final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1385 checkIncomplete(h0);
1386 checkIncomplete(h1);
1387 checkIncomplete(h2);
1388 assertTrue(f.cancel(mayInterruptIfRunning));
1389 final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1390 final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1391 final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1392
1393 checkCompletedWithWrappedCancellationException(h0);
1394 checkCompletedWithWrappedCancellationException(h1);
1395 checkCompletedWithWrappedCancellationException(h2);
1396 checkCompletedWithWrappedCancellationException(h3);
1397 checkCompletedWithWrappedCancellationException(h4);
1398 checkCompletedWithWrappedCancellationException(h5);
1399 checkCancelled(f);
1400 for (Noop r : rs) r.assertNotInvoked();
1401 }}
1402
1403 /**
1404 * thenRun result completes exceptionally if action does
1405 */
1406 public void testThenRun_actionFailed() {
1407 for (ExecutionMode m : ExecutionMode.values())
1408 for (Integer v1 : new Integer[] { 1, null })
1409 {
1410 final CompletableFuture<Integer> f = new CompletableFuture<>();
1411 final FailingRunnable[] rs = new FailingRunnable[6];
1412 for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
1413
1414 final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1415 final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1416 final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1417 assertTrue(f.complete(v1));
1418 final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1419 final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1420 final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1421
1422 checkCompletedWithWrappedException(h0, rs[0].ex);
1423 checkCompletedWithWrappedException(h1, rs[1].ex);
1424 checkCompletedWithWrappedException(h2, rs[2].ex);
1425 checkCompletedWithWrappedException(h3, rs[3].ex);
1426 checkCompletedWithWrappedException(h4, rs[4].ex);
1427 checkCompletedWithWrappedException(h5, rs[5].ex);
1428 checkCompletedNormally(f, v1);
1429 }}
1430
1431 /**
1432 * thenApply result completes normally after normal completion of source
1433 */
1434 public void testThenApply_normalCompletion() {
1435 for (ExecutionMode m : ExecutionMode.values())
1436 for (Integer v1 : new Integer[] { 1, null })
1437 {
1438 final CompletableFuture<Integer> f = new CompletableFuture<>();
1439 final IncFunction[] rs = new IncFunction[4];
1440 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1441
1442 final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1443 final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1444 checkIncomplete(h0);
1445 checkIncomplete(h1);
1446 assertTrue(f.complete(v1));
1447 final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1448 final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1449
1450 checkCompletedNormally(h0, inc(v1));
1451 checkCompletedNormally(h1, inc(v1));
1452 checkCompletedNormally(h2, inc(v1));
1453 checkCompletedNormally(h3, inc(v1));
1454 checkCompletedNormally(f, v1);
1455 for (IncFunction r : rs) r.assertValue(inc(v1));
1456 }}
1457
1458 /**
1459 * thenApply result completes exceptionally after exceptional
1460 * completion of source
1461 */
1462 public void testThenApply_exceptionalCompletion() {
1463 for (ExecutionMode m : ExecutionMode.values())
1464 {
1465 final CFException ex = new CFException();
1466 final CompletableFuture<Integer> f = new CompletableFuture<>();
1467 final IncFunction[] rs = new IncFunction[4];
1468 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1469
1470 final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1471 final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1472 assertTrue(f.completeExceptionally(ex));
1473 final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1474 final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1475
1476 checkCompletedWithWrappedException(h0, ex);
1477 checkCompletedWithWrappedException(h1, ex);
1478 checkCompletedWithWrappedException(h2, ex);
1479 checkCompletedWithWrappedException(h3, ex);
1480 checkCompletedExceptionally(f, ex);
1481 for (IncFunction r : rs) r.assertNotInvoked();
1482 }}
1483
1484 /**
1485 * thenApply result completes exceptionally if source cancelled
1486 */
1487 public void testThenApply_sourceCancelled() {
1488 for (ExecutionMode m : ExecutionMode.values())
1489 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1490 {
1491 final CompletableFuture<Integer> f = new CompletableFuture<>();
1492 final IncFunction[] rs = new IncFunction[4];
1493 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1494
1495 final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1496 final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1497 assertTrue(f.cancel(mayInterruptIfRunning));
1498 final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1499 final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1500
1501 checkCompletedWithWrappedCancellationException(h0);
1502 checkCompletedWithWrappedCancellationException(h1);
1503 checkCompletedWithWrappedCancellationException(h2);
1504 checkCompletedWithWrappedCancellationException(h3);
1505 checkCancelled(f);
1506 for (IncFunction r : rs) r.assertNotInvoked();
1507 }}
1508
1509 /**
1510 * thenApply result completes exceptionally if action does
1511 */
1512 public void testThenApply_actionFailed() {
1513 for (ExecutionMode m : ExecutionMode.values())
1514 for (Integer v1 : new Integer[] { 1, null })
1515 {
1516 final CompletableFuture<Integer> f = new CompletableFuture<>();
1517 final FailingFunction[] rs = new FailingFunction[4];
1518 for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
1519
1520 final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1521 final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1522 assertTrue(f.complete(v1));
1523 final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1524 final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1525
1526 checkCompletedWithWrappedException(h0, rs[0].ex);
1527 checkCompletedWithWrappedException(h1, rs[1].ex);
1528 checkCompletedWithWrappedException(h2, rs[2].ex);
1529 checkCompletedWithWrappedException(h3, rs[3].ex);
1530 checkCompletedNormally(f, v1);
1531 }}
1532
1533 /**
1534 * thenAccept result completes normally after normal completion of source
1535 */
1536 public void testThenAccept_normalCompletion() {
1537 for (ExecutionMode m : ExecutionMode.values())
1538 for (Integer v1 : new Integer[] { 1, null })
1539 {
1540 final CompletableFuture<Integer> f = new CompletableFuture<>();
1541 final NoopConsumer[] rs = new NoopConsumer[4];
1542 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1543
1544 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1545 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1546 checkIncomplete(h0);
1547 checkIncomplete(h1);
1548 assertTrue(f.complete(v1));
1549 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1550 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1551
1552 checkCompletedNormally(h0, null);
1553 checkCompletedNormally(h1, null);
1554 checkCompletedNormally(h2, null);
1555 checkCompletedNormally(h3, null);
1556 checkCompletedNormally(f, v1);
1557 for (NoopConsumer r : rs) r.assertValue(v1);
1558 }}
1559
1560 /**
1561 * thenAccept result completes exceptionally after exceptional
1562 * completion of source
1563 */
1564 public void testThenAccept_exceptionalCompletion() {
1565 for (ExecutionMode m : ExecutionMode.values())
1566 {
1567 final CFException ex = new CFException();
1568 final CompletableFuture<Integer> f = new CompletableFuture<>();
1569 final NoopConsumer[] rs = new NoopConsumer[4];
1570 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1571
1572 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1573 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1574 assertTrue(f.completeExceptionally(ex));
1575 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1576 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1577
1578 checkCompletedWithWrappedException(h0, ex);
1579 checkCompletedWithWrappedException(h1, ex);
1580 checkCompletedWithWrappedException(h2, ex);
1581 checkCompletedWithWrappedException(h3, ex);
1582 checkCompletedExceptionally(f, ex);
1583 for (NoopConsumer r : rs) r.assertNotInvoked();
1584 }}
1585
1586 /**
1587 * thenAccept result completes exceptionally if source cancelled
1588 */
1589 public void testThenAccept_sourceCancelled() {
1590 for (ExecutionMode m : ExecutionMode.values())
1591 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1592 {
1593 final CompletableFuture<Integer> f = new CompletableFuture<>();
1594 final NoopConsumer[] rs = new NoopConsumer[4];
1595 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1596
1597 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1598 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1599 assertTrue(f.cancel(mayInterruptIfRunning));
1600 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1601 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1602
1603 checkCompletedWithWrappedCancellationException(h0);
1604 checkCompletedWithWrappedCancellationException(h1);
1605 checkCompletedWithWrappedCancellationException(h2);
1606 checkCompletedWithWrappedCancellationException(h3);
1607 checkCancelled(f);
1608 for (NoopConsumer r : rs) r.assertNotInvoked();
1609 }}
1610
1611 /**
1612 * thenAccept result completes exceptionally if action does
1613 */
1614 public void testThenAccept_actionFailed() {
1615 for (ExecutionMode m : ExecutionMode.values())
1616 for (Integer v1 : new Integer[] { 1, null })
1617 {
1618 final CompletableFuture<Integer> f = new CompletableFuture<>();
1619 final FailingConsumer[] rs = new FailingConsumer[4];
1620 for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
1621
1622 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1623 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1624 assertTrue(f.complete(v1));
1625 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1626 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1627
1628 checkCompletedWithWrappedException(h0, rs[0].ex);
1629 checkCompletedWithWrappedException(h1, rs[1].ex);
1630 checkCompletedWithWrappedException(h2, rs[2].ex);
1631 checkCompletedWithWrappedException(h3, rs[3].ex);
1632 checkCompletedNormally(f, v1);
1633 }}
1634
1635 /**
1636 * thenCombine result completes normally after normal completion
1637 * of sources
1638 */
1639 public void testThenCombine_normalCompletion() {
1640 for (ExecutionMode m : ExecutionMode.values())
1641 for (boolean fFirst : new boolean[] { true, false })
1642 for (Integer v1 : new Integer[] { 1, null })
1643 for (Integer v2 : new Integer[] { 2, null })
1644 {
1645 final CompletableFuture<Integer> f = new CompletableFuture<>();
1646 final CompletableFuture<Integer> g = new CompletableFuture<>();
1647 final SubtractFunction[] rs = new SubtractFunction[6];
1648 for (int i = 0; i < rs.length; i++) rs[i] = new SubtractFunction(m);
1649
1650 final CompletableFuture<Integer> fst = fFirst ? f : g;
1651 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1652 final Integer w1 = fFirst ? v1 : v2;
1653 final Integer w2 = !fFirst ? v1 : v2;
1654
1655 final CompletableFuture<Integer> h0 = m.thenCombine(f, g, rs[0]);
1656 final CompletableFuture<Integer> h1 = m.thenCombine(fst, fst, rs[1]);
1657 assertTrue(fst.complete(w1));
1658 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, rs[2]);
1659 final CompletableFuture<Integer> h3 = m.thenCombine(fst, fst, rs[3]);
1660 checkIncomplete(h0); rs[0].assertNotInvoked();
1661 checkIncomplete(h2); rs[2].assertNotInvoked();
1662 checkCompletedNormally(h1, subtract(w1, w1));
1663 checkCompletedNormally(h3, subtract(w1, w1));
1664 rs[1].assertValue(subtract(w1, w1));
1665 rs[3].assertValue(subtract(w1, w1));
1666 assertTrue(snd.complete(w2));
1667 final CompletableFuture<Integer> h4 = m.thenCombine(f, g, rs[4]);
1668
1669 checkCompletedNormally(h0, subtract(v1, v2));
1670 checkCompletedNormally(h2, subtract(v1, v2));
1671 checkCompletedNormally(h4, subtract(v1, v2));
1672 rs[0].assertValue(subtract(v1, v2));
1673 rs[2].assertValue(subtract(v1, v2));
1674 rs[4].assertValue(subtract(v1, v2));
1675
1676 checkCompletedNormally(f, v1);
1677 checkCompletedNormally(g, v2);
1678 }}
1679
1680 /**
1681 * thenCombine result completes exceptionally after exceptional
1682 * completion of either source
1683 */
1684 public void testThenCombine_exceptionalCompletion() throws Throwable {
1685 for (ExecutionMode m : ExecutionMode.values())
1686 for (boolean fFirst : new boolean[] { true, false })
1687 for (boolean failFirst : new boolean[] { true, false })
1688 for (Integer v1 : new Integer[] { 1, null })
1689 {
1690 final CompletableFuture<Integer> f = new CompletableFuture<>();
1691 final CompletableFuture<Integer> g = new CompletableFuture<>();
1692 final CFException ex = new CFException();
1693 final SubtractFunction r1 = new SubtractFunction(m);
1694 final SubtractFunction r2 = new SubtractFunction(m);
1695 final SubtractFunction r3 = new SubtractFunction(m);
1696
1697 final CompletableFuture<Integer> fst = fFirst ? f : g;
1698 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1699 final Callable<Boolean> complete1 = failFirst ?
1700 () -> fst.completeExceptionally(ex) :
1701 () -> fst.complete(v1);
1702 final Callable<Boolean> complete2 = failFirst ?
1703 () -> snd.complete(v1) :
1704 () -> snd.completeExceptionally(ex);
1705
1706 final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1707 assertTrue(complete1.call());
1708 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1709 checkIncomplete(h1);
1710 checkIncomplete(h2);
1711 assertTrue(complete2.call());
1712 final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1713
1714 checkCompletedWithWrappedException(h1, ex);
1715 checkCompletedWithWrappedException(h2, ex);
1716 checkCompletedWithWrappedException(h3, ex);
1717 r1.assertNotInvoked();
1718 r2.assertNotInvoked();
1719 r3.assertNotInvoked();
1720 checkCompletedNormally(failFirst ? snd : fst, v1);
1721 checkCompletedExceptionally(failFirst ? fst : snd, ex);
1722 }}
1723
1724 /**
1725 * thenCombine result completes exceptionally if either source cancelled
1726 */
1727 public void testThenCombine_sourceCancelled() throws Throwable {
1728 for (ExecutionMode m : ExecutionMode.values())
1729 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1730 for (boolean fFirst : new boolean[] { true, false })
1731 for (boolean failFirst : new boolean[] { true, false })
1732 for (Integer v1 : new Integer[] { 1, null })
1733 {
1734 final CompletableFuture<Integer> f = new CompletableFuture<>();
1735 final CompletableFuture<Integer> g = new CompletableFuture<>();
1736 final SubtractFunction r1 = new SubtractFunction(m);
1737 final SubtractFunction r2 = new SubtractFunction(m);
1738 final SubtractFunction r3 = new SubtractFunction(m);
1739
1740 final CompletableFuture<Integer> fst = fFirst ? f : g;
1741 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1742 final Callable<Boolean> complete1 = failFirst ?
1743 () -> fst.cancel(mayInterruptIfRunning) :
1744 () -> fst.complete(v1);
1745 final Callable<Boolean> complete2 = failFirst ?
1746 () -> snd.complete(v1) :
1747 () -> snd.cancel(mayInterruptIfRunning);
1748
1749 final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1750 assertTrue(complete1.call());
1751 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1752 checkIncomplete(h1);
1753 checkIncomplete(h2);
1754 assertTrue(complete2.call());
1755 final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1756
1757 checkCompletedWithWrappedCancellationException(h1);
1758 checkCompletedWithWrappedCancellationException(h2);
1759 checkCompletedWithWrappedCancellationException(h3);
1760 r1.assertNotInvoked();
1761 r2.assertNotInvoked();
1762 r3.assertNotInvoked();
1763 checkCompletedNormally(failFirst ? snd : fst, v1);
1764 checkCancelled(failFirst ? fst : snd);
1765 }}
1766
1767 /**
1768 * thenCombine result completes exceptionally if action does
1769 */
1770 public void testThenCombine_actionFailed() {
1771 for (ExecutionMode m : ExecutionMode.values())
1772 for (boolean fFirst : new boolean[] { true, false })
1773 for (Integer v1 : new Integer[] { 1, null })
1774 for (Integer v2 : new Integer[] { 2, null })
1775 {
1776 final CompletableFuture<Integer> f = new CompletableFuture<>();
1777 final CompletableFuture<Integer> g = new CompletableFuture<>();
1778 final FailingBiFunction r1 = new FailingBiFunction(m);
1779 final FailingBiFunction r2 = new FailingBiFunction(m);
1780 final FailingBiFunction r3 = new FailingBiFunction(m);
1781
1782 final CompletableFuture<Integer> fst = fFirst ? f : g;
1783 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1784 final Integer w1 = fFirst ? v1 : v2;
1785 final Integer w2 = !fFirst ? v1 : v2;
1786
1787 final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1788 assertTrue(fst.complete(w1));
1789 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1790 assertTrue(snd.complete(w2));
1791 final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1792
1793 checkCompletedWithWrappedException(h1, r1.ex);
1794 checkCompletedWithWrappedException(h2, r2.ex);
1795 checkCompletedWithWrappedException(h3, r3.ex);
1796 r1.assertInvoked();
1797 r2.assertInvoked();
1798 r3.assertInvoked();
1799 checkCompletedNormally(f, v1);
1800 checkCompletedNormally(g, v2);
1801 }}
1802
1803 /**
1804 * thenAcceptBoth result completes normally after normal
1805 * completion of sources
1806 */
1807 public void testThenAcceptBoth_normalCompletion() {
1808 for (ExecutionMode m : ExecutionMode.values())
1809 for (boolean fFirst : new boolean[] { true, false })
1810 for (Integer v1 : new Integer[] { 1, null })
1811 for (Integer v2 : new Integer[] { 2, null })
1812 {
1813 final CompletableFuture<Integer> f = new CompletableFuture<>();
1814 final CompletableFuture<Integer> g = new CompletableFuture<>();
1815 final SubtractAction r1 = new SubtractAction(m);
1816 final SubtractAction r2 = new SubtractAction(m);
1817 final SubtractAction r3 = new SubtractAction(m);
1818
1819 final CompletableFuture<Integer> fst = fFirst ? f : g;
1820 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1821 final Integer w1 = fFirst ? v1 : v2;
1822 final Integer w2 = !fFirst ? v1 : v2;
1823
1824 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1825 assertTrue(fst.complete(w1));
1826 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1827 checkIncomplete(h1);
1828 checkIncomplete(h2);
1829 r1.assertNotInvoked();
1830 r2.assertNotInvoked();
1831 assertTrue(snd.complete(w2));
1832 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1833
1834 checkCompletedNormally(h1, null);
1835 checkCompletedNormally(h2, null);
1836 checkCompletedNormally(h3, null);
1837 r1.assertValue(subtract(v1, v2));
1838 r2.assertValue(subtract(v1, v2));
1839 r3.assertValue(subtract(v1, v2));
1840 checkCompletedNormally(f, v1);
1841 checkCompletedNormally(g, v2);
1842 }}
1843
1844 /**
1845 * thenAcceptBoth result completes exceptionally after exceptional
1846 * completion of either source
1847 */
1848 public void testThenAcceptBoth_exceptionalCompletion() throws Throwable {
1849 for (ExecutionMode m : ExecutionMode.values())
1850 for (boolean fFirst : new boolean[] { true, false })
1851 for (boolean failFirst : new boolean[] { true, false })
1852 for (Integer v1 : new Integer[] { 1, null })
1853 {
1854 final CompletableFuture<Integer> f = new CompletableFuture<>();
1855 final CompletableFuture<Integer> g = new CompletableFuture<>();
1856 final CFException ex = new CFException();
1857 final SubtractAction r1 = new SubtractAction(m);
1858 final SubtractAction r2 = new SubtractAction(m);
1859 final SubtractAction r3 = new SubtractAction(m);
1860
1861 final CompletableFuture<Integer> fst = fFirst ? f : g;
1862 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1863 final Callable<Boolean> complete1 = failFirst ?
1864 () -> fst.completeExceptionally(ex) :
1865 () -> fst.complete(v1);
1866 final Callable<Boolean> complete2 = failFirst ?
1867 () -> snd.complete(v1) :
1868 () -> snd.completeExceptionally(ex);
1869
1870 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1871 assertTrue(complete1.call());
1872 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1873 checkIncomplete(h1);
1874 checkIncomplete(h2);
1875 assertTrue(complete2.call());
1876 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1877
1878 checkCompletedWithWrappedException(h1, ex);
1879 checkCompletedWithWrappedException(h2, ex);
1880 checkCompletedWithWrappedException(h3, ex);
1881 r1.assertNotInvoked();
1882 r2.assertNotInvoked();
1883 r3.assertNotInvoked();
1884 checkCompletedNormally(failFirst ? snd : fst, v1);
1885 checkCompletedExceptionally(failFirst ? fst : snd, ex);
1886 }}
1887
1888 /**
1889 * thenAcceptBoth result completes exceptionally if either source cancelled
1890 */
1891 public void testThenAcceptBoth_sourceCancelled() throws Throwable {
1892 for (ExecutionMode m : ExecutionMode.values())
1893 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1894 for (boolean fFirst : new boolean[] { true, false })
1895 for (boolean failFirst : new boolean[] { true, false })
1896 for (Integer v1 : new Integer[] { 1, null })
1897 {
1898 final CompletableFuture<Integer> f = new CompletableFuture<>();
1899 final CompletableFuture<Integer> g = new CompletableFuture<>();
1900 final SubtractAction r1 = new SubtractAction(m);
1901 final SubtractAction r2 = new SubtractAction(m);
1902 final SubtractAction r3 = new SubtractAction(m);
1903
1904 final CompletableFuture<Integer> fst = fFirst ? f : g;
1905 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1906 final Callable<Boolean> complete1 = failFirst ?
1907 () -> fst.cancel(mayInterruptIfRunning) :
1908 () -> fst.complete(v1);
1909 final Callable<Boolean> complete2 = failFirst ?
1910 () -> snd.complete(v1) :
1911 () -> snd.cancel(mayInterruptIfRunning);
1912
1913 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1914 assertTrue(complete1.call());
1915 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1916 checkIncomplete(h1);
1917 checkIncomplete(h2);
1918 assertTrue(complete2.call());
1919 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1920
1921 checkCompletedWithWrappedCancellationException(h1);
1922 checkCompletedWithWrappedCancellationException(h2);
1923 checkCompletedWithWrappedCancellationException(h3);
1924 r1.assertNotInvoked();
1925 r2.assertNotInvoked();
1926 r3.assertNotInvoked();
1927 checkCompletedNormally(failFirst ? snd : fst, v1);
1928 checkCancelled(failFirst ? fst : snd);
1929 }}
1930
1931 /**
1932 * thenAcceptBoth result completes exceptionally if action does
1933 */
1934 public void testThenAcceptBoth_actionFailed() {
1935 for (ExecutionMode m : ExecutionMode.values())
1936 for (boolean fFirst : new boolean[] { true, false })
1937 for (Integer v1 : new Integer[] { 1, null })
1938 for (Integer v2 : new Integer[] { 2, null })
1939 {
1940 final CompletableFuture<Integer> f = new CompletableFuture<>();
1941 final CompletableFuture<Integer> g = new CompletableFuture<>();
1942 final FailingBiConsumer r1 = new FailingBiConsumer(m);
1943 final FailingBiConsumer r2 = new FailingBiConsumer(m);
1944 final FailingBiConsumer r3 = new FailingBiConsumer(m);
1945
1946 final CompletableFuture<Integer> fst = fFirst ? f : g;
1947 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1948 final Integer w1 = fFirst ? v1 : v2;
1949 final Integer w2 = !fFirst ? v1 : v2;
1950
1951 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1952 assertTrue(fst.complete(w1));
1953 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1954 assertTrue(snd.complete(w2));
1955 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1956
1957 checkCompletedWithWrappedException(h1, r1.ex);
1958 checkCompletedWithWrappedException(h2, r2.ex);
1959 checkCompletedWithWrappedException(h3, r3.ex);
1960 r1.assertInvoked();
1961 r2.assertInvoked();
1962 r3.assertInvoked();
1963 checkCompletedNormally(f, v1);
1964 checkCompletedNormally(g, v2);
1965 }}
1966
1967 /**
1968 * runAfterBoth result completes normally after normal
1969 * completion of sources
1970 */
1971 public void testRunAfterBoth_normalCompletion() {
1972 for (ExecutionMode m : ExecutionMode.values())
1973 for (boolean fFirst : new boolean[] { true, false })
1974 for (Integer v1 : new Integer[] { 1, null })
1975 for (Integer v2 : new Integer[] { 2, null })
1976 {
1977 final CompletableFuture<Integer> f = new CompletableFuture<>();
1978 final CompletableFuture<Integer> g = new CompletableFuture<>();
1979 final Noop r1 = new Noop(m);
1980 final Noop r2 = new Noop(m);
1981 final Noop r3 = new Noop(m);
1982
1983 final CompletableFuture<Integer> fst = fFirst ? f : g;
1984 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1985 final Integer w1 = fFirst ? v1 : v2;
1986 final Integer w2 = !fFirst ? v1 : v2;
1987
1988 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1989 assertTrue(fst.complete(w1));
1990 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1991 checkIncomplete(h1);
1992 checkIncomplete(h2);
1993 r1.assertNotInvoked();
1994 r2.assertNotInvoked();
1995 assertTrue(snd.complete(w2));
1996 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
1997
1998 checkCompletedNormally(h1, null);
1999 checkCompletedNormally(h2, null);
2000 checkCompletedNormally(h3, null);
2001 r1.assertInvoked();
2002 r2.assertInvoked();
2003 r3.assertInvoked();
2004 checkCompletedNormally(f, v1);
2005 checkCompletedNormally(g, v2);
2006 }}
2007
2008 /**
2009 * runAfterBoth result completes exceptionally after exceptional
2010 * completion of either source
2011 */
2012 public void testRunAfterBoth_exceptionalCompletion() throws Throwable {
2013 for (ExecutionMode m : ExecutionMode.values())
2014 for (boolean fFirst : new boolean[] { true, false })
2015 for (boolean failFirst : new boolean[] { true, false })
2016 for (Integer v1 : new Integer[] { 1, null })
2017 {
2018 final CompletableFuture<Integer> f = new CompletableFuture<>();
2019 final CompletableFuture<Integer> g = new CompletableFuture<>();
2020 final CFException ex = new CFException();
2021 final Noop r1 = new Noop(m);
2022 final Noop r2 = new Noop(m);
2023 final Noop r3 = new Noop(m);
2024
2025 final CompletableFuture<Integer> fst = fFirst ? f : g;
2026 final CompletableFuture<Integer> snd = !fFirst ? f : g;
2027 final Callable<Boolean> complete1 = failFirst ?
2028 () -> fst.completeExceptionally(ex) :
2029 () -> fst.complete(v1);
2030 final Callable<Boolean> complete2 = failFirst ?
2031 () -> snd.complete(v1) :
2032 () -> snd.completeExceptionally(ex);
2033
2034 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2035 assertTrue(complete1.call());
2036 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2037 checkIncomplete(h1);
2038 checkIncomplete(h2);
2039 assertTrue(complete2.call());
2040 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2041
2042 checkCompletedWithWrappedException(h1, ex);
2043 checkCompletedWithWrappedException(h2, ex);
2044 checkCompletedWithWrappedException(h3, ex);
2045 r1.assertNotInvoked();
2046 r2.assertNotInvoked();
2047 r3.assertNotInvoked();
2048 checkCompletedNormally(failFirst ? snd : fst, v1);
2049 checkCompletedExceptionally(failFirst ? fst : snd, ex);
2050 }}
2051
2052 /**
2053 * runAfterBoth result completes exceptionally if either source cancelled
2054 */
2055 public void testRunAfterBoth_sourceCancelled() throws Throwable {
2056 for (ExecutionMode m : ExecutionMode.values())
2057 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2058 for (boolean fFirst : new boolean[] { true, false })
2059 for (boolean failFirst : new boolean[] { true, false })
2060 for (Integer v1 : new Integer[] { 1, null })
2061 {
2062 final CompletableFuture<Integer> f = new CompletableFuture<>();
2063 final CompletableFuture<Integer> g = new CompletableFuture<>();
2064 final Noop r1 = new Noop(m);
2065 final Noop r2 = new Noop(m);
2066 final Noop r3 = new Noop(m);
2067
2068 final CompletableFuture<Integer> fst = fFirst ? f : g;
2069 final CompletableFuture<Integer> snd = !fFirst ? f : g;
2070 final Callable<Boolean> complete1 = failFirst ?
2071 () -> fst.cancel(mayInterruptIfRunning) :
2072 () -> fst.complete(v1);
2073 final Callable<Boolean> complete2 = failFirst ?
2074 () -> snd.complete(v1) :
2075 () -> snd.cancel(mayInterruptIfRunning);
2076
2077 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2078 assertTrue(complete1.call());
2079 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2080 checkIncomplete(h1);
2081 checkIncomplete(h2);
2082 assertTrue(complete2.call());
2083 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2084
2085 checkCompletedWithWrappedCancellationException(h1);
2086 checkCompletedWithWrappedCancellationException(h2);
2087 checkCompletedWithWrappedCancellationException(h3);
2088 r1.assertNotInvoked();
2089 r2.assertNotInvoked();
2090 r3.assertNotInvoked();
2091 checkCompletedNormally(failFirst ? snd : fst, v1);
2092 checkCancelled(failFirst ? fst : snd);
2093 }}
2094
2095 /**
2096 * runAfterBoth result completes exceptionally if action does
2097 */
2098 public void testRunAfterBoth_actionFailed() {
2099 for (ExecutionMode m : ExecutionMode.values())
2100 for (boolean fFirst : new boolean[] { true, false })
2101 for (Integer v1 : new Integer[] { 1, null })
2102 for (Integer v2 : new Integer[] { 2, null })
2103 {
2104 final CompletableFuture<Integer> f = new CompletableFuture<>();
2105 final CompletableFuture<Integer> g = new CompletableFuture<>();
2106 final FailingRunnable r1 = new FailingRunnable(m);
2107 final FailingRunnable r2 = new FailingRunnable(m);
2108 final FailingRunnable r3 = new FailingRunnable(m);
2109
2110 final CompletableFuture<Integer> fst = fFirst ? f : g;
2111 final CompletableFuture<Integer> snd = !fFirst ? f : g;
2112 final Integer w1 = fFirst ? v1 : v2;
2113 final Integer w2 = !fFirst ? v1 : v2;
2114
2115 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2116 assertTrue(fst.complete(w1));
2117 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2118 assertTrue(snd.complete(w2));
2119 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2120
2121 checkCompletedWithWrappedException(h1, r1.ex);
2122 checkCompletedWithWrappedException(h2, r2.ex);
2123 checkCompletedWithWrappedException(h3, r3.ex);
2124 r1.assertInvoked();
2125 r2.assertInvoked();
2126 r3.assertInvoked();
2127 checkCompletedNormally(f, v1);
2128 checkCompletedNormally(g, v2);
2129 }}
2130
2131 /**
2132 * applyToEither result completes normally after normal completion
2133 * of either source
2134 */
2135 public void testApplyToEither_normalCompletion() {
2136 for (ExecutionMode m : ExecutionMode.values())
2137 for (Integer v1 : new Integer[] { 1, null })
2138 for (Integer v2 : new Integer[] { 2, null })
2139 {
2140 final CompletableFuture<Integer> f = new CompletableFuture<>();
2141 final CompletableFuture<Integer> g = new CompletableFuture<>();
2142 final IncFunction[] rs = new IncFunction[6];
2143 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2144
2145 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2146 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2147 checkIncomplete(h0);
2148 checkIncomplete(h1);
2149 rs[0].assertNotInvoked();
2150 rs[1].assertNotInvoked();
2151 f.complete(v1);
2152 checkCompletedNormally(h0, inc(v1));
2153 checkCompletedNormally(h1, inc(v1));
2154 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2155 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2156 checkCompletedNormally(h2, inc(v1));
2157 checkCompletedNormally(h3, inc(v1));
2158 g.complete(v2);
2159
2160 // unspecified behavior - both source completions available
2161 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2162 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2163 rs[4].assertValue(h4.join());
2164 rs[5].assertValue(h5.join());
2165 assertTrue(Objects.equals(inc(v1), h4.join()) ||
2166 Objects.equals(inc(v2), h4.join()));
2167 assertTrue(Objects.equals(inc(v1), h5.join()) ||
2168 Objects.equals(inc(v2), h5.join()));
2169
2170 checkCompletedNormally(f, v1);
2171 checkCompletedNormally(g, v2);
2172 checkCompletedNormally(h0, inc(v1));
2173 checkCompletedNormally(h1, inc(v1));
2174 checkCompletedNormally(h2, inc(v1));
2175 checkCompletedNormally(h3, inc(v1));
2176 for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
2177 }}
2178
2179 /**
2180 * applyToEither result completes exceptionally after exceptional
2181 * completion of either source
2182 */
2183 public void testApplyToEither_exceptionalCompletion() {
2184 for (ExecutionMode m : ExecutionMode.values())
2185 for (Integer v1 : new Integer[] { 1, null })
2186 {
2187 final CompletableFuture<Integer> f = new CompletableFuture<>();
2188 final CompletableFuture<Integer> g = new CompletableFuture<>();
2189 final CFException ex = new CFException();
2190 final IncFunction[] rs = new IncFunction[6];
2191 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2192
2193 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2194 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2195 checkIncomplete(h0);
2196 checkIncomplete(h1);
2197 rs[0].assertNotInvoked();
2198 rs[1].assertNotInvoked();
2199 f.completeExceptionally(ex);
2200 checkCompletedWithWrappedException(h0, ex);
2201 checkCompletedWithWrappedException(h1, ex);
2202 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2203 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2204 checkCompletedWithWrappedException(h2, ex);
2205 checkCompletedWithWrappedException(h3, ex);
2206 g.complete(v1);
2207
2208 // unspecified behavior - both source completions available
2209 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2210 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2211 try {
2212 assertEquals(inc(v1), h4.join());
2213 rs[4].assertValue(inc(v1));
2214 } catch (CompletionException ok) {
2215 checkCompletedWithWrappedException(h4, ex);
2216 rs[4].assertNotInvoked();
2217 }
2218 try {
2219 assertEquals(inc(v1), h5.join());
2220 rs[5].assertValue(inc(v1));
2221 } catch (CompletionException ok) {
2222 checkCompletedWithWrappedException(h5, ex);
2223 rs[5].assertNotInvoked();
2224 }
2225
2226 checkCompletedExceptionally(f, ex);
2227 checkCompletedNormally(g, v1);
2228 checkCompletedWithWrappedException(h0, ex);
2229 checkCompletedWithWrappedException(h1, ex);
2230 checkCompletedWithWrappedException(h2, ex);
2231 checkCompletedWithWrappedException(h3, ex);
2232 checkCompletedWithWrappedException(h4, ex);
2233 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2234 }}
2235
2236 public void testApplyToEither_exceptionalCompletion2() {
2237 for (ExecutionMode m : ExecutionMode.values())
2238 for (boolean fFirst : new boolean[] { true, false })
2239 for (Integer v1 : new Integer[] { 1, null })
2240 {
2241 final CompletableFuture<Integer> f = new CompletableFuture<>();
2242 final CompletableFuture<Integer> g = new CompletableFuture<>();
2243 final CFException ex = new CFException();
2244 final IncFunction[] rs = new IncFunction[6];
2245 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2246
2247 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2248 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2249 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2250 assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2251 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2252 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2253
2254 // unspecified behavior - both source completions available
2255 try {
2256 assertEquals(inc(v1), h0.join());
2257 rs[0].assertValue(inc(v1));
2258 } catch (CompletionException ok) {
2259 checkCompletedWithWrappedException(h0, ex);
2260 rs[0].assertNotInvoked();
2261 }
2262 try {
2263 assertEquals(inc(v1), h1.join());
2264 rs[1].assertValue(inc(v1));
2265 } catch (CompletionException ok) {
2266 checkCompletedWithWrappedException(h1, ex);
2267 rs[1].assertNotInvoked();
2268 }
2269 try {
2270 assertEquals(inc(v1), h2.join());
2271 rs[2].assertValue(inc(v1));
2272 } catch (CompletionException ok) {
2273 checkCompletedWithWrappedException(h2, ex);
2274 rs[2].assertNotInvoked();
2275 }
2276 try {
2277 assertEquals(inc(v1), h3.join());
2278 rs[3].assertValue(inc(v1));
2279 } catch (CompletionException ok) {
2280 checkCompletedWithWrappedException(h3, ex);
2281 rs[3].assertNotInvoked();
2282 }
2283
2284 checkCompletedNormally(f, v1);
2285 checkCompletedExceptionally(g, ex);
2286 }}
2287
2288 /**
2289 * applyToEither result completes exceptionally if either source cancelled
2290 */
2291 public void testApplyToEither_sourceCancelled() {
2292 for (ExecutionMode m : ExecutionMode.values())
2293 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2294 for (Integer v1 : new Integer[] { 1, null })
2295 {
2296 final CompletableFuture<Integer> f = new CompletableFuture<>();
2297 final CompletableFuture<Integer> g = new CompletableFuture<>();
2298 final IncFunction[] rs = new IncFunction[6];
2299 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2300
2301 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2302 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2303 checkIncomplete(h0);
2304 checkIncomplete(h1);
2305 rs[0].assertNotInvoked();
2306 rs[1].assertNotInvoked();
2307 f.cancel(mayInterruptIfRunning);
2308 checkCompletedWithWrappedCancellationException(h0);
2309 checkCompletedWithWrappedCancellationException(h1);
2310 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2311 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2312 checkCompletedWithWrappedCancellationException(h2);
2313 checkCompletedWithWrappedCancellationException(h3);
2314 g.complete(v1);
2315
2316 // unspecified behavior - both source completions available
2317 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2318 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2319 try {
2320 assertEquals(inc(v1), h4.join());
2321 rs[4].assertValue(inc(v1));
2322 } catch (CompletionException ok) {
2323 checkCompletedWithWrappedCancellationException(h4);
2324 rs[4].assertNotInvoked();
2325 }
2326 try {
2327 assertEquals(inc(v1), h5.join());
2328 rs[5].assertValue(inc(v1));
2329 } catch (CompletionException ok) {
2330 checkCompletedWithWrappedCancellationException(h5);
2331 rs[5].assertNotInvoked();
2332 }
2333
2334 checkCancelled(f);
2335 checkCompletedNormally(g, v1);
2336 checkCompletedWithWrappedCancellationException(h0);
2337 checkCompletedWithWrappedCancellationException(h1);
2338 checkCompletedWithWrappedCancellationException(h2);
2339 checkCompletedWithWrappedCancellationException(h3);
2340 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2341 }}
2342
2343 public void testApplyToEither_sourceCancelled2() {
2344 for (ExecutionMode m : ExecutionMode.values())
2345 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2346 for (boolean fFirst : new boolean[] { true, false })
2347 for (Integer v1 : new Integer[] { 1, null })
2348 {
2349 final CompletableFuture<Integer> f = new CompletableFuture<>();
2350 final CompletableFuture<Integer> g = new CompletableFuture<>();
2351 final IncFunction[] rs = new IncFunction[6];
2352 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2353
2354 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2355 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2356 assertTrue(fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2357 assertTrue(!fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2358 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2359 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2360
2361 // unspecified behavior - both source completions available
2362 try {
2363 assertEquals(inc(v1), h0.join());
2364 rs[0].assertValue(inc(v1));
2365 } catch (CompletionException ok) {
2366 checkCompletedWithWrappedCancellationException(h0);
2367 rs[0].assertNotInvoked();
2368 }
2369 try {
2370 assertEquals(inc(v1), h1.join());
2371 rs[1].assertValue(inc(v1));
2372 } catch (CompletionException ok) {
2373 checkCompletedWithWrappedCancellationException(h1);
2374 rs[1].assertNotInvoked();
2375 }
2376 try {
2377 assertEquals(inc(v1), h2.join());
2378 rs[2].assertValue(inc(v1));
2379 } catch (CompletionException ok) {
2380 checkCompletedWithWrappedCancellationException(h2);
2381 rs[2].assertNotInvoked();
2382 }
2383 try {
2384 assertEquals(inc(v1), h3.join());
2385 rs[3].assertValue(inc(v1));
2386 } catch (CompletionException ok) {
2387 checkCompletedWithWrappedCancellationException(h3);
2388 rs[3].assertNotInvoked();
2389 }
2390
2391 checkCompletedNormally(f, v1);
2392 checkCancelled(g);
2393 }}
2394
2395 /**
2396 * applyToEither result completes exceptionally if action does
2397 */
2398 public void testApplyToEither_actionFailed() {
2399 for (ExecutionMode m : ExecutionMode.values())
2400 for (Integer v1 : new Integer[] { 1, null })
2401 for (Integer v2 : new Integer[] { 2, null })
2402 {
2403 final CompletableFuture<Integer> f = new CompletableFuture<>();
2404 final CompletableFuture<Integer> g = new CompletableFuture<>();
2405 final FailingFunction[] rs = new FailingFunction[6];
2406 for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2407
2408 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2409 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2410 f.complete(v1);
2411 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2412 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2413 checkCompletedWithWrappedException(h0, rs[0].ex);
2414 checkCompletedWithWrappedException(h1, rs[1].ex);
2415 checkCompletedWithWrappedException(h2, rs[2].ex);
2416 checkCompletedWithWrappedException(h3, rs[3].ex);
2417 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2418
2419 g.complete(v2);
2420
2421 // unspecified behavior - both source completions available
2422 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2423 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2424
2425 checkCompletedWithWrappedException(h4, rs[4].ex);
2426 assertTrue(Objects.equals(v1, rs[4].value) ||
2427 Objects.equals(v2, rs[4].value));
2428 checkCompletedWithWrappedException(h5, rs[5].ex);
2429 assertTrue(Objects.equals(v1, rs[5].value) ||
2430 Objects.equals(v2, rs[5].value));
2431
2432 checkCompletedNormally(f, v1);
2433 checkCompletedNormally(g, v2);
2434 }}
2435
2436 /**
2437 * acceptEither result completes normally after normal completion
2438 * of either source
2439 */
2440 public void testAcceptEither_normalCompletion() {
2441 for (ExecutionMode m : ExecutionMode.values())
2442 for (Integer v1 : new Integer[] { 1, null })
2443 for (Integer v2 : new Integer[] { 2, null })
2444 {
2445 final CompletableFuture<Integer> f = new CompletableFuture<>();
2446 final CompletableFuture<Integer> g = new CompletableFuture<>();
2447 final NoopConsumer[] rs = new NoopConsumer[6];
2448 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2449
2450 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2451 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2452 checkIncomplete(h0);
2453 checkIncomplete(h1);
2454 rs[0].assertNotInvoked();
2455 rs[1].assertNotInvoked();
2456 f.complete(v1);
2457 checkCompletedNormally(h0, null);
2458 checkCompletedNormally(h1, null);
2459 rs[0].assertValue(v1);
2460 rs[1].assertValue(v1);
2461 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2462 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2463 checkCompletedNormally(h2, null);
2464 checkCompletedNormally(h3, null);
2465 rs[2].assertValue(v1);
2466 rs[3].assertValue(v1);
2467 g.complete(v2);
2468
2469 // unspecified behavior - both source completions available
2470 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2471 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2472 checkCompletedNormally(h4, null);
2473 checkCompletedNormally(h5, null);
2474 assertTrue(Objects.equals(v1, rs[4].value) ||
2475 Objects.equals(v2, rs[4].value));
2476 assertTrue(Objects.equals(v1, rs[5].value) ||
2477 Objects.equals(v2, rs[5].value));
2478
2479 checkCompletedNormally(f, v1);
2480 checkCompletedNormally(g, v2);
2481 checkCompletedNormally(h0, null);
2482 checkCompletedNormally(h1, null);
2483 checkCompletedNormally(h2, null);
2484 checkCompletedNormally(h3, null);
2485 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2486 }}
2487
2488 /**
2489 * acceptEither result completes exceptionally after exceptional
2490 * completion of either source
2491 */
2492 public void testAcceptEither_exceptionalCompletion() {
2493 for (ExecutionMode m : ExecutionMode.values())
2494 for (Integer v1 : new Integer[] { 1, null })
2495 {
2496 final CompletableFuture<Integer> f = new CompletableFuture<>();
2497 final CompletableFuture<Integer> g = new CompletableFuture<>();
2498 final CFException ex = new CFException();
2499 final NoopConsumer[] rs = new NoopConsumer[6];
2500 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2501
2502 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2503 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2504 checkIncomplete(h0);
2505 checkIncomplete(h1);
2506 rs[0].assertNotInvoked();
2507 rs[1].assertNotInvoked();
2508 f.completeExceptionally(ex);
2509 checkCompletedWithWrappedException(h0, ex);
2510 checkCompletedWithWrappedException(h1, ex);
2511 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2512 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2513 checkCompletedWithWrappedException(h2, ex);
2514 checkCompletedWithWrappedException(h3, ex);
2515
2516 g.complete(v1);
2517
2518 // unspecified behavior - both source completions available
2519 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2520 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2521 try {
2522 assertNull(h4.join());
2523 rs[4].assertValue(v1);
2524 } catch (CompletionException ok) {
2525 checkCompletedWithWrappedException(h4, ex);
2526 rs[4].assertNotInvoked();
2527 }
2528 try {
2529 assertNull(h5.join());
2530 rs[5].assertValue(v1);
2531 } catch (CompletionException ok) {
2532 checkCompletedWithWrappedException(h5, ex);
2533 rs[5].assertNotInvoked();
2534 }
2535
2536 checkCompletedExceptionally(f, ex);
2537 checkCompletedNormally(g, v1);
2538 checkCompletedWithWrappedException(h0, ex);
2539 checkCompletedWithWrappedException(h1, ex);
2540 checkCompletedWithWrappedException(h2, ex);
2541 checkCompletedWithWrappedException(h3, ex);
2542 checkCompletedWithWrappedException(h4, ex);
2543 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2544 }}
2545
2546 public void testAcceptEither_exceptionalCompletion2() {
2547 for (ExecutionMode m : ExecutionMode.values())
2548 for (boolean fFirst : new boolean[] { true, false })
2549 for (Integer v1 : new Integer[] { 1, null })
2550 {
2551 final CompletableFuture<Integer> f = new CompletableFuture<>();
2552 final CompletableFuture<Integer> g = new CompletableFuture<>();
2553 final CFException ex = new CFException();
2554 final NoopConsumer[] rs = new NoopConsumer[6];
2555 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2556
2557 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2558 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2559 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2560 assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2561 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2562 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2563
2564 // unspecified behavior - both source completions available
2565 try {
2566 assertEquals(null, h0.join());
2567 rs[0].assertValue(v1);
2568 } catch (CompletionException ok) {
2569 checkCompletedWithWrappedException(h0, ex);
2570 rs[0].assertNotInvoked();
2571 }
2572 try {
2573 assertEquals(null, h1.join());
2574 rs[1].assertValue(v1);
2575 } catch (CompletionException ok) {
2576 checkCompletedWithWrappedException(h1, ex);
2577 rs[1].assertNotInvoked();
2578 }
2579 try {
2580 assertEquals(null, h2.join());
2581 rs[2].assertValue(v1);
2582 } catch (CompletionException ok) {
2583 checkCompletedWithWrappedException(h2, ex);
2584 rs[2].assertNotInvoked();
2585 }
2586 try {
2587 assertEquals(null, h3.join());
2588 rs[3].assertValue(v1);
2589 } catch (CompletionException ok) {
2590 checkCompletedWithWrappedException(h3, ex);
2591 rs[3].assertNotInvoked();
2592 }
2593
2594 checkCompletedNormally(f, v1);
2595 checkCompletedExceptionally(g, ex);
2596 }}
2597
2598 /**
2599 * acceptEither result completes exceptionally if either source cancelled
2600 */
2601 public void testAcceptEither_sourceCancelled() {
2602 for (ExecutionMode m : ExecutionMode.values())
2603 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2604 for (Integer v1 : new Integer[] { 1, null })
2605 {
2606 final CompletableFuture<Integer> f = new CompletableFuture<>();
2607 final CompletableFuture<Integer> g = new CompletableFuture<>();
2608 final NoopConsumer[] rs = new NoopConsumer[6];
2609 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2610
2611 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2612 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2613 checkIncomplete(h0);
2614 checkIncomplete(h1);
2615 rs[0].assertNotInvoked();
2616 rs[1].assertNotInvoked();
2617 f.cancel(mayInterruptIfRunning);
2618 checkCompletedWithWrappedCancellationException(h0);
2619 checkCompletedWithWrappedCancellationException(h1);
2620 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2621 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2622 checkCompletedWithWrappedCancellationException(h2);
2623 checkCompletedWithWrappedCancellationException(h3);
2624
2625 g.complete(v1);
2626
2627 // unspecified behavior - both source completions available
2628 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2629 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2630 try {
2631 assertNull(h4.join());
2632 rs[4].assertValue(v1);
2633 } catch (CompletionException ok) {
2634 checkCompletedWithWrappedCancellationException(h4);
2635 rs[4].assertNotInvoked();
2636 }
2637 try {
2638 assertNull(h5.join());
2639 rs[5].assertValue(v1);
2640 } catch (CompletionException ok) {
2641 checkCompletedWithWrappedCancellationException(h5);
2642 rs[5].assertNotInvoked();
2643 }
2644
2645 checkCancelled(f);
2646 checkCompletedNormally(g, v1);
2647 checkCompletedWithWrappedCancellationException(h0);
2648 checkCompletedWithWrappedCancellationException(h1);
2649 checkCompletedWithWrappedCancellationException(h2);
2650 checkCompletedWithWrappedCancellationException(h3);
2651 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2652 }}
2653
2654 /**
2655 * acceptEither result completes exceptionally if action does
2656 */
2657 public void testAcceptEither_actionFailed() {
2658 for (ExecutionMode m : ExecutionMode.values())
2659 for (Integer v1 : new Integer[] { 1, null })
2660 for (Integer v2 : new Integer[] { 2, null })
2661 {
2662 final CompletableFuture<Integer> f = new CompletableFuture<>();
2663 final CompletableFuture<Integer> g = new CompletableFuture<>();
2664 final FailingConsumer[] rs = new FailingConsumer[6];
2665 for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2666
2667 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2668 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2669 f.complete(v1);
2670 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2671 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2672 checkCompletedWithWrappedException(h0, rs[0].ex);
2673 checkCompletedWithWrappedException(h1, rs[1].ex);
2674 checkCompletedWithWrappedException(h2, rs[2].ex);
2675 checkCompletedWithWrappedException(h3, rs[3].ex);
2676 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2677
2678 g.complete(v2);
2679
2680 // unspecified behavior - both source completions available
2681 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2682 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2683
2684 checkCompletedWithWrappedException(h4, rs[4].ex);
2685 assertTrue(Objects.equals(v1, rs[4].value) ||
2686 Objects.equals(v2, rs[4].value));
2687 checkCompletedWithWrappedException(h5, rs[5].ex);
2688 assertTrue(Objects.equals(v1, rs[5].value) ||
2689 Objects.equals(v2, rs[5].value));
2690
2691 checkCompletedNormally(f, v1);
2692 checkCompletedNormally(g, v2);
2693 }}
2694
2695 /**
2696 * runAfterEither result completes normally after normal completion
2697 * of either source
2698 */
2699 public void testRunAfterEither_normalCompletion() {
2700 for (ExecutionMode m : ExecutionMode.values())
2701 for (Integer v1 : new Integer[] { 1, null })
2702 for (Integer v2 : new Integer[] { 2, null })
2703 {
2704 final CompletableFuture<Integer> f = new CompletableFuture<>();
2705 final CompletableFuture<Integer> g = new CompletableFuture<>();
2706 final Noop[] rs = new Noop[6];
2707 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2708
2709 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2710 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2711 checkIncomplete(h0);
2712 checkIncomplete(h1);
2713 rs[0].assertNotInvoked();
2714 rs[1].assertNotInvoked();
2715 f.complete(v1);
2716 checkCompletedNormally(h0, null);
2717 checkCompletedNormally(h1, null);
2718 rs[0].assertInvoked();
2719 rs[1].assertInvoked();
2720 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2721 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2722 checkCompletedNormally(h2, null);
2723 checkCompletedNormally(h3, null);
2724 rs[2].assertInvoked();
2725 rs[3].assertInvoked();
2726
2727 g.complete(v2);
2728
2729 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2730 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2731
2732 checkCompletedNormally(f, v1);
2733 checkCompletedNormally(g, v2);
2734 checkCompletedNormally(h0, null);
2735 checkCompletedNormally(h1, null);
2736 checkCompletedNormally(h2, null);
2737 checkCompletedNormally(h3, null);
2738 checkCompletedNormally(h4, null);
2739 checkCompletedNormally(h5, null);
2740 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2741 }}
2742
2743 /**
2744 * runAfterEither result completes exceptionally after exceptional
2745 * completion of either source
2746 */
2747 public void testRunAfterEither_exceptionalCompletion() {
2748 for (ExecutionMode m : ExecutionMode.values())
2749 for (Integer v1 : new Integer[] { 1, null })
2750 {
2751 final CompletableFuture<Integer> f = new CompletableFuture<>();
2752 final CompletableFuture<Integer> g = new CompletableFuture<>();
2753 final CFException ex = new CFException();
2754 final Noop[] rs = new Noop[6];
2755 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2756
2757 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2758 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2759 checkIncomplete(h0);
2760 checkIncomplete(h1);
2761 rs[0].assertNotInvoked();
2762 rs[1].assertNotInvoked();
2763 assertTrue(f.completeExceptionally(ex));
2764 checkCompletedWithWrappedException(h0, ex);
2765 checkCompletedWithWrappedException(h1, ex);
2766 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2767 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2768 checkCompletedWithWrappedException(h2, ex);
2769 checkCompletedWithWrappedException(h3, ex);
2770
2771 assertTrue(g.complete(v1));
2772
2773 // unspecified behavior - both source completions available
2774 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2775 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2776 try {
2777 assertNull(h4.join());
2778 rs[4].assertInvoked();
2779 } catch (CompletionException ok) {
2780 checkCompletedWithWrappedException(h4, ex);
2781 rs[4].assertNotInvoked();
2782 }
2783 try {
2784 assertNull(h5.join());
2785 rs[5].assertInvoked();
2786 } catch (CompletionException ok) {
2787 checkCompletedWithWrappedException(h5, ex);
2788 rs[5].assertNotInvoked();
2789 }
2790
2791 checkCompletedExceptionally(f, ex);
2792 checkCompletedNormally(g, v1);
2793 checkCompletedWithWrappedException(h0, ex);
2794 checkCompletedWithWrappedException(h1, ex);
2795 checkCompletedWithWrappedException(h2, ex);
2796 checkCompletedWithWrappedException(h3, ex);
2797 checkCompletedWithWrappedException(h4, ex);
2798 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2799 }}
2800
2801 public void testRunAfterEither_exceptionalCompletion2() {
2802 for (ExecutionMode m : ExecutionMode.values())
2803 for (boolean fFirst : new boolean[] { true, false })
2804 for (Integer v1 : new Integer[] { 1, null })
2805 {
2806 final CompletableFuture<Integer> f = new CompletableFuture<>();
2807 final CompletableFuture<Integer> g = new CompletableFuture<>();
2808 final CFException ex = new CFException();
2809 final Noop[] rs = new Noop[6];
2810 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2811
2812 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2813 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2814 assertTrue( fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2815 assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2816 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2817 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2818
2819 // unspecified behavior - both source completions available
2820 try {
2821 assertEquals(null, h0.join());
2822 rs[0].assertInvoked();
2823 } catch (CompletionException ok) {
2824 checkCompletedWithWrappedException(h0, ex);
2825 rs[0].assertNotInvoked();
2826 }
2827 try {
2828 assertEquals(null, h1.join());
2829 rs[1].assertInvoked();
2830 } catch (CompletionException ok) {
2831 checkCompletedWithWrappedException(h1, ex);
2832 rs[1].assertNotInvoked();
2833 }
2834 try {
2835 assertEquals(null, h2.join());
2836 rs[2].assertInvoked();
2837 } catch (CompletionException ok) {
2838 checkCompletedWithWrappedException(h2, ex);
2839 rs[2].assertNotInvoked();
2840 }
2841 try {
2842 assertEquals(null, h3.join());
2843 rs[3].assertInvoked();
2844 } catch (CompletionException ok) {
2845 checkCompletedWithWrappedException(h3, ex);
2846 rs[3].assertNotInvoked();
2847 }
2848
2849 checkCompletedNormally(f, v1);
2850 checkCompletedExceptionally(g, ex);
2851 }}
2852
2853 /**
2854 * runAfterEither result completes exceptionally if either source cancelled
2855 */
2856 public void testRunAfterEither_sourceCancelled() {
2857 for (ExecutionMode m : ExecutionMode.values())
2858 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2859 for (Integer v1 : new Integer[] { 1, null })
2860 {
2861 final CompletableFuture<Integer> f = new CompletableFuture<>();
2862 final CompletableFuture<Integer> g = new CompletableFuture<>();
2863 final Noop[] rs = new Noop[6];
2864 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2865
2866 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2867 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2868 checkIncomplete(h0);
2869 checkIncomplete(h1);
2870 rs[0].assertNotInvoked();
2871 rs[1].assertNotInvoked();
2872 f.cancel(mayInterruptIfRunning);
2873 checkCompletedWithWrappedCancellationException(h0);
2874 checkCompletedWithWrappedCancellationException(h1);
2875 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2876 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2877 checkCompletedWithWrappedCancellationException(h2);
2878 checkCompletedWithWrappedCancellationException(h3);
2879
2880 assertTrue(g.complete(v1));
2881
2882 // unspecified behavior - both source completions available
2883 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2884 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2885 try {
2886 assertNull(h4.join());
2887 rs[4].assertInvoked();
2888 } catch (CompletionException ok) {
2889 checkCompletedWithWrappedCancellationException(h4);
2890 rs[4].assertNotInvoked();
2891 }
2892 try {
2893 assertNull(h5.join());
2894 rs[5].assertInvoked();
2895 } catch (CompletionException ok) {
2896 checkCompletedWithWrappedCancellationException(h5);
2897 rs[5].assertNotInvoked();
2898 }
2899
2900 checkCancelled(f);
2901 checkCompletedNormally(g, v1);
2902 checkCompletedWithWrappedCancellationException(h0);
2903 checkCompletedWithWrappedCancellationException(h1);
2904 checkCompletedWithWrappedCancellationException(h2);
2905 checkCompletedWithWrappedCancellationException(h3);
2906 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2907 }}
2908
2909 /**
2910 * runAfterEither result completes exceptionally if action does
2911 */
2912 public void testRunAfterEither_actionFailed() {
2913 for (ExecutionMode m : ExecutionMode.values())
2914 for (Integer v1 : new Integer[] { 1, null })
2915 for (Integer v2 : new Integer[] { 2, null })
2916 {
2917 final CompletableFuture<Integer> f = new CompletableFuture<>();
2918 final CompletableFuture<Integer> g = new CompletableFuture<>();
2919 final FailingRunnable[] rs = new FailingRunnable[6];
2920 for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2921
2922 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2923 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2924 assertTrue(f.complete(v1));
2925 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2926 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2927 checkCompletedWithWrappedException(h0, rs[0].ex);
2928 checkCompletedWithWrappedException(h1, rs[1].ex);
2929 checkCompletedWithWrappedException(h2, rs[2].ex);
2930 checkCompletedWithWrappedException(h3, rs[3].ex);
2931 for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2932 assertTrue(g.complete(v2));
2933 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2934 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2935 checkCompletedWithWrappedException(h4, rs[4].ex);
2936 checkCompletedWithWrappedException(h5, rs[5].ex);
2937
2938 checkCompletedNormally(f, v1);
2939 checkCompletedNormally(g, v2);
2940 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2941 }}
2942
2943 /**
2944 * thenCompose result completes normally after normal completion of source
2945 */
2946 public void testThenCompose_normalCompletion() {
2947 for (ExecutionMode m : ExecutionMode.values())
2948 for (boolean createIncomplete : new boolean[] { true, false })
2949 for (Integer v1 : new Integer[] { 1, null })
2950 {
2951 final CompletableFuture<Integer> f = new CompletableFuture<>();
2952 final CompletableFutureInc r = new CompletableFutureInc(m);
2953 if (!createIncomplete) assertTrue(f.complete(v1));
2954 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2955 if (createIncomplete) assertTrue(f.complete(v1));
2956
2957 checkCompletedNormally(g, inc(v1));
2958 checkCompletedNormally(f, v1);
2959 r.assertValue(v1);
2960 }}
2961
2962 /**
2963 * thenCompose result completes exceptionally after exceptional
2964 * completion of source
2965 */
2966 public void testThenCompose_exceptionalCompletion() {
2967 for (ExecutionMode m : ExecutionMode.values())
2968 for (boolean createIncomplete : new boolean[] { true, false })
2969 {
2970 final CFException ex = new CFException();
2971 final CompletableFutureInc r = new CompletableFutureInc(m);
2972 final CompletableFuture<Integer> f = new CompletableFuture<>();
2973 if (!createIncomplete) f.completeExceptionally(ex);
2974 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2975 if (createIncomplete) f.completeExceptionally(ex);
2976
2977 checkCompletedWithWrappedException(g, ex);
2978 checkCompletedExceptionally(f, ex);
2979 r.assertNotInvoked();
2980 }}
2981
2982 /**
2983 * thenCompose result completes exceptionally if action does
2984 */
2985 public void testThenCompose_actionFailed() {
2986 for (ExecutionMode m : ExecutionMode.values())
2987 for (boolean createIncomplete : new boolean[] { true, false })
2988 for (Integer v1 : new Integer[] { 1, null })
2989 {
2990 final CompletableFuture<Integer> f = new CompletableFuture<>();
2991 final FailingCompletableFutureFunction r
2992 = new FailingCompletableFutureFunction(m);
2993 if (!createIncomplete) assertTrue(f.complete(v1));
2994 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2995 if (createIncomplete) assertTrue(f.complete(v1));
2996
2997 checkCompletedWithWrappedException(g, r.ex);
2998 checkCompletedNormally(f, v1);
2999 }}
3000
3001 /**
3002 * thenCompose result completes exceptionally if source cancelled
3003 */
3004 public void testThenCompose_sourceCancelled() {
3005 for (ExecutionMode m : ExecutionMode.values())
3006 for (boolean createIncomplete : new boolean[] { true, false })
3007 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3008 {
3009 final CompletableFuture<Integer> f = new CompletableFuture<>();
3010 final CompletableFutureInc r = new CompletableFutureInc(m);
3011 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3012 final CompletableFuture<Integer> g = m.thenCompose(f, r);
3013 if (createIncomplete) {
3014 checkIncomplete(g);
3015 assertTrue(f.cancel(mayInterruptIfRunning));
3016 }
3017
3018 checkCompletedWithWrappedCancellationException(g);
3019 checkCancelled(f);
3020 }}
3021
3022 /**
3023 * thenCompose result completes exceptionally if the result of the action does
3024 */
3025 public void testThenCompose_actionReturnsFailingFuture() {
3026 for (ExecutionMode m : ExecutionMode.values())
3027 for (int order = 0; order < 6; order++)
3028 for (Integer v1 : new Integer[] { 1, null })
3029 {
3030 final CFException ex = new CFException();
3031 final CompletableFuture<Integer> f = new CompletableFuture<>();
3032 final CompletableFuture<Integer> g = new CompletableFuture<>();
3033 final CompletableFuture<Integer> h;
3034 // Test all permutations of orders
3035 switch (order) {
3036 case 0:
3037 assertTrue(f.complete(v1));
3038 assertTrue(g.completeExceptionally(ex));
3039 h = m.thenCompose(f, (x -> g));
3040 break;
3041 case 1:
3042 assertTrue(f.complete(v1));
3043 h = m.thenCompose(f, (x -> g));
3044 assertTrue(g.completeExceptionally(ex));
3045 break;
3046 case 2:
3047 assertTrue(g.completeExceptionally(ex));
3048 assertTrue(f.complete(v1));
3049 h = m.thenCompose(f, (x -> g));
3050 break;
3051 case 3:
3052 assertTrue(g.completeExceptionally(ex));
3053 h = m.thenCompose(f, (x -> g));
3054 assertTrue(f.complete(v1));
3055 break;
3056 case 4:
3057 h = m.thenCompose(f, (x -> g));
3058 assertTrue(f.complete(v1));
3059 assertTrue(g.completeExceptionally(ex));
3060 break;
3061 case 5:
3062 h = m.thenCompose(f, (x -> g));
3063 assertTrue(f.complete(v1));
3064 assertTrue(g.completeExceptionally(ex));
3065 break;
3066 default: throw new AssertionError();
3067 }
3068
3069 checkCompletedExceptionally(g, ex);
3070 checkCompletedWithWrappedException(h, ex);
3071 checkCompletedNormally(f, v1);
3072 }}
3073
3074 // other static methods
3075
3076 /**
3077 * allOf(no component futures) returns a future completed normally
3078 * with the value null
3079 */
3080 public void testAllOf_empty() throws Exception {
3081 CompletableFuture<Void> f = CompletableFuture.allOf();
3082 checkCompletedNormally(f, null);
3083 }
3084
3085 /**
3086 * allOf returns a future completed normally with the value null
3087 * when all components complete normally
3088 */
3089 public void testAllOf_normal() throws Exception {
3090 for (int k = 1; k < 10; k++) {
3091 CompletableFuture<Integer>[] fs
3092 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3093 for (int i = 0; i < k; i++)
3094 fs[i] = new CompletableFuture<>();
3095 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3096 for (int i = 0; i < k; i++) {
3097 checkIncomplete(f);
3098 checkIncomplete(CompletableFuture.allOf(fs));
3099 fs[i].complete(one);
3100 }
3101 checkCompletedNormally(f, null);
3102 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3103 }
3104 }
3105
3106 public void testAllOf_normal_backwards() throws Exception {
3107 for (int k = 1; k < 10; k++) {
3108 CompletableFuture<Integer>[] fs
3109 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3110 for (int i = 0; i < k; i++)
3111 fs[i] = new CompletableFuture<>();
3112 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3113 for (int i = k - 1; i >= 0; i--) {
3114 checkIncomplete(f);
3115 checkIncomplete(CompletableFuture.allOf(fs));
3116 fs[i].complete(one);
3117 }
3118 checkCompletedNormally(f, null);
3119 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3120 }
3121 }
3122
3123 public void testAllOf_exceptional() throws Exception {
3124 for (int k = 1; k < 10; k++) {
3125 CompletableFuture<Integer>[] fs
3126 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3127 CFException ex = new CFException();
3128 for (int i = 0; i < k; i++)
3129 fs[i] = new CompletableFuture<>();
3130 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3131 for (int i = 0; i < k; i++) {
3132 checkIncomplete(f);
3133 checkIncomplete(CompletableFuture.allOf(fs));
3134 if (i != k / 2) {
3135 fs[i].complete(i);
3136 checkCompletedNormally(fs[i], i);
3137 } else {
3138 fs[i].completeExceptionally(ex);
3139 checkCompletedExceptionally(fs[i], ex);
3140 }
3141 }
3142 checkCompletedWithWrappedException(f, ex);
3143 checkCompletedWithWrappedException(CompletableFuture.allOf(fs), ex);
3144 }
3145 }
3146
3147 /**
3148 * anyOf(no component futures) returns an incomplete future
3149 */
3150 public void testAnyOf_empty() throws Exception {
3151 for (Integer v1 : new Integer[] { 1, null })
3152 {
3153 CompletableFuture<Object> f = CompletableFuture.anyOf();
3154 checkIncomplete(f);
3155
3156 f.complete(v1);
3157 checkCompletedNormally(f, v1);
3158 }}
3159
3160 /**
3161 * anyOf returns a future completed normally with a value when
3162 * a component future does
3163 */
3164 public void testAnyOf_normal() throws Exception {
3165 for (int k = 0; k < 10; k++) {
3166 CompletableFuture[] fs = new CompletableFuture[k];
3167 for (int i = 0; i < k; i++)
3168 fs[i] = new CompletableFuture<>();
3169 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3170 checkIncomplete(f);
3171 for (int i = 0; i < k; i++) {
3172 fs[i].complete(i);
3173 checkCompletedNormally(f, 0);
3174 int x = (int) CompletableFuture.anyOf(fs).join();
3175 assertTrue(0 <= x && x <= i);
3176 }
3177 }
3178 }
3179 public void testAnyOf_normal_backwards() throws Exception {
3180 for (int k = 0; k < 10; k++) {
3181 CompletableFuture[] fs = new CompletableFuture[k];
3182 for (int i = 0; i < k; i++)
3183 fs[i] = new CompletableFuture<>();
3184 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3185 checkIncomplete(f);
3186 for (int i = k - 1; i >= 0; i--) {
3187 fs[i].complete(i);
3188 checkCompletedNormally(f, k - 1);
3189 int x = (int) CompletableFuture.anyOf(fs).join();
3190 assertTrue(i <= x && x <= k - 1);
3191 }
3192 }
3193 }
3194
3195 /**
3196 * anyOf result completes exceptionally when any component does.
3197 */
3198 public void testAnyOf_exceptional() throws Exception {
3199 for (int k = 0; k < 10; k++) {
3200 CompletableFuture[] fs = new CompletableFuture[k];
3201 CFException[] exs = new CFException[k];
3202 for (int i = 0; i < k; i++) {
3203 fs[i] = new CompletableFuture<>();
3204 exs[i] = new CFException();
3205 }
3206 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3207 checkIncomplete(f);
3208 for (int i = 0; i < k; i++) {
3209 fs[i].completeExceptionally(exs[i]);
3210 checkCompletedWithWrappedException(f, exs[0]);
3211 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3212 }
3213 }
3214 }
3215
3216 public void testAnyOf_exceptional_backwards() throws Exception {
3217 for (int k = 0; k < 10; k++) {
3218 CompletableFuture[] fs = new CompletableFuture[k];
3219 CFException[] exs = new CFException[k];
3220 for (int i = 0; i < k; i++) {
3221 fs[i] = new CompletableFuture<>();
3222 exs[i] = new CFException();
3223 }
3224 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3225 checkIncomplete(f);
3226 for (int i = k - 1; i >= 0; i--) {
3227 fs[i].completeExceptionally(exs[i]);
3228 checkCompletedWithWrappedException(f, exs[k - 1]);
3229 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3230 }
3231 }
3232 }
3233
3234 /**
3235 * Completion methods throw NullPointerException with null arguments
3236 */
3237 public void testNPE() {
3238 CompletableFuture<Integer> f = new CompletableFuture<>();
3239 CompletableFuture<Integer> g = new CompletableFuture<>();
3240 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3241 ThreadExecutor exec = new ThreadExecutor();
3242
3243 Runnable[] throwingActions = {
3244 () -> CompletableFuture.supplyAsync(null),
3245 () -> CompletableFuture.supplyAsync(null, exec),
3246 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.SYNC, 42), null),
3247
3248 () -> CompletableFuture.runAsync(null),
3249 () -> CompletableFuture.runAsync(null, exec),
3250 () -> CompletableFuture.runAsync(() -> {}, null),
3251
3252 () -> f.completeExceptionally(null),
3253
3254 () -> f.thenApply(null),
3255 () -> f.thenApplyAsync(null),
3256 () -> f.thenApplyAsync((x) -> x, null),
3257 () -> f.thenApplyAsync(null, exec),
3258
3259 () -> f.thenAccept(null),
3260 () -> f.thenAcceptAsync(null),
3261 () -> f.thenAcceptAsync((x) -> {} , null),
3262 () -> f.thenAcceptAsync(null, exec),
3263
3264 () -> f.thenRun(null),
3265 () -> f.thenRunAsync(null),
3266 () -> f.thenRunAsync(() -> {} , null),
3267 () -> f.thenRunAsync(null, exec),
3268
3269 () -> f.thenCombine(g, null),
3270 () -> f.thenCombineAsync(g, null),
3271 () -> f.thenCombineAsync(g, null, exec),
3272 () -> f.thenCombine(nullFuture, (x, y) -> x),
3273 () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3274 () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3275 () -> f.thenCombineAsync(g, (x, y) -> x, null),
3276
3277 () -> f.thenAcceptBoth(g, null),
3278 () -> f.thenAcceptBothAsync(g, null),
3279 () -> f.thenAcceptBothAsync(g, null, exec),
3280 () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3281 () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3282 () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3283 () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3284
3285 () -> f.runAfterBoth(g, null),
3286 () -> f.runAfterBothAsync(g, null),
3287 () -> f.runAfterBothAsync(g, null, exec),
3288 () -> f.runAfterBoth(nullFuture, () -> {}),
3289 () -> f.runAfterBothAsync(nullFuture, () -> {}),
3290 () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3291 () -> f.runAfterBothAsync(g, () -> {}, null),
3292
3293 () -> f.applyToEither(g, null),
3294 () -> f.applyToEitherAsync(g, null),
3295 () -> f.applyToEitherAsync(g, null, exec),
3296 () -> f.applyToEither(nullFuture, (x) -> x),
3297 () -> f.applyToEitherAsync(nullFuture, (x) -> x),
3298 () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
3299 () -> f.applyToEitherAsync(g, (x) -> x, null),
3300
3301 () -> f.acceptEither(g, null),
3302 () -> f.acceptEitherAsync(g, null),
3303 () -> f.acceptEitherAsync(g, null, exec),
3304 () -> f.acceptEither(nullFuture, (x) -> {}),
3305 () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
3306 () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
3307 () -> f.acceptEitherAsync(g, (x) -> {}, null),
3308
3309 () -> f.runAfterEither(g, null),
3310 () -> f.runAfterEitherAsync(g, null),
3311 () -> f.runAfterEitherAsync(g, null, exec),
3312 () -> f.runAfterEither(nullFuture, () -> {}),
3313 () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3314 () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3315 () -> f.runAfterEitherAsync(g, () -> {}, null),
3316
3317 () -> f.thenCompose(null),
3318 () -> f.thenComposeAsync(null),
3319 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
3320 () -> f.thenComposeAsync(null, exec),
3321
3322 () -> f.exceptionally(null),
3323
3324 () -> f.handle(null),
3325
3326 () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3327 () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3328 () -> CompletableFuture.allOf(f, null),
3329 () -> CompletableFuture.allOf(null, f),
3330
3331 () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3332 () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3333 () -> CompletableFuture.anyOf(f, null),
3334 () -> CompletableFuture.anyOf(null, f),
3335
3336 () -> f.obtrudeException(null),
3337
3338 () -> CompletableFuture.delayedExecutor(1L, SECONDS, null),
3339 () -> CompletableFuture.delayedExecutor(1L, null, exec),
3340 () -> CompletableFuture.delayedExecutor(1L, null),
3341
3342 () -> f.orTimeout(1L, null),
3343 () -> f.completeOnTimeout(42, 1L, null),
3344
3345 () -> CompletableFuture.failedFuture(null),
3346 () -> CompletableFuture.failedStage(null),
3347 };
3348
3349 assertThrows(NullPointerException.class, throwingActions);
3350 assertEquals(0, exec.count.get());
3351 }
3352
3353 /**
3354 * Test submissions to an executor that rejects all tasks.
3355 */
3356 public void testRejectingExecutor() {
3357 for (Integer v : new Integer[] { 1, null })
3358 {
3359 final CountingRejectingExecutor e = new CountingRejectingExecutor();
3360
3361 final CompletableFuture<Integer> complete = CompletableFuture.completedFuture(v);
3362 final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3363
3364 List<CompletableFuture<?>> futures = new ArrayList<>();
3365
3366 List<CompletableFuture<Integer>> srcs = new ArrayList<>();
3367 srcs.add(complete);
3368 srcs.add(incomplete);
3369
3370 for (CompletableFuture<Integer> src : srcs) {
3371 List<CompletableFuture<?>> fs = new ArrayList<>();
3372 fs.add(src.thenRunAsync(() -> {}, e));
3373 fs.add(src.thenAcceptAsync((z) -> {}, e));
3374 fs.add(src.thenApplyAsync((z) -> z, e));
3375
3376 fs.add(src.thenCombineAsync(src, (x, y) -> x, e));
3377 fs.add(src.thenAcceptBothAsync(src, (x, y) -> {}, e));
3378 fs.add(src.runAfterBothAsync(src, () -> {}, e));
3379
3380 fs.add(src.applyToEitherAsync(src, (z) -> z, e));
3381 fs.add(src.acceptEitherAsync(src, (z) -> {}, e));
3382 fs.add(src.runAfterEitherAsync(src, () -> {}, e));
3383
3384 fs.add(src.thenComposeAsync((z) -> null, e));
3385 fs.add(src.whenCompleteAsync((z, t) -> {}, e));
3386 fs.add(src.handleAsync((z, t) -> null, e));
3387
3388 for (CompletableFuture<?> future : fs) {
3389 if (src.isDone())
3390 checkCompletedWithWrappedException(future, e.ex);
3391 else
3392 checkIncomplete(future);
3393 }
3394 futures.addAll(fs);
3395 }
3396
3397 {
3398 List<CompletableFuture<?>> fs = new ArrayList<>();
3399
3400 fs.add(complete.thenCombineAsync(incomplete, (x, y) -> x, e));
3401 fs.add(incomplete.thenCombineAsync(complete, (x, y) -> x, e));
3402
3403 fs.add(complete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3404 fs.add(incomplete.thenAcceptBothAsync(complete, (x, y) -> {}, e));
3405
3406 fs.add(complete.runAfterBothAsync(incomplete, () -> {}, e));
3407 fs.add(incomplete.runAfterBothAsync(complete, () -> {}, e));
3408
3409 for (CompletableFuture<?> future : fs)
3410 checkIncomplete(future);
3411 futures.addAll(fs);
3412 }
3413
3414 {
3415 List<CompletableFuture<?>> fs = new ArrayList<>();
3416
3417 fs.add(complete.applyToEitherAsync(incomplete, (z) -> z, e));
3418 fs.add(incomplete.applyToEitherAsync(complete, (z) -> z, e));
3419
3420 fs.add(complete.acceptEitherAsync(incomplete, (z) -> {}, e));
3421 fs.add(incomplete.acceptEitherAsync(complete, (z) -> {}, e));
3422
3423 fs.add(complete.runAfterEitherAsync(incomplete, () -> {}, e));
3424 fs.add(incomplete.runAfterEitherAsync(complete, () -> {}, e));
3425
3426 for (CompletableFuture<?> future : fs)
3427 checkCompletedWithWrappedException(future, e.ex);
3428 futures.addAll(fs);
3429 }
3430
3431 incomplete.complete(v);
3432
3433 for (CompletableFuture<?> future : futures)
3434 checkCompletedWithWrappedException(future, e.ex);
3435
3436 assertEquals(futures.size(), e.count.get());
3437 }}
3438
3439 /**
3440 * Test submissions to an executor that rejects all tasks, but
3441 * should never be invoked because the dependent future is
3442 * explicitly completed.
3443 */
3444 public void testRejectingExecutorNeverInvoked() {
3445 for (Integer v : new Integer[] { 1, null })
3446 {
3447 final CountingRejectingExecutor e = new CountingRejectingExecutor();
3448
3449 final CompletableFuture<Integer> complete = CompletableFuture.completedFuture(v);
3450 final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3451
3452 List<CompletableFuture<?>> futures = new ArrayList<>();
3453
3454 List<CompletableFuture<Integer>> srcs = new ArrayList<>();
3455 srcs.add(complete);
3456 srcs.add(incomplete);
3457
3458 List<CompletableFuture<?>> fs = new ArrayList<>();
3459 fs.add(incomplete.thenRunAsync(() -> {}, e));
3460 fs.add(incomplete.thenAcceptAsync((z) -> {}, e));
3461 fs.add(incomplete.thenApplyAsync((z) -> z, e));
3462
3463 fs.add(incomplete.thenCombineAsync(incomplete, (x, y) -> x, e));
3464 fs.add(incomplete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3465 fs.add(incomplete.runAfterBothAsync(incomplete, () -> {}, e));
3466
3467 fs.add(incomplete.applyToEitherAsync(incomplete, (z) -> z, e));
3468 fs.add(incomplete.acceptEitherAsync(incomplete, (z) -> {}, e));
3469 fs.add(incomplete.runAfterEitherAsync(incomplete, () -> {}, e));
3470
3471 fs.add(incomplete.thenComposeAsync((z) -> null, e));
3472 fs.add(incomplete.whenCompleteAsync((z, t) -> {}, e));
3473 fs.add(incomplete.handleAsync((z, t) -> null, e));
3474
3475 fs.add(complete.thenCombineAsync(incomplete, (x, y) -> x, e));
3476 fs.add(incomplete.thenCombineAsync(complete, (x, y) -> x, e));
3477
3478 fs.add(complete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3479 fs.add(incomplete.thenAcceptBothAsync(complete, (x, y) -> {}, e));
3480
3481 fs.add(complete.runAfterBothAsync(incomplete, () -> {}, e));
3482 fs.add(incomplete.runAfterBothAsync(complete, () -> {}, e));
3483
3484 for (CompletableFuture<?> future : fs)
3485 checkIncomplete(future);
3486
3487 for (CompletableFuture<?> future : fs)
3488 future.complete(null);
3489
3490 incomplete.complete(v);
3491
3492 for (CompletableFuture<?> future : fs)
3493 checkCompletedNormally(future, null);
3494
3495 assertEquals(0, e.count.get());
3496 }}
3497
3498 /**
3499 * toCompletableFuture returns this CompletableFuture.
3500 */
3501 public void testToCompletableFuture() {
3502 CompletableFuture<Integer> f = new CompletableFuture<>();
3503 assertSame(f, f.toCompletableFuture());
3504 }
3505
3506 // jdk9
3507
3508 /**
3509 * newIncompleteFuture returns an incomplete CompletableFuture
3510 */
3511 public void testNewIncompleteFuture() {
3512 for (Integer v1 : new Integer[] { 1, null })
3513 {
3514 CompletableFuture<Integer> f = new CompletableFuture<>();
3515 CompletableFuture<Integer> g = f.newIncompleteFuture();
3516 checkIncomplete(f);
3517 checkIncomplete(g);
3518 f.complete(v1);
3519 checkCompletedNormally(f, v1);
3520 checkIncomplete(g);
3521 g.complete(v1);
3522 checkCompletedNormally(g, v1);
3523 assertSame(g.getClass(), CompletableFuture.class);
3524 }}
3525
3526 /**
3527 * completedStage returns a completed CompletionStage
3528 */
3529 public void testCompletedStage() {
3530 AtomicInteger x = new AtomicInteger(0);
3531 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3532 CompletionStage<Integer> f = CompletableFuture.completedStage(1);
3533 f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3534 assertEquals(x.get(), 1);
3535 assertNull(r.get());
3536 }
3537
3538 /**
3539 * defaultExecutor by default returns the commonPool if
3540 * it supports more than one thread.
3541 */
3542 public void testDefaultExecutor() {
3543 CompletableFuture<Integer> f = new CompletableFuture<>();
3544 Executor e = f.defaultExecutor();
3545 Executor c = ForkJoinPool.commonPool();
3546 if (ForkJoinPool.getCommonPoolParallelism() > 1)
3547 assertSame(e, c);
3548 else
3549 assertNotSame(e, c);
3550 }
3551
3552 /**
3553 * failedFuture returns a CompletableFuture completed
3554 * exceptionally with the given Exception
3555 */
3556 public void testFailedFuture() {
3557 CFException ex = new CFException();
3558 CompletableFuture<Integer> f = CompletableFuture.failedFuture(ex);
3559 checkCompletedExceptionally(f, ex);
3560 }
3561
3562 /**
3563 * failedFuture(null) throws NPE
3564 */
3565 public void testFailedFuture_null() {
3566 try {
3567 CompletableFuture<Integer> f = CompletableFuture.failedFuture(null);
3568 shouldThrow();
3569 } catch (NullPointerException success) {}
3570 }
3571
3572 /**
3573 * copy returns a CompletableFuture that is completed normally,
3574 * with the same value, when source is.
3575 */
3576 public void testCopy() {
3577 CompletableFuture<Integer> f = new CompletableFuture<>();
3578 CompletableFuture<Integer> g = f.copy();
3579 checkIncomplete(f);
3580 checkIncomplete(g);
3581 f.complete(1);
3582 checkCompletedNormally(f, 1);
3583 checkCompletedNormally(g, 1);
3584 }
3585
3586 /**
3587 * copy returns a CompletableFuture that is completed exceptionally
3588 * when source is.
3589 */
3590 public void testCopy2() {
3591 CompletableFuture<Integer> f = new CompletableFuture<>();
3592 CompletableFuture<Integer> g = f.copy();
3593 checkIncomplete(f);
3594 checkIncomplete(g);
3595 CFException ex = new CFException();
3596 f.completeExceptionally(ex);
3597 checkCompletedExceptionally(f, ex);
3598 checkCompletedWithWrappedException(g, ex);
3599 }
3600
3601 /**
3602 * minimalCompletionStage returns a CompletableFuture that is
3603 * completed normally, with the same value, when source is.
3604 */
3605 public void testMinimalCompletionStage() {
3606 CompletableFuture<Integer> f = new CompletableFuture<>();
3607 CompletionStage<Integer> g = f.minimalCompletionStage();
3608 AtomicInteger x = new AtomicInteger(0);
3609 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3610 checkIncomplete(f);
3611 g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3612 f.complete(1);
3613 checkCompletedNormally(f, 1);
3614 assertEquals(x.get(), 1);
3615 assertNull(r.get());
3616 }
3617
3618 /**
3619 * minimalCompletionStage returns a CompletableFuture that is
3620 * completed exceptionally when source is.
3621 */
3622 public void testMinimalCompletionStage2() {
3623 CompletableFuture<Integer> f = new CompletableFuture<>();
3624 CompletionStage<Integer> g = f.minimalCompletionStage();
3625 AtomicInteger x = new AtomicInteger(0);
3626 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3627 g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3628 checkIncomplete(f);
3629 CFException ex = new CFException();
3630 f.completeExceptionally(ex);
3631 checkCompletedExceptionally(f, ex);
3632 assertEquals(x.get(), 0);
3633 assertEquals(r.get().getCause(), ex);
3634 }
3635
3636 /**
3637 * failedStage returns a CompletionStage completed
3638 * exceptionally with the given Exception
3639 */
3640 public void testFailedStage() {
3641 CFException ex = new CFException();
3642 CompletionStage<Integer> f = CompletableFuture.failedStage(ex);
3643 AtomicInteger x = new AtomicInteger(0);
3644 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3645 f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3646 assertEquals(x.get(), 0);
3647 assertEquals(r.get(), ex);
3648 }
3649
3650 /**
3651 * completeAsync completes with value of given supplier
3652 */
3653 public void testCompleteAsync() {
3654 for (Integer v1 : new Integer[] { 1, null })
3655 {
3656 CompletableFuture<Integer> f = new CompletableFuture<>();
3657 f.completeAsync(() -> v1);
3658 f.join();
3659 checkCompletedNormally(f, v1);
3660 }}
3661
3662 /**
3663 * completeAsync completes exceptionally if given supplier throws
3664 */
3665 public void testCompleteAsync2() {
3666 CompletableFuture<Integer> f = new CompletableFuture<>();
3667 CFException ex = new CFException();
3668 f.completeAsync(() -> {if (true) throw ex; return 1;});
3669 try {
3670 f.join();
3671 shouldThrow();
3672 } catch (CompletionException success) {}
3673 checkCompletedWithWrappedException(f, ex);
3674 }
3675
3676 /**
3677 * completeAsync with given executor completes with value of given supplier
3678 */
3679 public void testCompleteAsync3() {
3680 for (Integer v1 : new Integer[] { 1, null })
3681 {
3682 CompletableFuture<Integer> f = new CompletableFuture<>();
3683 ThreadExecutor executor = new ThreadExecutor();
3684 f.completeAsync(() -> v1, executor);
3685 assertSame(v1, f.join());
3686 checkCompletedNormally(f, v1);
3687 assertEquals(1, executor.count.get());
3688 }}
3689
3690 /**
3691 * completeAsync with given executor completes exceptionally if
3692 * given supplier throws
3693 */
3694 public void testCompleteAsync4() {
3695 CompletableFuture<Integer> f = new CompletableFuture<>();
3696 CFException ex = new CFException();
3697 ThreadExecutor executor = new ThreadExecutor();
3698 f.completeAsync(() -> {if (true) throw ex; return 1;}, executor);
3699 try {
3700 f.join();
3701 shouldThrow();
3702 } catch (CompletionException success) {}
3703 checkCompletedWithWrappedException(f, ex);
3704 assertEquals(1, executor.count.get());
3705 }
3706
3707 /**
3708 * orTimeout completes with TimeoutException if not complete
3709 */
3710 public void testOrTimeout_timesOut() {
3711 long timeoutMillis = timeoutMillis();
3712 CompletableFuture<Integer> f = new CompletableFuture<>();
3713 long startTime = System.nanoTime();
3714 assertSame(f, f.orTimeout(timeoutMillis, MILLISECONDS));
3715 checkCompletedWithTimeoutException(f);
3716 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3717 }
3718
3719 /**
3720 * orTimeout completes normally if completed before timeout
3721 */
3722 public void testOrTimeout_completed() {
3723 for (Integer v1 : new Integer[] { 1, null })
3724 {
3725 CompletableFuture<Integer> f = new CompletableFuture<>();
3726 CompletableFuture<Integer> g = new CompletableFuture<>();
3727 long startTime = System.nanoTime();
3728 f.complete(v1);
3729 assertSame(f, f.orTimeout(LONG_DELAY_MS, MILLISECONDS));
3730 assertSame(g, g.orTimeout(LONG_DELAY_MS, MILLISECONDS));
3731 g.complete(v1);
3732 checkCompletedNormally(f, v1);
3733 checkCompletedNormally(g, v1);
3734 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3735 }}
3736
3737 /**
3738 * completeOnTimeout completes with given value if not complete
3739 */
3740 public void testCompleteOnTimeout_timesOut() {
3741 testInParallel(() -> testCompleteOnTimeout_timesOut(42),
3742 () -> testCompleteOnTimeout_timesOut(null));
3743 }
3744
3745 /**
3746 * completeOnTimeout completes with given value if not complete
3747 */
3748 public void testCompleteOnTimeout_timesOut(Integer v) {
3749 long timeoutMillis = timeoutMillis();
3750 CompletableFuture<Integer> f = new CompletableFuture<>();
3751 long startTime = System.nanoTime();
3752 assertSame(f, f.completeOnTimeout(v, timeoutMillis, MILLISECONDS));
3753 assertSame(v, f.join());
3754 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3755 f.complete(99); // should have no effect
3756 checkCompletedNormally(f, v);
3757 }
3758
3759 /**
3760 * completeOnTimeout has no effect if completed within timeout
3761 */
3762 public void testCompleteOnTimeout_completed() {
3763 for (Integer v1 : new Integer[] { 1, null })
3764 {
3765 CompletableFuture<Integer> f = new CompletableFuture<>();
3766 CompletableFuture<Integer> g = new CompletableFuture<>();
3767 long startTime = System.nanoTime();
3768 f.complete(v1);
3769 assertSame(f, f.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
3770 assertSame(g, g.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
3771 g.complete(v1);
3772 checkCompletedNormally(f, v1);
3773 checkCompletedNormally(g, v1);
3774 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3775 }}
3776
3777 /**
3778 * delayedExecutor returns an executor that delays submission
3779 */
3780 public void testDelayedExecutor() {
3781 testInParallel(() -> testDelayedExecutor(null, null),
3782 () -> testDelayedExecutor(null, 1),
3783 () -> testDelayedExecutor(new ThreadExecutor(), 1),
3784 () -> testDelayedExecutor(new ThreadExecutor(), 1));
3785 }
3786
3787 public void testDelayedExecutor(Executor executor, Integer v) throws Exception {
3788 long timeoutMillis = timeoutMillis();
3789 // Use an "unreasonably long" long timeout to catch lingering threads
3790 long longTimeoutMillis = 1000 * 60 * 60 * 24;
3791 final Executor delayer, longDelayer;
3792 if (executor == null) {
3793 delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS);
3794 longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS);
3795 } else {
3796 delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS, executor);
3797 longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS, executor);
3798 }
3799 long startTime = System.nanoTime();
3800 CompletableFuture<Integer> f =
3801 CompletableFuture.supplyAsync(() -> v, delayer);
3802 CompletableFuture<Integer> g =
3803 CompletableFuture.supplyAsync(() -> v, longDelayer);
3804
3805 assertNull(g.getNow(null));
3806
3807 assertSame(v, f.get(LONG_DELAY_MS, MILLISECONDS));
3808 long millisElapsed = millisElapsedSince(startTime);
3809 assertTrue(millisElapsed >= timeoutMillis);
3810 assertTrue(millisElapsed < LONG_DELAY_MS / 2);
3811
3812 checkCompletedNormally(f, v);
3813
3814 checkIncomplete(g);
3815 assertTrue(g.cancel(true));
3816 }
3817
3818 //--- tests of implementation details; not part of official tck ---
3819
3820 Object resultOf(CompletableFuture<?> f) {
3821 SecurityManager sm = System.getSecurityManager();
3822 if (sm != null) {
3823 try {
3824 System.setSecurityManager(null);
3825 } catch (SecurityException giveUp) {
3826 return "Reflection not available";
3827 }
3828 }
3829
3830 try {
3831 java.lang.reflect.Field resultField
3832 = CompletableFuture.class.getDeclaredField("result");
3833 resultField.setAccessible(true);
3834 return resultField.get(f);
3835 } catch (Throwable t) {
3836 throw new AssertionError(t);
3837 } finally {
3838 if (sm != null) System.setSecurityManager(sm);
3839 }
3840 }
3841
3842 public void testExceptionPropagationReusesResultObject() {
3843 if (!testImplementationDetails) return;
3844 for (ExecutionMode m : ExecutionMode.values())
3845 {
3846 final CFException ex = new CFException();
3847 final CompletableFuture<Integer> v42 = CompletableFuture.completedFuture(42);
3848 final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3849
3850 List<Function<CompletableFuture<Integer>, CompletableFuture<?>>> funs
3851 = new ArrayList<>();
3852
3853 funs.add((y) -> m.thenRun(y, new Noop(m)));
3854 funs.add((y) -> m.thenAccept(y, new NoopConsumer(m)));
3855 funs.add((y) -> m.thenApply(y, new IncFunction(m)));
3856
3857 funs.add((y) -> m.runAfterEither(y, incomplete, new Noop(m)));
3858 funs.add((y) -> m.acceptEither(y, incomplete, new NoopConsumer(m)));
3859 funs.add((y) -> m.applyToEither(y, incomplete, new IncFunction(m)));
3860
3861 funs.add((y) -> m.runAfterBoth(y, v42, new Noop(m)));
3862 funs.add((y) -> m.runAfterBoth(v42, y, new Noop(m)));
3863 funs.add((y) -> m.thenAcceptBoth(y, v42, new SubtractAction(m)));
3864 funs.add((y) -> m.thenAcceptBoth(v42, y, new SubtractAction(m)));
3865 funs.add((y) -> m.thenCombine(y, v42, new SubtractFunction(m)));
3866 funs.add((y) -> m.thenCombine(v42, y, new SubtractFunction(m)));
3867
3868 funs.add((y) -> m.whenComplete(y, (Integer r, Throwable t) -> {}));
3869
3870 funs.add((y) -> m.thenCompose(y, new CompletableFutureInc(m)));
3871
3872 funs.add((y) -> CompletableFuture.allOf(new CompletableFuture<?>[] {y}));
3873 funs.add((y) -> CompletableFuture.allOf(new CompletableFuture<?>[] {y, v42}));
3874 funs.add((y) -> CompletableFuture.allOf(new CompletableFuture<?>[] {v42, y}));
3875 funs.add((y) -> CompletableFuture.anyOf(new CompletableFuture<?>[] {y}));
3876 funs.add((y) -> CompletableFuture.anyOf(new CompletableFuture<?>[] {y, incomplete}));
3877 funs.add((y) -> CompletableFuture.anyOf(new CompletableFuture<?>[] {incomplete, y}));
3878
3879 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3880 fun : funs) {
3881 CompletableFuture<Integer> f = new CompletableFuture<>();
3882 f.completeExceptionally(ex);
3883 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3884 checkCompletedWithWrappedException(src, ex);
3885 CompletableFuture<?> dep = fun.apply(src);
3886 checkCompletedWithWrappedException(dep, ex);
3887 assertSame(resultOf(src), resultOf(dep));
3888 }
3889
3890 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3891 fun : funs) {
3892 CompletableFuture<Integer> f = new CompletableFuture<>();
3893 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3894 CompletableFuture<?> dep = fun.apply(src);
3895 f.completeExceptionally(ex);
3896 checkCompletedWithWrappedException(src, ex);
3897 checkCompletedWithWrappedException(dep, ex);
3898 assertSame(resultOf(src), resultOf(dep));
3899 }
3900
3901 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3902 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3903 fun : funs) {
3904 CompletableFuture<Integer> f = new CompletableFuture<>();
3905 f.cancel(mayInterruptIfRunning);
3906 checkCancelled(f);
3907 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3908 checkCompletedWithWrappedCancellationException(src);
3909 CompletableFuture<?> dep = fun.apply(src);
3910 checkCompletedWithWrappedCancellationException(dep);
3911 assertSame(resultOf(src), resultOf(dep));
3912 }
3913
3914 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3915 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3916 fun : funs) {
3917 CompletableFuture<Integer> f = new CompletableFuture<>();
3918 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3919 CompletableFuture<?> dep = fun.apply(src);
3920 f.cancel(mayInterruptIfRunning);
3921 checkCancelled(f);
3922 checkCompletedWithWrappedCancellationException(src);
3923 checkCompletedWithWrappedCancellationException(dep);
3924 assertSame(resultOf(src), resultOf(dep));
3925 }
3926 }}
3927
3928 /**
3929 * Minimal completion stages throw UOE for all non-CompletionStage methods
3930 */
3931 public void testMinimalCompletionStage_minimality() {
3932 if (!testImplementationDetails) return;
3933 Function<Method, String> toSignature =
3934 (method) -> method.getName() + Arrays.toString(method.getParameterTypes());
3935 Predicate<Method> isNotStatic =
3936 (method) -> (method.getModifiers() & Modifier.STATIC) == 0;
3937 List<Method> minimalMethods =
3938 Stream.of(Object.class, CompletionStage.class)
3939 .flatMap((klazz) -> Stream.of(klazz.getMethods()))
3940 .filter(isNotStatic)
3941 .collect(Collectors.toList());
3942 // Methods from CompletableFuture permitted NOT to throw UOE
3943 String[] signatureWhitelist = {
3944 "newIncompleteFuture[]",
3945 "defaultExecutor[]",
3946 "minimalCompletionStage[]",
3947 "copy[]",
3948 };
3949 Set<String> permittedMethodSignatures =
3950 Stream.concat(minimalMethods.stream().map(toSignature),
3951 Stream.of(signatureWhitelist))
3952 .collect(Collectors.toSet());
3953 List<Method> allMethods = Stream.of(CompletableFuture.class.getMethods())
3954 .filter(isNotStatic)
3955 .filter((method) -> !permittedMethodSignatures.contains(toSignature.apply(method)))
3956 .collect(Collectors.toList());
3957
3958 CompletionStage<Integer> minimalStage =
3959 new CompletableFuture<Integer>().minimalCompletionStage();
3960
3961 List<Method> bugs = new ArrayList<>();
3962 for (Method method : allMethods) {
3963 Class<?>[] parameterTypes = method.getParameterTypes();
3964 Object[] args = new Object[parameterTypes.length];
3965 // Manufacture boxed primitives for primitive params
3966 for (int i = 0; i < args.length; i++) {
3967 Class<?> type = parameterTypes[i];
3968 if (parameterTypes[i] == boolean.class)
3969 args[i] = false;
3970 else if (parameterTypes[i] == int.class)
3971 args[i] = 0;
3972 else if (parameterTypes[i] == long.class)
3973 args[i] = 0L;
3974 }
3975 try {
3976 method.invoke(minimalStage, args);
3977 bugs.add(method);
3978 }
3979 catch (java.lang.reflect.InvocationTargetException expected) {
3980 if (! (expected.getCause() instanceof UnsupportedOperationException)) {
3981 bugs.add(method);
3982 // expected.getCause().printStackTrace();
3983 }
3984 }
3985 catch (ReflectiveOperationException bad) { throw new Error(bad); }
3986 }
3987 if (!bugs.isEmpty())
3988 throw new Error("Methods did not throw UOE: " + bugs.toString());
3989 }
3990
3991 static class Monad {
3992 static class ZeroException extends RuntimeException {
3993 public ZeroException() { super("monadic zero"); }
3994 }
3995 // "return", "unit"
3996 static <T> CompletableFuture<T> unit(T value) {
3997 return completedFuture(value);
3998 }
3999 // monadic zero ?
4000 static <T> CompletableFuture<T> zero() {
4001 return failedFuture(new ZeroException());
4002 }
4003 // >=>
4004 static <T,U,V> Function<T, CompletableFuture<V>> compose
4005 (Function<T, CompletableFuture<U>> f,
4006 Function<U, CompletableFuture<V>> g) {
4007 return (x) -> f.apply(x).thenCompose(g);
4008 }
4009
4010 static void assertZero(CompletableFuture<?> f) {
4011 try {
4012 f.getNow(null);
4013 throw new AssertionFailedError("should throw");
4014 } catch (CompletionException success) {
4015 assertTrue(success.getCause() instanceof ZeroException);
4016 }
4017 }
4018
4019 static <T> void assertFutureEquals(CompletableFuture<T> f,
4020 CompletableFuture<T> g) {
4021 T fval = null, gval = null;
4022 Throwable fex = null, gex = null;
4023
4024 try { fval = f.get(); }
4025 catch (ExecutionException ex) { fex = ex.getCause(); }
4026 catch (Throwable ex) { fex = ex; }
4027
4028 try { gval = g.get(); }
4029 catch (ExecutionException ex) { gex = ex.getCause(); }
4030 catch (Throwable ex) { gex = ex; }
4031
4032 if (fex != null || gex != null)
4033 assertSame(fex.getClass(), gex.getClass());
4034 else
4035 assertEquals(fval, gval);
4036 }
4037
4038 static class PlusFuture<T> extends CompletableFuture<T> {
4039 AtomicReference<Throwable> firstFailure = new AtomicReference<>(null);
4040 }
4041
4042 /** Implements "monadic plus". */
4043 static <T> CompletableFuture<T> plus(CompletableFuture<? extends T> f,
4044 CompletableFuture<? extends T> g) {
4045 PlusFuture<T> plus = new PlusFuture<T>();
4046 BiConsumer<T, Throwable> action = (T result, Throwable ex) -> {
4047 try {
4048 if (ex == null) {
4049 if (plus.complete(result))
4050 if (plus.firstFailure.get() != null)
4051 plus.firstFailure.set(null);
4052 }
4053 else if (plus.firstFailure.compareAndSet(null, ex)) {
4054 if (plus.isDone())
4055 plus.firstFailure.set(null);
4056 }
4057 else {
4058 // first failure has precedence
4059 Throwable first = plus.firstFailure.getAndSet(null);
4060
4061 // may fail with "Self-suppression not permitted"
4062 try { first.addSuppressed(ex); }
4063 catch (Exception ignored) {}
4064
4065 plus.completeExceptionally(first);
4066 }
4067 } catch (Throwable unexpected) {
4068 plus.completeExceptionally(unexpected);
4069 }
4070 };
4071 f.whenComplete(action);
4072 g.whenComplete(action);
4073 return plus;
4074 }
4075 }
4076
4077 /**
4078 * CompletableFuture is an additive monad - sort of.
4079 * https://en.wikipedia.org/wiki/Monad_(functional_programming)#Additive_monads
4080 */
4081 public void testAdditiveMonad() throws Throwable {
4082 Function<Long, CompletableFuture<Long>> unit = Monad::unit;
4083 CompletableFuture<Long> zero = Monad.zero();
4084
4085 // Some mutually non-commutative functions
4086 Function<Long, CompletableFuture<Long>> triple
4087 = (x) -> Monad.unit(3 * x);
4088 Function<Long, CompletableFuture<Long>> inc
4089 = (x) -> Monad.unit(x + 1);
4090
4091 // unit is a right identity: m >>= unit === m
4092 Monad.assertFutureEquals(inc.apply(5L).thenCompose(unit),
4093 inc.apply(5L));
4094 // unit is a left identity: (unit x) >>= f === f x
4095 Monad.assertFutureEquals(unit.apply(5L).thenCompose(inc),
4096 inc.apply(5L));
4097
4098 // associativity: (m >>= f) >>= g === m >>= ( \x -> (f x >>= g) )
4099 Monad.assertFutureEquals(
4100 unit.apply(5L).thenCompose(inc).thenCompose(triple),
4101 unit.apply(5L).thenCompose((x) -> inc.apply(x).thenCompose(triple)));
4102
4103 // The case for CompletableFuture as an additive monad is weaker...
4104
4105 // zero is a monadic zero
4106 Monad.assertZero(zero);
4107
4108 // left zero: zero >>= f === zero
4109 Monad.assertZero(zero.thenCompose(inc));
4110 // right zero: f >>= (\x -> zero) === zero
4111 Monad.assertZero(inc.apply(5L).thenCompose((x) -> zero));
4112
4113 // f plus zero === f
4114 Monad.assertFutureEquals(Monad.unit(5L),
4115 Monad.plus(Monad.unit(5L), zero));
4116 // zero plus f === f
4117 Monad.assertFutureEquals(Monad.unit(5L),
4118 Monad.plus(zero, Monad.unit(5L)));
4119 // zero plus zero === zero
4120 Monad.assertZero(Monad.plus(zero, zero));
4121 {
4122 CompletableFuture<Long> f = Monad.plus(Monad.unit(5L),
4123 Monad.unit(8L));
4124 // non-determinism
4125 assertTrue(f.get() == 5L || f.get() == 8L);
4126 }
4127
4128 CompletableFuture<Long> godot = new CompletableFuture<>();
4129 // f plus godot === f (doesn't wait for godot)
4130 Monad.assertFutureEquals(Monad.unit(5L),
4131 Monad.plus(Monad.unit(5L), godot));
4132 // godot plus f === f (doesn't wait for godot)
4133 Monad.assertFutureEquals(Monad.unit(5L),
4134 Monad.plus(godot, Monad.unit(5L)));
4135 }
4136
4137 /**
4138 * A single CompletableFuture with many dependents.
4139 * A demo of scalability - runtime is O(n).
4140 */
4141 public void testManyDependents() throws Throwable {
4142 final int n = expensiveTests ? 1_000_000 : 10;
4143 final CompletableFuture<Void> head = new CompletableFuture<>();
4144 final CompletableFuture<Void> complete = CompletableFuture.completedFuture((Void)null);
4145 final AtomicInteger count = new AtomicInteger(0);
4146 for (int i = 0; i < n; i++) {
4147 head.thenRun(() -> count.getAndIncrement());
4148 head.thenAccept((x) -> count.getAndIncrement());
4149 head.thenApply((x) -> count.getAndIncrement());
4150
4151 head.runAfterBoth(complete, () -> count.getAndIncrement());
4152 head.thenAcceptBoth(complete, (x, y) -> count.getAndIncrement());
4153 head.thenCombine(complete, (x, y) -> count.getAndIncrement());
4154 complete.runAfterBoth(head, () -> count.getAndIncrement());
4155 complete.thenAcceptBoth(head, (x, y) -> count.getAndIncrement());
4156 complete.thenCombine(head, (x, y) -> count.getAndIncrement());
4157
4158 head.runAfterEither(new CompletableFuture<Void>(), () -> count.getAndIncrement());
4159 head.acceptEither(new CompletableFuture<Void>(), (x) -> count.getAndIncrement());
4160 head.applyToEither(new CompletableFuture<Void>(), (x) -> count.getAndIncrement());
4161 new CompletableFuture<Void>().runAfterEither(head, () -> count.getAndIncrement());
4162 new CompletableFuture<Void>().acceptEither(head, (x) -> count.getAndIncrement());
4163 new CompletableFuture<Void>().applyToEither(head, (x) -> count.getAndIncrement());
4164 }
4165 head.complete(null);
4166 assertEquals(5 * 3 * n, count.get());
4167 }
4168
4169 /** ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest tck */
4170 public void testCoCompletionGarbageRetention() throws Throwable {
4171 final int n = expensiveTests ? 1_000_000 : 10;
4172 final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
4173 CompletableFuture<Integer> f;
4174 for (int i = 0; i < n; i++) {
4175 f = new CompletableFuture<>();
4176 f.runAfterEither(incomplete, () -> {});
4177 f.complete(null);
4178
4179 f = new CompletableFuture<>();
4180 f.acceptEither(incomplete, (x) -> {});
4181 f.complete(null);
4182
4183 f = new CompletableFuture<>();
4184 f.applyToEither(incomplete, (x) -> x);
4185 f.complete(null);
4186
4187 f = new CompletableFuture<>();
4188 CompletableFuture.anyOf(new CompletableFuture<?>[] { f, incomplete });
4189 f.complete(null);
4190 }
4191
4192 for (int i = 0; i < n; i++) {
4193 f = new CompletableFuture<>();
4194 incomplete.runAfterEither(f, () -> {});
4195 f.complete(null);
4196
4197 f = new CompletableFuture<>();
4198 incomplete.acceptEither(f, (x) -> {});
4199 f.complete(null);
4200
4201 f = new CompletableFuture<>();
4202 incomplete.applyToEither(f, (x) -> x);
4203 f.complete(null);
4204
4205 f = new CompletableFuture<>();
4206 CompletableFuture.anyOf(new CompletableFuture<?>[] { incomplete, f });
4207 f.complete(null);
4208 }
4209 }
4210
4211 /*
4212 * Tests below currently fail in stress mode due to memory retention.
4213 * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest tck
4214 */
4215
4216 /** Checks for garbage retention with anyOf. */
4217 public void testAnyOfGarbageRetention() throws Throwable {
4218 for (Integer v : new Integer[] { 1, null })
4219 {
4220 final int n = expensiveTests ? 100_000 : 10;
4221 CompletableFuture<Integer>[] fs
4222 = (CompletableFuture<Integer>[]) new CompletableFuture<?>[100];
4223 for (int i = 0; i < fs.length; i++)
4224 fs[i] = new CompletableFuture<>();
4225 fs[fs.length - 1].complete(v);
4226 for (int i = 0; i < n; i++)
4227 checkCompletedNormally(CompletableFuture.anyOf(fs), v);
4228 }}
4229
4230 /** Checks for garbage retention with allOf. */
4231 public void testCancelledAllOfGarbageRetention() throws Throwable {
4232 final int n = expensiveTests ? 100_000 : 10;
4233 CompletableFuture<Integer>[] fs
4234 = (CompletableFuture<Integer>[]) new CompletableFuture<?>[100];
4235 for (int i = 0; i < fs.length; i++)
4236 fs[i] = new CompletableFuture<>();
4237 for (int i = 0; i < n; i++)
4238 assertTrue(CompletableFuture.allOf(fs).cancel(false));
4239 }
4240
4241 // static <U> U join(CompletionStage<U> stage) {
4242 // CompletableFuture<U> f = new CompletableFuture<>();
4243 // stage.whenComplete((v, ex) -> {
4244 // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
4245 // });
4246 // return f.join();
4247 // }
4248
4249 // static <U> boolean isDone(CompletionStage<U> stage) {
4250 // CompletableFuture<U> f = new CompletableFuture<>();
4251 // stage.whenComplete((v, ex) -> {
4252 // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
4253 // });
4254 // return f.isDone();
4255 // }
4256
4257 // static <U> U join2(CompletionStage<U> stage) {
4258 // return stage.toCompletableFuture().copy().join();
4259 // }
4260
4261 // static <U> boolean isDone2(CompletionStage<U> stage) {
4262 // return stage.toCompletableFuture().copy().isDone();
4263 // }
4264
4265 }