ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.55
Committed: Mon Jun 2 21:41:37 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.54: +24 -21 lines
Log Message:
improve tests for execution environment

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