ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.123
Committed: Tue Sep 8 19:45:35 2015 UTC (8 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.122: +95 -0 lines
Log Message:
add testMinimalCompletionStage_minimality

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