ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.127
Committed: Sun Oct 25 02:58:25 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.126: +2 -2 lines
Log Message:
replace throw with fail or threadFail

File Contents

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