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

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