ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.86
Committed: Mon Jun 16 21:04:23 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.85: +36 -15 lines
Log Message:
improve tests for allOf and anyOf

File Contents

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