ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.185
Committed: Mon May 29 19:15:02 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.184: +1 -5 lines
Log Message:
more timeout handling rework; remove most uses of SMALL_DELAY_MS; randomize timeouts and TimeUnits; remove hardcoded 5 second timeouts

File Contents

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