ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.91
Committed: Tue Jun 17 20:34:18 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.90: +53 -40 lines
Log Message:
add tests with 2 identical sources

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