ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.94
Committed: Wed Jun 18 02:37:38 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.93: +1 -1 lines
Log Message:
whitespace

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 (Integer v1 : new Integer[] { 1, null })
1495 {
1496 final CompletableFuture<Integer> f = new CompletableFuture<>();
1497 final NoopConsumer[] rs = new NoopConsumer[4];
1498 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1499
1500 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1501 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1502 checkIncomplete(h0);
1503 checkIncomplete(h1);
1504 assertTrue(f.complete(v1));
1505 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1506 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1507
1508 checkCompletedNormally(h0, null);
1509 checkCompletedNormally(h1, null);
1510 checkCompletedNormally(h2, null);
1511 checkCompletedNormally(h3, null);
1512 checkCompletedNormally(f, v1);
1513 for (NoopConsumer r : rs) r.assertValue(v1);
1514 }}
1515
1516 /**
1517 * thenAccept result completes exceptionally after exceptional
1518 * completion of source
1519 */
1520 public void testThenAccept_exceptionalCompletion() {
1521 for (ExecutionMode m : ExecutionMode.values())
1522 {
1523 final CFException ex = new CFException();
1524 final CompletableFuture<Integer> f = new CompletableFuture<>();
1525 final NoopConsumer[] rs = new NoopConsumer[4];
1526 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1527
1528 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1529 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1530 assertTrue(f.completeExceptionally(ex));
1531 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1532 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1533
1534 checkCompletedWithWrappedException(h0, ex);
1535 checkCompletedWithWrappedException(h1, ex);
1536 checkCompletedWithWrappedException(h2, ex);
1537 checkCompletedWithWrappedException(h3, ex);
1538 checkCompletedExceptionally(f, ex);
1539 for (NoopConsumer r : rs) r.assertNotInvoked();
1540 }}
1541
1542 /**
1543 * thenAccept result completes exceptionally if source cancelled
1544 */
1545 public void testThenAccept_sourceCancelled() {
1546 for (ExecutionMode m : ExecutionMode.values())
1547 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1548 {
1549 final CompletableFuture<Integer> f = new CompletableFuture<>();
1550 final NoopConsumer[] rs = new NoopConsumer[4];
1551 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1552
1553 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1554 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1555 assertTrue(f.cancel(mayInterruptIfRunning));
1556 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1557 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1558
1559 checkCompletedWithWrappedCancellationException(h0);
1560 checkCompletedWithWrappedCancellationException(h1);
1561 checkCompletedWithWrappedCancellationException(h2);
1562 checkCompletedWithWrappedCancellationException(h3);
1563 checkCancelled(f);
1564 for (NoopConsumer r : rs) r.assertNotInvoked();
1565 }}
1566
1567 /**
1568 * thenAccept result completes exceptionally if action does
1569 */
1570 public void testThenAccept_actionFailed() {
1571 for (ExecutionMode m : ExecutionMode.values())
1572 for (Integer v1 : new Integer[] { 1, null })
1573 {
1574 final CompletableFuture<Integer> f = new CompletableFuture<>();
1575 final FailingConsumer[] rs = new FailingConsumer[4];
1576 for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
1577
1578 final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1579 final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1580 assertTrue(f.complete(v1));
1581 final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1582 final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1583
1584 checkCompletedWithWrappedCFException(h0);
1585 checkCompletedWithWrappedCFException(h1);
1586 checkCompletedWithWrappedCFException(h2);
1587 checkCompletedWithWrappedCFException(h3);
1588 checkCompletedNormally(f, v1);
1589 }}
1590
1591 /**
1592 * thenCombine result completes normally after normal completion
1593 * of sources
1594 */
1595 public void testThenCombine_normalCompletion() {
1596 for (ExecutionMode m : ExecutionMode.values())
1597 for (boolean fFirst : new boolean[] { true, false })
1598 for (Integer v1 : new Integer[] { 1, null })
1599 for (Integer v2 : new Integer[] { 2, null })
1600 {
1601 final CompletableFuture<Integer> f = new CompletableFuture<>();
1602 final CompletableFuture<Integer> g = new CompletableFuture<>();
1603 final SubtractFunction[] rs = new SubtractFunction[6];
1604 for (int i = 0; i < rs.length; i++) rs[i] = new SubtractFunction(m);
1605
1606 final CompletableFuture<Integer> fst = fFirst ? f : g;
1607 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1608 final Integer w1 = fFirst ? v1 : v2;
1609 final Integer w2 = !fFirst ? v1 : v2;
1610
1611 final CompletableFuture<Integer> h0 = m.thenCombine(f, g, rs[0]);
1612 final CompletableFuture<Integer> h1 = m.thenCombine(fst, fst, rs[1]);
1613 assertTrue(fst.complete(w1));
1614 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, rs[2]);
1615 final CompletableFuture<Integer> h3 = m.thenCombine(fst, fst, rs[3]);
1616 checkIncomplete(h0); rs[0].assertNotInvoked();
1617 checkIncomplete(h2); rs[2].assertNotInvoked();
1618 checkCompletedNormally(h1, subtract(w1, w1));
1619 checkCompletedNormally(h3, subtract(w1, w1));
1620 rs[1].assertValue(subtract(w1, w1));
1621 rs[3].assertValue(subtract(w1, w1));
1622 assertTrue(snd.complete(w2));
1623 final CompletableFuture<Integer> h4 = m.thenCombine(f, g, rs[4]);
1624
1625 checkCompletedNormally(h0, subtract(v1, v2));
1626 checkCompletedNormally(h2, subtract(v1, v2));
1627 checkCompletedNormally(h4, subtract(v1, v2));
1628 rs[0].assertValue(subtract(v1, v2));
1629 rs[2].assertValue(subtract(v1, v2));
1630 rs[4].assertValue(subtract(v1, v2));
1631
1632 checkCompletedNormally(f, v1);
1633 checkCompletedNormally(g, v2);
1634 }}
1635
1636 /**
1637 * thenCombine result completes exceptionally after exceptional
1638 * completion of either source
1639 */
1640 public void testThenCombine_exceptionalCompletion() throws Throwable {
1641 for (ExecutionMode m : ExecutionMode.values())
1642 for (boolean fFirst : new boolean[] { true, false })
1643 for (boolean failFirst : new boolean[] { true, false })
1644 for (Integer v1 : new Integer[] { 1, null })
1645 {
1646 final CompletableFuture<Integer> f = new CompletableFuture<>();
1647 final CompletableFuture<Integer> g = new CompletableFuture<>();
1648 final CFException ex = new CFException();
1649 final SubtractFunction r1 = new SubtractFunction(m);
1650 final SubtractFunction r2 = new SubtractFunction(m);
1651 final SubtractFunction r3 = new SubtractFunction(m);
1652
1653 final CompletableFuture<Integer> fst = fFirst ? f : g;
1654 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1655 final Callable<Boolean> complete1 = failFirst ?
1656 () -> fst.completeExceptionally(ex) :
1657 () -> fst.complete(v1);
1658 final Callable<Boolean> complete2 = failFirst ?
1659 () -> snd.complete(v1) :
1660 () -> snd.completeExceptionally(ex);
1661
1662 final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1663 assertTrue(complete1.call());
1664 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1665 checkIncomplete(h1);
1666 checkIncomplete(h2);
1667 assertTrue(complete2.call());
1668 final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1669
1670 checkCompletedWithWrappedException(h1, ex);
1671 checkCompletedWithWrappedException(h2, ex);
1672 checkCompletedWithWrappedException(h3, ex);
1673 r1.assertNotInvoked();
1674 r2.assertNotInvoked();
1675 r3.assertNotInvoked();
1676 checkCompletedNormally(failFirst ? snd : fst, v1);
1677 checkCompletedExceptionally(failFirst ? fst : snd, ex);
1678 }}
1679
1680 /**
1681 * thenCombine result completes exceptionally if either source cancelled
1682 */
1683 public void testThenCombine_sourceCancelled() throws Throwable {
1684 for (ExecutionMode m : ExecutionMode.values())
1685 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1686 for (boolean fFirst : new boolean[] { true, false })
1687 for (boolean failFirst : new boolean[] { true, false })
1688 for (Integer v1 : new Integer[] { 1, null })
1689 {
1690 final CompletableFuture<Integer> f = new CompletableFuture<>();
1691 final CompletableFuture<Integer> g = new CompletableFuture<>();
1692 final SubtractFunction r1 = new SubtractFunction(m);
1693 final SubtractFunction r2 = new SubtractFunction(m);
1694 final SubtractFunction r3 = new SubtractFunction(m);
1695
1696 final CompletableFuture<Integer> fst = fFirst ? f : g;
1697 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1698 final Callable<Boolean> complete1 = failFirst ?
1699 () -> fst.cancel(mayInterruptIfRunning) :
1700 () -> fst.complete(v1);
1701 final Callable<Boolean> complete2 = failFirst ?
1702 () -> snd.complete(v1) :
1703 () -> snd.cancel(mayInterruptIfRunning);
1704
1705 final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1706 assertTrue(complete1.call());
1707 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1708 checkIncomplete(h1);
1709 checkIncomplete(h2);
1710 assertTrue(complete2.call());
1711 final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1712
1713 checkCompletedWithWrappedCancellationException(h1);
1714 checkCompletedWithWrappedCancellationException(h2);
1715 checkCompletedWithWrappedCancellationException(h3);
1716 r1.assertNotInvoked();
1717 r2.assertNotInvoked();
1718 r3.assertNotInvoked();
1719 checkCompletedNormally(failFirst ? snd : fst, v1);
1720 checkCancelled(failFirst ? fst : snd);
1721 }}
1722
1723 /**
1724 * thenCombine result completes exceptionally if action does
1725 */
1726 public void testThenCombine_actionFailed() {
1727 for (ExecutionMode m : ExecutionMode.values())
1728 for (boolean fFirst : new boolean[] { true, false })
1729 for (Integer v1 : new Integer[] { 1, null })
1730 for (Integer v2 : new Integer[] { 2, null })
1731 {
1732 final CompletableFuture<Integer> f = new CompletableFuture<>();
1733 final CompletableFuture<Integer> g = new CompletableFuture<>();
1734 final FailingBiFunction r1 = new FailingBiFunction(m);
1735 final FailingBiFunction r2 = new FailingBiFunction(m);
1736 final FailingBiFunction r3 = new FailingBiFunction(m);
1737
1738 final CompletableFuture<Integer> fst = fFirst ? f : g;
1739 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1740 final Integer w1 = fFirst ? v1 : v2;
1741 final Integer w2 = !fFirst ? v1 : v2;
1742
1743 final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1744 assertTrue(fst.complete(w1));
1745 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1746 assertTrue(snd.complete(w2));
1747 final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1748
1749 checkCompletedWithWrappedCFException(h1);
1750 checkCompletedWithWrappedCFException(h2);
1751 checkCompletedWithWrappedCFException(h3);
1752 r1.assertInvoked();
1753 r2.assertInvoked();
1754 r3.assertInvoked();
1755 checkCompletedNormally(f, v1);
1756 checkCompletedNormally(g, v2);
1757 }}
1758
1759 /**
1760 * thenAcceptBoth result completes normally after normal
1761 * completion of sources
1762 */
1763 public void testThenAcceptBoth_normalCompletion() {
1764 for (ExecutionMode m : ExecutionMode.values())
1765 for (boolean fFirst : new boolean[] { true, false })
1766 for (Integer v1 : new Integer[] { 1, null })
1767 for (Integer v2 : new Integer[] { 2, null })
1768 {
1769 final CompletableFuture<Integer> f = new CompletableFuture<>();
1770 final CompletableFuture<Integer> g = new CompletableFuture<>();
1771 final SubtractAction r1 = new SubtractAction(m);
1772 final SubtractAction r2 = new SubtractAction(m);
1773 final SubtractAction r3 = new SubtractAction(m);
1774
1775 final CompletableFuture<Integer> fst = fFirst ? f : g;
1776 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1777 final Integer w1 = fFirst ? v1 : v2;
1778 final Integer w2 = !fFirst ? v1 : v2;
1779
1780 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1781 assertTrue(fst.complete(w1));
1782 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1783 checkIncomplete(h1);
1784 checkIncomplete(h2);
1785 r1.assertNotInvoked();
1786 r2.assertNotInvoked();
1787 assertTrue(snd.complete(w2));
1788 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1789
1790 checkCompletedNormally(h1, null);
1791 checkCompletedNormally(h2, null);
1792 checkCompletedNormally(h3, null);
1793 r1.assertValue(subtract(v1, v2));
1794 r2.assertValue(subtract(v1, v2));
1795 r3.assertValue(subtract(v1, v2));
1796 checkCompletedNormally(f, v1);
1797 checkCompletedNormally(g, v2);
1798 }}
1799
1800 /**
1801 * thenAcceptBoth result completes exceptionally after exceptional
1802 * completion of either source
1803 */
1804 public void testThenAcceptBoth_exceptionalCompletion() throws Throwable {
1805 for (ExecutionMode m : ExecutionMode.values())
1806 for (boolean fFirst : new boolean[] { true, false })
1807 for (boolean failFirst : new boolean[] { true, false })
1808 for (Integer v1 : new Integer[] { 1, null })
1809 {
1810 final CompletableFuture<Integer> f = new CompletableFuture<>();
1811 final CompletableFuture<Integer> g = new CompletableFuture<>();
1812 final CFException ex = new CFException();
1813 final SubtractAction r1 = new SubtractAction(m);
1814 final SubtractAction r2 = new SubtractAction(m);
1815 final SubtractAction r3 = new SubtractAction(m);
1816
1817 final CompletableFuture<Integer> fst = fFirst ? f : g;
1818 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1819 final Callable<Boolean> complete1 = failFirst ?
1820 () -> fst.completeExceptionally(ex) :
1821 () -> fst.complete(v1);
1822 final Callable<Boolean> complete2 = failFirst ?
1823 () -> snd.complete(v1) :
1824 () -> snd.completeExceptionally(ex);
1825
1826 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1827 assertTrue(complete1.call());
1828 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1829 checkIncomplete(h1);
1830 checkIncomplete(h2);
1831 assertTrue(complete2.call());
1832 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1833
1834 checkCompletedWithWrappedException(h1, ex);
1835 checkCompletedWithWrappedException(h2, ex);
1836 checkCompletedWithWrappedException(h3, ex);
1837 r1.assertNotInvoked();
1838 r2.assertNotInvoked();
1839 r3.assertNotInvoked();
1840 checkCompletedNormally(failFirst ? snd : fst, v1);
1841 checkCompletedExceptionally(failFirst ? fst : snd, ex);
1842 }}
1843
1844 /**
1845 * thenAcceptBoth result completes exceptionally if either source cancelled
1846 */
1847 public void testThenAcceptBoth_sourceCancelled() throws Throwable {
1848 for (ExecutionMode m : ExecutionMode.values())
1849 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1850 for (boolean fFirst : new boolean[] { true, false })
1851 for (boolean failFirst : new boolean[] { true, false })
1852 for (Integer v1 : new Integer[] { 1, null })
1853 {
1854 final CompletableFuture<Integer> f = new CompletableFuture<>();
1855 final CompletableFuture<Integer> g = new CompletableFuture<>();
1856 final SubtractAction r1 = new SubtractAction(m);
1857 final SubtractAction r2 = new SubtractAction(m);
1858 final SubtractAction r3 = new SubtractAction(m);
1859
1860 final CompletableFuture<Integer> fst = fFirst ? f : g;
1861 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1862 final Callable<Boolean> complete1 = failFirst ?
1863 () -> fst.cancel(mayInterruptIfRunning) :
1864 () -> fst.complete(v1);
1865 final Callable<Boolean> complete2 = failFirst ?
1866 () -> snd.complete(v1) :
1867 () -> snd.cancel(mayInterruptIfRunning);
1868
1869 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1870 assertTrue(complete1.call());
1871 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1872 checkIncomplete(h1);
1873 checkIncomplete(h2);
1874 assertTrue(complete2.call());
1875 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1876
1877 checkCompletedWithWrappedCancellationException(h1);
1878 checkCompletedWithWrappedCancellationException(h2);
1879 checkCompletedWithWrappedCancellationException(h3);
1880 r1.assertNotInvoked();
1881 r2.assertNotInvoked();
1882 r3.assertNotInvoked();
1883 checkCompletedNormally(failFirst ? snd : fst, v1);
1884 checkCancelled(failFirst ? fst : snd);
1885 }}
1886
1887 /**
1888 * thenAcceptBoth result completes exceptionally if action does
1889 */
1890 public void testThenAcceptBoth_actionFailed() {
1891 for (ExecutionMode m : ExecutionMode.values())
1892 for (boolean fFirst : new boolean[] { true, false })
1893 for (Integer v1 : new Integer[] { 1, null })
1894 for (Integer v2 : new Integer[] { 2, null })
1895 {
1896 final CompletableFuture<Integer> f = new CompletableFuture<>();
1897 final CompletableFuture<Integer> g = new CompletableFuture<>();
1898 final FailingBiConsumer r1 = new FailingBiConsumer(m);
1899 final FailingBiConsumer r2 = new FailingBiConsumer(m);
1900 final FailingBiConsumer r3 = new FailingBiConsumer(m);
1901
1902 final CompletableFuture<Integer> fst = fFirst ? f : g;
1903 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1904 final Integer w1 = fFirst ? v1 : v2;
1905 final Integer w2 = !fFirst ? v1 : v2;
1906
1907 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1908 assertTrue(fst.complete(w1));
1909 final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1910 assertTrue(snd.complete(w2));
1911 final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1912
1913 checkCompletedWithWrappedCFException(h1);
1914 checkCompletedWithWrappedCFException(h2);
1915 checkCompletedWithWrappedCFException(h3);
1916 r1.assertInvoked();
1917 r2.assertInvoked();
1918 r3.assertInvoked();
1919 checkCompletedNormally(f, v1);
1920 checkCompletedNormally(g, v2);
1921 }}
1922
1923 /**
1924 * runAfterBoth result completes normally after normal
1925 * completion of sources
1926 */
1927 public void testRunAfterBoth_normalCompletion() {
1928 for (ExecutionMode m : ExecutionMode.values())
1929 for (boolean fFirst : new boolean[] { true, false })
1930 for (Integer v1 : new Integer[] { 1, null })
1931 for (Integer v2 : new Integer[] { 2, null })
1932 {
1933 final CompletableFuture<Integer> f = new CompletableFuture<>();
1934 final CompletableFuture<Integer> g = new CompletableFuture<>();
1935 final Noop r1 = new Noop(m);
1936 final Noop r2 = new Noop(m);
1937 final Noop r3 = new Noop(m);
1938
1939 final CompletableFuture<Integer> fst = fFirst ? f : g;
1940 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1941 final Integer w1 = fFirst ? v1 : v2;
1942 final Integer w2 = !fFirst ? v1 : v2;
1943
1944 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1945 assertTrue(fst.complete(w1));
1946 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1947 checkIncomplete(h1);
1948 checkIncomplete(h2);
1949 r1.assertNotInvoked();
1950 r2.assertNotInvoked();
1951 assertTrue(snd.complete(w2));
1952 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
1953
1954 checkCompletedNormally(h1, null);
1955 checkCompletedNormally(h2, null);
1956 checkCompletedNormally(h3, null);
1957 r1.assertInvoked();
1958 r2.assertInvoked();
1959 r3.assertInvoked();
1960 checkCompletedNormally(f, v1);
1961 checkCompletedNormally(g, v2);
1962 }}
1963
1964 /**
1965 * runAfterBoth result completes exceptionally after exceptional
1966 * completion of either source
1967 */
1968 public void testRunAfterBoth_exceptionalCompletion() throws Throwable {
1969 for (ExecutionMode m : ExecutionMode.values())
1970 for (boolean fFirst : new boolean[] { true, false })
1971 for (boolean failFirst : new boolean[] { true, false })
1972 for (Integer v1 : new Integer[] { 1, null })
1973 {
1974 final CompletableFuture<Integer> f = new CompletableFuture<>();
1975 final CompletableFuture<Integer> g = new CompletableFuture<>();
1976 final CFException ex = new CFException();
1977 final Noop r1 = new Noop(m);
1978 final Noop r2 = new Noop(m);
1979 final Noop r3 = new Noop(m);
1980
1981 final CompletableFuture<Integer> fst = fFirst ? f : g;
1982 final CompletableFuture<Integer> snd = !fFirst ? f : g;
1983 final Callable<Boolean> complete1 = failFirst ?
1984 () -> fst.completeExceptionally(ex) :
1985 () -> fst.complete(v1);
1986 final Callable<Boolean> complete2 = failFirst ?
1987 () -> snd.complete(v1) :
1988 () -> snd.completeExceptionally(ex);
1989
1990 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1991 assertTrue(complete1.call());
1992 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1993 checkIncomplete(h1);
1994 checkIncomplete(h2);
1995 assertTrue(complete2.call());
1996 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
1997
1998 checkCompletedWithWrappedException(h1, ex);
1999 checkCompletedWithWrappedException(h2, ex);
2000 checkCompletedWithWrappedException(h3, ex);
2001 r1.assertNotInvoked();
2002 r2.assertNotInvoked();
2003 r3.assertNotInvoked();
2004 checkCompletedNormally(failFirst ? snd : fst, v1);
2005 checkCompletedExceptionally(failFirst ? fst : snd, ex);
2006 }}
2007
2008 /**
2009 * runAfterBoth result completes exceptionally if either source cancelled
2010 */
2011 public void testRunAfterBoth_sourceCancelled() throws Throwable {
2012 for (ExecutionMode m : ExecutionMode.values())
2013 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2014 for (boolean fFirst : new boolean[] { true, false })
2015 for (boolean failFirst : new boolean[] { true, false })
2016 for (Integer v1 : new Integer[] { 1, null })
2017 {
2018 final CompletableFuture<Integer> f = new CompletableFuture<>();
2019 final CompletableFuture<Integer> g = new CompletableFuture<>();
2020 final Noop r1 = new Noop(m);
2021 final Noop r2 = new Noop(m);
2022 final Noop r3 = new Noop(m);
2023
2024 final CompletableFuture<Integer> fst = fFirst ? f : g;
2025 final CompletableFuture<Integer> snd = !fFirst ? f : g;
2026 final Callable<Boolean> complete1 = failFirst ?
2027 () -> fst.cancel(mayInterruptIfRunning) :
2028 () -> fst.complete(v1);
2029 final Callable<Boolean> complete2 = failFirst ?
2030 () -> snd.complete(v1) :
2031 () -> snd.cancel(mayInterruptIfRunning);
2032
2033 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2034 assertTrue(complete1.call());
2035 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2036 checkIncomplete(h1);
2037 checkIncomplete(h2);
2038 assertTrue(complete2.call());
2039 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2040
2041 checkCompletedWithWrappedCancellationException(h1);
2042 checkCompletedWithWrappedCancellationException(h2);
2043 checkCompletedWithWrappedCancellationException(h3);
2044 r1.assertNotInvoked();
2045 r2.assertNotInvoked();
2046 r3.assertNotInvoked();
2047 checkCompletedNormally(failFirst ? snd : fst, v1);
2048 checkCancelled(failFirst ? fst : snd);
2049 }}
2050
2051 /**
2052 * runAfterBoth result completes exceptionally if action does
2053 */
2054 public void testRunAfterBoth_actionFailed() {
2055 for (ExecutionMode m : ExecutionMode.values())
2056 for (boolean fFirst : new boolean[] { true, false })
2057 for (Integer v1 : new Integer[] { 1, null })
2058 for (Integer v2 : new Integer[] { 2, null })
2059 {
2060 final CompletableFuture<Integer> f = new CompletableFuture<>();
2061 final CompletableFuture<Integer> g = new CompletableFuture<>();
2062 final FailingRunnable r1 = new FailingRunnable(m);
2063 final FailingRunnable r2 = new FailingRunnable(m);
2064 final FailingRunnable r3 = new FailingRunnable(m);
2065
2066 final CompletableFuture<Integer> fst = fFirst ? f : g;
2067 final CompletableFuture<Integer> snd = !fFirst ? f : g;
2068 final Integer w1 = fFirst ? v1 : v2;
2069 final Integer w2 = !fFirst ? v1 : v2;
2070
2071 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2072 assertTrue(fst.complete(w1));
2073 final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2074 assertTrue(snd.complete(w2));
2075 final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2076
2077 checkCompletedWithWrappedCFException(h1);
2078 checkCompletedWithWrappedCFException(h2);
2079 checkCompletedWithWrappedCFException(h3);
2080 r1.assertInvoked();
2081 r2.assertInvoked();
2082 r3.assertInvoked();
2083 checkCompletedNormally(f, v1);
2084 checkCompletedNormally(g, v2);
2085 }}
2086
2087 /**
2088 * applyToEither result completes normally after normal completion
2089 * of either source
2090 */
2091 public void testApplyToEither_normalCompletion() {
2092 for (ExecutionMode m : ExecutionMode.values())
2093 for (Integer v1 : new Integer[] { 1, null })
2094 for (Integer v2 : new Integer[] { 2, null })
2095 {
2096 final CompletableFuture<Integer> f = new CompletableFuture<>();
2097 final CompletableFuture<Integer> g = new CompletableFuture<>();
2098 final IncFunction[] rs = new IncFunction[6];
2099 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2100
2101 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2102 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2103 checkIncomplete(h0);
2104 checkIncomplete(h1);
2105 rs[0].assertNotInvoked();
2106 rs[1].assertNotInvoked();
2107 f.complete(v1);
2108 checkCompletedNormally(h0, inc(v1));
2109 checkCompletedNormally(h1, inc(v1));
2110 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2111 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2112 checkCompletedNormally(h2, inc(v1));
2113 checkCompletedNormally(h3, inc(v1));
2114 g.complete(v2);
2115
2116 // unspecified behavior - both source completions available
2117 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2118 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2119 rs[4].assertValue(h4.join());
2120 rs[5].assertValue(h5.join());
2121 assertTrue(Objects.equals(inc(v1), h4.join()) ||
2122 Objects.equals(inc(v2), h4.join()));
2123 assertTrue(Objects.equals(inc(v1), h5.join()) ||
2124 Objects.equals(inc(v2), h5.join()));
2125
2126 checkCompletedNormally(f, v1);
2127 checkCompletedNormally(g, v2);
2128 checkCompletedNormally(h0, inc(v1));
2129 checkCompletedNormally(h1, inc(v1));
2130 checkCompletedNormally(h2, inc(v1));
2131 checkCompletedNormally(h3, inc(v1));
2132 for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
2133 }}
2134
2135 /**
2136 * applyToEither result completes exceptionally after exceptional
2137 * completion of either source
2138 */
2139 public void testApplyToEither_exceptionalCompletion() {
2140 for (ExecutionMode m : ExecutionMode.values())
2141 for (Integer v1 : new Integer[] { 1, null })
2142 {
2143 final CompletableFuture<Integer> f = new CompletableFuture<>();
2144 final CompletableFuture<Integer> g = new CompletableFuture<>();
2145 final CFException ex = new CFException();
2146 final IncFunction[] rs = new IncFunction[6];
2147 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2148
2149 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2150 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2151 checkIncomplete(h0);
2152 checkIncomplete(h1);
2153 rs[0].assertNotInvoked();
2154 rs[1].assertNotInvoked();
2155 f.completeExceptionally(ex);
2156 checkCompletedWithWrappedException(h0, ex);
2157 checkCompletedWithWrappedException(h1, ex);
2158 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2159 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2160 checkCompletedWithWrappedException(h2, ex);
2161 checkCompletedWithWrappedException(h3, ex);
2162 g.complete(v1);
2163
2164 // unspecified behavior - both source completions available
2165 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2166 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2167 try {
2168 assertEquals(inc(v1), h4.join());
2169 rs[4].assertValue(inc(v1));
2170 } catch (CompletionException ok) {
2171 checkCompletedWithWrappedException(h4, ex);
2172 rs[4].assertNotInvoked();
2173 }
2174 try {
2175 assertEquals(inc(v1), h5.join());
2176 rs[5].assertValue(inc(v1));
2177 } catch (CompletionException ok) {
2178 checkCompletedWithWrappedException(h5, ex);
2179 rs[5].assertNotInvoked();
2180 }
2181
2182 checkCompletedExceptionally(f, ex);
2183 checkCompletedNormally(g, v1);
2184 checkCompletedWithWrappedException(h0, ex);
2185 checkCompletedWithWrappedException(h1, ex);
2186 checkCompletedWithWrappedException(h2, ex);
2187 checkCompletedWithWrappedException(h3, ex);
2188 checkCompletedWithWrappedException(h4, ex);
2189 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2190 }}
2191
2192 public void testApplyToEither_exceptionalCompletion2() {
2193 for (ExecutionMode m : ExecutionMode.values())
2194 for (boolean fFirst : new boolean[] { true, false })
2195 for (Integer v1 : new Integer[] { 1, null })
2196 {
2197 final CompletableFuture<Integer> f = new CompletableFuture<>();
2198 final CompletableFuture<Integer> g = new CompletableFuture<>();
2199 final CFException ex = new CFException();
2200 final IncFunction[] rs = new IncFunction[6];
2201 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2202
2203 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2204 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2205 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2206 assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2207 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2208 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2209
2210 // unspecified behavior - both source completions available
2211 try {
2212 assertEquals(inc(v1), h0.join());
2213 rs[0].assertValue(inc(v1));
2214 } catch (CompletionException ok) {
2215 checkCompletedWithWrappedException(h0, ex);
2216 rs[0].assertNotInvoked();
2217 }
2218 try {
2219 assertEquals(inc(v1), h1.join());
2220 rs[1].assertValue(inc(v1));
2221 } catch (CompletionException ok) {
2222 checkCompletedWithWrappedException(h1, ex);
2223 rs[1].assertNotInvoked();
2224 }
2225 try {
2226 assertEquals(inc(v1), h2.join());
2227 rs[2].assertValue(inc(v1));
2228 } catch (CompletionException ok) {
2229 checkCompletedWithWrappedException(h2, ex);
2230 rs[2].assertNotInvoked();
2231 }
2232 try {
2233 assertEquals(inc(v1), h3.join());
2234 rs[3].assertValue(inc(v1));
2235 } catch (CompletionException ok) {
2236 checkCompletedWithWrappedException(h3, ex);
2237 rs[3].assertNotInvoked();
2238 }
2239
2240 checkCompletedNormally(f, v1);
2241 checkCompletedExceptionally(g, ex);
2242 }}
2243
2244 /**
2245 * applyToEither result completes exceptionally if either source cancelled
2246 */
2247 public void testApplyToEither_sourceCancelled() {
2248 for (ExecutionMode m : ExecutionMode.values())
2249 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2250 for (Integer v1 : new Integer[] { 1, null })
2251 {
2252 final CompletableFuture<Integer> f = new CompletableFuture<>();
2253 final CompletableFuture<Integer> g = new CompletableFuture<>();
2254 final IncFunction[] rs = new IncFunction[6];
2255 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2256
2257 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2258 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2259 checkIncomplete(h0);
2260 checkIncomplete(h1);
2261 rs[0].assertNotInvoked();
2262 rs[1].assertNotInvoked();
2263 f.cancel(mayInterruptIfRunning);
2264 checkCompletedWithWrappedCancellationException(h0);
2265 checkCompletedWithWrappedCancellationException(h1);
2266 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2267 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2268 checkCompletedWithWrappedCancellationException(h2);
2269 checkCompletedWithWrappedCancellationException(h3);
2270 g.complete(v1);
2271
2272 // unspecified behavior - both source completions available
2273 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2274 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2275 try {
2276 assertEquals(inc(v1), h4.join());
2277 rs[4].assertValue(inc(v1));
2278 } catch (CompletionException ok) {
2279 checkCompletedWithWrappedCancellationException(h4);
2280 rs[4].assertNotInvoked();
2281 }
2282 try {
2283 assertEquals(inc(v1), h5.join());
2284 rs[5].assertValue(inc(v1));
2285 } catch (CompletionException ok) {
2286 checkCompletedWithWrappedCancellationException(h5);
2287 rs[5].assertNotInvoked();
2288 }
2289
2290 checkCancelled(f);
2291 checkCompletedNormally(g, v1);
2292 checkCompletedWithWrappedCancellationException(h0);
2293 checkCompletedWithWrappedCancellationException(h1);
2294 checkCompletedWithWrappedCancellationException(h2);
2295 checkCompletedWithWrappedCancellationException(h3);
2296 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2297 }}
2298
2299 public void testApplyToEither_sourceCancelled2() {
2300 for (ExecutionMode m : ExecutionMode.values())
2301 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2302 for (boolean fFirst : new boolean[] { true, false })
2303 for (Integer v1 : new Integer[] { 1, null })
2304 {
2305 final CompletableFuture<Integer> f = new CompletableFuture<>();
2306 final CompletableFuture<Integer> g = new CompletableFuture<>();
2307 final IncFunction[] rs = new IncFunction[6];
2308 for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2309
2310 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2311 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2312 assertTrue(fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2313 assertTrue(!fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2314 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2315 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2316
2317 // unspecified behavior - both source completions available
2318 try {
2319 assertEquals(inc(v1), h0.join());
2320 rs[0].assertValue(inc(v1));
2321 } catch (CompletionException ok) {
2322 checkCompletedWithWrappedCancellationException(h0);
2323 rs[0].assertNotInvoked();
2324 }
2325 try {
2326 assertEquals(inc(v1), h1.join());
2327 rs[1].assertValue(inc(v1));
2328 } catch (CompletionException ok) {
2329 checkCompletedWithWrappedCancellationException(h1);
2330 rs[1].assertNotInvoked();
2331 }
2332 try {
2333 assertEquals(inc(v1), h2.join());
2334 rs[2].assertValue(inc(v1));
2335 } catch (CompletionException ok) {
2336 checkCompletedWithWrappedCancellationException(h2);
2337 rs[2].assertNotInvoked();
2338 }
2339 try {
2340 assertEquals(inc(v1), h3.join());
2341 rs[3].assertValue(inc(v1));
2342 } catch (CompletionException ok) {
2343 checkCompletedWithWrappedCancellationException(h3);
2344 rs[3].assertNotInvoked();
2345 }
2346
2347 checkCompletedNormally(f, v1);
2348 checkCancelled(g);
2349 }}
2350
2351 /**
2352 * applyToEither result completes exceptionally if action does
2353 */
2354 public void testApplyToEither_actionFailed() {
2355 for (ExecutionMode m : ExecutionMode.values())
2356 for (Integer v1 : new Integer[] { 1, null })
2357 for (Integer v2 : new Integer[] { 2, null })
2358 {
2359 final CompletableFuture<Integer> f = new CompletableFuture<>();
2360 final CompletableFuture<Integer> g = new CompletableFuture<>();
2361 final FailingFunction[] rs = new FailingFunction[6];
2362 for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2363
2364 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2365 final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2366 f.complete(v1);
2367 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2368 final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2369 checkCompletedWithWrappedCFException(h0);
2370 checkCompletedWithWrappedCFException(h1);
2371 checkCompletedWithWrappedCFException(h2);
2372 checkCompletedWithWrappedCFException(h3);
2373 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2374
2375 g.complete(v2);
2376
2377 // unspecified behavior - both source completions available
2378 final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2379 final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2380
2381 checkCompletedWithWrappedCFException(h4);
2382 assertTrue(Objects.equals(v1, rs[4].value) ||
2383 Objects.equals(v2, rs[4].value));
2384 checkCompletedWithWrappedCFException(h5);
2385 assertTrue(Objects.equals(v1, rs[5].value) ||
2386 Objects.equals(v2, rs[5].value));
2387
2388 checkCompletedNormally(f, v1);
2389 checkCompletedNormally(g, v2);
2390 }}
2391
2392 /**
2393 * acceptEither result completes normally after normal completion
2394 * of either source
2395 */
2396 public void testAcceptEither_normalCompletion() {
2397 for (ExecutionMode m : ExecutionMode.values())
2398 for (Integer v1 : new Integer[] { 1, null })
2399 for (Integer v2 : new Integer[] { 2, null })
2400 {
2401 final CompletableFuture<Integer> f = new CompletableFuture<>();
2402 final CompletableFuture<Integer> g = new CompletableFuture<>();
2403 final NoopConsumer[] rs = new NoopConsumer[6];
2404 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2405
2406 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2407 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2408 checkIncomplete(h0);
2409 checkIncomplete(h1);
2410 rs[0].assertNotInvoked();
2411 rs[1].assertNotInvoked();
2412 f.complete(v1);
2413 checkCompletedNormally(h0, null);
2414 checkCompletedNormally(h1, null);
2415 rs[0].assertValue(v1);
2416 rs[1].assertValue(v1);
2417 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2418 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2419 checkCompletedNormally(h2, null);
2420 checkCompletedNormally(h3, null);
2421 rs[2].assertValue(v1);
2422 rs[3].assertValue(v1);
2423 g.complete(v2);
2424
2425 // unspecified behavior - both source completions available
2426 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2427 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2428 checkCompletedNormally(h4, null);
2429 checkCompletedNormally(h5, null);
2430 assertTrue(Objects.equals(v1, rs[4].value) ||
2431 Objects.equals(v2, rs[4].value));
2432 assertTrue(Objects.equals(v1, rs[5].value) ||
2433 Objects.equals(v2, rs[5].value));
2434
2435 checkCompletedNormally(f, v1);
2436 checkCompletedNormally(g, v2);
2437 checkCompletedNormally(h0, null);
2438 checkCompletedNormally(h1, null);
2439 checkCompletedNormally(h2, null);
2440 checkCompletedNormally(h3, null);
2441 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2442 }}
2443
2444 /**
2445 * acceptEither result completes exceptionally after exceptional
2446 * completion of either source
2447 */
2448 public void testAcceptEither_exceptionalCompletion() {
2449 for (ExecutionMode m : ExecutionMode.values())
2450 for (Integer v1 : new Integer[] { 1, null })
2451 {
2452 final CompletableFuture<Integer> f = new CompletableFuture<>();
2453 final CompletableFuture<Integer> g = new CompletableFuture<>();
2454 final CFException ex = new CFException();
2455 final NoopConsumer[] rs = new NoopConsumer[6];
2456 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2457
2458 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2459 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2460 checkIncomplete(h0);
2461 checkIncomplete(h1);
2462 rs[0].assertNotInvoked();
2463 rs[1].assertNotInvoked();
2464 f.completeExceptionally(ex);
2465 checkCompletedWithWrappedException(h0, ex);
2466 checkCompletedWithWrappedException(h1, ex);
2467 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2468 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2469 checkCompletedWithWrappedException(h2, ex);
2470 checkCompletedWithWrappedException(h3, ex);
2471
2472 g.complete(v1);
2473
2474 // unspecified behavior - both source completions available
2475 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2476 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2477 try {
2478 assertNull(h4.join());
2479 rs[4].assertValue(v1);
2480 } catch (CompletionException ok) {
2481 checkCompletedWithWrappedException(h4, ex);
2482 rs[4].assertNotInvoked();
2483 }
2484 try {
2485 assertNull(h5.join());
2486 rs[5].assertValue(v1);
2487 } catch (CompletionException ok) {
2488 checkCompletedWithWrappedException(h5, ex);
2489 rs[5].assertNotInvoked();
2490 }
2491
2492 checkCompletedExceptionally(f, ex);
2493 checkCompletedNormally(g, v1);
2494 checkCompletedWithWrappedException(h0, ex);
2495 checkCompletedWithWrappedException(h1, ex);
2496 checkCompletedWithWrappedException(h2, ex);
2497 checkCompletedWithWrappedException(h3, ex);
2498 checkCompletedWithWrappedException(h4, ex);
2499 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2500 }}
2501
2502 public void testAcceptEither_exceptionalCompletion2() {
2503 for (ExecutionMode m : ExecutionMode.values())
2504 for (boolean fFirst : new boolean[] { true, false })
2505 for (Integer v1 : new Integer[] { 1, null })
2506 {
2507 final CompletableFuture<Integer> f = new CompletableFuture<>();
2508 final CompletableFuture<Integer> g = new CompletableFuture<>();
2509 final CFException ex = new CFException();
2510 final NoopConsumer[] rs = new NoopConsumer[6];
2511 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2512
2513 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2514 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2515 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2516 assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2517 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2518 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2519
2520 // unspecified behavior - both source completions available
2521 try {
2522 assertEquals(null, h0.join());
2523 rs[0].assertValue(v1);
2524 } catch (CompletionException ok) {
2525 checkCompletedWithWrappedException(h0, ex);
2526 rs[0].assertNotInvoked();
2527 }
2528 try {
2529 assertEquals(null, h1.join());
2530 rs[1].assertValue(v1);
2531 } catch (CompletionException ok) {
2532 checkCompletedWithWrappedException(h1, ex);
2533 rs[1].assertNotInvoked();
2534 }
2535 try {
2536 assertEquals(null, h2.join());
2537 rs[2].assertValue(v1);
2538 } catch (CompletionException ok) {
2539 checkCompletedWithWrappedException(h2, ex);
2540 rs[2].assertNotInvoked();
2541 }
2542 try {
2543 assertEquals(null, h3.join());
2544 rs[3].assertValue(v1);
2545 } catch (CompletionException ok) {
2546 checkCompletedWithWrappedException(h3, ex);
2547 rs[3].assertNotInvoked();
2548 }
2549
2550 checkCompletedNormally(f, v1);
2551 checkCompletedExceptionally(g, ex);
2552 }}
2553
2554 /**
2555 * acceptEither result completes exceptionally if either source cancelled
2556 */
2557 public void testAcceptEither_sourceCancelled() {
2558 for (ExecutionMode m : ExecutionMode.values())
2559 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2560 for (Integer v1 : new Integer[] { 1, null })
2561 {
2562 final CompletableFuture<Integer> f = new CompletableFuture<>();
2563 final CompletableFuture<Integer> g = new CompletableFuture<>();
2564 final NoopConsumer[] rs = new NoopConsumer[6];
2565 for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2566
2567 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2568 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2569 checkIncomplete(h0);
2570 checkIncomplete(h1);
2571 rs[0].assertNotInvoked();
2572 rs[1].assertNotInvoked();
2573 f.cancel(mayInterruptIfRunning);
2574 checkCompletedWithWrappedCancellationException(h0);
2575 checkCompletedWithWrappedCancellationException(h1);
2576 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2577 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2578 checkCompletedWithWrappedCancellationException(h2);
2579 checkCompletedWithWrappedCancellationException(h3);
2580
2581 g.complete(v1);
2582
2583 // unspecified behavior - both source completions available
2584 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2585 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2586 try {
2587 assertNull(h4.join());
2588 rs[4].assertValue(v1);
2589 } catch (CompletionException ok) {
2590 checkCompletedWithWrappedCancellationException(h4);
2591 rs[4].assertNotInvoked();
2592 }
2593 try {
2594 assertNull(h5.join());
2595 rs[5].assertValue(v1);
2596 } catch (CompletionException ok) {
2597 checkCompletedWithWrappedCancellationException(h5);
2598 rs[5].assertNotInvoked();
2599 }
2600
2601 checkCancelled(f);
2602 checkCompletedNormally(g, v1);
2603 checkCompletedWithWrappedCancellationException(h0);
2604 checkCompletedWithWrappedCancellationException(h1);
2605 checkCompletedWithWrappedCancellationException(h2);
2606 checkCompletedWithWrappedCancellationException(h3);
2607 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2608 }}
2609
2610 /**
2611 * acceptEither result completes exceptionally if action does
2612 */
2613 public void testAcceptEither_actionFailed() {
2614 for (ExecutionMode m : ExecutionMode.values())
2615 for (Integer v1 : new Integer[] { 1, null })
2616 for (Integer v2 : new Integer[] { 2, null })
2617 {
2618 final CompletableFuture<Integer> f = new CompletableFuture<>();
2619 final CompletableFuture<Integer> g = new CompletableFuture<>();
2620 final FailingConsumer[] rs = new FailingConsumer[6];
2621 for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2622
2623 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2624 final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2625 f.complete(v1);
2626 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2627 final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2628 checkCompletedWithWrappedCFException(h0);
2629 checkCompletedWithWrappedCFException(h1);
2630 checkCompletedWithWrappedCFException(h2);
2631 checkCompletedWithWrappedCFException(h3);
2632 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2633
2634 g.complete(v2);
2635
2636 // unspecified behavior - both source completions available
2637 final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2638 final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2639
2640 checkCompletedWithWrappedCFException(h4);
2641 assertTrue(Objects.equals(v1, rs[4].value) ||
2642 Objects.equals(v2, rs[4].value));
2643 checkCompletedWithWrappedCFException(h5);
2644 assertTrue(Objects.equals(v1, rs[5].value) ||
2645 Objects.equals(v2, rs[5].value));
2646
2647 checkCompletedNormally(f, v1);
2648 checkCompletedNormally(g, v2);
2649 }}
2650
2651 /**
2652 * runAfterEither result completes normally after normal completion
2653 * of either source
2654 */
2655 public void testRunAfterEither_normalCompletion() {
2656 for (ExecutionMode m : ExecutionMode.values())
2657 for (Integer v1 : new Integer[] { 1, null })
2658 for (Integer v2 : new Integer[] { 2, null })
2659 {
2660 final CompletableFuture<Integer> f = new CompletableFuture<>();
2661 final CompletableFuture<Integer> g = new CompletableFuture<>();
2662 final Noop[] rs = new Noop[6];
2663 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2664
2665 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2666 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2667 checkIncomplete(h0);
2668 checkIncomplete(h1);
2669 rs[0].assertNotInvoked();
2670 rs[1].assertNotInvoked();
2671 f.complete(v1);
2672 checkCompletedNormally(h0, null);
2673 checkCompletedNormally(h1, null);
2674 rs[0].assertInvoked();
2675 rs[1].assertInvoked();
2676 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2677 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2678 checkCompletedNormally(h2, null);
2679 checkCompletedNormally(h3, null);
2680 rs[2].assertInvoked();
2681 rs[3].assertInvoked();
2682
2683 g.complete(v2);
2684
2685 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2686 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2687
2688 checkCompletedNormally(f, v1);
2689 checkCompletedNormally(g, v2);
2690 checkCompletedNormally(h0, null);
2691 checkCompletedNormally(h1, null);
2692 checkCompletedNormally(h2, null);
2693 checkCompletedNormally(h3, null);
2694 checkCompletedNormally(h4, null);
2695 checkCompletedNormally(h5, null);
2696 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2697 }}
2698
2699 /**
2700 * runAfterEither result completes exceptionally after exceptional
2701 * completion of either source
2702 */
2703 public void testRunAfterEither_exceptionalCompletion() {
2704 for (ExecutionMode m : ExecutionMode.values())
2705 for (Integer v1 : new Integer[] { 1, null })
2706 {
2707 final CompletableFuture<Integer> f = new CompletableFuture<>();
2708 final CompletableFuture<Integer> g = new CompletableFuture<>();
2709 final CFException ex = new CFException();
2710 final Noop[] rs = new Noop[6];
2711 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2712
2713 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2714 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2715 checkIncomplete(h0);
2716 checkIncomplete(h1);
2717 rs[0].assertNotInvoked();
2718 rs[1].assertNotInvoked();
2719 assertTrue(f.completeExceptionally(ex));
2720 checkCompletedWithWrappedException(h0, ex);
2721 checkCompletedWithWrappedException(h1, ex);
2722 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2723 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2724 checkCompletedWithWrappedException(h2, ex);
2725 checkCompletedWithWrappedException(h3, ex);
2726
2727 assertTrue(g.complete(v1));
2728
2729 // unspecified behavior - both source completions available
2730 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2731 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2732 try {
2733 assertNull(h4.join());
2734 rs[4].assertInvoked();
2735 } catch (CompletionException ok) {
2736 checkCompletedWithWrappedException(h4, ex);
2737 rs[4].assertNotInvoked();
2738 }
2739 try {
2740 assertNull(h5.join());
2741 rs[5].assertInvoked();
2742 } catch (CompletionException ok) {
2743 checkCompletedWithWrappedException(h5, ex);
2744 rs[5].assertNotInvoked();
2745 }
2746
2747 checkCompletedExceptionally(f, ex);
2748 checkCompletedNormally(g, v1);
2749 checkCompletedWithWrappedException(h0, ex);
2750 checkCompletedWithWrappedException(h1, ex);
2751 checkCompletedWithWrappedException(h2, ex);
2752 checkCompletedWithWrappedException(h3, ex);
2753 checkCompletedWithWrappedException(h4, ex);
2754 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2755 }}
2756
2757 public void testRunAfterEither_exceptionalCompletion2() {
2758 for (ExecutionMode m : ExecutionMode.values())
2759 for (boolean fFirst : new boolean[] { true, false })
2760 for (Integer v1 : new Integer[] { 1, null })
2761 {
2762 final CompletableFuture<Integer> f = new CompletableFuture<>();
2763 final CompletableFuture<Integer> g = new CompletableFuture<>();
2764 final CFException ex = new CFException();
2765 final Noop[] rs = new Noop[6];
2766 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2767
2768 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2769 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2770 assertTrue( fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2771 assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2772 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2773 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2774
2775 // unspecified behavior - both source completions available
2776 try {
2777 assertEquals(null, h0.join());
2778 rs[0].assertInvoked();
2779 } catch (CompletionException ok) {
2780 checkCompletedWithWrappedException(h0, ex);
2781 rs[0].assertNotInvoked();
2782 }
2783 try {
2784 assertEquals(null, h1.join());
2785 rs[1].assertInvoked();
2786 } catch (CompletionException ok) {
2787 checkCompletedWithWrappedException(h1, ex);
2788 rs[1].assertNotInvoked();
2789 }
2790 try {
2791 assertEquals(null, h2.join());
2792 rs[2].assertInvoked();
2793 } catch (CompletionException ok) {
2794 checkCompletedWithWrappedException(h2, ex);
2795 rs[2].assertNotInvoked();
2796 }
2797 try {
2798 assertEquals(null, h3.join());
2799 rs[3].assertInvoked();
2800 } catch (CompletionException ok) {
2801 checkCompletedWithWrappedException(h3, ex);
2802 rs[3].assertNotInvoked();
2803 }
2804
2805 checkCompletedNormally(f, v1);
2806 checkCompletedExceptionally(g, ex);
2807 }}
2808
2809 /**
2810 * runAfterEither result completes exceptionally if either source cancelled
2811 */
2812 public void testRunAfterEither_sourceCancelled() {
2813 for (ExecutionMode m : ExecutionMode.values())
2814 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2815 for (Integer v1 : new Integer[] { 1, null })
2816 {
2817 final CompletableFuture<Integer> f = new CompletableFuture<>();
2818 final CompletableFuture<Integer> g = new CompletableFuture<>();
2819 final Noop[] rs = new Noop[6];
2820 for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2821
2822 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2823 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2824 checkIncomplete(h0);
2825 checkIncomplete(h1);
2826 rs[0].assertNotInvoked();
2827 rs[1].assertNotInvoked();
2828 f.cancel(mayInterruptIfRunning);
2829 checkCompletedWithWrappedCancellationException(h0);
2830 checkCompletedWithWrappedCancellationException(h1);
2831 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2832 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2833 checkCompletedWithWrappedCancellationException(h2);
2834 checkCompletedWithWrappedCancellationException(h3);
2835
2836 assertTrue(g.complete(v1));
2837
2838 // unspecified behavior - both source completions available
2839 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2840 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2841 try {
2842 assertNull(h4.join());
2843 rs[4].assertInvoked();
2844 } catch (CompletionException ok) {
2845 checkCompletedWithWrappedCancellationException(h4);
2846 rs[4].assertNotInvoked();
2847 }
2848 try {
2849 assertNull(h5.join());
2850 rs[5].assertInvoked();
2851 } catch (CompletionException ok) {
2852 checkCompletedWithWrappedCancellationException(h5);
2853 rs[5].assertNotInvoked();
2854 }
2855
2856 checkCancelled(f);
2857 checkCompletedNormally(g, v1);
2858 checkCompletedWithWrappedCancellationException(h0);
2859 checkCompletedWithWrappedCancellationException(h1);
2860 checkCompletedWithWrappedCancellationException(h2);
2861 checkCompletedWithWrappedCancellationException(h3);
2862 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2863 }}
2864
2865 /**
2866 * runAfterEither result completes exceptionally if action does
2867 */
2868 public void testRunAfterEither_actionFailed() {
2869 for (ExecutionMode m : ExecutionMode.values())
2870 for (Integer v1 : new Integer[] { 1, null })
2871 for (Integer v2 : new Integer[] { 2, null })
2872 {
2873 final CompletableFuture<Integer> f = new CompletableFuture<>();
2874 final CompletableFuture<Integer> g = new CompletableFuture<>();
2875 final FailingRunnable[] rs = new FailingRunnable[6];
2876 for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2877
2878 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2879 final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2880 assertTrue(f.complete(v1));
2881 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2882 final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2883 checkCompletedWithWrappedCFException(h0);
2884 checkCompletedWithWrappedCFException(h1);
2885 checkCompletedWithWrappedCFException(h2);
2886 checkCompletedWithWrappedCFException(h3);
2887 for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2888 assertTrue(g.complete(v2));
2889 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2890 final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2891 checkCompletedWithWrappedCFException(h4);
2892 checkCompletedWithWrappedCFException(h5);
2893
2894 checkCompletedNormally(f, v1);
2895 checkCompletedNormally(g, v2);
2896 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2897 }}
2898
2899 /**
2900 * thenCompose result completes normally after normal completion of source
2901 */
2902 public void testThenCompose_normalCompletion() {
2903 for (ExecutionMode m : ExecutionMode.values())
2904 for (boolean createIncomplete : new boolean[] { true, false })
2905 for (Integer v1 : new Integer[] { 1, null })
2906 {
2907 final CompletableFuture<Integer> f = new CompletableFuture<>();
2908 final CompletableFutureInc r = new CompletableFutureInc(m);
2909 if (!createIncomplete) assertTrue(f.complete(v1));
2910 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2911 if (createIncomplete) assertTrue(f.complete(v1));
2912
2913 checkCompletedNormally(g, inc(v1));
2914 checkCompletedNormally(f, v1);
2915 r.assertValue(v1);
2916 }}
2917
2918 /**
2919 * thenCompose result completes exceptionally after exceptional
2920 * completion of source
2921 */
2922 public void testThenCompose_exceptionalCompletion() {
2923 for (ExecutionMode m : ExecutionMode.values())
2924 for (boolean createIncomplete : new boolean[] { true, false })
2925 {
2926 final CFException ex = new CFException();
2927 final CompletableFutureInc r = new CompletableFutureInc(m);
2928 final CompletableFuture<Integer> f = new CompletableFuture<>();
2929 if (!createIncomplete) f.completeExceptionally(ex);
2930 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2931 if (createIncomplete) f.completeExceptionally(ex);
2932
2933 checkCompletedWithWrappedException(g, ex);
2934 checkCompletedExceptionally(f, ex);
2935 r.assertNotInvoked();
2936 }}
2937
2938 /**
2939 * thenCompose result completes exceptionally if action does
2940 */
2941 public void testThenCompose_actionFailed() {
2942 for (ExecutionMode m : ExecutionMode.values())
2943 for (boolean createIncomplete : new boolean[] { true, false })
2944 for (Integer v1 : new Integer[] { 1, null })
2945 {
2946 final CompletableFuture<Integer> f = new CompletableFuture<>();
2947 final FailingCompletableFutureFunction r
2948 = new FailingCompletableFutureFunction(m);
2949 if (!createIncomplete) assertTrue(f.complete(v1));
2950 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2951 if (createIncomplete) assertTrue(f.complete(v1));
2952
2953 checkCompletedWithWrappedCFException(g);
2954 checkCompletedNormally(f, v1);
2955 }}
2956
2957 /**
2958 * thenCompose result completes exceptionally if source cancelled
2959 */
2960 public void testThenCompose_sourceCancelled() {
2961 for (ExecutionMode m : ExecutionMode.values())
2962 for (boolean createIncomplete : new boolean[] { true, false })
2963 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2964 {
2965 final CompletableFuture<Integer> f = new CompletableFuture<>();
2966 final CompletableFutureInc r = new CompletableFutureInc(m);
2967 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2968 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2969 if (createIncomplete) {
2970 checkIncomplete(g);
2971 assertTrue(f.cancel(mayInterruptIfRunning));
2972 }
2973
2974 checkCompletedWithWrappedCancellationException(g);
2975 checkCancelled(f);
2976 }}
2977
2978 // other static methods
2979
2980 /**
2981 * allOf(no component futures) returns a future completed normally
2982 * with the value null
2983 */
2984 public void testAllOf_empty() throws Exception {
2985 CompletableFuture<Void> f = CompletableFuture.allOf();
2986 checkCompletedNormally(f, null);
2987 }
2988
2989 /**
2990 * allOf returns a future completed normally with the value null
2991 * when all components complete normally
2992 */
2993 public void testAllOf_normal() throws Exception {
2994 for (int k = 1; k < 10; k++) {
2995 CompletableFuture<Integer>[] fs
2996 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2997 for (int i = 0; i < k; i++)
2998 fs[i] = new CompletableFuture<>();
2999 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3000 for (int i = 0; i < k; i++) {
3001 checkIncomplete(f);
3002 checkIncomplete(CompletableFuture.allOf(fs));
3003 fs[i].complete(one);
3004 }
3005 checkCompletedNormally(f, null);
3006 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3007 }
3008 }
3009
3010 public void testAllOf_backwards() throws Exception {
3011 for (int k = 1; k < 10; k++) {
3012 CompletableFuture<Integer>[] fs
3013 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3014 for (int i = 0; i < k; i++)
3015 fs[i] = new CompletableFuture<>();
3016 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3017 for (int i = k - 1; i >= 0; i--) {
3018 checkIncomplete(f);
3019 checkIncomplete(CompletableFuture.allOf(fs));
3020 fs[i].complete(one);
3021 }
3022 checkCompletedNormally(f, null);
3023 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3024 }
3025 }
3026
3027 public void testAllOf_exceptional() throws Exception {
3028 for (int k = 1; k < 10; k++) {
3029 CompletableFuture<Integer>[] fs
3030 = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3031 CFException ex = new CFException();
3032 for (int i = 0; i < k; i++)
3033 fs[i] = new CompletableFuture<>();
3034 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3035 for (int i = 0; i < k; i++) {
3036 checkIncomplete(f);
3037 checkIncomplete(CompletableFuture.allOf(fs));
3038 if (i != k/2) {
3039 fs[i].complete(i);
3040 checkCompletedNormally(fs[i], i);
3041 } else {
3042 fs[i].completeExceptionally(ex);
3043 checkCompletedExceptionally(fs[i], ex);
3044 }
3045 }
3046 checkCompletedWithWrappedException(f, ex);
3047 checkCompletedWithWrappedException(CompletableFuture.allOf(fs), ex);
3048 }
3049 }
3050
3051 /**
3052 * anyOf(no component futures) returns an incomplete future
3053 */
3054 public void testAnyOf_empty() throws Exception {
3055 for (Integer v1 : new Integer[] { 1, null })
3056 {
3057 CompletableFuture<Object> f = CompletableFuture.anyOf();
3058 checkIncomplete(f);
3059
3060 f.complete(v1);
3061 checkCompletedNormally(f, v1);
3062 }}
3063
3064 /**
3065 * anyOf returns a future completed normally with a value when
3066 * a component future does
3067 */
3068 public void testAnyOf_normal() throws Exception {
3069 for (int k = 0; k < 10; k++) {
3070 CompletableFuture[] fs = new CompletableFuture[k];
3071 for (int i = 0; i < k; i++)
3072 fs[i] = new CompletableFuture<>();
3073 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3074 checkIncomplete(f);
3075 for (int i = 0; i < k; i++) {
3076 fs[i].complete(i);
3077 checkCompletedNormally(f, 0);
3078 int x = (int) CompletableFuture.anyOf(fs).join();
3079 assertTrue(0 <= x && x <= i);
3080 }
3081 }
3082 }
3083 public void testAnyOf_normal_backwards() throws Exception {
3084 for (int k = 0; k < 10; k++) {
3085 CompletableFuture[] fs = new CompletableFuture[k];
3086 for (int i = 0; i < k; i++)
3087 fs[i] = new CompletableFuture<>();
3088 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3089 checkIncomplete(f);
3090 for (int i = k - 1; i >= 0; i--) {
3091 fs[i].complete(i);
3092 checkCompletedNormally(f, k - 1);
3093 int x = (int) CompletableFuture.anyOf(fs).join();
3094 assertTrue(i <= x && x <= k - 1);
3095 }
3096 }
3097 }
3098
3099 /**
3100 * anyOf result completes exceptionally when any component does.
3101 */
3102 public void testAnyOf_exceptional() 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 = 0; i < k; i++) {
3113 fs[i].completeExceptionally(exs[i]);
3114 checkCompletedWithWrappedException(f, exs[0]);
3115 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3116 }
3117 }
3118 }
3119
3120 public void testAnyOf_exceptional_backwards() throws Exception {
3121 for (int k = 0; k < 10; k++) {
3122 CompletableFuture[] fs = new CompletableFuture[k];
3123 CFException[] exs = new CFException[k];
3124 for (int i = 0; i < k; i++) {
3125 fs[i] = new CompletableFuture<>();
3126 exs[i] = new CFException();
3127 }
3128 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3129 checkIncomplete(f);
3130 for (int i = k - 1; i >= 0; i--) {
3131 fs[i].completeExceptionally(exs[i]);
3132 checkCompletedWithWrappedException(f, exs[k - 1]);
3133 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3134 }
3135 }
3136 }
3137
3138 /**
3139 * Completion methods throw NullPointerException with null arguments
3140 */
3141 public void testNPE() {
3142 CompletableFuture<Integer> f = new CompletableFuture<>();
3143 CompletableFuture<Integer> g = new CompletableFuture<>();
3144 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3145 CompletableFuture<?> h;
3146 ThreadExecutor exec = new ThreadExecutor();
3147
3148 Runnable[] throwingActions = {
3149 () -> CompletableFuture.supplyAsync(null),
3150 () -> CompletableFuture.supplyAsync(null, exec),
3151 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.DEFAULT, 42), null),
3152
3153 () -> CompletableFuture.runAsync(null),
3154 () -> CompletableFuture.runAsync(null, exec),
3155 () -> CompletableFuture.runAsync(() -> {}, null),
3156
3157 () -> f.completeExceptionally(null),
3158
3159 () -> f.thenApply(null),
3160 () -> f.thenApplyAsync(null),
3161 () -> f.thenApplyAsync((x) -> x, null),
3162 () -> f.thenApplyAsync(null, exec),
3163
3164 () -> f.thenAccept(null),
3165 () -> f.thenAcceptAsync(null),
3166 () -> f.thenAcceptAsync((x) -> {} , null),
3167 () -> f.thenAcceptAsync(null, exec),
3168
3169 () -> f.thenRun(null),
3170 () -> f.thenRunAsync(null),
3171 () -> f.thenRunAsync(() -> {} , null),
3172 () -> f.thenRunAsync(null, exec),
3173
3174 () -> f.thenCombine(g, null),
3175 () -> f.thenCombineAsync(g, null),
3176 () -> f.thenCombineAsync(g, null, exec),
3177 () -> f.thenCombine(nullFuture, (x, y) -> x),
3178 () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3179 () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3180 () -> f.thenCombineAsync(g, (x, y) -> x, null),
3181
3182 () -> f.thenAcceptBoth(g, null),
3183 () -> f.thenAcceptBothAsync(g, null),
3184 () -> f.thenAcceptBothAsync(g, null, exec),
3185 () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3186 () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3187 () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3188 () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3189
3190 () -> f.runAfterBoth(g, null),
3191 () -> f.runAfterBothAsync(g, null),
3192 () -> f.runAfterBothAsync(g, null, exec),
3193 () -> f.runAfterBoth(nullFuture, () -> {}),
3194 () -> f.runAfterBothAsync(nullFuture, () -> {}),
3195 () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3196 () -> f.runAfterBothAsync(g, () -> {}, null),
3197
3198 () -> f.applyToEither(g, null),
3199 () -> f.applyToEitherAsync(g, null),
3200 () -> f.applyToEitherAsync(g, null, exec),
3201 () -> f.applyToEither(nullFuture, (x) -> x),
3202 () -> f.applyToEitherAsync(nullFuture, (x) -> x),
3203 () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
3204 () -> f.applyToEitherAsync(g, (x) -> x, null),
3205
3206 () -> f.acceptEither(g, null),
3207 () -> f.acceptEitherAsync(g, null),
3208 () -> f.acceptEitherAsync(g, null, exec),
3209 () -> f.acceptEither(nullFuture, (x) -> {}),
3210 () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
3211 () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
3212 () -> f.acceptEitherAsync(g, (x) -> {}, null),
3213
3214 () -> f.runAfterEither(g, null),
3215 () -> f.runAfterEitherAsync(g, null),
3216 () -> f.runAfterEitherAsync(g, null, exec),
3217 () -> f.runAfterEither(nullFuture, () -> {}),
3218 () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3219 () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3220 () -> f.runAfterEitherAsync(g, () -> {}, null),
3221
3222 () -> f.thenCompose(null),
3223 () -> f.thenComposeAsync(null),
3224 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
3225 () -> f.thenComposeAsync(null, exec),
3226
3227 () -> f.exceptionally(null),
3228
3229 () -> f.handle(null),
3230
3231 () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3232 () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3233 () -> CompletableFuture.allOf(f, null),
3234 () -> CompletableFuture.allOf(null, f),
3235
3236 () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3237 () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3238 () -> CompletableFuture.anyOf(f, null),
3239 () -> CompletableFuture.anyOf(null, f),
3240
3241 () -> f.obtrudeException(null),
3242 };
3243
3244 assertThrows(NullPointerException.class, throwingActions);
3245 assertEquals(0, exec.count.get());
3246 }
3247
3248 /**
3249 * toCompletableFuture returns this CompletableFuture.
3250 */
3251 public void testToCompletableFuture() {
3252 CompletableFuture<Integer> f = new CompletableFuture<>();
3253 assertSame(f, f.toCompletableFuture());
3254 }
3255
3256 //--- tests of implementation details; not part of official tck ---
3257
3258 Object resultOf(CompletableFuture<?> f) {
3259 try {
3260 java.lang.reflect.Field resultField
3261 = CompletableFuture.class.getDeclaredField("result");
3262 resultField.setAccessible(true);
3263 return resultField.get(f);
3264 } catch (Throwable t) { throw new AssertionError(t); }
3265 }
3266
3267 public void testExceptionPropagationReusesResultObject() {
3268 if (!testImplementationDetails) return;
3269 for (ExecutionMode m : ExecutionMode.values())
3270 {
3271 final CFException ex = new CFException();
3272 final CompletableFuture<Integer> v42 = CompletableFuture.completedFuture(42);
3273 final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3274
3275 List<Function<CompletableFuture<Integer>, CompletableFuture<?>>> funs
3276 = new ArrayList<>();
3277
3278 funs.add((y) -> m.thenRun(y, new Noop(m)));
3279 funs.add((y) -> m.thenAccept(y, new NoopConsumer(m)));
3280 funs.add((y) -> m.thenApply(y, new IncFunction(m)));
3281
3282 funs.add((y) -> m.runAfterEither(y, incomplete, new Noop(m)));
3283 funs.add((y) -> m.acceptEither(y, incomplete, new NoopConsumer(m)));
3284 funs.add((y) -> m.applyToEither(y, incomplete, new IncFunction(m)));
3285
3286 funs.add((y) -> m.runAfterBoth(y, v42, new Noop(m)));
3287 funs.add((y) -> m.thenAcceptBoth(y, v42, new SubtractAction(m)));
3288 funs.add((y) -> m.thenCombine(y, v42, new SubtractFunction(m)));
3289
3290 funs.add((y) -> m.whenComplete(y, (Integer x, Throwable t) -> {}));
3291
3292 funs.add((y) -> m.thenCompose(y, new CompletableFutureInc(m)));
3293
3294 funs.add((y) -> CompletableFuture.allOf(new CompletableFuture<?>[] {y, v42}));
3295 funs.add((y) -> CompletableFuture.anyOf(new CompletableFuture<?>[] {y, incomplete}));
3296
3297 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3298 fun : funs) {
3299 CompletableFuture<Integer> f = new CompletableFuture<>();
3300 f.completeExceptionally(ex);
3301 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3302 checkCompletedWithWrappedException(src, ex);
3303 CompletableFuture<?> dep = fun.apply(src);
3304 checkCompletedWithWrappedException(dep, ex);
3305 assertSame(resultOf(src), resultOf(dep));
3306 }
3307
3308 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3309 fun : funs) {
3310 CompletableFuture<Integer> f = new CompletableFuture<>();
3311 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3312 CompletableFuture<?> dep = fun.apply(src);
3313 f.completeExceptionally(ex);
3314 checkCompletedWithWrappedException(src, ex);
3315 checkCompletedWithWrappedException(dep, ex);
3316 assertSame(resultOf(src), resultOf(dep));
3317 }
3318
3319 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3320 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3321 fun : funs) {
3322 CompletableFuture<Integer> f = new CompletableFuture<>();
3323 f.cancel(mayInterruptIfRunning);
3324 checkCancelled(f);
3325 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3326 checkCompletedWithWrappedCancellationException(src);
3327 CompletableFuture<?> dep = fun.apply(src);
3328 checkCompletedWithWrappedCancellationException(dep);
3329 assertSame(resultOf(src), resultOf(dep));
3330 }
3331
3332 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3333 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3334 fun : funs) {
3335 CompletableFuture<Integer> f = new CompletableFuture<>();
3336 CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3337 CompletableFuture<?> dep = fun.apply(src);
3338 f.cancel(mayInterruptIfRunning);
3339 checkCancelled(f);
3340 checkCompletedWithWrappedCancellationException(src);
3341 checkCompletedWithWrappedCancellationException(dep);
3342 assertSame(resultOf(src), resultOf(dep));
3343 }
3344 }}
3345
3346 }