ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.74
Committed: Fri Jun 6 21:19:22 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.73: +8 -0 lines
Log Message:
improve tests for toString

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 junit.framework.*;
9 import java.util.concurrent.Callable;
10 import java.util.concurrent.Executor;
11 import java.util.concurrent.ExecutorService;
12 import java.util.concurrent.Executors;
13 import java.util.concurrent.CancellationException;
14 import java.util.concurrent.CountDownLatch;
15 import java.util.concurrent.ExecutionException;
16 import java.util.concurrent.Future;
17 import java.util.concurrent.CompletableFuture;
18 import java.util.concurrent.CompletionException;
19 import java.util.concurrent.CompletionStage;
20 import java.util.concurrent.ForkJoinPool;
21 import java.util.concurrent.ForkJoinTask;
22 import java.util.concurrent.TimeoutException;
23 import java.util.concurrent.atomic.AtomicInteger;
24 import static java.util.concurrent.TimeUnit.MILLISECONDS;
25 import static java.util.concurrent.TimeUnit.SECONDS;
26 import java.util.*;
27 import java.util.function.Supplier;
28 import java.util.function.Consumer;
29 import java.util.function.BiConsumer;
30 import java.util.function.Function;
31 import java.util.function.BiFunction;
32
33 public class CompletableFutureTest extends JSR166TestCase {
34
35 public static void main(String[] args) {
36 junit.textui.TestRunner.run(suite());
37 }
38 public static Test suite() {
39 return new TestSuite(CompletableFutureTest.class);
40 }
41
42 static class CFException extends RuntimeException {}
43
44 void checkIncomplete(CompletableFuture<?> f) {
45 assertFalse(f.isDone());
46 assertFalse(f.isCancelled());
47 assertTrue(f.toString().contains("[Not completed]"));
48 try {
49 assertNull(f.getNow(null));
50 } catch (Throwable fail) { threadUnexpectedException(fail); }
51 try {
52 f.get(0L, SECONDS);
53 shouldThrow();
54 }
55 catch (TimeoutException success) {}
56 catch (Throwable fail) { threadUnexpectedException(fail); }
57 }
58
59 <T> void checkCompletedNormally(CompletableFuture<T> f, T value) {
60 try {
61 assertEquals(value, f.get(LONG_DELAY_MS, MILLISECONDS));
62 } catch (Throwable fail) { threadUnexpectedException(fail); }
63 try {
64 assertEquals(value, f.join());
65 } catch (Throwable fail) { threadUnexpectedException(fail); }
66 try {
67 assertEquals(value, f.getNow(null));
68 } catch (Throwable fail) { threadUnexpectedException(fail); }
69 try {
70 assertEquals(value, f.get());
71 } catch (Throwable fail) { threadUnexpectedException(fail); }
72 assertTrue(f.isDone());
73 assertFalse(f.isCancelled());
74 assertFalse(f.isCompletedExceptionally());
75 assertTrue(f.toString().contains("[Completed normally]"));
76 }
77
78 void checkCompletedWithWrappedCFException(CompletableFuture<?> f) {
79 try {
80 f.get(LONG_DELAY_MS, MILLISECONDS);
81 shouldThrow();
82 } catch (ExecutionException success) {
83 assertTrue(success.getCause() instanceof CFException);
84 } catch (Throwable fail) { threadUnexpectedException(fail); }
85 try {
86 f.join();
87 shouldThrow();
88 } catch (CompletionException success) {
89 assertTrue(success.getCause() instanceof CFException);
90 }
91 try {
92 f.getNow(null);
93 shouldThrow();
94 } catch (CompletionException success) {
95 assertTrue(success.getCause() instanceof CFException);
96 }
97 try {
98 f.get();
99 shouldThrow();
100 } catch (ExecutionException success) {
101 assertTrue(success.getCause() instanceof CFException);
102 } catch (Throwable fail) { threadUnexpectedException(fail); }
103 assertTrue(f.isDone());
104 assertFalse(f.isCancelled());
105 assertTrue(f.toString().contains("[Completed exceptionally]"));
106 }
107
108 <U> void checkCompletedExceptionallyWithRootCause(CompletableFuture<U> f,
109 Throwable ex) {
110 try {
111 f.get(LONG_DELAY_MS, MILLISECONDS);
112 shouldThrow();
113 } catch (ExecutionException success) {
114 assertSame(ex, success.getCause());
115 } catch (Throwable fail) { threadUnexpectedException(fail); }
116 try {
117 f.join();
118 shouldThrow();
119 } catch (CompletionException success) {
120 assertSame(ex, success.getCause());
121 }
122 try {
123 f.getNow(null);
124 shouldThrow();
125 } catch (CompletionException success) {
126 assertSame(ex, success.getCause());
127 }
128 try {
129 f.get();
130 shouldThrow();
131 } catch (ExecutionException success) {
132 assertSame(ex, success.getCause());
133 } catch (Throwable fail) { threadUnexpectedException(fail); }
134
135 assertTrue(f.isDone());
136 assertFalse(f.isCancelled());
137 assertTrue(f.toString().contains("[Completed exceptionally]"));
138 }
139
140 <U> void checkCompletedWithWrappedException(CompletableFuture<U> f,
141 Throwable ex) {
142 checkCompletedExceptionallyWithRootCause(f, ex);
143 try {
144 CompletableFuture<Throwable> spy = f.handle
145 ((U u, Throwable t) -> t);
146 assertTrue(spy.join() instanceof CompletionException);
147 assertSame(ex, spy.join().getCause());
148 } catch (Throwable fail) { threadUnexpectedException(fail); }
149 }
150
151 <U> void checkCompletedExceptionally(CompletableFuture<U> f, Throwable ex) {
152 checkCompletedExceptionallyWithRootCause(f, ex);
153 try {
154 CompletableFuture<Throwable> spy = f.handle
155 ((U u, Throwable t) -> t);
156 assertSame(ex, spy.join());
157 } catch (Throwable fail) { threadUnexpectedException(fail); }
158 }
159
160 void checkCancelled(CompletableFuture<?> f) {
161 try {
162 f.get(LONG_DELAY_MS, MILLISECONDS);
163 shouldThrow();
164 } catch (CancellationException success) {
165 } catch (Throwable fail) { threadUnexpectedException(fail); }
166 try {
167 f.join();
168 shouldThrow();
169 } catch (CancellationException success) {}
170 try {
171 f.getNow(null);
172 shouldThrow();
173 } catch (CancellationException success) {}
174 try {
175 f.get();
176 shouldThrow();
177 } catch (CancellationException success) {
178 } catch (Throwable fail) { threadUnexpectedException(fail); }
179 assertTrue(f.isDone());
180 assertTrue(f.isCompletedExceptionally());
181 assertTrue(f.isCancelled());
182 assertTrue(f.toString().contains("[Completed exceptionally]"));
183 }
184
185 void checkCompletedWithWrappedCancellationException(CompletableFuture<?> f) {
186 try {
187 f.get(LONG_DELAY_MS, MILLISECONDS);
188 shouldThrow();
189 } catch (ExecutionException success) {
190 assertTrue(success.getCause() instanceof CancellationException);
191 } catch (Throwable fail) { threadUnexpectedException(fail); }
192 try {
193 f.join();
194 shouldThrow();
195 } catch (CompletionException success) {
196 assertTrue(success.getCause() instanceof CancellationException);
197 }
198 try {
199 f.getNow(null);
200 shouldThrow();
201 } catch (CompletionException success) {
202 assertTrue(success.getCause() instanceof CancellationException);
203 }
204 try {
205 f.get();
206 shouldThrow();
207 } catch (ExecutionException success) {
208 assertTrue(success.getCause() instanceof CancellationException);
209 } catch (Throwable fail) { threadUnexpectedException(fail); }
210 assertTrue(f.isDone());
211 assertFalse(f.isCancelled());
212 assertTrue(f.isCompletedExceptionally());
213 assertTrue(f.toString().contains("[Completed exceptionally]"));
214 }
215
216 /**
217 * A newly constructed CompletableFuture is incomplete, as indicated
218 * by methods isDone, isCancelled, and getNow
219 */
220 public void testConstructor() {
221 CompletableFuture<Integer> f = new CompletableFuture<>();
222 checkIncomplete(f);
223 }
224
225 /**
226 * complete completes normally, as indicated by methods isDone,
227 * isCancelled, join, get, and getNow
228 */
229 public void testComplete() {
230 CompletableFuture<Integer> f = new CompletableFuture<>();
231 checkIncomplete(f);
232 f.complete(one);
233 checkCompletedNormally(f, one);
234 }
235
236 /**
237 * completeExceptionally completes exceptionally, as indicated by
238 * methods isDone, isCancelled, join, get, and getNow
239 */
240 public void testCompleteExceptionally() {
241 CompletableFuture<Integer> f = new CompletableFuture<>();
242 CFException ex = new CFException();
243 checkIncomplete(f);
244 f.completeExceptionally(ex);
245 checkCompletedExceptionally(f, ex);
246 }
247
248 /**
249 * cancel completes exceptionally and reports cancelled, as indicated by
250 * methods isDone, isCancelled, join, get, and getNow
251 */
252 public void testCancel() {
253 CompletableFuture<Integer> f = new CompletableFuture<>();
254 checkIncomplete(f);
255 assertTrue(f.cancel(true));
256 checkCancelled(f);
257 }
258
259 /**
260 * obtrudeValue forces completion with given value
261 */
262 public void testObtrudeValue() {
263 CompletableFuture<Integer> f = new CompletableFuture<>();
264 checkIncomplete(f);
265 f.complete(one);
266 checkCompletedNormally(f, one);
267 f.obtrudeValue(three);
268 checkCompletedNormally(f, three);
269 f.obtrudeValue(two);
270 checkCompletedNormally(f, two);
271 f = new CompletableFuture<>();
272 f.obtrudeValue(three);
273 checkCompletedNormally(f, three);
274 f.obtrudeValue(null);
275 checkCompletedNormally(f, null);
276 f = new CompletableFuture<>();
277 f.completeExceptionally(new CFException());
278 f.obtrudeValue(four);
279 checkCompletedNormally(f, four);
280 }
281
282 /**
283 * obtrudeException forces completion with given exception
284 */
285 public void testObtrudeException() {
286 for (Integer v1 : new Integer[] { 1, null })
287 {
288 CFException ex;
289 CompletableFuture<Integer> f;
290
291 f = new CompletableFuture<>();
292 f.complete(v1);
293 for (int i = 0; i < 2; i++) {
294 f.obtrudeException(ex = new CFException());
295 checkCompletedExceptionally(f, ex);
296 }
297
298 f = new CompletableFuture<>();
299 for (int i = 0; i < 2; i++) {
300 f.obtrudeException(ex = new CFException());
301 checkCompletedExceptionally(f, ex);
302 }
303
304 f = new CompletableFuture<>();
305 f.completeExceptionally(ex = new CFException());
306 f.obtrudeValue(v1);
307 checkCompletedNormally(f, v1);
308 f.obtrudeException(ex = new CFException());
309 checkCompletedExceptionally(f, ex);
310 f.completeExceptionally(new CFException());
311 checkCompletedExceptionally(f, ex);
312 f.complete(v1);
313 checkCompletedExceptionally(f, ex);
314 }}
315
316 /**
317 * getNumberOfDependents returns number of dependent tasks
318 */
319 public void testGetNumberOfDependents() {
320 CompletableFuture<Integer> f = new CompletableFuture<>();
321 assertEquals(0, f.getNumberOfDependents());
322 CompletableFuture g = f.thenRun(new Noop(ExecutionMode.DEFAULT));
323 assertEquals(1, f.getNumberOfDependents());
324 assertEquals(0, g.getNumberOfDependents());
325 CompletableFuture h = f.thenRun(new Noop(ExecutionMode.DEFAULT));
326 assertEquals(2, f.getNumberOfDependents());
327 f.complete(1);
328 checkCompletedNormally(g, null);
329 assertEquals(0, f.getNumberOfDependents());
330 assertEquals(0, g.getNumberOfDependents());
331 }
332
333 /**
334 * toString indicates current completion state
335 */
336 public void testToString() {
337 CompletableFuture<String> f;
338
339 f = new CompletableFuture<String>();
340 assertTrue(f.toString().contains("[Not completed]"));
341
342 f.complete("foo");
343 assertTrue(f.toString().contains("[Completed normally]"));
344
345 f = new CompletableFuture<String>();
346 f.completeExceptionally(new IndexOutOfBoundsException());
347 assertTrue(f.toString().contains("[Completed exceptionally]"));
348
349 f = new CompletableFuture<String>();
350 f.cancel(true);
351 assertTrue(f.toString().contains("[Completed exceptionally]"));
352
353 f = new CompletableFuture<String>();
354 f.cancel(false);
355 assertTrue(f.toString().contains("[Completed exceptionally]"));
356 }
357
358 /**
359 * completedFuture returns a completed CompletableFuture with given value
360 */
361 public void testCompletedFuture() {
362 CompletableFuture<String> f = CompletableFuture.completedFuture("test");
363 checkCompletedNormally(f, "test");
364 }
365
366 abstract class CheckedAction {
367 int invocationCount = 0;
368 final ExecutionMode m;
369 CheckedAction(ExecutionMode m) { this.m = m; }
370 void invoked() {
371 m.checkExecutionMode();
372 assertEquals(0, invocationCount++);
373 }
374 void assertNotInvoked() { assertEquals(0, invocationCount); }
375 void assertInvoked() { assertEquals(1, invocationCount); }
376 }
377
378 abstract class CheckedIntegerAction extends CheckedAction {
379 Integer value;
380 CheckedIntegerAction(ExecutionMode m) { super(m); }
381 void assertValue(Integer expected) {
382 assertInvoked();
383 assertEquals(expected, value);
384 }
385 }
386
387 class IntegerSupplier extends CheckedAction
388 implements Supplier<Integer>
389 {
390 final Integer value;
391 IntegerSupplier(ExecutionMode m, Integer value) {
392 super(m);
393 this.value = value;
394 }
395 public Integer get() {
396 invoked();
397 return value;
398 }
399 }
400
401 // A function that handles and produces null values as well.
402 static Integer inc(Integer x) {
403 return (x == null) ? null : x + 1;
404 }
405
406 class NoopConsumer extends CheckedIntegerAction
407 implements Consumer<Integer>
408 {
409 NoopConsumer(ExecutionMode m) { super(m); }
410 public void accept(Integer x) {
411 invoked();
412 value = x;
413 }
414 }
415
416 class IncFunction extends CheckedIntegerAction
417 implements Function<Integer,Integer>
418 {
419 IncFunction(ExecutionMode m) { super(m); }
420 public Integer apply(Integer x) {
421 invoked();
422 return value = inc(x);
423 }
424 }
425
426 // Choose non-commutative actions for better coverage
427 // A non-commutative function that handles and produces null values as well.
428 static Integer subtract(Integer x, Integer y) {
429 return (x == null && y == null) ? null :
430 ((x == null) ? 42 : x.intValue())
431 - ((y == null) ? 99 : y.intValue());
432 }
433
434 class SubtractAction extends CheckedIntegerAction
435 implements BiConsumer<Integer, Integer>
436 {
437 SubtractAction(ExecutionMode m) { super(m); }
438 public void accept(Integer x, Integer y) {
439 invoked();
440 value = subtract(x, y);
441 }
442 }
443
444 class SubtractFunction extends CheckedIntegerAction
445 implements BiFunction<Integer, Integer, Integer>
446 {
447 SubtractFunction(ExecutionMode m) { super(m); }
448 public Integer apply(Integer x, Integer y) {
449 invoked();
450 return value = subtract(x, y);
451 }
452 }
453
454 class Noop extends CheckedAction implements Runnable {
455 Noop(ExecutionMode m) { super(m); }
456 public void run() {
457 invoked();
458 }
459 }
460
461 class FailingSupplier extends CheckedAction
462 implements Supplier<Integer>
463 {
464 FailingSupplier(ExecutionMode m) { super(m); }
465 public Integer get() {
466 invoked();
467 throw new CFException();
468 }
469 }
470
471 class FailingConsumer extends CheckedIntegerAction
472 implements Consumer<Integer>
473 {
474 FailingConsumer(ExecutionMode m) { super(m); }
475 public void accept(Integer x) {
476 invoked();
477 value = x;
478 throw new CFException();
479 }
480 }
481
482 class FailingBiConsumer extends CheckedIntegerAction
483 implements BiConsumer<Integer, Integer>
484 {
485 FailingBiConsumer(ExecutionMode m) { super(m); }
486 public void accept(Integer x, Integer y) {
487 invoked();
488 value = subtract(x, y);
489 throw new CFException();
490 }
491 }
492
493 class FailingFunction extends CheckedIntegerAction
494 implements Function<Integer, Integer>
495 {
496 FailingFunction(ExecutionMode m) { super(m); }
497 public Integer apply(Integer x) {
498 invoked();
499 value = x;
500 throw new CFException();
501 }
502 }
503
504 class FailingBiFunction extends CheckedIntegerAction
505 implements BiFunction<Integer, Integer, Integer>
506 {
507 FailingBiFunction(ExecutionMode m) { super(m); }
508 public Integer apply(Integer x, Integer y) {
509 invoked();
510 value = subtract(x, y);
511 throw new CFException();
512 }
513 }
514
515 class FailingRunnable extends CheckedAction implements Runnable {
516 FailingRunnable(ExecutionMode m) { super(m); }
517 public void run() {
518 invoked();
519 throw new CFException();
520 }
521 }
522
523
524 class CompletableFutureInc extends CheckedIntegerAction
525 implements Function<Integer, CompletableFuture<Integer>>
526 {
527 CompletableFutureInc(ExecutionMode m) { super(m); }
528 public CompletableFuture<Integer> apply(Integer x) {
529 invoked();
530 value = x;
531 CompletableFuture<Integer> f = new CompletableFuture<>();
532 f.complete(inc(x));
533 return f;
534 }
535 }
536
537 class FailingCompletableFutureFunction extends CheckedIntegerAction
538 implements Function<Integer, CompletableFuture<Integer>>
539 {
540 FailingCompletableFutureFunction(ExecutionMode m) { super(m); }
541 public CompletableFuture<Integer> apply(Integer x) {
542 invoked();
543 value = x;
544 throw new CFException();
545 }
546 }
547
548 // Used for explicit executor tests
549 static final class ThreadExecutor implements Executor {
550 final AtomicInteger count = new AtomicInteger(0);
551 static final ThreadGroup tg = new ThreadGroup("ThreadExecutor");
552 static boolean startedCurrentThread() {
553 return Thread.currentThread().getThreadGroup() == tg;
554 }
555
556 public void execute(Runnable r) {
557 count.getAndIncrement();
558 new Thread(tg, r).start();
559 }
560 }
561
562 /**
563 * Permits the testing of parallel code for the 3 different
564 * execution modes without copy/pasting all the test methods.
565 */
566 enum ExecutionMode {
567 DEFAULT {
568 public void checkExecutionMode() {
569 assertFalse(ThreadExecutor.startedCurrentThread());
570 assertNull(ForkJoinTask.getPool());
571 }
572 public CompletableFuture<Void> runAsync(Runnable a) {
573 throw new UnsupportedOperationException();
574 }
575 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
576 throw new UnsupportedOperationException();
577 }
578 public <T> CompletableFuture<Void> thenRun
579 (CompletableFuture<T> f, Runnable a) {
580 return f.thenRun(a);
581 }
582 public <T> CompletableFuture<Void> thenAccept
583 (CompletableFuture<T> f, Consumer<? super T> a) {
584 return f.thenAccept(a);
585 }
586 public <T,U> CompletableFuture<U> thenApply
587 (CompletableFuture<T> f, Function<? super T,U> a) {
588 return f.thenApply(a);
589 }
590 public <T,U> CompletableFuture<U> thenCompose
591 (CompletableFuture<T> f,
592 Function<? super T,? extends CompletionStage<U>> a) {
593 return f.thenCompose(a);
594 }
595 public <T,U> CompletableFuture<U> handle
596 (CompletableFuture<T> f,
597 BiFunction<? super T,Throwable,? extends U> a) {
598 return f.handle(a);
599 }
600 public <T> CompletableFuture<T> whenComplete
601 (CompletableFuture<T> f,
602 BiConsumer<? super T,? super Throwable> a) {
603 return f.whenComplete(a);
604 }
605 public <T,U> CompletableFuture<Void> runAfterBoth
606 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
607 return f.runAfterBoth(g, a);
608 }
609 public <T,U> CompletableFuture<Void> thenAcceptBoth
610 (CompletableFuture<T> f,
611 CompletionStage<? extends U> g,
612 BiConsumer<? super T,? super U> a) {
613 return f.thenAcceptBoth(g, a);
614 }
615 public <T,U,V> CompletableFuture<V> thenCombine
616 (CompletableFuture<T> f,
617 CompletionStage<? extends U> g,
618 BiFunction<? super T,? super U,? extends V> a) {
619 return f.thenCombine(g, a);
620 }
621 public <T> CompletableFuture<Void> runAfterEither
622 (CompletableFuture<T> f,
623 CompletionStage<?> g,
624 java.lang.Runnable a) {
625 return f.runAfterEither(g, a);
626 }
627 public <T> CompletableFuture<Void> acceptEither
628 (CompletableFuture<T> f,
629 CompletionStage<? extends T> g,
630 Consumer<? super T> a) {
631 return f.acceptEither(g, a);
632 }
633 public <T,U> CompletableFuture<U> applyToEither
634 (CompletableFuture<T> f,
635 CompletionStage<? extends T> g,
636 Function<? super T,U> a) {
637 return f.applyToEither(g, a);
638 }
639 },
640
641 ASYNC {
642 public void checkExecutionMode() {
643 assertSame(ForkJoinPool.commonPool(),
644 ForkJoinTask.getPool());
645 }
646 public CompletableFuture<Void> runAsync(Runnable a) {
647 return CompletableFuture.runAsync(a);
648 }
649 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
650 return CompletableFuture.supplyAsync(a);
651 }
652 public <T> CompletableFuture<Void> thenRun
653 (CompletableFuture<T> f, Runnable a) {
654 return f.thenRunAsync(a);
655 }
656 public <T> CompletableFuture<Void> thenAccept
657 (CompletableFuture<T> f, Consumer<? super T> a) {
658 return f.thenAcceptAsync(a);
659 }
660 public <T,U> CompletableFuture<U> thenApply
661 (CompletableFuture<T> f, Function<? super T,U> a) {
662 return f.thenApplyAsync(a);
663 }
664 public <T,U> CompletableFuture<U> thenCompose
665 (CompletableFuture<T> f,
666 Function<? super T,? extends CompletionStage<U>> a) {
667 return f.thenComposeAsync(a);
668 }
669 public <T,U> CompletableFuture<U> handle
670 (CompletableFuture<T> f,
671 BiFunction<? super T,Throwable,? extends U> a) {
672 return f.handleAsync(a);
673 }
674 public <T> CompletableFuture<T> whenComplete
675 (CompletableFuture<T> f,
676 BiConsumer<? super T,? super Throwable> a) {
677 return f.whenCompleteAsync(a);
678 }
679 public <T,U> CompletableFuture<Void> runAfterBoth
680 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
681 return f.runAfterBothAsync(g, a);
682 }
683 public <T,U> CompletableFuture<Void> thenAcceptBoth
684 (CompletableFuture<T> f,
685 CompletionStage<? extends U> g,
686 BiConsumer<? super T,? super U> a) {
687 return f.thenAcceptBothAsync(g, a);
688 }
689 public <T,U,V> CompletableFuture<V> thenCombine
690 (CompletableFuture<T> f,
691 CompletionStage<? extends U> g,
692 BiFunction<? super T,? super U,? extends V> a) {
693 return f.thenCombineAsync(g, a);
694 }
695 public <T> CompletableFuture<Void> runAfterEither
696 (CompletableFuture<T> f,
697 CompletionStage<?> g,
698 java.lang.Runnable a) {
699 return f.runAfterEitherAsync(g, a);
700 }
701 public <T> CompletableFuture<Void> acceptEither
702 (CompletableFuture<T> f,
703 CompletionStage<? extends T> g,
704 Consumer<? super T> a) {
705 return f.acceptEitherAsync(g, a);
706 }
707 public <T,U> CompletableFuture<U> applyToEither
708 (CompletableFuture<T> f,
709 CompletionStage<? extends T> g,
710 Function<? super T,U> a) {
711 return f.applyToEitherAsync(g, a);
712 }
713 },
714
715 EXECUTOR {
716 public void checkExecutionMode() {
717 assertTrue(ThreadExecutor.startedCurrentThread());
718 }
719 public CompletableFuture<Void> runAsync(Runnable a) {
720 return CompletableFuture.runAsync(a, new ThreadExecutor());
721 }
722 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
723 return CompletableFuture.supplyAsync(a, new ThreadExecutor());
724 }
725 public <T> CompletableFuture<Void> thenRun
726 (CompletableFuture<T> f, Runnable a) {
727 return f.thenRunAsync(a, new ThreadExecutor());
728 }
729 public <T> CompletableFuture<Void> thenAccept
730 (CompletableFuture<T> f, Consumer<? super T> a) {
731 return f.thenAcceptAsync(a, new ThreadExecutor());
732 }
733 public <T,U> CompletableFuture<U> thenApply
734 (CompletableFuture<T> f, Function<? super T,U> a) {
735 return f.thenApplyAsync(a, new ThreadExecutor());
736 }
737 public <T,U> CompletableFuture<U> thenCompose
738 (CompletableFuture<T> f,
739 Function<? super T,? extends CompletionStage<U>> a) {
740 return f.thenComposeAsync(a, new ThreadExecutor());
741 }
742 public <T,U> CompletableFuture<U> handle
743 (CompletableFuture<T> f,
744 BiFunction<? super T,Throwable,? extends U> a) {
745 return f.handleAsync(a, new ThreadExecutor());
746 }
747 public <T> CompletableFuture<T> whenComplete
748 (CompletableFuture<T> f,
749 BiConsumer<? super T,? super Throwable> a) {
750 return f.whenCompleteAsync(a, new ThreadExecutor());
751 }
752 public <T,U> CompletableFuture<Void> runAfterBoth
753 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
754 return f.runAfterBothAsync(g, a, new ThreadExecutor());
755 }
756 public <T,U> CompletableFuture<Void> thenAcceptBoth
757 (CompletableFuture<T> f,
758 CompletionStage<? extends U> g,
759 BiConsumer<? super T,? super U> a) {
760 return f.thenAcceptBothAsync(g, a, new ThreadExecutor());
761 }
762 public <T,U,V> CompletableFuture<V> thenCombine
763 (CompletableFuture<T> f,
764 CompletionStage<? extends U> g,
765 BiFunction<? super T,? super U,? extends V> a) {
766 return f.thenCombineAsync(g, a, new ThreadExecutor());
767 }
768 public <T> CompletableFuture<Void> runAfterEither
769 (CompletableFuture<T> f,
770 CompletionStage<?> g,
771 java.lang.Runnable a) {
772 return f.runAfterEitherAsync(g, a, new ThreadExecutor());
773 }
774 public <T> CompletableFuture<Void> acceptEither
775 (CompletableFuture<T> f,
776 CompletionStage<? extends T> g,
777 Consumer<? super T> a) {
778 return f.acceptEitherAsync(g, a, new ThreadExecutor());
779 }
780 public <T,U> CompletableFuture<U> applyToEither
781 (CompletableFuture<T> f,
782 CompletionStage<? extends T> g,
783 Function<? super T,U> a) {
784 return f.applyToEitherAsync(g, a, new ThreadExecutor());
785 }
786 };
787
788 public abstract void checkExecutionMode();
789 public abstract CompletableFuture<Void> runAsync(Runnable a);
790 public abstract <U> CompletableFuture<U> supplyAsync(Supplier<U> a);
791 public abstract <T> CompletableFuture<Void> thenRun
792 (CompletableFuture<T> f, Runnable a);
793 public abstract <T> CompletableFuture<Void> thenAccept
794 (CompletableFuture<T> f, Consumer<? super T> a);
795 public abstract <T,U> CompletableFuture<U> thenApply
796 (CompletableFuture<T> f, Function<? super T,U> a);
797 public abstract <T,U> CompletableFuture<U> thenCompose
798 (CompletableFuture<T> f,
799 Function<? super T,? extends CompletionStage<U>> a);
800 public abstract <T,U> CompletableFuture<U> handle
801 (CompletableFuture<T> f,
802 BiFunction<? super T,Throwable,? extends U> a);
803 public abstract <T> CompletableFuture<T> whenComplete
804 (CompletableFuture<T> f,
805 BiConsumer<? super T,? super Throwable> a);
806 public abstract <T,U> CompletableFuture<Void> runAfterBoth
807 (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a);
808 public abstract <T,U> CompletableFuture<Void> thenAcceptBoth
809 (CompletableFuture<T> f,
810 CompletionStage<? extends U> g,
811 BiConsumer<? super T,? super U> a);
812 public abstract <T,U,V> CompletableFuture<V> thenCombine
813 (CompletableFuture<T> f,
814 CompletionStage<? extends U> g,
815 BiFunction<? super T,? super U,? extends V> a);
816 public abstract <T> CompletableFuture<Void> runAfterEither
817 (CompletableFuture<T> f,
818 CompletionStage<?> g,
819 java.lang.Runnable a);
820 public abstract <T> CompletableFuture<Void> acceptEither
821 (CompletableFuture<T> f,
822 CompletionStage<? extends T> g,
823 Consumer<? super T> a);
824 public abstract <T,U> CompletableFuture<U> applyToEither
825 (CompletableFuture<T> f,
826 CompletionStage<? extends T> g,
827 Function<? super T,U> a);
828 }
829
830 /**
831 * exceptionally action is not invoked when source completes
832 * normally, and source result is propagated
833 */
834 public void testExceptionally_normalCompletion() {
835 for (boolean createIncomplete : new boolean[] { true, false })
836 for (Integer v1 : new Integer[] { 1, null })
837 {
838 final AtomicInteger a = new AtomicInteger(0);
839 final CompletableFuture<Integer> f = new CompletableFuture<>();
840 if (!createIncomplete) f.complete(v1);
841 final CompletableFuture<Integer> g = f.exceptionally
842 ((Throwable t) -> {
843 // Should not be called
844 a.getAndIncrement();
845 throw new AssertionError();
846 });
847 if (createIncomplete) f.complete(v1);
848
849 checkCompletedNormally(g, v1);
850 checkCompletedNormally(f, v1);
851 assertEquals(0, a.get());
852 }}
853
854
855 /**
856 * exceptionally action completes with function value on source
857 * exception
858 */
859 public void testExceptionally_exceptionalCompletion() {
860 for (boolean createIncomplete : new boolean[] { true, false })
861 for (Integer v1 : new Integer[] { 1, null })
862 {
863 final AtomicInteger a = new AtomicInteger(0);
864 final CFException ex = new CFException();
865 final CompletableFuture<Integer> f = new CompletableFuture<>();
866 if (!createIncomplete) f.completeExceptionally(ex);
867 final CompletableFuture<Integer> g = f.exceptionally
868 ((Throwable t) -> {
869 ExecutionMode.DEFAULT.checkExecutionMode();
870 threadAssertSame(t, ex);
871 a.getAndIncrement();
872 return v1;
873 });
874 if (createIncomplete) f.completeExceptionally(ex);
875
876 checkCompletedNormally(g, v1);
877 assertEquals(1, a.get());
878 }}
879
880 public void testExceptionally_exceptionalCompletionActionFailed() {
881 for (boolean createIncomplete : new boolean[] { true, false })
882 for (Integer v1 : new Integer[] { 1, null })
883 {
884 final AtomicInteger a = new AtomicInteger(0);
885 final CFException ex1 = new CFException();
886 final CFException ex2 = new CFException();
887 final CompletableFuture<Integer> f = new CompletableFuture<>();
888 if (!createIncomplete) f.completeExceptionally(ex1);
889 final CompletableFuture<Integer> g = f.exceptionally
890 ((Throwable t) -> {
891 ExecutionMode.DEFAULT.checkExecutionMode();
892 threadAssertSame(t, ex1);
893 a.getAndIncrement();
894 throw ex2;
895 });
896 if (createIncomplete) f.completeExceptionally(ex1);
897
898 checkCompletedWithWrappedException(g, ex2);
899 assertEquals(1, a.get());
900 }}
901
902 /**
903 * handle action completes normally with function value on normal
904 * completion of source
905 */
906 public void testHandle_normalCompletion() {
907 for (ExecutionMode m : ExecutionMode.values())
908 for (boolean createIncomplete : new boolean[] { true, false })
909 for (Integer v1 : new Integer[] { 1, null })
910 {
911 final CompletableFuture<Integer> f = new CompletableFuture<>();
912 final AtomicInteger a = new AtomicInteger(0);
913 if (!createIncomplete) f.complete(v1);
914 final CompletableFuture<Integer> g = m.handle
915 (f,
916 (Integer x, Throwable t) -> {
917 m.checkExecutionMode();
918 threadAssertSame(x, v1);
919 threadAssertNull(t);
920 a.getAndIncrement();
921 return inc(v1);
922 });
923 if (createIncomplete) f.complete(v1);
924
925 checkCompletedNormally(g, inc(v1));
926 checkCompletedNormally(f, v1);
927 assertEquals(1, a.get());
928 }}
929
930 /**
931 * handle action completes normally with function value on
932 * exceptional completion of source
933 */
934 public void testHandle_exceptionalCompletion() {
935 for (ExecutionMode m : ExecutionMode.values())
936 for (boolean createIncomplete : new boolean[] { true, false })
937 for (Integer v1 : new Integer[] { 1, null })
938 {
939 final CompletableFuture<Integer> f = new CompletableFuture<>();
940 final AtomicInteger a = new AtomicInteger(0);
941 final CFException ex = new CFException();
942 if (!createIncomplete) f.completeExceptionally(ex);
943 final CompletableFuture<Integer> g = m.handle
944 (f,
945 (Integer x, Throwable t) -> {
946 m.checkExecutionMode();
947 threadAssertNull(x);
948 threadAssertSame(t, ex);
949 a.getAndIncrement();
950 return v1;
951 });
952 if (createIncomplete) f.completeExceptionally(ex);
953
954 checkCompletedNormally(g, v1);
955 checkCompletedExceptionally(f, ex);
956 assertEquals(1, a.get());
957 }}
958
959 /**
960 * handle action completes normally with function value on
961 * cancelled source
962 */
963 public void testHandle_sourceCancelled() {
964 for (ExecutionMode m : ExecutionMode.values())
965 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
966 for (boolean createIncomplete : new boolean[] { true, false })
967 for (Integer v1 : new Integer[] { 1, null })
968 {
969 final CompletableFuture<Integer> f = new CompletableFuture<>();
970 final AtomicInteger a = new AtomicInteger(0);
971 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
972 final CompletableFuture<Integer> g = m.handle
973 (f,
974 (Integer x, Throwable t) -> {
975 m.checkExecutionMode();
976 threadAssertNull(x);
977 threadAssertTrue(t instanceof CancellationException);
978 a.getAndIncrement();
979 return v1;
980 });
981 if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
982
983 checkCompletedNormally(g, v1);
984 checkCancelled(f);
985 assertEquals(1, a.get());
986 }}
987
988 /**
989 * handle result completes exceptionally if action does
990 */
991 public void testHandle_sourceFailedActionFailed() {
992 for (ExecutionMode m : ExecutionMode.values())
993 for (boolean createIncomplete : new boolean[] { true, false })
994 {
995 final CompletableFuture<Integer> f = new CompletableFuture<>();
996 final AtomicInteger a = new AtomicInteger(0);
997 final CFException ex1 = new CFException();
998 final CFException ex2 = new CFException();
999 if (!createIncomplete) f.completeExceptionally(ex1);
1000 final CompletableFuture<Integer> g = m.handle
1001 (f,
1002 (Integer x, Throwable t) -> {
1003 m.checkExecutionMode();
1004 threadAssertNull(x);
1005 threadAssertSame(ex1, t);
1006 a.getAndIncrement();
1007 throw ex2;
1008 });
1009 if (createIncomplete) f.completeExceptionally(ex1);
1010
1011 checkCompletedWithWrappedException(g, ex2);
1012 checkCompletedExceptionally(f, ex1);
1013 assertEquals(1, a.get());
1014 }}
1015
1016 public void testHandle_sourceCompletedNormallyActionFailed() {
1017 for (ExecutionMode m : ExecutionMode.values())
1018 for (boolean createIncomplete : new boolean[] { true, false })
1019 for (Integer v1 : new Integer[] { 1, null })
1020 {
1021 final CompletableFuture<Integer> f = new CompletableFuture<>();
1022 final AtomicInteger a = new AtomicInteger(0);
1023 final CFException ex = new CFException();
1024 if (!createIncomplete) f.complete(v1);
1025 final CompletableFuture<Integer> g = m.handle
1026 (f,
1027 (Integer x, Throwable t) -> {
1028 m.checkExecutionMode();
1029 threadAssertSame(x, v1);
1030 threadAssertNull(t);
1031 a.getAndIncrement();
1032 throw ex;
1033 });
1034 if (createIncomplete) f.complete(v1);
1035
1036 checkCompletedWithWrappedException(g, ex);
1037 checkCompletedNormally(f, v1);
1038 assertEquals(1, a.get());
1039 }}
1040
1041 /**
1042 * runAsync completes after running Runnable
1043 */
1044 public void testRunAsync_normalCompletion() {
1045 ExecutionMode[] executionModes = {
1046 ExecutionMode.ASYNC,
1047 ExecutionMode.EXECUTOR,
1048 };
1049 for (ExecutionMode m : executionModes)
1050 {
1051 final Noop r = new Noop(m);
1052 final CompletableFuture<Void> f = m.runAsync(r);
1053 assertNull(f.join());
1054 checkCompletedNormally(f, null);
1055 r.assertInvoked();
1056 }}
1057
1058 /**
1059 * failing runAsync completes exceptionally after running Runnable
1060 */
1061 public void testRunAsync_exceptionalCompletion() {
1062 ExecutionMode[] executionModes = {
1063 ExecutionMode.ASYNC,
1064 ExecutionMode.EXECUTOR,
1065 };
1066 for (ExecutionMode m : executionModes)
1067 {
1068 final FailingRunnable r = new FailingRunnable(m);
1069 final CompletableFuture<Void> f = m.runAsync(r);
1070 checkCompletedWithWrappedCFException(f);
1071 r.assertInvoked();
1072 }}
1073
1074 /**
1075 * supplyAsync completes with result of supplier
1076 */
1077 public void testSupplyAsync_normalCompletion() {
1078 ExecutionMode[] executionModes = {
1079 ExecutionMode.ASYNC,
1080 ExecutionMode.EXECUTOR,
1081 };
1082 for (ExecutionMode m : executionModes)
1083 for (Integer v1 : new Integer[] { 1, null })
1084 {
1085 final IntegerSupplier r = new IntegerSupplier(m, v1);
1086 final CompletableFuture<Integer> f = m.supplyAsync(r);
1087 assertSame(v1, f.join());
1088 checkCompletedNormally(f, v1);
1089 r.assertInvoked();
1090 }}
1091
1092 /**
1093 * Failing supplyAsync completes exceptionally
1094 */
1095 public void testSupplyAsync_exceptionalCompletion() {
1096 ExecutionMode[] executionModes = {
1097 ExecutionMode.ASYNC,
1098 ExecutionMode.EXECUTOR,
1099 };
1100 for (ExecutionMode m : executionModes)
1101 {
1102 FailingSupplier r = new FailingSupplier(m);
1103 CompletableFuture<Integer> f = m.supplyAsync(r);
1104 checkCompletedWithWrappedCFException(f);
1105 r.assertInvoked();
1106 }}
1107
1108 // seq completion methods
1109
1110 /**
1111 * thenRun result completes normally after normal completion of source
1112 */
1113 public void testThenRun_normalCompletion() {
1114 for (ExecutionMode m : ExecutionMode.values())
1115 for (boolean createIncomplete : new boolean[] { true, false })
1116 for (Integer v1 : new Integer[] { 1, null })
1117 {
1118 final CompletableFuture<Integer> f = new CompletableFuture<>();
1119 final Noop r = new Noop(m);
1120 if (!createIncomplete) f.complete(v1);
1121 final CompletableFuture<Void> g = m.thenRun(f, r);
1122 if (createIncomplete) {
1123 checkIncomplete(g);
1124 f.complete(v1);
1125 }
1126
1127 checkCompletedNormally(g, null);
1128 checkCompletedNormally(f, v1);
1129 r.assertInvoked();
1130 }}
1131
1132 /**
1133 * thenRun result completes exceptionally after exceptional
1134 * completion of source
1135 */
1136 public void testThenRun_exceptionalCompletion() {
1137 for (ExecutionMode m : ExecutionMode.values())
1138 for (boolean createIncomplete : new boolean[] { true, false })
1139 {
1140 final CFException ex = new CFException();
1141 final CompletableFuture<Integer> f = new CompletableFuture<>();
1142 final Noop r = new Noop(m);
1143 if (!createIncomplete) f.completeExceptionally(ex);
1144 final CompletableFuture<Void> g = m.thenRun(f, r);
1145 if (createIncomplete) {
1146 checkIncomplete(g);
1147 f.completeExceptionally(ex);
1148 }
1149
1150 checkCompletedWithWrappedException(g, ex);
1151 checkCompletedExceptionally(f, ex);
1152 r.assertNotInvoked();
1153 }}
1154
1155 /**
1156 * thenRun result completes exceptionally if source cancelled
1157 */
1158 public void testThenRun_sourceCancelled() {
1159 for (ExecutionMode m : ExecutionMode.values())
1160 for (boolean createIncomplete : new boolean[] { true, false })
1161 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1162 {
1163 final CompletableFuture<Integer> f = new CompletableFuture<>();
1164 final Noop r = new Noop(m);
1165 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1166 final CompletableFuture<Void> g = m.thenRun(f, r);
1167 if (createIncomplete) {
1168 checkIncomplete(g);
1169 assertTrue(f.cancel(mayInterruptIfRunning));
1170 }
1171
1172 checkCompletedWithWrappedCancellationException(g);
1173 checkCancelled(f);
1174 r.assertNotInvoked();
1175 }}
1176
1177 /**
1178 * thenRun result completes exceptionally if action does
1179 */
1180 public void testThenRun_actionFailed() {
1181 for (ExecutionMode m : ExecutionMode.values())
1182 for (boolean createIncomplete : new boolean[] { true, false })
1183 for (Integer v1 : new Integer[] { 1, null })
1184 {
1185 final CompletableFuture<Integer> f = new CompletableFuture<>();
1186 final FailingRunnable r = new FailingRunnable(m);
1187 if (!createIncomplete) f.complete(v1);
1188 final CompletableFuture<Void> g = m.thenRun(f, r);
1189 if (createIncomplete) {
1190 checkIncomplete(g);
1191 f.complete(v1);
1192 }
1193
1194 checkCompletedWithWrappedCFException(g);
1195 checkCompletedNormally(f, v1);
1196 }}
1197
1198 /**
1199 * thenApply result completes normally after normal completion of source
1200 */
1201 public void testThenApply_normalCompletion() {
1202 for (ExecutionMode m : ExecutionMode.values())
1203 for (boolean createIncomplete : new boolean[] { true, false })
1204 for (Integer v1 : new Integer[] { 1, null })
1205 {
1206 final CompletableFuture<Integer> f = new CompletableFuture<>();
1207 final IncFunction r = new IncFunction(m);
1208 if (!createIncomplete) f.complete(v1);
1209 final CompletableFuture<Integer> g = m.thenApply(f, r);
1210 if (createIncomplete) {
1211 checkIncomplete(g);
1212 f.complete(v1);
1213 }
1214
1215 checkCompletedNormally(g, inc(v1));
1216 checkCompletedNormally(f, v1);
1217 r.assertValue(inc(v1));
1218 }}
1219
1220 /**
1221 * thenApply result completes exceptionally after exceptional
1222 * completion of source
1223 */
1224 public void testThenApply_exceptionalCompletion() {
1225 for (ExecutionMode m : ExecutionMode.values())
1226 for (boolean createIncomplete : new boolean[] { true, false })
1227 {
1228 final CFException ex = new CFException();
1229 final CompletableFuture<Integer> f = new CompletableFuture<>();
1230 final IncFunction r = new IncFunction(m);
1231 if (!createIncomplete) f.completeExceptionally(ex);
1232 final CompletableFuture<Integer> g = m.thenApply(f, r);
1233 if (createIncomplete) {
1234 checkIncomplete(g);
1235 f.completeExceptionally(ex);
1236 }
1237
1238 checkCompletedWithWrappedException(g, ex);
1239 checkCompletedExceptionally(f, ex);
1240 r.assertNotInvoked();
1241 }}
1242
1243 /**
1244 * thenApply result completes exceptionally if source cancelled
1245 */
1246 public void testThenApply_sourceCancelled() {
1247 for (ExecutionMode m : ExecutionMode.values())
1248 for (boolean createIncomplete : new boolean[] { true, false })
1249 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1250 {
1251 final CompletableFuture<Integer> f = new CompletableFuture<>();
1252 final IncFunction r = new IncFunction(m);
1253 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1254 final CompletableFuture<Integer> g = m.thenApply(f, r);
1255 if (createIncomplete) {
1256 checkIncomplete(g);
1257 assertTrue(f.cancel(mayInterruptIfRunning));
1258 }
1259
1260 checkCompletedWithWrappedCancellationException(g);
1261 checkCancelled(f);
1262 r.assertNotInvoked();
1263 }}
1264
1265 /**
1266 * thenApply result completes exceptionally if action does
1267 */
1268 public void testThenApply_actionFailed() {
1269 for (ExecutionMode m : ExecutionMode.values())
1270 for (boolean createIncomplete : new boolean[] { true, false })
1271 for (Integer v1 : new Integer[] { 1, null })
1272 {
1273 final CompletableFuture<Integer> f = new CompletableFuture<>();
1274 final FailingFunction r = new FailingFunction(m);
1275 if (!createIncomplete) f.complete(v1);
1276 final CompletableFuture<Integer> g = m.thenApply(f, r);
1277 if (createIncomplete) {
1278 checkIncomplete(g);
1279 f.complete(v1);
1280 }
1281
1282 checkCompletedWithWrappedCFException(g);
1283 checkCompletedNormally(f, v1);
1284 }}
1285
1286 /**
1287 * thenAccept result completes normally after normal completion of source
1288 */
1289 public void testThenAccept_normalCompletion() {
1290 for (ExecutionMode m : ExecutionMode.values())
1291 for (boolean createIncomplete : new boolean[] { true, false })
1292 for (Integer v1 : new Integer[] { 1, null })
1293 {
1294 final CompletableFuture<Integer> f = new CompletableFuture<>();
1295 final NoopConsumer r = new NoopConsumer(m);
1296 if (!createIncomplete) f.complete(v1);
1297 final CompletableFuture<Void> g = m.thenAccept(f, r);
1298 if (createIncomplete) {
1299 checkIncomplete(g);
1300 f.complete(v1);
1301 }
1302
1303 checkCompletedNormally(g, null);
1304 r.assertValue(v1);
1305 checkCompletedNormally(f, v1);
1306 }}
1307
1308 /**
1309 * thenAccept result completes exceptionally after exceptional
1310 * completion of source
1311 */
1312 public void testThenAccept_exceptionalCompletion() {
1313 for (ExecutionMode m : ExecutionMode.values())
1314 for (boolean createIncomplete : new boolean[] { true, false })
1315 {
1316 final CFException ex = new CFException();
1317 final CompletableFuture<Integer> f = new CompletableFuture<>();
1318 final NoopConsumer r = new NoopConsumer(m);
1319 if (!createIncomplete) f.completeExceptionally(ex);
1320 final CompletableFuture<Void> g = m.thenAccept(f, r);
1321 if (createIncomplete) {
1322 checkIncomplete(g);
1323 f.completeExceptionally(ex);
1324 }
1325
1326 checkCompletedWithWrappedException(g, ex);
1327 checkCompletedExceptionally(f, ex);
1328 r.assertNotInvoked();
1329 }}
1330
1331 /**
1332 * thenAccept result completes exceptionally if source cancelled
1333 */
1334 public void testThenAccept_sourceCancelled() {
1335 for (ExecutionMode m : ExecutionMode.values())
1336 for (boolean createIncomplete : new boolean[] { true, false })
1337 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1338 {
1339 final CompletableFuture<Integer> f = new CompletableFuture<>();
1340 final NoopConsumer r = new NoopConsumer(m);
1341 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1342 final CompletableFuture<Void> g = m.thenAccept(f, r);
1343 if (createIncomplete) {
1344 checkIncomplete(g);
1345 assertTrue(f.cancel(mayInterruptIfRunning));
1346 }
1347
1348 checkCompletedWithWrappedCancellationException(g);
1349 checkCancelled(f);
1350 r.assertNotInvoked();
1351 }}
1352
1353 /**
1354 * thenAccept result completes exceptionally if action does
1355 */
1356 public void testThenAccept_actionFailed() {
1357 for (ExecutionMode m : ExecutionMode.values())
1358 for (boolean createIncomplete : new boolean[] { true, false })
1359 for (Integer v1 : new Integer[] { 1, null })
1360 {
1361 final CompletableFuture<Integer> f = new CompletableFuture<>();
1362 final FailingConsumer r = new FailingConsumer(m);
1363 if (!createIncomplete) f.complete(v1);
1364 final CompletableFuture<Void> g = m.thenAccept(f, r);
1365 if (createIncomplete) {
1366 checkIncomplete(g);
1367 f.complete(v1);
1368 }
1369
1370 checkCompletedWithWrappedCFException(g);
1371 checkCompletedNormally(f, v1);
1372 }}
1373
1374 /**
1375 * thenCombine result completes normally after normal completion
1376 * of sources
1377 */
1378 public void testThenCombine_normalCompletion() {
1379 for (ExecutionMode m : ExecutionMode.values())
1380 for (boolean createIncomplete : new boolean[] { true, false })
1381 for (boolean fFirst : new boolean[] { true, false })
1382 for (Integer v1 : new Integer[] { 1, null })
1383 for (Integer v2 : new Integer[] { 2, null })
1384 {
1385 final CompletableFuture<Integer> f = new CompletableFuture<>();
1386 final CompletableFuture<Integer> g = new CompletableFuture<>();
1387 final SubtractFunction r = new SubtractFunction(m);
1388
1389 if (fFirst) f.complete(v1); else g.complete(v2);
1390 if (!createIncomplete)
1391 if (!fFirst) f.complete(v1); else g.complete(v2);
1392 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1393 if (createIncomplete) {
1394 checkIncomplete(h);
1395 r.assertNotInvoked();
1396 if (!fFirst) f.complete(v1); else g.complete(v2);
1397 }
1398
1399 checkCompletedNormally(h, subtract(v1, v2));
1400 checkCompletedNormally(f, v1);
1401 checkCompletedNormally(g, v2);
1402 r.assertValue(subtract(v1, v2));
1403 }}
1404
1405 /**
1406 * thenCombine result completes exceptionally after exceptional
1407 * completion of either source
1408 */
1409 public void testThenCombine_exceptionalCompletion() {
1410 for (ExecutionMode m : ExecutionMode.values())
1411 for (boolean createIncomplete : new boolean[] { true, false })
1412 for (boolean fFirst : new boolean[] { true, false })
1413 for (Integer v1 : new Integer[] { 1, null })
1414 {
1415 final CompletableFuture<Integer> f = new CompletableFuture<>();
1416 final CompletableFuture<Integer> g = new CompletableFuture<>();
1417 final CFException ex = new CFException();
1418 final SubtractFunction r = new SubtractFunction(m);
1419
1420 (fFirst ? f : g).complete(v1);
1421 if (!createIncomplete)
1422 (!fFirst ? f : g).completeExceptionally(ex);
1423 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1424 if (createIncomplete) {
1425 checkIncomplete(h);
1426 (!fFirst ? f : g).completeExceptionally(ex);
1427 }
1428
1429 checkCompletedWithWrappedException(h, ex);
1430 r.assertNotInvoked();
1431 checkCompletedNormally(fFirst ? f : g, v1);
1432 checkCompletedExceptionally(!fFirst ? f : g, ex);
1433 }}
1434
1435 /**
1436 * thenCombine result completes exceptionally if either source cancelled
1437 */
1438 public void testThenCombine_sourceCancelled() {
1439 for (ExecutionMode m : ExecutionMode.values())
1440 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1441 for (boolean createIncomplete : new boolean[] { true, false })
1442 for (boolean fFirst : new boolean[] { true, false })
1443 for (Integer v1 : new Integer[] { 1, null })
1444 {
1445 final CompletableFuture<Integer> f = new CompletableFuture<>();
1446 final CompletableFuture<Integer> g = new CompletableFuture<>();
1447 final SubtractFunction r = new SubtractFunction(m);
1448
1449 (fFirst ? f : g).complete(v1);
1450 if (!createIncomplete)
1451 assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1452 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1453 if (createIncomplete) {
1454 checkIncomplete(h);
1455 assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1456 }
1457
1458 checkCompletedWithWrappedCancellationException(h);
1459 checkCancelled(!fFirst ? f : g);
1460 r.assertNotInvoked();
1461 checkCompletedNormally(fFirst ? f : g, v1);
1462 }}
1463
1464 /**
1465 * thenCombine result completes exceptionally if action does
1466 */
1467 public void testThenCombine_actionFailed() {
1468 for (ExecutionMode m : ExecutionMode.values())
1469 for (boolean fFirst : new boolean[] { true, false })
1470 for (Integer v1 : new Integer[] { 1, null })
1471 for (Integer v2 : new Integer[] { 2, null })
1472 {
1473 final CompletableFuture<Integer> f = new CompletableFuture<>();
1474 final CompletableFuture<Integer> g = new CompletableFuture<>();
1475 final FailingBiFunction r = new FailingBiFunction(m);
1476 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1477
1478 if (fFirst) {
1479 f.complete(v1);
1480 g.complete(v2);
1481 } else {
1482 g.complete(v2);
1483 f.complete(v1);
1484 }
1485
1486 checkCompletedWithWrappedCFException(h);
1487 checkCompletedNormally(f, v1);
1488 checkCompletedNormally(g, v2);
1489 }}
1490
1491 /**
1492 * thenAcceptBoth result completes normally after normal
1493 * completion of sources
1494 */
1495 public void testThenAcceptBoth_normalCompletion() {
1496 for (ExecutionMode m : ExecutionMode.values())
1497 for (boolean createIncomplete : new boolean[] { true, false })
1498 for (boolean fFirst : new boolean[] { true, false })
1499 for (Integer v1 : new Integer[] { 1, null })
1500 for (Integer v2 : new Integer[] { 2, null })
1501 {
1502 final CompletableFuture<Integer> f = new CompletableFuture<>();
1503 final CompletableFuture<Integer> g = new CompletableFuture<>();
1504 final SubtractAction r = new SubtractAction(m);
1505
1506 if (fFirst) f.complete(v1); else g.complete(v2);
1507 if (!createIncomplete)
1508 if (!fFirst) f.complete(v1); else g.complete(v2);
1509 final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1510 if (createIncomplete) {
1511 checkIncomplete(h);
1512 r.assertNotInvoked();
1513 if (!fFirst) f.complete(v1); else g.complete(v2);
1514 }
1515
1516 checkCompletedNormally(h, null);
1517 r.assertValue(subtract(v1, v2));
1518 checkCompletedNormally(f, v1);
1519 checkCompletedNormally(g, v2);
1520 }}
1521
1522 /**
1523 * thenAcceptBoth result completes exceptionally after exceptional
1524 * completion of either source
1525 */
1526 public void testThenAcceptBoth_exceptionalCompletion() {
1527 for (ExecutionMode m : ExecutionMode.values())
1528 for (boolean createIncomplete : new boolean[] { true, false })
1529 for (boolean fFirst : new boolean[] { true, false })
1530 for (Integer v1 : new Integer[] { 1, null })
1531 {
1532 final CompletableFuture<Integer> f = new CompletableFuture<>();
1533 final CompletableFuture<Integer> g = new CompletableFuture<>();
1534 final CFException ex = new CFException();
1535 final SubtractAction r = new SubtractAction(m);
1536
1537 (fFirst ? f : g).complete(v1);
1538 if (!createIncomplete)
1539 (!fFirst ? f : g).completeExceptionally(ex);
1540 final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1541 if (createIncomplete) {
1542 checkIncomplete(h);
1543 (!fFirst ? f : g).completeExceptionally(ex);
1544 }
1545
1546 checkCompletedWithWrappedException(h, ex);
1547 r.assertNotInvoked();
1548 checkCompletedNormally(fFirst ? f : g, v1);
1549 checkCompletedExceptionally(!fFirst ? f : g, ex);
1550 }}
1551
1552 /**
1553 * thenAcceptBoth result completes exceptionally if either source cancelled
1554 */
1555 public void testThenAcceptBoth_sourceCancelled() {
1556 for (ExecutionMode m : ExecutionMode.values())
1557 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1558 for (boolean createIncomplete : new boolean[] { true, false })
1559 for (boolean fFirst : new boolean[] { true, false })
1560 for (Integer v1 : new Integer[] { 1, null })
1561 {
1562 final CompletableFuture<Integer> f = new CompletableFuture<>();
1563 final CompletableFuture<Integer> g = new CompletableFuture<>();
1564 final SubtractAction r = new SubtractAction(m);
1565
1566 (fFirst ? f : g).complete(v1);
1567 if (!createIncomplete)
1568 assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1569 final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1570 if (createIncomplete) {
1571 checkIncomplete(h);
1572 assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1573 }
1574
1575 checkCompletedWithWrappedCancellationException(h);
1576 checkCancelled(!fFirst ? f : g);
1577 r.assertNotInvoked();
1578 checkCompletedNormally(fFirst ? f : g, v1);
1579 }}
1580
1581 /**
1582 * thenAcceptBoth result completes exceptionally if action does
1583 */
1584 public void testThenAcceptBoth_actionFailed() {
1585 for (ExecutionMode m : ExecutionMode.values())
1586 for (boolean fFirst : new boolean[] { true, false })
1587 for (Integer v1 : new Integer[] { 1, null })
1588 for (Integer v2 : new Integer[] { 2, null })
1589 {
1590 final CompletableFuture<Integer> f = new CompletableFuture<>();
1591 final CompletableFuture<Integer> g = new CompletableFuture<>();
1592 final FailingBiConsumer r = new FailingBiConsumer(m);
1593 final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1594
1595 if (fFirst) {
1596 f.complete(v1);
1597 g.complete(v2);
1598 } else {
1599 g.complete(v2);
1600 f.complete(v1);
1601 }
1602
1603 checkCompletedWithWrappedCFException(h);
1604 checkCompletedNormally(f, v1);
1605 checkCompletedNormally(g, v2);
1606 }}
1607
1608 /**
1609 * runAfterBoth result completes normally after normal
1610 * completion of sources
1611 */
1612 public void testRunAfterBoth_normalCompletion() {
1613 for (ExecutionMode m : ExecutionMode.values())
1614 for (boolean createIncomplete : new boolean[] { true, false })
1615 for (boolean fFirst : new boolean[] { true, false })
1616 for (Integer v1 : new Integer[] { 1, null })
1617 for (Integer v2 : new Integer[] { 2, null })
1618 {
1619 final CompletableFuture<Integer> f = new CompletableFuture<>();
1620 final CompletableFuture<Integer> g = new CompletableFuture<>();
1621 final Noop r = new Noop(m);
1622
1623 if (fFirst) f.complete(v1); else g.complete(v2);
1624 if (!createIncomplete)
1625 if (!fFirst) f.complete(v1); else g.complete(v2);
1626 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1627 if (createIncomplete) {
1628 checkIncomplete(h);
1629 r.assertNotInvoked();
1630 if (!fFirst) f.complete(v1); else g.complete(v2);
1631 }
1632
1633 checkCompletedNormally(h, null);
1634 r.assertInvoked();
1635 checkCompletedNormally(f, v1);
1636 checkCompletedNormally(g, v2);
1637 }}
1638
1639 /**
1640 * runAfterBoth result completes exceptionally after exceptional
1641 * completion of either source
1642 */
1643 public void testRunAfterBoth_exceptionalCompletion() {
1644 for (ExecutionMode m : ExecutionMode.values())
1645 for (boolean createIncomplete : new boolean[] { true, false })
1646 for (boolean fFirst : new boolean[] { true, false })
1647 for (Integer v1 : new Integer[] { 1, null })
1648 {
1649 final CompletableFuture<Integer> f = new CompletableFuture<>();
1650 final CompletableFuture<Integer> g = new CompletableFuture<>();
1651 final CFException ex = new CFException();
1652 final Noop r = new Noop(m);
1653
1654 (fFirst ? f : g).complete(v1);
1655 if (!createIncomplete)
1656 (!fFirst ? f : g).completeExceptionally(ex);
1657 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1658 if (createIncomplete) {
1659 checkIncomplete(h);
1660 (!fFirst ? f : g).completeExceptionally(ex);
1661 }
1662
1663 checkCompletedWithWrappedException(h, ex);
1664 r.assertNotInvoked();
1665 checkCompletedNormally(fFirst ? f : g, v1);
1666 checkCompletedExceptionally(!fFirst ? f : g, ex);
1667 }}
1668
1669 /**
1670 * runAfterBoth result completes exceptionally if either source cancelled
1671 */
1672 public void testRunAfterBoth_sourceCancelled() {
1673 for (ExecutionMode m : ExecutionMode.values())
1674 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1675 for (boolean createIncomplete : new boolean[] { true, false })
1676 for (boolean fFirst : new boolean[] { true, false })
1677 for (Integer v1 : new Integer[] { 1, null })
1678 {
1679 final CompletableFuture<Integer> f = new CompletableFuture<>();
1680 final CompletableFuture<Integer> g = new CompletableFuture<>();
1681 final Noop r = new Noop(m);
1682
1683
1684 (fFirst ? f : g).complete(v1);
1685 if (!createIncomplete)
1686 assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1687 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1688 if (createIncomplete) {
1689 checkIncomplete(h);
1690 assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1691 }
1692
1693 checkCompletedWithWrappedCancellationException(h);
1694 checkCancelled(!fFirst ? f : g);
1695 r.assertNotInvoked();
1696 checkCompletedNormally(fFirst ? f : g, v1);
1697 }}
1698
1699 /**
1700 * runAfterBoth result completes exceptionally if action does
1701 */
1702 public void testRunAfterBoth_actionFailed() {
1703 for (ExecutionMode m : ExecutionMode.values())
1704 for (boolean fFirst : new boolean[] { true, false })
1705 for (Integer v1 : new Integer[] { 1, null })
1706 for (Integer v2 : new Integer[] { 2, null })
1707 {
1708 final CompletableFuture<Integer> f = new CompletableFuture<>();
1709 final CompletableFuture<Integer> g = new CompletableFuture<>();
1710 final FailingRunnable r1 = new FailingRunnable(m);
1711 final FailingRunnable r2 = new FailingRunnable(m);
1712
1713 CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1714 if (fFirst) {
1715 f.complete(v1);
1716 g.complete(v2);
1717 } else {
1718 g.complete(v2);
1719 f.complete(v1);
1720 }
1721 CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1722
1723 checkCompletedWithWrappedCFException(h1);
1724 checkCompletedWithWrappedCFException(h2);
1725 checkCompletedNormally(f, v1);
1726 checkCompletedNormally(g, v2);
1727 }}
1728
1729 /**
1730 * applyToEither result completes normally after normal completion
1731 * of either source
1732 */
1733 public void testApplyToEither_normalCompletion() {
1734 for (ExecutionMode m : ExecutionMode.values())
1735 for (Integer v1 : new Integer[] { 1, null })
1736 for (Integer v2 : new Integer[] { 2, null })
1737 {
1738 final CompletableFuture<Integer> f = new CompletableFuture<>();
1739 final CompletableFuture<Integer> g = new CompletableFuture<>();
1740 final IncFunction[] rs = new IncFunction[6];
1741 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1742
1743 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
1744 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
1745 checkIncomplete(h0);
1746 checkIncomplete(h1);
1747 rs[0].assertNotInvoked();
1748 rs[1].assertNotInvoked();
1749 f.complete(v1);
1750 checkCompletedNormally(h0, inc(v1));
1751 checkCompletedNormally(h1, inc(v1));
1752 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
1753 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
1754 checkCompletedNormally(h2, inc(v1));
1755 checkCompletedNormally(h3, inc(v1));
1756 g.complete(v2);
1757
1758 // unspecified behavior - both source completions available
1759 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
1760 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
1761 rs[4].assertValue(h4.join());
1762 rs[5].assertValue(h5.join());
1763 assertTrue(Objects.equals(inc(v1), h4.join()) ||
1764 Objects.equals(inc(v2), h4.join()));
1765 assertTrue(Objects.equals(inc(v1), h5.join()) ||
1766 Objects.equals(inc(v2), h5.join()));
1767
1768 checkCompletedNormally(f, v1);
1769 checkCompletedNormally(g, v2);
1770 checkCompletedNormally(h0, inc(v1));
1771 checkCompletedNormally(h1, inc(v1));
1772 checkCompletedNormally(h2, inc(v1));
1773 checkCompletedNormally(h3, inc(v1));
1774 for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
1775 }}
1776
1777 /**
1778 * applyToEither result completes exceptionally after exceptional
1779 * completion of either source
1780 */
1781 public void testApplyToEither_exceptionalCompletion() {
1782 for (ExecutionMode m : ExecutionMode.values())
1783 for (Integer v1 : new Integer[] { 1, null })
1784 {
1785 final CompletableFuture<Integer> f = new CompletableFuture<>();
1786 final CompletableFuture<Integer> g = new CompletableFuture<>();
1787 final CFException ex = new CFException();
1788 final IncFunction[] rs = new IncFunction[6];
1789 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1790
1791 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
1792 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
1793 checkIncomplete(h0);
1794 checkIncomplete(h1);
1795 rs[0].assertNotInvoked();
1796 rs[1].assertNotInvoked();
1797 f.completeExceptionally(ex);
1798 checkCompletedWithWrappedException(h0, ex);
1799 checkCompletedWithWrappedException(h1, ex);
1800 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
1801 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
1802 checkCompletedWithWrappedException(h2, ex);
1803 checkCompletedWithWrappedException(h3, ex);
1804 g.complete(v1);
1805
1806 // unspecified behavior - both source completions available
1807 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
1808 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
1809 try {
1810 assertEquals(inc(v1), h4.join());
1811 rs[4].assertValue(inc(v1));
1812 } catch (CompletionException ok) {
1813 checkCompletedWithWrappedException(h4, ex);
1814 rs[4].assertNotInvoked();
1815 }
1816 try {
1817 assertEquals(inc(v1), h5.join());
1818 rs[5].assertValue(inc(v1));
1819 } catch (CompletionException ok) {
1820 checkCompletedWithWrappedException(h5, ex);
1821 rs[5].assertNotInvoked();
1822 }
1823
1824 checkCompletedExceptionally(f, ex);
1825 checkCompletedNormally(g, v1);
1826 checkCompletedWithWrappedException(h0, ex);
1827 checkCompletedWithWrappedException(h1, ex);
1828 checkCompletedWithWrappedException(h2, ex);
1829 checkCompletedWithWrappedException(h3, ex);
1830 checkCompletedWithWrappedException(h4, ex);
1831 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
1832 }}
1833
1834 public void testApplyToEither_exceptionalCompletion2() {
1835 for (ExecutionMode m : ExecutionMode.values())
1836 for (boolean fFirst : new boolean[] { true, false })
1837 for (Integer v1 : new Integer[] { 1, null })
1838 {
1839 final CompletableFuture<Integer> f = new CompletableFuture<>();
1840 final CompletableFuture<Integer> g = new CompletableFuture<>();
1841 final CFException ex = new CFException();
1842 final IncFunction[] rs = new IncFunction[6];
1843 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1844
1845 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
1846 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
1847 if (fFirst) {
1848 f.complete(v1);
1849 g.completeExceptionally(ex);
1850 } else {
1851 g.completeExceptionally(ex);
1852 f.complete(v1);
1853 }
1854 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
1855 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
1856
1857 // unspecified behavior - both source completions available
1858 try {
1859 assertEquals(inc(v1), h0.join());
1860 rs[0].assertValue(inc(v1));
1861 } catch (CompletionException ok) {
1862 checkCompletedWithWrappedException(h0, ex);
1863 rs[0].assertNotInvoked();
1864 }
1865 try {
1866 assertEquals(inc(v1), h1.join());
1867 rs[1].assertValue(inc(v1));
1868 } catch (CompletionException ok) {
1869 checkCompletedWithWrappedException(h1, ex);
1870 rs[1].assertNotInvoked();
1871 }
1872 try {
1873 assertEquals(inc(v1), h2.join());
1874 rs[2].assertValue(inc(v1));
1875 } catch (CompletionException ok) {
1876 checkCompletedWithWrappedException(h2, ex);
1877 rs[2].assertNotInvoked();
1878 }
1879 try {
1880 assertEquals(inc(v1), h3.join());
1881 rs[3].assertValue(inc(v1));
1882 } catch (CompletionException ok) {
1883 checkCompletedWithWrappedException(h3, ex);
1884 rs[3].assertNotInvoked();
1885 }
1886
1887 checkCompletedNormally(f, v1);
1888 checkCompletedExceptionally(g, ex);
1889 }}
1890
1891 /**
1892 * applyToEither result completes exceptionally if either source cancelled
1893 */
1894 public void testApplyToEither_sourceCancelled() {
1895 for (ExecutionMode m : ExecutionMode.values())
1896 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1897 for (Integer v1 : new Integer[] { 1, null })
1898 {
1899 final CompletableFuture<Integer> f = new CompletableFuture<>();
1900 final CompletableFuture<Integer> g = new CompletableFuture<>();
1901 final IncFunction[] rs = new IncFunction[6];
1902 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1903
1904 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
1905 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
1906 checkIncomplete(h0);
1907 checkIncomplete(h1);
1908 rs[0].assertNotInvoked();
1909 rs[1].assertNotInvoked();
1910 f.cancel(mayInterruptIfRunning);
1911 checkCompletedWithWrappedCancellationException(h0);
1912 checkCompletedWithWrappedCancellationException(h1);
1913 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
1914 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
1915 checkCompletedWithWrappedCancellationException(h2);
1916 checkCompletedWithWrappedCancellationException(h3);
1917 g.complete(v1);
1918
1919 // unspecified behavior - both source completions available
1920 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
1921 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
1922 try {
1923 assertEquals(inc(v1), h4.join());
1924 rs[4].assertValue(inc(v1));
1925 } catch (CompletionException ok) {
1926 checkCompletedWithWrappedCancellationException(h4);
1927 rs[4].assertNotInvoked();
1928 }
1929 try {
1930 assertEquals(inc(v1), h5.join());
1931 rs[5].assertValue(inc(v1));
1932 } catch (CompletionException ok) {
1933 checkCompletedWithWrappedCancellationException(h5);
1934 rs[5].assertNotInvoked();
1935 }
1936
1937 checkCancelled(f);
1938 checkCompletedNormally(g, v1);
1939 checkCompletedWithWrappedCancellationException(h0);
1940 checkCompletedWithWrappedCancellationException(h1);
1941 checkCompletedWithWrappedCancellationException(h2);
1942 checkCompletedWithWrappedCancellationException(h3);
1943 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
1944 }}
1945
1946 public void testApplyToEither_sourceCancelled2() {
1947 for (ExecutionMode m : ExecutionMode.values())
1948 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1949 for (boolean fFirst : new boolean[] { true, false })
1950 for (Integer v1 : new Integer[] { 1, null })
1951 {
1952 final CompletableFuture<Integer> f = new CompletableFuture<>();
1953 final CompletableFuture<Integer> g = new CompletableFuture<>();
1954 final IncFunction[] rs = new IncFunction[6];
1955 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1956
1957 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
1958 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
1959 if (fFirst) {
1960 f.complete(v1);
1961 g.cancel(mayInterruptIfRunning);
1962 } else {
1963 g.cancel(mayInterruptIfRunning);
1964 f.complete(v1);
1965 }
1966 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
1967 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
1968
1969 // unspecified behavior - both source completions available
1970 try {
1971 assertEquals(inc(v1), h0.join());
1972 rs[0].assertValue(inc(v1));
1973 } catch (CompletionException ok) {
1974 checkCompletedWithWrappedCancellationException(h0);
1975 rs[0].assertNotInvoked();
1976 }
1977 try {
1978 assertEquals(inc(v1), h1.join());
1979 rs[1].assertValue(inc(v1));
1980 } catch (CompletionException ok) {
1981 checkCompletedWithWrappedCancellationException(h1);
1982 rs[1].assertNotInvoked();
1983 }
1984 try {
1985 assertEquals(inc(v1), h2.join());
1986 rs[2].assertValue(inc(v1));
1987 } catch (CompletionException ok) {
1988 checkCompletedWithWrappedCancellationException(h2);
1989 rs[2].assertNotInvoked();
1990 }
1991 try {
1992 assertEquals(inc(v1), h3.join());
1993 rs[3].assertValue(inc(v1));
1994 } catch (CompletionException ok) {
1995 checkCompletedWithWrappedCancellationException(h3);
1996 rs[3].assertNotInvoked();
1997 }
1998
1999 checkCompletedNormally(f, v1);
2000 checkCancelled(g);
2001 }}
2002
2003 /**
2004 * applyToEither result completes exceptionally if action does
2005 */
2006 public void testApplyToEither_actionFailed() {
2007 for (ExecutionMode m : ExecutionMode.values())
2008 for (Integer v1 : new Integer[] { 1, null })
2009 for (Integer v2 : new Integer[] { 2, null })
2010 {
2011 final CompletableFuture<Integer> f = new CompletableFuture<>();
2012 final CompletableFuture<Integer> g = new CompletableFuture<>();
2013 final FailingFunction[] rs = new FailingFunction[6];
2014 for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2015
2016 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2017 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2018 f.complete(v1);
2019 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2020 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2021 checkCompletedWithWrappedCFException(h0);
2022 checkCompletedWithWrappedCFException(h1);
2023 checkCompletedWithWrappedCFException(h2);
2024 checkCompletedWithWrappedCFException(h3);
2025 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2026
2027 g.complete(v2);
2028
2029 // unspecified behavior - both source completions available
2030 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2031 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2032
2033 checkCompletedWithWrappedCFException(h4);
2034 assertTrue(Objects.equals(v1, rs[4].value) ||
2035 Objects.equals(v2, rs[4].value));
2036 checkCompletedWithWrappedCFException(h5);
2037 assertTrue(Objects.equals(v1, rs[5].value) ||
2038 Objects.equals(v2, rs[5].value));
2039
2040 checkCompletedNormally(f, v1);
2041 checkCompletedNormally(g, v2);
2042 }}
2043
2044 /**
2045 * acceptEither result completes normally after normal completion
2046 * of either source
2047 */
2048 public void testAcceptEither_normalCompletion() {
2049 for (ExecutionMode m : ExecutionMode.values())
2050 for (Integer v1 : new Integer[] { 1, null })
2051 for (Integer v2 : new Integer[] { 2, null })
2052 {
2053 final CompletableFuture<Integer> f = new CompletableFuture<>();
2054 final CompletableFuture<Integer> g = new CompletableFuture<>();
2055 final NoopConsumer[] rs = new NoopConsumer[6];
2056 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2057
2058 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2059 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2060 checkIncomplete(h0);
2061 checkIncomplete(h1);
2062 rs[0].assertNotInvoked();
2063 rs[1].assertNotInvoked();
2064 f.complete(v1);
2065 checkCompletedNormally(h0, null);
2066 checkCompletedNormally(h1, null);
2067 rs[0].assertValue(v1);
2068 rs[1].assertValue(v1);
2069 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2070 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2071 checkCompletedNormally(h2, null);
2072 checkCompletedNormally(h3, null);
2073 rs[2].assertValue(v1);
2074 rs[3].assertValue(v1);
2075 g.complete(v2);
2076
2077 // unspecified behavior - both source completions available
2078 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2079 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2080 checkCompletedNormally(h4, null);
2081 checkCompletedNormally(h5, null);
2082 assertTrue(Objects.equals(v1, rs[4].value) ||
2083 Objects.equals(v2, rs[4].value));
2084 assertTrue(Objects.equals(v1, rs[5].value) ||
2085 Objects.equals(v2, rs[5].value));
2086
2087 checkCompletedNormally(f, v1);
2088 checkCompletedNormally(g, v2);
2089 checkCompletedNormally(h0, null);
2090 checkCompletedNormally(h1, null);
2091 checkCompletedNormally(h2, null);
2092 checkCompletedNormally(h3, null);
2093 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2094 }}
2095
2096 /**
2097 * acceptEither result completes exceptionally after exceptional
2098 * completion of either source
2099 */
2100 public void testAcceptEither_exceptionalCompletion() {
2101 for (ExecutionMode m : ExecutionMode.values())
2102 for (Integer v1 : new Integer[] { 1, null })
2103 {
2104 final CompletableFuture<Integer> f = new CompletableFuture<>();
2105 final CompletableFuture<Integer> g = new CompletableFuture<>();
2106 final CFException ex = new CFException();
2107 final NoopConsumer[] rs = new NoopConsumer[6];
2108 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2109
2110 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2111 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2112 checkIncomplete(h0);
2113 checkIncomplete(h1);
2114 rs[0].assertNotInvoked();
2115 rs[1].assertNotInvoked();
2116 f.completeExceptionally(ex);
2117 checkCompletedWithWrappedException(h0, ex);
2118 checkCompletedWithWrappedException(h1, ex);
2119 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2120 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2121 checkCompletedWithWrappedException(h2, ex);
2122 checkCompletedWithWrappedException(h3, ex);
2123
2124 g.complete(v1);
2125
2126 // unspecified behavior - both source completions available
2127 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2128 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2129 try {
2130 assertNull(h4.join());
2131 rs[4].assertValue(v1);
2132 } catch (CompletionException ok) {
2133 checkCompletedWithWrappedException(h4, ex);
2134 rs[4].assertNotInvoked();
2135 }
2136 try {
2137 assertNull(h5.join());
2138 rs[5].assertValue(v1);
2139 } catch (CompletionException ok) {
2140 checkCompletedWithWrappedException(h5, ex);
2141 rs[5].assertNotInvoked();
2142 }
2143
2144 checkCompletedExceptionally(f, ex);
2145 checkCompletedNormally(g, v1);
2146 checkCompletedWithWrappedException(h0, ex);
2147 checkCompletedWithWrappedException(h1, ex);
2148 checkCompletedWithWrappedException(h2, ex);
2149 checkCompletedWithWrappedException(h3, ex);
2150 checkCompletedWithWrappedException(h4, ex);
2151 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2152 }}
2153
2154 public void testAcceptEither_exceptionalCompletion2() {
2155 for (ExecutionMode m : ExecutionMode.values())
2156 for (boolean fFirst : new boolean[] { true, false })
2157 for (Integer v1 : new Integer[] { 1, null })
2158 {
2159 final CompletableFuture<Integer> f = new CompletableFuture<>();
2160 final CompletableFuture<Integer> g = new CompletableFuture<>();
2161 final CFException ex = new CFException();
2162 final NoopConsumer[] rs = new NoopConsumer[6];
2163 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2164
2165 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2166 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2167 if (fFirst) {
2168 f.complete(v1);
2169 g.completeExceptionally(ex);
2170 } else {
2171 g.completeExceptionally(ex);
2172 f.complete(v1);
2173 }
2174 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2175 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2176
2177 // unspecified behavior - both source completions available
2178 try {
2179 assertEquals(null, h0.join());
2180 rs[0].assertValue(v1);
2181 } catch (CompletionException ok) {
2182 checkCompletedWithWrappedException(h0, ex);
2183 rs[0].assertNotInvoked();
2184 }
2185 try {
2186 assertEquals(null, h1.join());
2187 rs[1].assertValue(v1);
2188 } catch (CompletionException ok) {
2189 checkCompletedWithWrappedException(h1, ex);
2190 rs[1].assertNotInvoked();
2191 }
2192 try {
2193 assertEquals(null, h2.join());
2194 rs[2].assertValue(v1);
2195 } catch (CompletionException ok) {
2196 checkCompletedWithWrappedException(h2, ex);
2197 rs[2].assertNotInvoked();
2198 }
2199 try {
2200 assertEquals(null, h3.join());
2201 rs[3].assertValue(v1);
2202 } catch (CompletionException ok) {
2203 checkCompletedWithWrappedException(h3, ex);
2204 rs[3].assertNotInvoked();
2205 }
2206
2207 checkCompletedNormally(f, v1);
2208 checkCompletedExceptionally(g, ex);
2209 }}
2210
2211 /**
2212 * acceptEither result completes exceptionally if either source cancelled
2213 */
2214 public void testAcceptEither_sourceCancelled() {
2215 for (ExecutionMode m : ExecutionMode.values())
2216 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2217 for (Integer v1 : new Integer[] { 1, null })
2218 {
2219 final CompletableFuture<Integer> f = new CompletableFuture<>();
2220 final CompletableFuture<Integer> g = new CompletableFuture<>();
2221 final NoopConsumer[] rs = new NoopConsumer[6];
2222 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2223
2224 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2225 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2226 checkIncomplete(h0);
2227 checkIncomplete(h1);
2228 rs[0].assertNotInvoked();
2229 rs[1].assertNotInvoked();
2230 f.cancel(mayInterruptIfRunning);
2231 checkCompletedWithWrappedCancellationException(h0);
2232 checkCompletedWithWrappedCancellationException(h1);
2233 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2234 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2235 checkCompletedWithWrappedCancellationException(h2);
2236 checkCompletedWithWrappedCancellationException(h3);
2237
2238 g.complete(v1);
2239
2240 // unspecified behavior - both source completions available
2241 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2242 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2243 try {
2244 assertNull(h4.join());
2245 rs[4].assertValue(v1);
2246 } catch (CompletionException ok) {
2247 checkCompletedWithWrappedCancellationException(h4);
2248 rs[4].assertNotInvoked();
2249 }
2250 try {
2251 assertNull(h5.join());
2252 rs[5].assertValue(v1);
2253 } catch (CompletionException ok) {
2254 checkCompletedWithWrappedCancellationException(h5);
2255 rs[5].assertNotInvoked();
2256 }
2257
2258 checkCancelled(f);
2259 checkCompletedNormally(g, v1);
2260 checkCompletedWithWrappedCancellationException(h0);
2261 checkCompletedWithWrappedCancellationException(h1);
2262 checkCompletedWithWrappedCancellationException(h2);
2263 checkCompletedWithWrappedCancellationException(h3);
2264 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2265 }}
2266
2267 /**
2268 * acceptEither result completes exceptionally if action does
2269 */
2270 public void testAcceptEither_actionFailed() {
2271 for (ExecutionMode m : ExecutionMode.values())
2272 for (Integer v1 : new Integer[] { 1, null })
2273 for (Integer v2 : new Integer[] { 2, null })
2274 {
2275 final CompletableFuture<Integer> f = new CompletableFuture<>();
2276 final CompletableFuture<Integer> g = new CompletableFuture<>();
2277 final FailingConsumer[] rs = new FailingConsumer[6];
2278 for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2279
2280 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2281 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2282 f.complete(v1);
2283 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2284 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2285 checkCompletedWithWrappedCFException(h0);
2286 checkCompletedWithWrappedCFException(h1);
2287 checkCompletedWithWrappedCFException(h2);
2288 checkCompletedWithWrappedCFException(h3);
2289 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2290
2291 g.complete(v2);
2292
2293 // unspecified behavior - both source completions available
2294 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2295 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2296
2297 checkCompletedWithWrappedCFException(h4);
2298 assertTrue(Objects.equals(v1, rs[4].value) ||
2299 Objects.equals(v2, rs[4].value));
2300 checkCompletedWithWrappedCFException(h5);
2301 assertTrue(Objects.equals(v1, rs[5].value) ||
2302 Objects.equals(v2, rs[5].value));
2303
2304 checkCompletedNormally(f, v1);
2305 checkCompletedNormally(g, v2);
2306 }}
2307
2308 /**
2309 * runAfterEither result completes normally after normal completion
2310 * of either source
2311 */
2312 public void testRunAfterEither_normalCompletion() {
2313 for (ExecutionMode m : ExecutionMode.values())
2314 for (Integer v1 : new Integer[] { 1, null })
2315 for (Integer v2 : new Integer[] { 2, null })
2316 {
2317 final CompletableFuture<Integer> f = new CompletableFuture<>();
2318 final CompletableFuture<Integer> g = new CompletableFuture<>();
2319 final Noop[] rs = new Noop[6];
2320 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2321
2322 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2323 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2324 checkIncomplete(h0);
2325 checkIncomplete(h1);
2326 rs[0].assertNotInvoked();
2327 rs[1].assertNotInvoked();
2328 f.complete(v1);
2329 checkCompletedNormally(h0, null);
2330 checkCompletedNormally(h1, null);
2331 rs[0].assertInvoked();
2332 rs[1].assertInvoked();
2333 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2334 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2335 checkCompletedNormally(h2, null);
2336 checkCompletedNormally(h3, null);
2337 rs[2].assertInvoked();
2338 rs[3].assertInvoked();
2339
2340 g.complete(v2);
2341
2342 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2343 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2344
2345 checkCompletedNormally(f, v1);
2346 checkCompletedNormally(g, v2);
2347 checkCompletedNormally(h0, null);
2348 checkCompletedNormally(h1, null);
2349 checkCompletedNormally(h2, null);
2350 checkCompletedNormally(h3, null);
2351 checkCompletedNormally(h4, null);
2352 checkCompletedNormally(h5, null);
2353 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2354 }}
2355
2356 /**
2357 * runAfterEither result completes exceptionally after exceptional
2358 * completion of either source
2359 */
2360 public void testRunAfterEither_exceptionalCompletion() {
2361 for (ExecutionMode m : ExecutionMode.values())
2362 for (Integer v1 : new Integer[] { 1, null })
2363 {
2364 final CompletableFuture<Integer> f = new CompletableFuture<>();
2365 final CompletableFuture<Integer> g = new CompletableFuture<>();
2366 final CFException ex = new CFException();
2367 final Noop[] rs = new Noop[6];
2368 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2369
2370 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2371 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2372 checkIncomplete(h0);
2373 checkIncomplete(h1);
2374 rs[0].assertNotInvoked();
2375 rs[1].assertNotInvoked();
2376 f.completeExceptionally(ex);
2377 checkCompletedWithWrappedException(h0, ex);
2378 checkCompletedWithWrappedException(h1, ex);
2379 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2380 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2381 checkCompletedWithWrappedException(h2, ex);
2382 checkCompletedWithWrappedException(h3, ex);
2383
2384 g.complete(v1);
2385
2386 // unspecified behavior - both source completions available
2387 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2388 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2389 try {
2390 assertNull(h4.join());
2391 rs[4].assertInvoked();
2392 } catch (CompletionException ok) {
2393 checkCompletedWithWrappedException(h4, ex);
2394 rs[4].assertNotInvoked();
2395 }
2396 try {
2397 assertNull(h5.join());
2398 rs[5].assertInvoked();
2399 } catch (CompletionException ok) {
2400 checkCompletedWithWrappedException(h5, ex);
2401 rs[5].assertNotInvoked();
2402 }
2403
2404 checkCompletedExceptionally(f, ex);
2405 checkCompletedNormally(g, v1);
2406 checkCompletedWithWrappedException(h0, ex);
2407 checkCompletedWithWrappedException(h1, ex);
2408 checkCompletedWithWrappedException(h2, ex);
2409 checkCompletedWithWrappedException(h3, ex);
2410 checkCompletedWithWrappedException(h4, ex);
2411 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2412 }}
2413
2414 public void testRunAfterEither_exceptionalCompletion2() {
2415 for (ExecutionMode m : ExecutionMode.values())
2416 for (boolean fFirst : new boolean[] { true, false })
2417 for (Integer v1 : new Integer[] { 1, null })
2418 {
2419 final CompletableFuture<Integer> f = new CompletableFuture<>();
2420 final CompletableFuture<Integer> g = new CompletableFuture<>();
2421 final CFException ex = new CFException();
2422 final Noop[] rs = new Noop[6];
2423 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2424
2425 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2426 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2427 if (fFirst) {
2428 f.complete(v1);
2429 g.completeExceptionally(ex);
2430 } else {
2431 g.completeExceptionally(ex);
2432 f.complete(v1);
2433 }
2434 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2435 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2436
2437 // unspecified behavior - both source completions available
2438 try {
2439 assertEquals(null, h0.join());
2440 rs[0].assertInvoked();
2441 } catch (CompletionException ok) {
2442 checkCompletedWithWrappedException(h0, ex);
2443 rs[0].assertNotInvoked();
2444 }
2445 try {
2446 assertEquals(null, h1.join());
2447 rs[1].assertInvoked();
2448 } catch (CompletionException ok) {
2449 checkCompletedWithWrappedException(h1, ex);
2450 rs[1].assertNotInvoked();
2451 }
2452 try {
2453 assertEquals(null, h2.join());
2454 rs[2].assertInvoked();
2455 } catch (CompletionException ok) {
2456 checkCompletedWithWrappedException(h2, ex);
2457 rs[2].assertNotInvoked();
2458 }
2459 try {
2460 assertEquals(null, h3.join());
2461 rs[3].assertInvoked();
2462 } catch (CompletionException ok) {
2463 checkCompletedWithWrappedException(h3, ex);
2464 rs[3].assertNotInvoked();
2465 }
2466
2467 checkCompletedNormally(f, v1);
2468 checkCompletedExceptionally(g, ex);
2469 }}
2470
2471 /**
2472 * runAfterEither result completes exceptionally if either source cancelled
2473 */
2474 public void testRunAfterEither_sourceCancelled() {
2475 for (ExecutionMode m : ExecutionMode.values())
2476 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2477 for (Integer v1 : new Integer[] { 1, null })
2478 {
2479 final CompletableFuture<Integer> f = new CompletableFuture<>();
2480 final CompletableFuture<Integer> g = new CompletableFuture<>();
2481 final Noop[] rs = new Noop[6];
2482 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2483
2484 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2485 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2486 checkIncomplete(h0);
2487 checkIncomplete(h1);
2488 rs[0].assertNotInvoked();
2489 rs[1].assertNotInvoked();
2490 f.cancel(mayInterruptIfRunning);
2491 checkCompletedWithWrappedCancellationException(h0);
2492 checkCompletedWithWrappedCancellationException(h1);
2493 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2494 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2495 checkCompletedWithWrappedCancellationException(h2);
2496 checkCompletedWithWrappedCancellationException(h3);
2497
2498 g.complete(v1);
2499
2500 // unspecified behavior - both source completions available
2501 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2502 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2503 try {
2504 assertNull(h4.join());
2505 rs[4].assertInvoked();
2506 } catch (CompletionException ok) {
2507 checkCompletedWithWrappedCancellationException(h4);
2508 rs[4].assertNotInvoked();
2509 }
2510 try {
2511 assertNull(h5.join());
2512 rs[5].assertInvoked();
2513 } catch (CompletionException ok) {
2514 checkCompletedWithWrappedCancellationException(h5);
2515 rs[5].assertNotInvoked();
2516 }
2517
2518 checkCancelled(f);
2519 checkCompletedNormally(g, v1);
2520 checkCompletedWithWrappedCancellationException(h0);
2521 checkCompletedWithWrappedCancellationException(h1);
2522 checkCompletedWithWrappedCancellationException(h2);
2523 checkCompletedWithWrappedCancellationException(h3);
2524 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2525 }}
2526
2527 /**
2528 * runAfterEither result completes exceptionally if action does
2529 */
2530 public void testRunAfterEither_actionFailed() {
2531 for (ExecutionMode m : ExecutionMode.values())
2532 for (Integer v1 : new Integer[] { 1, null })
2533 for (Integer v2 : new Integer[] { 2, null })
2534 {
2535 final CompletableFuture<Integer> f = new CompletableFuture<>();
2536 final CompletableFuture<Integer> g = new CompletableFuture<>();
2537 final FailingRunnable[] rs = new FailingRunnable[6];
2538 for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2539
2540 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2541 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2542 f.complete(v1);
2543 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2544 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2545 checkCompletedWithWrappedCFException(h0);
2546 checkCompletedWithWrappedCFException(h1);
2547 checkCompletedWithWrappedCFException(h2);
2548 checkCompletedWithWrappedCFException(h3);
2549 for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2550 g.complete(v2);
2551 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2552 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2553 checkCompletedWithWrappedCFException(h4);
2554 checkCompletedWithWrappedCFException(h5);
2555
2556 checkCompletedNormally(f, v1);
2557 checkCompletedNormally(g, v2);
2558 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2559 }}
2560
2561 /**
2562 * thenCompose result completes normally after normal completion of source
2563 */
2564 public void testThenCompose_normalCompletion() {
2565 for (ExecutionMode m : ExecutionMode.values())
2566 for (boolean createIncomplete : new boolean[] { true, false })
2567 for (Integer v1 : new Integer[] { 1, null })
2568 {
2569 final CompletableFuture<Integer> f = new CompletableFuture<>();
2570 final CompletableFutureInc r = new CompletableFutureInc(m);
2571 if (!createIncomplete) f.complete(v1);
2572 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2573 if (createIncomplete) f.complete(v1);
2574
2575 checkCompletedNormally(g, inc(v1));
2576 checkCompletedNormally(f, v1);
2577 r.assertValue(v1);
2578 }}
2579
2580 /**
2581 * thenCompose result completes exceptionally after exceptional
2582 * completion of source
2583 */
2584 public void testThenCompose_exceptionalCompletion() {
2585 for (ExecutionMode m : ExecutionMode.values())
2586 for (boolean createIncomplete : new boolean[] { true, false })
2587 {
2588 final CFException ex = new CFException();
2589 final CompletableFutureInc r = new CompletableFutureInc(m);
2590 final CompletableFuture<Integer> f = new CompletableFuture<>();
2591 if (!createIncomplete) f.completeExceptionally(ex);
2592 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2593 if (createIncomplete) f.completeExceptionally(ex);
2594
2595 checkCompletedWithWrappedException(g, ex);
2596 checkCompletedExceptionally(f, ex);
2597 r.assertNotInvoked();
2598 }}
2599
2600 /**
2601 * thenCompose result completes exceptionally if action does
2602 */
2603 public void testThenCompose_actionFailed() {
2604 for (ExecutionMode m : ExecutionMode.values())
2605 for (boolean createIncomplete : new boolean[] { true, false })
2606 for (Integer v1 : new Integer[] { 1, null })
2607 {
2608 final CompletableFuture<Integer> f = new CompletableFuture<>();
2609 final FailingCompletableFutureFunction r
2610 = new FailingCompletableFutureFunction(m);
2611 if (!createIncomplete) f.complete(v1);
2612 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2613 if (createIncomplete) f.complete(v1);
2614
2615 checkCompletedWithWrappedCFException(g);
2616 checkCompletedNormally(f, v1);
2617 }}
2618
2619 /**
2620 * thenCompose result completes exceptionally if source cancelled
2621 */
2622 public void testThenCompose_sourceCancelled() {
2623 for (ExecutionMode m : ExecutionMode.values())
2624 for (boolean createIncomplete : new boolean[] { true, false })
2625 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2626 {
2627 final CompletableFuture<Integer> f = new CompletableFuture<>();
2628 final CompletableFutureInc r = new CompletableFutureInc(m);
2629 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2630 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2631 if (createIncomplete) {
2632 checkIncomplete(g);
2633 assertTrue(f.cancel(mayInterruptIfRunning));
2634 }
2635
2636 checkCompletedWithWrappedCancellationException(g);
2637 checkCancelled(f);
2638 }}
2639
2640 // other static methods
2641
2642 /**
2643 * allOf(no component futures) returns a future completed normally
2644 * with the value null
2645 */
2646 public void testAllOf_empty() throws Exception {
2647 CompletableFuture<Void> f = CompletableFuture.allOf();
2648 checkCompletedNormally(f, null);
2649 }
2650
2651 /**
2652 * allOf returns a future completed normally with the value null
2653 * when all components complete normally
2654 */
2655 public void testAllOf_normal() throws Exception {
2656 for (int k = 1; k < 20; ++k) {
2657 CompletableFuture<Integer>[] fs
2658 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2659 for (int i = 0; i < k; ++i)
2660 fs[i] = new CompletableFuture<>();
2661 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2662 for (int i = 0; i < k; ++i) {
2663 checkIncomplete(f);
2664 checkIncomplete(CompletableFuture.allOf(fs));
2665 fs[i].complete(one);
2666 }
2667 checkCompletedNormally(f, null);
2668 checkCompletedNormally(CompletableFuture.allOf(fs), null);
2669 }
2670 }
2671
2672 public void testAllOf_backwards() throws Exception {
2673 for (int k = 1; k < 20; ++k) {
2674 CompletableFuture<Integer>[] fs
2675 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2676 for (int i = 0; i < k; ++i)
2677 fs[i] = new CompletableFuture<>();
2678 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2679 for (int i = k - 1; i >= 0; i--) {
2680 checkIncomplete(f);
2681 checkIncomplete(CompletableFuture.allOf(fs));
2682 fs[i].complete(one);
2683 }
2684 checkCompletedNormally(f, null);
2685 checkCompletedNormally(CompletableFuture.allOf(fs), null);
2686 }
2687 }
2688
2689 /**
2690 * anyOf(no component futures) returns an incomplete future
2691 */
2692 public void testAnyOf_empty() throws Exception {
2693 CompletableFuture<Object> f = CompletableFuture.anyOf();
2694 checkIncomplete(f);
2695 }
2696
2697 /**
2698 * anyOf returns a future completed normally with a value when
2699 * a component future does
2700 */
2701 public void testAnyOf_normal() throws Exception {
2702 for (int k = 0; k < 10; ++k) {
2703 CompletableFuture[] fs = new CompletableFuture[k];
2704 for (int i = 0; i < k; ++i)
2705 fs[i] = new CompletableFuture<>();
2706 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2707 checkIncomplete(f);
2708 for (int i = 0; i < k; ++i) {
2709 fs[i].complete(one);
2710 checkCompletedNormally(f, one);
2711 checkCompletedNormally(CompletableFuture.anyOf(fs), one);
2712 }
2713 }
2714 }
2715
2716 /**
2717 * anyOf result completes exceptionally when any component does.
2718 */
2719 public void testAnyOf_exceptional() throws Exception {
2720 for (int k = 0; k < 10; ++k) {
2721 CompletableFuture[] fs = new CompletableFuture[k];
2722 for (int i = 0; i < k; ++i)
2723 fs[i] = new CompletableFuture<>();
2724 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2725 checkIncomplete(f);
2726 for (int i = 0; i < k; ++i) {
2727 fs[i].completeExceptionally(new CFException());
2728 checkCompletedWithWrappedCFException(f);
2729 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
2730 }
2731 }
2732 }
2733
2734 /**
2735 * Completion methods throw NullPointerException with null arguments
2736 */
2737 public void testNPE() {
2738 CompletableFuture<Integer> f = new CompletableFuture<>();
2739 CompletableFuture<Integer> g = new CompletableFuture<>();
2740 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
2741 CompletableFuture<?> h;
2742 ThreadExecutor exec = new ThreadExecutor();
2743
2744 Runnable[] throwingActions = {
2745 () -> CompletableFuture.supplyAsync(null),
2746 () -> CompletableFuture.supplyAsync(null, exec),
2747 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.DEFAULT, 42), null),
2748
2749 () -> CompletableFuture.runAsync(null),
2750 () -> CompletableFuture.runAsync(null, exec),
2751 () -> CompletableFuture.runAsync(() -> {}, null),
2752
2753 () -> f.completeExceptionally(null),
2754
2755 () -> f.thenApply(null),
2756 () -> f.thenApplyAsync(null),
2757 () -> f.thenApplyAsync((x) -> x, null),
2758 () -> f.thenApplyAsync(null, exec),
2759
2760 () -> f.thenAccept(null),
2761 () -> f.thenAcceptAsync(null),
2762 () -> f.thenAcceptAsync((x) -> {} , null),
2763 () -> f.thenAcceptAsync(null, exec),
2764
2765 () -> f.thenRun(null),
2766 () -> f.thenRunAsync(null),
2767 () -> f.thenRunAsync(() -> {} , null),
2768 () -> f.thenRunAsync(null, exec),
2769
2770 () -> f.thenCombine(g, null),
2771 () -> f.thenCombineAsync(g, null),
2772 () -> f.thenCombineAsync(g, null, exec),
2773 () -> f.thenCombine(nullFuture, (x, y) -> x),
2774 () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
2775 () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
2776 () -> f.thenCombineAsync(g, (x, y) -> x, null),
2777
2778 () -> f.thenAcceptBoth(g, null),
2779 () -> f.thenAcceptBothAsync(g, null),
2780 () -> f.thenAcceptBothAsync(g, null, exec),
2781 () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
2782 () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
2783 () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
2784 () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
2785
2786 () -> f.runAfterBoth(g, null),
2787 () -> f.runAfterBothAsync(g, null),
2788 () -> f.runAfterBothAsync(g, null, exec),
2789 () -> f.runAfterBoth(nullFuture, () -> {}),
2790 () -> f.runAfterBothAsync(nullFuture, () -> {}),
2791 () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
2792 () -> f.runAfterBothAsync(g, () -> {}, null),
2793
2794 () -> f.applyToEither(g, null),
2795 () -> f.applyToEitherAsync(g, null),
2796 () -> f.applyToEitherAsync(g, null, exec),
2797 () -> f.applyToEither(nullFuture, (x) -> x),
2798 () -> f.applyToEitherAsync(nullFuture, (x) -> x),
2799 () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
2800 () -> f.applyToEitherAsync(g, (x) -> x, null),
2801
2802 () -> f.acceptEither(g, null),
2803 () -> f.acceptEitherAsync(g, null),
2804 () -> f.acceptEitherAsync(g, null, exec),
2805 () -> f.acceptEither(nullFuture, (x) -> {}),
2806 () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
2807 () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
2808 () -> f.acceptEitherAsync(g, (x) -> {}, null),
2809
2810 () -> f.runAfterEither(g, null),
2811 () -> f.runAfterEitherAsync(g, null),
2812 () -> f.runAfterEitherAsync(g, null, exec),
2813 () -> f.runAfterEither(nullFuture, () -> {}),
2814 () -> f.runAfterEitherAsync(nullFuture, () -> {}),
2815 () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
2816 () -> f.runAfterEitherAsync(g, () -> {}, null),
2817
2818 () -> f.thenCompose(null),
2819 () -> f.thenComposeAsync(null),
2820 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
2821 () -> f.thenComposeAsync(null, exec),
2822
2823 () -> f.exceptionally(null),
2824
2825 () -> f.handle(null),
2826
2827 () -> CompletableFuture.allOf((CompletableFuture<?>)null),
2828 () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
2829 () -> CompletableFuture.allOf(f, null),
2830 () -> CompletableFuture.allOf(null, f),
2831
2832 () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
2833 () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
2834 () -> CompletableFuture.anyOf(f, null),
2835 () -> CompletableFuture.anyOf(null, f),
2836
2837 () -> f.obtrudeException(null),
2838 };
2839
2840 assertThrows(NullPointerException.class, throwingActions);
2841 assertEquals(0, exec.count.get());
2842 }
2843
2844 /**
2845 * toCompletableFuture returns this CompletableFuture.
2846 */
2847 public void testToCompletableFuture() {
2848 CompletableFuture<Integer> f = new CompletableFuture<>();
2849 assertSame(f, f.toCompletableFuture());
2850 }
2851
2852 /**
2853 * whenComplete action executes on normal completion, propagating
2854 * source result.
2855 */
2856 public void testWhenComplete_normalCompletion1() {
2857 for (ExecutionMode m : ExecutionMode.values())
2858 for (boolean createIncomplete : new boolean[] { true, false })
2859 for (Integer v1 : new Integer[] { 1, null })
2860 {
2861 final AtomicInteger a = new AtomicInteger(0);
2862 final CompletableFuture<Integer> f = new CompletableFuture<>();
2863 if (!createIncomplete) f.complete(v1);
2864 final CompletableFuture<Integer> g = m.whenComplete
2865 (f,
2866 (Integer x, Throwable t) -> {
2867 m.checkExecutionMode();
2868 threadAssertSame(x, v1);
2869 threadAssertNull(t);
2870 a.getAndIncrement();
2871 });
2872 if (createIncomplete) f.complete(v1);
2873
2874 checkCompletedNormally(g, v1);
2875 checkCompletedNormally(f, v1);
2876 assertEquals(1, a.get());
2877 }}
2878
2879 /**
2880 * whenComplete action executes on exceptional completion, propagating
2881 * source result.
2882 */
2883 public void testWhenComplete_exceptionalCompletion() {
2884 for (ExecutionMode m : ExecutionMode.values())
2885 for (boolean createIncomplete : new boolean[] { true, false })
2886 for (Integer v1 : new Integer[] { 1, null })
2887 {
2888 final AtomicInteger a = new AtomicInteger(0);
2889 final CFException ex = new CFException();
2890 final CompletableFuture<Integer> f = new CompletableFuture<>();
2891 if (!createIncomplete) f.completeExceptionally(ex);
2892 final CompletableFuture<Integer> g = m.whenComplete
2893 (f,
2894 (Integer x, Throwable t) -> {
2895 m.checkExecutionMode();
2896 threadAssertNull(x);
2897 threadAssertSame(t, ex);
2898 a.getAndIncrement();
2899 });
2900 if (createIncomplete) f.completeExceptionally(ex);
2901 checkCompletedExceptionally(f, ex);
2902 checkCompletedWithWrappedException(g, ex);
2903 assertEquals(1, a.get());
2904 }}
2905
2906 /**
2907 * whenComplete action executes on cancelled source, propagating
2908 * CancellationException.
2909 */
2910 public void testWhenComplete_sourceCancelled() {
2911 for (ExecutionMode m : ExecutionMode.values())
2912 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2913 for (boolean createIncomplete : new boolean[] { true, false })
2914 {
2915 final AtomicInteger a = new AtomicInteger(0);
2916 final CompletableFuture<Integer> f = new CompletableFuture<>();
2917 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2918 final CompletableFuture<Integer> g = m.whenComplete
2919 (f,
2920 (Integer x, Throwable t) -> {
2921 m.checkExecutionMode();
2922 threadAssertNull(x);
2923 threadAssertTrue(t instanceof CancellationException);
2924 a.getAndIncrement();
2925 });
2926 if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2927
2928 checkCompletedWithWrappedCancellationException(g);
2929 checkCancelled(f);
2930 assertEquals(1, a.get());
2931 }}
2932
2933 /**
2934 * If a whenComplete action throws an exception when triggered by
2935 * a normal completion, it completes exceptionally
2936 */
2937 public void testWhenComplete_actionFailed() {
2938 for (boolean createIncomplete : new boolean[] { true, false })
2939 for (ExecutionMode m : ExecutionMode.values())
2940 for (Integer v1 : new Integer[] { 1, null })
2941 {
2942 final AtomicInteger a = new AtomicInteger(0);
2943 final CFException ex = new CFException();
2944 final CompletableFuture<Integer> f = new CompletableFuture<>();
2945 if (!createIncomplete) f.complete(v1);
2946 final CompletableFuture<Integer> g = m.whenComplete
2947 (f,
2948 (Integer x, Throwable t) -> {
2949 m.checkExecutionMode();
2950 threadAssertSame(x, v1);
2951 threadAssertNull(t);
2952 a.getAndIncrement();
2953 throw ex;
2954 });
2955 if (createIncomplete) f.complete(v1);
2956 checkCompletedNormally(f, v1);
2957 checkCompletedWithWrappedException(g, ex);
2958 assertEquals(1, a.get());
2959 }}
2960
2961 /**
2962 * If a whenComplete action throws an exception when triggered by
2963 * a source completion that also throws an exception, the source
2964 * exception takes precedence.
2965 */
2966 public void testWhenComplete_actionFailedSourceFailed() {
2967 for (boolean createIncomplete : new boolean[] { true, false })
2968 for (ExecutionMode m : ExecutionMode.values())
2969 for (Integer v1 : new Integer[] { 1, null })
2970 {
2971 final AtomicInteger a = new AtomicInteger(0);
2972 final CFException ex1 = new CFException();
2973 final CFException ex2 = new CFException();
2974 final CompletableFuture<Integer> f = new CompletableFuture<>();
2975
2976 if (!createIncomplete) f.completeExceptionally(ex1);
2977 final CompletableFuture<Integer> g = m.whenComplete
2978 (f,
2979 (Integer x, Throwable t) -> {
2980 m.checkExecutionMode();
2981 threadAssertSame(t, ex1);
2982 threadAssertNull(x);
2983 a.getAndIncrement();
2984 throw ex2;
2985 });
2986 if (createIncomplete) f.completeExceptionally(ex1);
2987
2988 checkCompletedExceptionally(f, ex1);
2989 checkCompletedWithWrappedException(g, ex1);
2990 assertEquals(1, a.get());
2991 }}
2992
2993 }