ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.187
Committed: Mon Jul 3 21:18:37 2017 UTC (6 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.186: +5 -0 lines
Log Message:
add more @SuppressWarnings("FutureReturnValueIgnored")

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 jsr166 1.128 import static java.util.concurrent.CompletableFuture.completedFuture;
11     import static java.util.concurrent.CompletableFuture.failedFuture;
12 jsr166 1.98
13 jsr166 1.123 import java.lang.reflect.Method;
14     import java.lang.reflect.Modifier;
15    
16     import java.util.stream.Collectors;
17     import java.util.stream.Stream;
18    
19 jsr166 1.98 import java.util.ArrayList;
20 jsr166 1.123 import java.util.Arrays;
21 jsr166 1.98 import java.util.List;
22     import java.util.Objects;
23 jsr166 1.123 import java.util.Set;
24 jsr166 1.1 import java.util.concurrent.Callable;
25     import java.util.concurrent.CancellationException;
26     import java.util.concurrent.CompletableFuture;
27 dl 1.5 import java.util.concurrent.CompletionException;
28 jsr166 1.35 import java.util.concurrent.CompletionStage;
29 jsr166 1.98 import java.util.concurrent.ExecutionException;
30     import java.util.concurrent.Executor;
31 jsr166 1.48 import java.util.concurrent.ForkJoinPool;
32     import java.util.concurrent.ForkJoinTask;
33 jsr166 1.152 import java.util.concurrent.RejectedExecutionException;
34 jsr166 1.1 import java.util.concurrent.TimeoutException;
35     import java.util.concurrent.atomic.AtomicInteger;
36 dl 1.103 import java.util.concurrent.atomic.AtomicReference;
37 jsr166 1.98 import java.util.function.BiConsumer;
38     import java.util.function.BiFunction;
39 dl 1.5 import java.util.function.Consumer;
40     import java.util.function.Function;
41 jsr166 1.124 import java.util.function.Predicate;
42 jsr166 1.98 import java.util.function.Supplier;
43    
44 jsr166 1.128 import junit.framework.AssertionFailedError;
45 jsr166 1.98 import junit.framework.Test;
46     import junit.framework.TestSuite;
47 jsr166 1.1
48     public class CompletableFutureTest extends JSR166TestCase {
49    
50     public static void main(String[] args) {
51 jsr166 1.102 main(suite(), args);
52 jsr166 1.1 }
53     public static Test suite() {
54     return new TestSuite(CompletableFutureTest.class);
55     }
56    
57 dl 1.5 static class CFException extends RuntimeException {}
58    
59 jsr166 1.4 void checkIncomplete(CompletableFuture<?> f) {
60     assertFalse(f.isDone());
61     assertFalse(f.isCancelled());
62 dl 1.103 assertTrue(f.toString().contains("Not completed"));
63 jsr166 1.4 try {
64     assertNull(f.getNow(null));
65     } catch (Throwable fail) { threadUnexpectedException(fail); }
66     try {
67 jsr166 1.185 f.get(randomExpiredTimeout(), randomTimeUnit());
68 jsr166 1.4 shouldThrow();
69     }
70     catch (TimeoutException success) {}
71     catch (Throwable fail) { threadUnexpectedException(fail); }
72     }
73    
74 jsr166 1.11 <T> void checkCompletedNormally(CompletableFuture<T> f, T value) {
75 jsr166 1.95 checkTimedGet(f, value);
76    
77 jsr166 1.20 try {
78 dl 1.5 assertEquals(value, f.join());
79     assertEquals(value, f.getNow(null));
80     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 jsr166 1.182 Throwable exceptionalCompletion(CompletableFuture<?> f) {
93     // handle (and whenComplete and exceptionally) can distinguish
94     // between "direct" and "wrapped" exceptional completion
95     return f.handle((u, t) -> t).join();
96 jsr166 1.121 }
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 jsr166 1.180 t -> assertTrue(t instanceof CFException));
147 jsr166 1.121 }
148 dl 1.103
149 jsr166 1.121 void checkCompletedWithWrappedCancellationException(CompletableFuture<?> f) {
150     checkCompletedExceptionally(f, true,
151 jsr166 1.180 t -> assertTrue(t instanceof CancellationException));
152 jsr166 1.121 }
153 dl 1.103
154 jsr166 1.121 void checkCompletedWithTimeoutException(CompletableFuture<?> f) {
155     checkCompletedExceptionally(f, false,
156 jsr166 1.180 t -> assertTrue(t instanceof TimeoutException));
157 dl 1.103 }
158    
159 jsr166 1.121 void checkCompletedWithWrappedException(CompletableFuture<?> f,
160     Throwable ex) {
161 jsr166 1.180 checkCompletedExceptionally(f, true, t -> assertSame(t, ex));
162 jsr166 1.72 }
163    
164 jsr166 1.121 void checkCompletedExceptionally(CompletableFuture<?> f, Throwable ex) {
165 jsr166 1.180 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.172 abstract static class CheckedAction {
361 jsr166 1.62 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 jsr166 1.172 abstract static class CheckedIntegerAction extends CheckedAction {
373 jsr166 1.62 Integer value;
374     CheckedIntegerAction(ExecutionMode m) { super(m); }
375     void assertValue(Integer expected) {
376     assertInvoked();
377     assertEquals(expected, value);
378     }
379     }
380    
381 jsr166 1.172 static class IntegerSupplier extends CheckedAction
382 jsr166 1.62 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.172 static 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 jsr166 1.172 static class IncFunction extends CheckedIntegerAction
411 jsr166 1.62 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.172 static class SubtractAction extends CheckedIntegerAction
429 jsr166 1.62 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 jsr166 1.172 static class SubtractFunction extends CheckedIntegerAction
439 jsr166 1.62 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.172 static class Noop extends CheckedAction implements Runnable {
449 jsr166 1.62 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.172 static class FailingSupplier extends CheckedAction
456 jsr166 1.63 implements Supplier<Integer>
457 jsr166 1.62 {
458 jsr166 1.151 final CFException ex;
459     FailingSupplier(ExecutionMode m) { super(m); ex = new CFException(); }
460 jsr166 1.44 public Integer get() {
461 jsr166 1.62 invoked();
462 jsr166 1.151 throw ex;
463 jsr166 1.44 }
464 dl 1.5 }
465 jsr166 1.62
466 jsr166 1.172 static class FailingConsumer extends CheckedIntegerAction
467 jsr166 1.63 implements Consumer<Integer>
468     {
469 jsr166 1.151 final CFException ex;
470     FailingConsumer(ExecutionMode m) { super(m); ex = new CFException(); }
471 jsr166 1.44 public void accept(Integer x) {
472 jsr166 1.62 invoked();
473 jsr166 1.63 value = x;
474 jsr166 1.151 throw ex;
475 jsr166 1.44 }
476 dl 1.5 }
477 jsr166 1.62
478 jsr166 1.172 static class FailingBiConsumer extends CheckedIntegerAction
479 jsr166 1.62 implements BiConsumer<Integer, Integer>
480     {
481 jsr166 1.151 final CFException ex;
482     FailingBiConsumer(ExecutionMode m) { super(m); ex = new CFException(); }
483 jsr166 1.44 public void accept(Integer x, Integer y) {
484 jsr166 1.62 invoked();
485 jsr166 1.63 value = subtract(x, y);
486 jsr166 1.151 throw ex;
487 jsr166 1.44 }
488 dl 1.5 }
489 jsr166 1.62
490 jsr166 1.172 static class FailingFunction extends CheckedIntegerAction
491 jsr166 1.62 implements Function<Integer, Integer>
492     {
493 jsr166 1.151 final CFException ex;
494     FailingFunction(ExecutionMode m) { super(m); ex = new CFException(); }
495 jsr166 1.44 public Integer apply(Integer x) {
496 jsr166 1.62 invoked();
497 jsr166 1.63 value = x;
498 jsr166 1.151 throw ex;
499 jsr166 1.44 }
500 dl 1.5 }
501 jsr166 1.62
502 jsr166 1.172 static class FailingBiFunction extends CheckedIntegerAction
503 jsr166 1.62 implements BiFunction<Integer, Integer, Integer>
504     {
505 jsr166 1.151 final CFException ex;
506     FailingBiFunction(ExecutionMode m) { super(m); ex = new CFException(); }
507 jsr166 1.44 public Integer apply(Integer x, Integer y) {
508 jsr166 1.62 invoked();
509 jsr166 1.63 value = subtract(x, y);
510 jsr166 1.151 throw ex;
511 jsr166 1.44 }
512 dl 1.5 }
513 jsr166 1.62
514 jsr166 1.172 static class FailingRunnable extends CheckedAction implements Runnable {
515 jsr166 1.151 final CFException ex;
516     FailingRunnable(ExecutionMode m) { super(m); ex = new CFException(); }
517 jsr166 1.44 public void run() {
518 jsr166 1.62 invoked();
519 jsr166 1.151 throw ex;
520 jsr166 1.44 }
521 dl 1.5 }
522    
523 jsr166 1.172 static class CompletableFutureInc extends CheckedIntegerAction
524 jsr166 1.62 implements Function<Integer, CompletableFuture<Integer>>
525     {
526     CompletableFutureInc(ExecutionMode m) { super(m); }
527 dl 1.5 public CompletableFuture<Integer> apply(Integer x) {
528 jsr166 1.62 invoked();
529 jsr166 1.63 value = x;
530 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
531 jsr166 1.78 assertTrue(f.complete(inc(x)));
532 dl 1.5 return f;
533     }
534     }
535    
536 jsr166 1.172 static class FailingCompletableFutureFunction extends CheckedIntegerAction
537 jsr166 1.62 implements Function<Integer, CompletableFuture<Integer>>
538     {
539 jsr166 1.151 final CFException ex;
540     FailingCompletableFutureFunction(ExecutionMode m) { super(m); ex = new CFException(); }
541 dl 1.5 public CompletableFuture<Integer> apply(Integer x) {
542 jsr166 1.62 invoked();
543 jsr166 1.63 value = x;
544 jsr166 1.151 throw ex;
545 dl 1.5 }
546     }
547 jsr166 1.6
548 jsr166 1.155 static class CountingRejectingExecutor implements Executor {
549     final RejectedExecutionException ex = new RejectedExecutionException();
550     final AtomicInteger count = new AtomicInteger(0);
551     public void execute(Runnable r) {
552     count.getAndIncrement();
553     throw ex;
554     }
555     }
556    
557 dl 1.5 // Used for explicit executor tests
558     static final class ThreadExecutor implements Executor {
559 jsr166 1.56 final AtomicInteger count = new AtomicInteger(0);
560     static final ThreadGroup tg = new ThreadGroup("ThreadExecutor");
561     static boolean startedCurrentThread() {
562     return Thread.currentThread().getThreadGroup() == tg;
563     }
564 jsr166 1.17
565 dl 1.5 public void execute(Runnable r) {
566 jsr166 1.17 count.getAndIncrement();
567 jsr166 1.56 new Thread(tg, r).start();
568 dl 1.5 }
569     }
570    
571 jsr166 1.96 static final boolean defaultExecutorIsCommonPool
572     = ForkJoinPool.getCommonPoolParallelism() > 1;
573    
574 dl 1.5 /**
575 jsr166 1.35 * Permits the testing of parallel code for the 3 different
576 jsr166 1.60 * execution modes without copy/pasting all the test methods.
577 jsr166 1.35 */
578     enum ExecutionMode {
579 jsr166 1.95 SYNC {
580 jsr166 1.48 public void checkExecutionMode() {
581 jsr166 1.60 assertFalse(ThreadExecutor.startedCurrentThread());
582 jsr166 1.48 assertNull(ForkJoinTask.getPool());
583     }
584 jsr166 1.57 public CompletableFuture<Void> runAsync(Runnable a) {
585     throw new UnsupportedOperationException();
586     }
587 jsr166 1.58 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
588     throw new UnsupportedOperationException();
589     }
590 jsr166 1.46 public <T> CompletableFuture<Void> thenRun
591     (CompletableFuture<T> f, Runnable a) {
592     return f.thenRun(a);
593     }
594     public <T> CompletableFuture<Void> thenAccept
595     (CompletableFuture<T> f, Consumer<? super T> a) {
596     return f.thenAccept(a);
597     }
598     public <T,U> CompletableFuture<U> thenApply
599     (CompletableFuture<T> f, Function<? super T,U> a) {
600     return f.thenApply(a);
601     }
602     public <T,U> CompletableFuture<U> thenCompose
603     (CompletableFuture<T> f,
604     Function<? super T,? extends CompletionStage<U>> a) {
605     return f.thenCompose(a);
606     }
607     public <T,U> CompletableFuture<U> handle
608     (CompletableFuture<T> f,
609     BiFunction<? super T,Throwable,? extends U> a) {
610     return f.handle(a);
611     }
612     public <T> CompletableFuture<T> whenComplete
613     (CompletableFuture<T> f,
614     BiConsumer<? super T,? super Throwable> a) {
615     return f.whenComplete(a);
616     }
617 jsr166 1.35 public <T,U> CompletableFuture<Void> runAfterBoth
618     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
619     return f.runAfterBoth(g, a);
620     }
621     public <T,U> CompletableFuture<Void> thenAcceptBoth
622     (CompletableFuture<T> f,
623     CompletionStage<? extends U> g,
624     BiConsumer<? super T,? super U> a) {
625     return f.thenAcceptBoth(g, a);
626     }
627 jsr166 1.36 public <T,U,V> CompletableFuture<V> thenCombine
628     (CompletableFuture<T> f,
629     CompletionStage<? extends U> g,
630     BiFunction<? super T,? super U,? extends V> a) {
631     return f.thenCombine(g, a);
632     }
633 jsr166 1.46 public <T> CompletableFuture<Void> runAfterEither
634 jsr166 1.38 (CompletableFuture<T> f,
635 jsr166 1.46 CompletionStage<?> g,
636     java.lang.Runnable a) {
637     return f.runAfterEither(g, a);
638 jsr166 1.38 }
639     public <T> CompletableFuture<Void> acceptEither
640     (CompletableFuture<T> f,
641     CompletionStage<? extends T> g,
642     Consumer<? super T> a) {
643     return f.acceptEither(g, a);
644     }
645 jsr166 1.46 public <T,U> CompletableFuture<U> applyToEither
646 jsr166 1.38 (CompletableFuture<T> f,
647 jsr166 1.46 CompletionStage<? extends T> g,
648     Function<? super T,U> a) {
649     return f.applyToEither(g, a);
650     }
651     },
652    
653 jsr166 1.48 ASYNC {
654     public void checkExecutionMode() {
655 jsr166 1.144 assertEquals(defaultExecutorIsCommonPool,
656     (ForkJoinPool.commonPool() == ForkJoinTask.getPool()));
657 jsr166 1.48 }
658 jsr166 1.57 public CompletableFuture<Void> runAsync(Runnable a) {
659     return CompletableFuture.runAsync(a);
660     }
661 jsr166 1.58 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
662     return CompletableFuture.supplyAsync(a);
663     }
664 jsr166 1.46 public <T> CompletableFuture<Void> thenRun
665     (CompletableFuture<T> f, Runnable a) {
666     return f.thenRunAsync(a);
667     }
668     public <T> CompletableFuture<Void> thenAccept
669     (CompletableFuture<T> f, Consumer<? super T> a) {
670     return f.thenAcceptAsync(a);
671     }
672     public <T,U> CompletableFuture<U> thenApply
673     (CompletableFuture<T> f, Function<? super T,U> a) {
674     return f.thenApplyAsync(a);
675 jsr166 1.38 }
676     public <T,U> CompletableFuture<U> thenCompose
677     (CompletableFuture<T> f,
678     Function<? super T,? extends CompletionStage<U>> a) {
679 jsr166 1.46 return f.thenComposeAsync(a);
680     }
681     public <T,U> CompletableFuture<U> handle
682     (CompletableFuture<T> f,
683     BiFunction<? super T,Throwable,? extends U> a) {
684     return f.handleAsync(a);
685 jsr166 1.38 }
686     public <T> CompletableFuture<T> whenComplete
687     (CompletableFuture<T> f,
688     BiConsumer<? super T,? super Throwable> a) {
689 jsr166 1.46 return f.whenCompleteAsync(a);
690 jsr166 1.38 }
691 jsr166 1.35 public <T,U> CompletableFuture<Void> runAfterBoth
692     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
693     return f.runAfterBothAsync(g, a);
694     }
695     public <T,U> CompletableFuture<Void> thenAcceptBoth
696     (CompletableFuture<T> f,
697     CompletionStage<? extends U> g,
698     BiConsumer<? super T,? super U> a) {
699     return f.thenAcceptBothAsync(g, a);
700     }
701 jsr166 1.36 public <T,U,V> CompletableFuture<V> thenCombine
702     (CompletableFuture<T> f,
703     CompletionStage<? extends U> g,
704     BiFunction<? super T,? super U,? extends V> a) {
705     return f.thenCombineAsync(g, a);
706     }
707 jsr166 1.46 public <T> CompletableFuture<Void> runAfterEither
708 jsr166 1.38 (CompletableFuture<T> f,
709 jsr166 1.46 CompletionStage<?> g,
710     java.lang.Runnable a) {
711     return f.runAfterEitherAsync(g, a);
712 jsr166 1.38 }
713     public <T> CompletableFuture<Void> acceptEither
714     (CompletableFuture<T> f,
715     CompletionStage<? extends T> g,
716     Consumer<? super T> a) {
717     return f.acceptEitherAsync(g, a);
718     }
719 jsr166 1.46 public <T,U> CompletableFuture<U> applyToEither
720 jsr166 1.38 (CompletableFuture<T> f,
721 jsr166 1.46 CompletionStage<? extends T> g,
722     Function<? super T,U> a) {
723     return f.applyToEitherAsync(g, a);
724     }
725     },
726    
727     EXECUTOR {
728 jsr166 1.48 public void checkExecutionMode() {
729 jsr166 1.56 assertTrue(ThreadExecutor.startedCurrentThread());
730 jsr166 1.48 }
731 jsr166 1.57 public CompletableFuture<Void> runAsync(Runnable a) {
732     return CompletableFuture.runAsync(a, new ThreadExecutor());
733     }
734 jsr166 1.58 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
735     return CompletableFuture.supplyAsync(a, new ThreadExecutor());
736     }
737 jsr166 1.46 public <T> CompletableFuture<Void> thenRun
738     (CompletableFuture<T> f, Runnable a) {
739     return f.thenRunAsync(a, new ThreadExecutor());
740     }
741     public <T> CompletableFuture<Void> thenAccept
742     (CompletableFuture<T> f, Consumer<? super T> a) {
743     return f.thenAcceptAsync(a, new ThreadExecutor());
744     }
745     public <T,U> CompletableFuture<U> thenApply
746     (CompletableFuture<T> f, Function<? super T,U> a) {
747     return f.thenApplyAsync(a, new ThreadExecutor());
748 jsr166 1.38 }
749     public <T,U> CompletableFuture<U> thenCompose
750     (CompletableFuture<T> f,
751     Function<? super T,? extends CompletionStage<U>> a) {
752 jsr166 1.46 return f.thenComposeAsync(a, new ThreadExecutor());
753     }
754     public <T,U> CompletableFuture<U> handle
755     (CompletableFuture<T> f,
756     BiFunction<? super T,Throwable,? extends U> a) {
757     return f.handleAsync(a, new ThreadExecutor());
758 jsr166 1.38 }
759     public <T> CompletableFuture<T> whenComplete
760     (CompletableFuture<T> f,
761     BiConsumer<? super T,? super Throwable> a) {
762 jsr166 1.46 return f.whenCompleteAsync(a, new ThreadExecutor());
763 jsr166 1.38 }
764 jsr166 1.35 public <T,U> CompletableFuture<Void> runAfterBoth
765     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
766     return f.runAfterBothAsync(g, a, new ThreadExecutor());
767     }
768     public <T,U> CompletableFuture<Void> thenAcceptBoth
769     (CompletableFuture<T> f,
770     CompletionStage<? extends U> g,
771     BiConsumer<? super T,? super U> a) {
772     return f.thenAcceptBothAsync(g, a, new ThreadExecutor());
773     }
774 jsr166 1.36 public <T,U,V> CompletableFuture<V> thenCombine
775     (CompletableFuture<T> f,
776     CompletionStage<? extends U> g,
777     BiFunction<? super T,? super U,? extends V> a) {
778     return f.thenCombineAsync(g, a, new ThreadExecutor());
779     }
780 jsr166 1.46 public <T> CompletableFuture<Void> runAfterEither
781 jsr166 1.38 (CompletableFuture<T> f,
782 jsr166 1.46 CompletionStage<?> g,
783     java.lang.Runnable a) {
784     return f.runAfterEitherAsync(g, a, new ThreadExecutor());
785 jsr166 1.38 }
786     public <T> CompletableFuture<Void> acceptEither
787     (CompletableFuture<T> f,
788     CompletionStage<? extends T> g,
789     Consumer<? super T> a) {
790     return f.acceptEitherAsync(g, a, new ThreadExecutor());
791     }
792 jsr166 1.46 public <T,U> CompletableFuture<U> applyToEither
793 jsr166 1.38 (CompletableFuture<T> f,
794 jsr166 1.46 CompletionStage<? extends T> g,
795     Function<? super T,U> a) {
796     return f.applyToEitherAsync(g, a, new ThreadExecutor());
797 jsr166 1.38 }
798 jsr166 1.35 };
799    
800 jsr166 1.48 public abstract void checkExecutionMode();
801 jsr166 1.57 public abstract CompletableFuture<Void> runAsync(Runnable a);
802 jsr166 1.58 public abstract <U> CompletableFuture<U> supplyAsync(Supplier<U> a);
803 jsr166 1.46 public abstract <T> CompletableFuture<Void> thenRun
804     (CompletableFuture<T> f, Runnable a);
805     public abstract <T> CompletableFuture<Void> thenAccept
806     (CompletableFuture<T> f, Consumer<? super T> a);
807     public abstract <T,U> CompletableFuture<U> thenApply
808     (CompletableFuture<T> f, Function<? super T,U> a);
809     public abstract <T,U> CompletableFuture<U> thenCompose
810     (CompletableFuture<T> f,
811     Function<? super T,? extends CompletionStage<U>> a);
812     public abstract <T,U> CompletableFuture<U> handle
813     (CompletableFuture<T> f,
814     BiFunction<? super T,Throwable,? extends U> a);
815     public abstract <T> CompletableFuture<T> whenComplete
816     (CompletableFuture<T> f,
817     BiConsumer<? super T,? super Throwable> a);
818 jsr166 1.35 public abstract <T,U> CompletableFuture<Void> runAfterBoth
819     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a);
820     public abstract <T,U> CompletableFuture<Void> thenAcceptBoth
821     (CompletableFuture<T> f,
822     CompletionStage<? extends U> g,
823     BiConsumer<? super T,? super U> a);
824 jsr166 1.36 public abstract <T,U,V> CompletableFuture<V> thenCombine
825     (CompletableFuture<T> f,
826     CompletionStage<? extends U> g,
827     BiFunction<? super T,? super U,? extends V> a);
828 jsr166 1.46 public abstract <T> CompletableFuture<Void> runAfterEither
829 jsr166 1.38 (CompletableFuture<T> f,
830 jsr166 1.46 CompletionStage<?> g,
831     java.lang.Runnable a);
832 jsr166 1.38 public abstract <T> CompletableFuture<Void> acceptEither
833     (CompletableFuture<T> f,
834     CompletionStage<? extends T> g,
835     Consumer<? super T> a);
836 jsr166 1.46 public abstract <T,U> CompletableFuture<U> applyToEither
837 jsr166 1.38 (CompletableFuture<T> f,
838 jsr166 1.46 CompletionStage<? extends T> g,
839     Function<? super T,U> a);
840     }
841    
842     /**
843     * exceptionally action is not invoked when source completes
844     * normally, and source result is propagated
845     */
846     public void testExceptionally_normalCompletion() {
847     for (boolean createIncomplete : new boolean[] { true, false })
848     for (Integer v1 : new Integer[] { 1, null })
849     {
850     final AtomicInteger a = new AtomicInteger(0);
851     final CompletableFuture<Integer> f = new CompletableFuture<>();
852 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
853 jsr166 1.46 final CompletableFuture<Integer> g = f.exceptionally
854     ((Throwable t) -> {
855     a.getAndIncrement();
856 jsr166 1.127 threadFail("should not be called");
857     return null; // unreached
858 jsr166 1.46 });
859 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
860 jsr166 1.38
861 jsr166 1.46 checkCompletedNormally(g, v1);
862     checkCompletedNormally(f, v1);
863     assertEquals(0, a.get());
864     }}
865 jsr166 1.38
866 jsr166 1.35 /**
867 dl 1.5 * exceptionally action completes with function value on source
868 jsr166 1.46 * exception
869     */
870     public void testExceptionally_exceptionalCompletion() {
871     for (boolean createIncomplete : new boolean[] { true, false })
872     for (Integer v1 : new Integer[] { 1, null })
873     {
874     final AtomicInteger a = new AtomicInteger(0);
875     final CFException ex = new CFException();
876     final CompletableFuture<Integer> f = new CompletableFuture<>();
877     if (!createIncomplete) f.completeExceptionally(ex);
878     final CompletableFuture<Integer> g = f.exceptionally
879     ((Throwable t) -> {
880 jsr166 1.95 ExecutionMode.SYNC.checkExecutionMode();
881 jsr166 1.46 threadAssertSame(t, ex);
882     a.getAndIncrement();
883     return v1;
884     });
885     if (createIncomplete) f.completeExceptionally(ex);
886    
887     checkCompletedNormally(g, v1);
888     assertEquals(1, a.get());
889     }}
890    
891 jsr166 1.136 /**
892     * If an "exceptionally action" throws an exception, it completes
893     * exceptionally with that exception
894     */
895 jsr166 1.46 public void testExceptionally_exceptionalCompletionActionFailed() {
896     for (boolean createIncomplete : new boolean[] { true, false })
897     {
898     final AtomicInteger a = new AtomicInteger(0);
899     final CFException ex1 = new CFException();
900     final CFException ex2 = new CFException();
901     final CompletableFuture<Integer> f = new CompletableFuture<>();
902     if (!createIncomplete) f.completeExceptionally(ex1);
903     final CompletableFuture<Integer> g = f.exceptionally
904     ((Throwable t) -> {
905 jsr166 1.95 ExecutionMode.SYNC.checkExecutionMode();
906 jsr166 1.46 threadAssertSame(t, ex1);
907     a.getAndIncrement();
908     throw ex2;
909     });
910     if (createIncomplete) f.completeExceptionally(ex1);
911    
912 jsr166 1.72 checkCompletedWithWrappedException(g, ex2);
913 jsr166 1.136 checkCompletedExceptionally(f, ex1);
914 jsr166 1.46 assertEquals(1, a.get());
915     }}
916    
917     /**
918 jsr166 1.75 * whenComplete action executes on normal completion, propagating
919     * source result.
920     */
921 jsr166 1.126 public void testWhenComplete_normalCompletion() {
922 jsr166 1.75 for (ExecutionMode m : ExecutionMode.values())
923     for (boolean createIncomplete : new boolean[] { true, false })
924     for (Integer v1 : new Integer[] { 1, null })
925     {
926     final AtomicInteger a = new AtomicInteger(0);
927     final CompletableFuture<Integer> f = new CompletableFuture<>();
928 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
929 jsr166 1.75 final CompletableFuture<Integer> g = m.whenComplete
930     (f,
931 jsr166 1.135 (Integer result, Throwable t) -> {
932 jsr166 1.75 m.checkExecutionMode();
933 jsr166 1.135 threadAssertSame(result, v1);
934 jsr166 1.75 threadAssertNull(t);
935     a.getAndIncrement();
936     });
937 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
938 jsr166 1.75
939     checkCompletedNormally(g, v1);
940     checkCompletedNormally(f, v1);
941     assertEquals(1, a.get());
942     }}
943    
944     /**
945     * whenComplete action executes on exceptional completion, propagating
946     * source result.
947     */
948     public void testWhenComplete_exceptionalCompletion() {
949     for (ExecutionMode m : ExecutionMode.values())
950     for (boolean createIncomplete : new boolean[] { true, false })
951     {
952     final AtomicInteger a = new AtomicInteger(0);
953     final CFException ex = new CFException();
954     final CompletableFuture<Integer> f = new CompletableFuture<>();
955     if (!createIncomplete) f.completeExceptionally(ex);
956     final CompletableFuture<Integer> g = m.whenComplete
957     (f,
958 jsr166 1.135 (Integer result, Throwable t) -> {
959 jsr166 1.75 m.checkExecutionMode();
960 jsr166 1.135 threadAssertNull(result);
961 jsr166 1.75 threadAssertSame(t, ex);
962     a.getAndIncrement();
963     });
964     if (createIncomplete) f.completeExceptionally(ex);
965    
966     checkCompletedWithWrappedException(g, ex);
967     checkCompletedExceptionally(f, ex);
968     assertEquals(1, a.get());
969     }}
970    
971     /**
972     * whenComplete action executes on cancelled source, propagating
973     * CancellationException.
974     */
975     public void testWhenComplete_sourceCancelled() {
976     for (ExecutionMode m : ExecutionMode.values())
977     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
978     for (boolean createIncomplete : new boolean[] { true, false })
979     {
980     final AtomicInteger a = new AtomicInteger(0);
981     final CompletableFuture<Integer> f = new CompletableFuture<>();
982     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
983     final CompletableFuture<Integer> g = m.whenComplete
984     (f,
985 jsr166 1.135 (Integer result, Throwable t) -> {
986 jsr166 1.75 m.checkExecutionMode();
987 jsr166 1.135 threadAssertNull(result);
988 jsr166 1.75 threadAssertTrue(t instanceof CancellationException);
989     a.getAndIncrement();
990     });
991     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
992    
993     checkCompletedWithWrappedCancellationException(g);
994     checkCancelled(f);
995     assertEquals(1, a.get());
996     }}
997    
998     /**
999     * If a whenComplete action throws an exception when triggered by
1000     * a normal completion, it completes exceptionally
1001     */
1002 jsr166 1.132 public void testWhenComplete_sourceCompletedNormallyActionFailed() {
1003 jsr166 1.75 for (boolean createIncomplete : new boolean[] { true, false })
1004     for (ExecutionMode m : ExecutionMode.values())
1005     for (Integer v1 : new Integer[] { 1, null })
1006     {
1007     final AtomicInteger a = new AtomicInteger(0);
1008     final CFException ex = new CFException();
1009     final CompletableFuture<Integer> f = new CompletableFuture<>();
1010 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1011 jsr166 1.75 final CompletableFuture<Integer> g = m.whenComplete
1012     (f,
1013 jsr166 1.135 (Integer result, Throwable t) -> {
1014 jsr166 1.75 m.checkExecutionMode();
1015 jsr166 1.135 threadAssertSame(result, v1);
1016 jsr166 1.75 threadAssertNull(t);
1017     a.getAndIncrement();
1018     throw ex;
1019     });
1020 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
1021 jsr166 1.75
1022     checkCompletedWithWrappedException(g, ex);
1023     checkCompletedNormally(f, v1);
1024     assertEquals(1, a.get());
1025     }}
1026    
1027     /**
1028     * If a whenComplete action throws an exception when triggered by
1029     * a source completion that also throws an exception, the source
1030 jsr166 1.134 * exception takes precedence (unlike handle)
1031 jsr166 1.75 */
1032 jsr166 1.134 public void testWhenComplete_sourceFailedActionFailed() {
1033 jsr166 1.75 for (boolean createIncomplete : new boolean[] { true, false })
1034     for (ExecutionMode m : ExecutionMode.values())
1035     {
1036     final AtomicInteger a = new AtomicInteger(0);
1037     final CFException ex1 = new CFException();
1038     final CFException ex2 = new CFException();
1039     final CompletableFuture<Integer> f = new CompletableFuture<>();
1040    
1041     if (!createIncomplete) f.completeExceptionally(ex1);
1042     final CompletableFuture<Integer> g = m.whenComplete
1043     (f,
1044 jsr166 1.135 (Integer result, Throwable t) -> {
1045 jsr166 1.75 m.checkExecutionMode();
1046     threadAssertSame(t, ex1);
1047 jsr166 1.135 threadAssertNull(result);
1048 jsr166 1.75 a.getAndIncrement();
1049     throw ex2;
1050     });
1051     if (createIncomplete) f.completeExceptionally(ex1);
1052    
1053     checkCompletedWithWrappedException(g, ex1);
1054     checkCompletedExceptionally(f, ex1);
1055 jsr166 1.139 if (testImplementationDetails) {
1056     assertEquals(1, ex1.getSuppressed().length);
1057     assertSame(ex2, ex1.getSuppressed()[0]);
1058     }
1059 jsr166 1.75 assertEquals(1, a.get());
1060     }}
1061    
1062     /**
1063 jsr166 1.46 * handle action completes normally with function value on normal
1064     * completion of source
1065     */
1066     public void testHandle_normalCompletion() {
1067     for (ExecutionMode m : ExecutionMode.values())
1068     for (boolean createIncomplete : new boolean[] { true, false })
1069     for (Integer v1 : new Integer[] { 1, null })
1070     {
1071     final CompletableFuture<Integer> f = new CompletableFuture<>();
1072     final AtomicInteger a = new AtomicInteger(0);
1073 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1074 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1075     (f,
1076 jsr166 1.135 (Integer result, Throwable t) -> {
1077 jsr166 1.57 m.checkExecutionMode();
1078 jsr166 1.135 threadAssertSame(result, v1);
1079 jsr166 1.46 threadAssertNull(t);
1080     a.getAndIncrement();
1081     return inc(v1);
1082     });
1083 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
1084 jsr166 1.46
1085     checkCompletedNormally(g, inc(v1));
1086     checkCompletedNormally(f, v1);
1087     assertEquals(1, a.get());
1088     }}
1089    
1090     /**
1091     * handle action completes normally with function value on
1092     * exceptional completion of source
1093 dl 1.5 */
1094 jsr166 1.46 public void testHandle_exceptionalCompletion() {
1095     for (ExecutionMode m : ExecutionMode.values())
1096     for (boolean createIncomplete : new boolean[] { true, false })
1097     for (Integer v1 : new Integer[] { 1, null })
1098     {
1099     final CompletableFuture<Integer> f = new CompletableFuture<>();
1100     final AtomicInteger a = new AtomicInteger(0);
1101     final CFException ex = new CFException();
1102     if (!createIncomplete) f.completeExceptionally(ex);
1103     final CompletableFuture<Integer> g = m.handle
1104     (f,
1105 jsr166 1.135 (Integer result, Throwable t) -> {
1106 jsr166 1.57 m.checkExecutionMode();
1107 jsr166 1.135 threadAssertNull(result);
1108 jsr166 1.46 threadAssertSame(t, ex);
1109     a.getAndIncrement();
1110     return v1;
1111     });
1112     if (createIncomplete) f.completeExceptionally(ex);
1113 dl 1.5
1114 jsr166 1.46 checkCompletedNormally(g, v1);
1115 jsr166 1.72 checkCompletedExceptionally(f, ex);
1116 jsr166 1.46 assertEquals(1, a.get());
1117     }}
1118 dl 1.5
1119     /**
1120 jsr166 1.46 * handle action completes normally with function value on
1121     * cancelled source
1122 dl 1.5 */
1123 jsr166 1.46 public void testHandle_sourceCancelled() {
1124     for (ExecutionMode m : ExecutionMode.values())
1125     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1126     for (boolean createIncomplete : new boolean[] { true, false })
1127     for (Integer v1 : new Integer[] { 1, null })
1128     {
1129     final CompletableFuture<Integer> f = new CompletableFuture<>();
1130     final AtomicInteger a = new AtomicInteger(0);
1131     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1132     final CompletableFuture<Integer> g = m.handle
1133     (f,
1134 jsr166 1.135 (Integer result, Throwable t) -> {
1135 jsr166 1.57 m.checkExecutionMode();
1136 jsr166 1.135 threadAssertNull(result);
1137 jsr166 1.46 threadAssertTrue(t instanceof CancellationException);
1138     a.getAndIncrement();
1139     return v1;
1140     });
1141     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1142    
1143     checkCompletedNormally(g, v1);
1144     checkCancelled(f);
1145     assertEquals(1, a.get());
1146     }}
1147 jsr166 1.15
1148 jsr166 1.46 /**
1149 jsr166 1.134 * If a "handle action" throws an exception when triggered by
1150     * a normal completion, it completes exceptionally
1151 jsr166 1.46 */
1152 jsr166 1.134 public void testHandle_sourceCompletedNormallyActionFailed() {
1153 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
1154     for (boolean createIncomplete : new boolean[] { true, false })
1155 jsr166 1.134 for (Integer v1 : new Integer[] { 1, null })
1156 jsr166 1.46 {
1157     final CompletableFuture<Integer> f = new CompletableFuture<>();
1158     final AtomicInteger a = new AtomicInteger(0);
1159 jsr166 1.134 final CFException ex = new CFException();
1160     if (!createIncomplete) assertTrue(f.complete(v1));
1161 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1162     (f,
1163 jsr166 1.135 (Integer result, Throwable t) -> {
1164 jsr166 1.57 m.checkExecutionMode();
1165 jsr166 1.135 threadAssertSame(result, v1);
1166 jsr166 1.134 threadAssertNull(t);
1167 jsr166 1.46 a.getAndIncrement();
1168 jsr166 1.134 throw ex;
1169 jsr166 1.46 });
1170 jsr166 1.134 if (createIncomplete) assertTrue(f.complete(v1));
1171 dl 1.5
1172 jsr166 1.134 checkCompletedWithWrappedException(g, ex);
1173     checkCompletedNormally(f, v1);
1174 jsr166 1.46 assertEquals(1, a.get());
1175     }}
1176 jsr166 1.15
1177 jsr166 1.133 /**
1178     * If a "handle action" throws an exception when triggered by
1179 jsr166 1.134 * a source completion that also throws an exception, the action
1180     * exception takes precedence (unlike whenComplete)
1181 jsr166 1.133 */
1182 jsr166 1.134 public void testHandle_sourceFailedActionFailed() {
1183     for (boolean createIncomplete : new boolean[] { true, false })
1184 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
1185     {
1186 jsr166 1.134 final AtomicInteger a = new AtomicInteger(0);
1187     final CFException ex1 = new CFException();
1188     final CFException ex2 = new CFException();
1189 jsr166 1.46 final CompletableFuture<Integer> f = new CompletableFuture<>();
1190 jsr166 1.134
1191     if (!createIncomplete) f.completeExceptionally(ex1);
1192 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1193     (f,
1194 jsr166 1.135 (Integer result, Throwable t) -> {
1195 jsr166 1.57 m.checkExecutionMode();
1196 jsr166 1.135 threadAssertNull(result);
1197 jsr166 1.134 threadAssertSame(ex1, t);
1198 jsr166 1.46 a.getAndIncrement();
1199 jsr166 1.134 throw ex2;
1200 jsr166 1.46 });
1201 jsr166 1.134 if (createIncomplete) f.completeExceptionally(ex1);
1202 jsr166 1.15
1203 jsr166 1.134 checkCompletedWithWrappedException(g, ex2);
1204     checkCompletedExceptionally(f, ex1);
1205 jsr166 1.46 assertEquals(1, a.get());
1206     }}
1207 dl 1.5
1208     /**
1209     * runAsync completes after running Runnable
1210     */
1211 jsr166 1.57 public void testRunAsync_normalCompletion() {
1212     ExecutionMode[] executionModes = {
1213     ExecutionMode.ASYNC,
1214     ExecutionMode.EXECUTOR,
1215     };
1216     for (ExecutionMode m : executionModes)
1217     {
1218     final Noop r = new Noop(m);
1219     final CompletableFuture<Void> f = m.runAsync(r);
1220 dl 1.5 assertNull(f.join());
1221 jsr166 1.14 checkCompletedNormally(f, null);
1222 jsr166 1.62 r.assertInvoked();
1223 jsr166 1.57 }}
1224 dl 1.5
1225     /**
1226     * failing runAsync completes exceptionally after running Runnable
1227     */
1228 jsr166 1.57 public void testRunAsync_exceptionalCompletion() {
1229     ExecutionMode[] executionModes = {
1230     ExecutionMode.ASYNC,
1231     ExecutionMode.EXECUTOR,
1232     };
1233     for (ExecutionMode m : executionModes)
1234     {
1235     final FailingRunnable r = new FailingRunnable(m);
1236     final CompletableFuture<Void> f = m.runAsync(r);
1237 jsr166 1.151 checkCompletedWithWrappedException(f, r.ex);
1238 jsr166 1.62 r.assertInvoked();
1239 jsr166 1.57 }}
1240 dl 1.5
1241 jsr166 1.187 @SuppressWarnings("FutureReturnValueIgnored")
1242 jsr166 1.155 public void testRunAsync_rejectingExecutor() {
1243     CountingRejectingExecutor e = new CountingRejectingExecutor();
1244     try {
1245     CompletableFuture.runAsync(() -> {}, e);
1246     shouldThrow();
1247     } catch (Throwable t) {
1248     assertSame(e.ex, t);
1249     }
1250    
1251     assertEquals(1, e.count.get());
1252     }
1253    
1254 dl 1.5 /**
1255     * supplyAsync completes with result of supplier
1256     */
1257 jsr166 1.58 public void testSupplyAsync_normalCompletion() {
1258     ExecutionMode[] executionModes = {
1259     ExecutionMode.ASYNC,
1260     ExecutionMode.EXECUTOR,
1261     };
1262     for (ExecutionMode m : executionModes)
1263     for (Integer v1 : new Integer[] { 1, null })
1264     {
1265     final IntegerSupplier r = new IntegerSupplier(m, v1);
1266     final CompletableFuture<Integer> f = m.supplyAsync(r);
1267     assertSame(v1, f.join());
1268     checkCompletedNormally(f, v1);
1269 jsr166 1.62 r.assertInvoked();
1270 jsr166 1.58 }}
1271 dl 1.5
1272     /**
1273     * Failing supplyAsync completes exceptionally
1274     */
1275 jsr166 1.58 public void testSupplyAsync_exceptionalCompletion() {
1276     ExecutionMode[] executionModes = {
1277     ExecutionMode.ASYNC,
1278     ExecutionMode.EXECUTOR,
1279     };
1280     for (ExecutionMode m : executionModes)
1281     {
1282     FailingSupplier r = new FailingSupplier(m);
1283     CompletableFuture<Integer> f = m.supplyAsync(r);
1284 jsr166 1.151 checkCompletedWithWrappedException(f, r.ex);
1285 jsr166 1.62 r.assertInvoked();
1286 jsr166 1.58 }}
1287 dl 1.5
1288 jsr166 1.187 @SuppressWarnings("FutureReturnValueIgnored")
1289 jsr166 1.155 public void testSupplyAsync_rejectingExecutor() {
1290     CountingRejectingExecutor e = new CountingRejectingExecutor();
1291     try {
1292     CompletableFuture.supplyAsync(() -> null, e);
1293     shouldThrow();
1294     } catch (Throwable t) {
1295     assertSame(e.ex, t);
1296     }
1297    
1298     assertEquals(1, e.count.get());
1299     }
1300    
1301 jsr166 1.7 // seq completion methods
1302 jsr166 1.6
1303 dl 1.5 /**
1304     * thenRun result completes normally after normal completion of source
1305     */
1306 jsr166 1.48 public void testThenRun_normalCompletion() {
1307     for (ExecutionMode m : ExecutionMode.values())
1308     for (Integer v1 : new Integer[] { 1, null })
1309     {
1310     final CompletableFuture<Integer> f = new CompletableFuture<>();
1311 jsr166 1.90 final Noop[] rs = new Noop[6];
1312     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1313    
1314     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1315     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1316     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1317     checkIncomplete(h0);
1318     checkIncomplete(h1);
1319     checkIncomplete(h2);
1320     assertTrue(f.complete(v1));
1321     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1322     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1323     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1324 jsr166 1.23
1325 jsr166 1.90 checkCompletedNormally(h0, null);
1326     checkCompletedNormally(h1, null);
1327     checkCompletedNormally(h2, null);
1328     checkCompletedNormally(h3, null);
1329     checkCompletedNormally(h4, null);
1330     checkCompletedNormally(h5, null);
1331 jsr166 1.48 checkCompletedNormally(f, v1);
1332 jsr166 1.90 for (Noop r : rs) r.assertInvoked();
1333 jsr166 1.48 }}
1334 dl 1.5
1335     /**
1336     * thenRun result completes exceptionally after exceptional
1337     * completion of source
1338     */
1339 jsr166 1.48 public void testThenRun_exceptionalCompletion() {
1340     for (ExecutionMode m : ExecutionMode.values())
1341     {
1342     final CFException ex = new CFException();
1343     final CompletableFuture<Integer> f = new CompletableFuture<>();
1344 jsr166 1.90 final Noop[] rs = new Noop[6];
1345     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1346    
1347     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1348     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1349     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1350     checkIncomplete(h0);
1351     checkIncomplete(h1);
1352     checkIncomplete(h2);
1353     assertTrue(f.completeExceptionally(ex));
1354     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1355     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1356     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1357 jsr166 1.23
1358 jsr166 1.90 checkCompletedWithWrappedException(h0, ex);
1359     checkCompletedWithWrappedException(h1, ex);
1360     checkCompletedWithWrappedException(h2, ex);
1361     checkCompletedWithWrappedException(h3, ex);
1362     checkCompletedWithWrappedException(h4, ex);
1363     checkCompletedWithWrappedException(h5, ex);
1364 jsr166 1.72 checkCompletedExceptionally(f, ex);
1365 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1366 jsr166 1.48 }}
1367    
1368     /**
1369     * thenRun result completes exceptionally if source cancelled
1370     */
1371     public void testThenRun_sourceCancelled() {
1372     for (ExecutionMode m : ExecutionMode.values())
1373     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1374     {
1375     final CompletableFuture<Integer> f = new CompletableFuture<>();
1376 jsr166 1.90 final Noop[] rs = new Noop[6];
1377     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1378    
1379     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1380     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1381     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1382     checkIncomplete(h0);
1383     checkIncomplete(h1);
1384     checkIncomplete(h2);
1385     assertTrue(f.cancel(mayInterruptIfRunning));
1386     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1387     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1388     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1389 jsr166 1.23
1390 jsr166 1.90 checkCompletedWithWrappedCancellationException(h0);
1391     checkCompletedWithWrappedCancellationException(h1);
1392     checkCompletedWithWrappedCancellationException(h2);
1393     checkCompletedWithWrappedCancellationException(h3);
1394     checkCompletedWithWrappedCancellationException(h4);
1395     checkCompletedWithWrappedCancellationException(h5);
1396 jsr166 1.48 checkCancelled(f);
1397 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1398 jsr166 1.48 }}
1399 dl 1.5
1400     /**
1401     * thenRun result completes exceptionally if action does
1402     */
1403 jsr166 1.48 public void testThenRun_actionFailed() {
1404     for (ExecutionMode m : ExecutionMode.values())
1405     for (Integer v1 : new Integer[] { 1, null })
1406     {
1407     final CompletableFuture<Integer> f = new CompletableFuture<>();
1408 jsr166 1.90 final FailingRunnable[] rs = new FailingRunnable[6];
1409     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
1410    
1411     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1412     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1413     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1414     assertTrue(f.complete(v1));
1415     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1416     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1417     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1418 jsr166 1.23
1419 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
1420     checkCompletedWithWrappedException(h1, rs[1].ex);
1421     checkCompletedWithWrappedException(h2, rs[2].ex);
1422     checkCompletedWithWrappedException(h3, rs[3].ex);
1423     checkCompletedWithWrappedException(h4, rs[4].ex);
1424     checkCompletedWithWrappedException(h5, rs[5].ex);
1425 jsr166 1.48 checkCompletedNormally(f, v1);
1426     }}
1427 dl 1.5
1428     /**
1429     * thenApply result completes normally after normal completion of source
1430     */
1431 jsr166 1.49 public void testThenApply_normalCompletion() {
1432     for (ExecutionMode m : ExecutionMode.values())
1433     for (Integer v1 : new Integer[] { 1, null })
1434     {
1435     final CompletableFuture<Integer> f = new CompletableFuture<>();
1436 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1437     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1438    
1439     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1440     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1441     checkIncomplete(h0);
1442     checkIncomplete(h1);
1443     assertTrue(f.complete(v1));
1444     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1445     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1446 jsr166 1.49
1447 jsr166 1.91 checkCompletedNormally(h0, inc(v1));
1448     checkCompletedNormally(h1, inc(v1));
1449     checkCompletedNormally(h2, inc(v1));
1450     checkCompletedNormally(h3, inc(v1));
1451 jsr166 1.49 checkCompletedNormally(f, v1);
1452 jsr166 1.91 for (IncFunction r : rs) r.assertValue(inc(v1));
1453 jsr166 1.49 }}
1454 dl 1.5
1455     /**
1456     * thenApply result completes exceptionally after exceptional
1457     * completion of source
1458     */
1459 jsr166 1.49 public void testThenApply_exceptionalCompletion() {
1460     for (ExecutionMode m : ExecutionMode.values())
1461     {
1462     final CFException ex = new CFException();
1463     final CompletableFuture<Integer> f = new CompletableFuture<>();
1464 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1465     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1466    
1467     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1468     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1469     assertTrue(f.completeExceptionally(ex));
1470     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1471     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1472 jsr166 1.49
1473 jsr166 1.91 checkCompletedWithWrappedException(h0, ex);
1474     checkCompletedWithWrappedException(h1, ex);
1475     checkCompletedWithWrappedException(h2, ex);
1476     checkCompletedWithWrappedException(h3, ex);
1477 jsr166 1.72 checkCompletedExceptionally(f, ex);
1478 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1479 jsr166 1.49 }}
1480 dl 1.5
1481     /**
1482 jsr166 1.49 * thenApply result completes exceptionally if source cancelled
1483 dl 1.5 */
1484 jsr166 1.49 public void testThenApply_sourceCancelled() {
1485     for (ExecutionMode m : ExecutionMode.values())
1486     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1487     {
1488     final CompletableFuture<Integer> f = new CompletableFuture<>();
1489 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1490     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1491    
1492     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1493     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1494     assertTrue(f.cancel(mayInterruptIfRunning));
1495     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1496     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1497 jsr166 1.49
1498 jsr166 1.91 checkCompletedWithWrappedCancellationException(h0);
1499     checkCompletedWithWrappedCancellationException(h1);
1500     checkCompletedWithWrappedCancellationException(h2);
1501     checkCompletedWithWrappedCancellationException(h3);
1502 jsr166 1.49 checkCancelled(f);
1503 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1504 jsr166 1.49 }}
1505 dl 1.5
1506     /**
1507 jsr166 1.49 * thenApply result completes exceptionally if action does
1508 dl 1.5 */
1509 jsr166 1.49 public void testThenApply_actionFailed() {
1510     for (ExecutionMode m : ExecutionMode.values())
1511     for (Integer v1 : new Integer[] { 1, null })
1512     {
1513     final CompletableFuture<Integer> f = new CompletableFuture<>();
1514 jsr166 1.91 final FailingFunction[] rs = new FailingFunction[4];
1515     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
1516    
1517     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1518     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1519     assertTrue(f.complete(v1));
1520     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1521     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1522 jsr166 1.49
1523 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
1524     checkCompletedWithWrappedException(h1, rs[1].ex);
1525     checkCompletedWithWrappedException(h2, rs[2].ex);
1526     checkCompletedWithWrappedException(h3, rs[3].ex);
1527 jsr166 1.49 checkCompletedNormally(f, v1);
1528     }}
1529 dl 1.5
1530     /**
1531     * thenAccept result completes normally after normal completion of source
1532     */
1533 jsr166 1.50 public void testThenAccept_normalCompletion() {
1534     for (ExecutionMode m : ExecutionMode.values())
1535     for (Integer v1 : new Integer[] { 1, null })
1536     {
1537     final CompletableFuture<Integer> f = new CompletableFuture<>();
1538 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1539     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1540    
1541     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1542     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1543     checkIncomplete(h0);
1544     checkIncomplete(h1);
1545     assertTrue(f.complete(v1));
1546     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1547     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1548 jsr166 1.50
1549 jsr166 1.92 checkCompletedNormally(h0, null);
1550     checkCompletedNormally(h1, null);
1551     checkCompletedNormally(h2, null);
1552     checkCompletedNormally(h3, null);
1553 jsr166 1.50 checkCompletedNormally(f, v1);
1554 jsr166 1.92 for (NoopConsumer r : rs) r.assertValue(v1);
1555 jsr166 1.50 }}
1556 dl 1.5
1557     /**
1558     * thenAccept result completes exceptionally after exceptional
1559     * completion of source
1560     */
1561 jsr166 1.50 public void testThenAccept_exceptionalCompletion() {
1562     for (ExecutionMode m : ExecutionMode.values())
1563     {
1564     final CFException ex = new CFException();
1565     final CompletableFuture<Integer> f = new CompletableFuture<>();
1566 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1567     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1568    
1569     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1570     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1571     assertTrue(f.completeExceptionally(ex));
1572     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1573     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1574 jsr166 1.50
1575 jsr166 1.92 checkCompletedWithWrappedException(h0, ex);
1576     checkCompletedWithWrappedException(h1, ex);
1577     checkCompletedWithWrappedException(h2, ex);
1578     checkCompletedWithWrappedException(h3, ex);
1579 jsr166 1.72 checkCompletedExceptionally(f, ex);
1580 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1581 jsr166 1.50 }}
1582 dl 1.5
1583     /**
1584 jsr166 1.61 * thenAccept result completes exceptionally if source cancelled
1585 dl 1.5 */
1586 jsr166 1.61 public void testThenAccept_sourceCancelled() {
1587 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1588 jsr166 1.61 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1589 jsr166 1.50 {
1590     final CompletableFuture<Integer> f = new CompletableFuture<>();
1591 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1592     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1593    
1594     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1595     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1596     assertTrue(f.cancel(mayInterruptIfRunning));
1597     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1598     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1599 jsr166 1.50
1600 jsr166 1.92 checkCompletedWithWrappedCancellationException(h0);
1601     checkCompletedWithWrappedCancellationException(h1);
1602     checkCompletedWithWrappedCancellationException(h2);
1603     checkCompletedWithWrappedCancellationException(h3);
1604 jsr166 1.61 checkCancelled(f);
1605 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1606 jsr166 1.50 }}
1607 dl 1.5
1608     /**
1609 jsr166 1.61 * thenAccept result completes exceptionally if action does
1610 dl 1.5 */
1611 jsr166 1.61 public void testThenAccept_actionFailed() {
1612 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1613 jsr166 1.61 for (Integer v1 : new Integer[] { 1, null })
1614 jsr166 1.50 {
1615     final CompletableFuture<Integer> f = new CompletableFuture<>();
1616 jsr166 1.92 final FailingConsumer[] rs = new FailingConsumer[4];
1617     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
1618    
1619     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1620     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1621     assertTrue(f.complete(v1));
1622     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1623     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1624 jsr166 1.50
1625 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
1626     checkCompletedWithWrappedException(h1, rs[1].ex);
1627     checkCompletedWithWrappedException(h2, rs[2].ex);
1628     checkCompletedWithWrappedException(h3, rs[3].ex);
1629 jsr166 1.61 checkCompletedNormally(f, v1);
1630 jsr166 1.50 }}
1631 dl 1.5
1632     /**
1633 jsr166 1.18 * thenCombine result completes normally after normal completion
1634     * of sources
1635 dl 1.5 */
1636 jsr166 1.51 public void testThenCombine_normalCompletion() {
1637     for (ExecutionMode m : ExecutionMode.values())
1638 jsr166 1.43 for (boolean fFirst : new boolean[] { true, false })
1639 jsr166 1.36 for (Integer v1 : new Integer[] { 1, null })
1640 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1641     {
1642 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1643     final CompletableFuture<Integer> g = new CompletableFuture<>();
1644 jsr166 1.93 final SubtractFunction[] rs = new SubtractFunction[6];
1645     for (int i = 0; i < rs.length; i++) rs[i] = new SubtractFunction(m);
1646 jsr166 1.79
1647     final CompletableFuture<Integer> fst = fFirst ? f : g;
1648     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1649     final Integer w1 = fFirst ? v1 : v2;
1650     final Integer w2 = !fFirst ? v1 : v2;
1651    
1652 jsr166 1.93 final CompletableFuture<Integer> h0 = m.thenCombine(f, g, rs[0]);
1653     final CompletableFuture<Integer> h1 = m.thenCombine(fst, fst, rs[1]);
1654 jsr166 1.79 assertTrue(fst.complete(w1));
1655 jsr166 1.93 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, rs[2]);
1656     final CompletableFuture<Integer> h3 = m.thenCombine(fst, fst, rs[3]);
1657     checkIncomplete(h0); rs[0].assertNotInvoked();
1658     checkIncomplete(h2); rs[2].assertNotInvoked();
1659     checkCompletedNormally(h1, subtract(w1, w1));
1660     checkCompletedNormally(h3, subtract(w1, w1));
1661     rs[1].assertValue(subtract(w1, w1));
1662     rs[3].assertValue(subtract(w1, w1));
1663 jsr166 1.79 assertTrue(snd.complete(w2));
1664 jsr166 1.93 final CompletableFuture<Integer> h4 = m.thenCombine(f, g, rs[4]);
1665 jsr166 1.79
1666 jsr166 1.93 checkCompletedNormally(h0, subtract(v1, v2));
1667 jsr166 1.79 checkCompletedNormally(h2, subtract(v1, v2));
1668 jsr166 1.93 checkCompletedNormally(h4, subtract(v1, v2));
1669     rs[0].assertValue(subtract(v1, v2));
1670     rs[2].assertValue(subtract(v1, v2));
1671     rs[4].assertValue(subtract(v1, v2));
1672 jsr166 1.94
1673 jsr166 1.36 checkCompletedNormally(f, v1);
1674     checkCompletedNormally(g, v2);
1675 jsr166 1.47 }}
1676 dl 1.5
1677     /**
1678     * thenCombine result completes exceptionally after exceptional
1679     * completion of either source
1680     */
1681 jsr166 1.79 public void testThenCombine_exceptionalCompletion() throws Throwable {
1682 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1683 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1684 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1685 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1686     {
1687 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1688     final CompletableFuture<Integer> g = new CompletableFuture<>();
1689     final CFException ex = new CFException();
1690 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1691     final SubtractFunction r2 = new SubtractFunction(m);
1692     final SubtractFunction r3 = new SubtractFunction(m);
1693    
1694     final CompletableFuture<Integer> fst = fFirst ? f : g;
1695     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1696     final Callable<Boolean> complete1 = failFirst ?
1697     () -> fst.completeExceptionally(ex) :
1698     () -> fst.complete(v1);
1699     final Callable<Boolean> complete2 = failFirst ?
1700     () -> snd.complete(v1) :
1701     () -> snd.completeExceptionally(ex);
1702    
1703     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1704     assertTrue(complete1.call());
1705     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1706     checkIncomplete(h1);
1707     checkIncomplete(h2);
1708     assertTrue(complete2.call());
1709     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1710 jsr166 1.18
1711 jsr166 1.79 checkCompletedWithWrappedException(h1, ex);
1712     checkCompletedWithWrappedException(h2, ex);
1713     checkCompletedWithWrappedException(h3, ex);
1714     r1.assertNotInvoked();
1715     r2.assertNotInvoked();
1716     r3.assertNotInvoked();
1717     checkCompletedNormally(failFirst ? snd : fst, v1);
1718     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1719 jsr166 1.47 }}
1720 dl 1.5
1721     /**
1722     * thenCombine result completes exceptionally if either source cancelled
1723     */
1724 jsr166 1.79 public void testThenCombine_sourceCancelled() throws Throwable {
1725 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1726     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1727 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1728 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1729 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1730     {
1731 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1732     final CompletableFuture<Integer> g = new CompletableFuture<>();
1733 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1734     final SubtractFunction r2 = new SubtractFunction(m);
1735     final SubtractFunction r3 = new SubtractFunction(m);
1736 jsr166 1.18
1737 jsr166 1.79 final CompletableFuture<Integer> fst = fFirst ? f : g;
1738     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1739     final Callable<Boolean> complete1 = failFirst ?
1740     () -> fst.cancel(mayInterruptIfRunning) :
1741     () -> fst.complete(v1);
1742     final Callable<Boolean> complete2 = failFirst ?
1743     () -> snd.complete(v1) :
1744     () -> snd.cancel(mayInterruptIfRunning);
1745    
1746     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1747     assertTrue(complete1.call());
1748     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1749     checkIncomplete(h1);
1750     checkIncomplete(h2);
1751     assertTrue(complete2.call());
1752     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1753 jsr166 1.36
1754 jsr166 1.79 checkCompletedWithWrappedCancellationException(h1);
1755     checkCompletedWithWrappedCancellationException(h2);
1756     checkCompletedWithWrappedCancellationException(h3);
1757     r1.assertNotInvoked();
1758     r2.assertNotInvoked();
1759     r3.assertNotInvoked();
1760     checkCompletedNormally(failFirst ? snd : fst, v1);
1761     checkCancelled(failFirst ? fst : snd);
1762 jsr166 1.47 }}
1763 dl 1.5
1764     /**
1765 jsr166 1.61 * thenCombine result completes exceptionally if action does
1766     */
1767     public void testThenCombine_actionFailed() {
1768     for (ExecutionMode m : ExecutionMode.values())
1769     for (boolean fFirst : new boolean[] { true, false })
1770     for (Integer v1 : new Integer[] { 1, null })
1771     for (Integer v2 : new Integer[] { 2, null })
1772     {
1773     final CompletableFuture<Integer> f = new CompletableFuture<>();
1774     final CompletableFuture<Integer> g = new CompletableFuture<>();
1775 jsr166 1.79 final FailingBiFunction r1 = new FailingBiFunction(m);
1776     final FailingBiFunction r2 = new FailingBiFunction(m);
1777     final FailingBiFunction r3 = new FailingBiFunction(m);
1778    
1779     final CompletableFuture<Integer> fst = fFirst ? f : g;
1780     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1781     final Integer w1 = fFirst ? v1 : v2;
1782     final Integer w2 = !fFirst ? v1 : v2;
1783    
1784     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1785     assertTrue(fst.complete(w1));
1786     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1787     assertTrue(snd.complete(w2));
1788     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1789 jsr166 1.61
1790 jsr166 1.151 checkCompletedWithWrappedException(h1, r1.ex);
1791     checkCompletedWithWrappedException(h2, r2.ex);
1792     checkCompletedWithWrappedException(h3, r3.ex);
1793 jsr166 1.81 r1.assertInvoked();
1794     r2.assertInvoked();
1795     r3.assertInvoked();
1796 jsr166 1.61 checkCompletedNormally(f, v1);
1797     checkCompletedNormally(g, v2);
1798     }}
1799    
1800     /**
1801 dl 1.5 * thenAcceptBoth result completes normally after normal
1802     * completion of sources
1803     */
1804 jsr166 1.53 public void testThenAcceptBoth_normalCompletion() {
1805 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1806 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1807 jsr166 1.35 for (Integer v1 : new Integer[] { 1, null })
1808 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1809     {
1810 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1811     final CompletableFuture<Integer> g = new CompletableFuture<>();
1812 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1813     final SubtractAction r2 = new SubtractAction(m);
1814     final SubtractAction r3 = new SubtractAction(m);
1815    
1816     final CompletableFuture<Integer> fst = fFirst ? f : g;
1817     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1818     final Integer w1 = fFirst ? v1 : v2;
1819     final Integer w2 = !fFirst ? v1 : v2;
1820    
1821     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1822     assertTrue(fst.complete(w1));
1823     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1824     checkIncomplete(h1);
1825     checkIncomplete(h2);
1826     r1.assertNotInvoked();
1827     r2.assertNotInvoked();
1828     assertTrue(snd.complete(w2));
1829     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1830 jsr166 1.35
1831 jsr166 1.80 checkCompletedNormally(h1, null);
1832     checkCompletedNormally(h2, null);
1833     checkCompletedNormally(h3, null);
1834     r1.assertValue(subtract(v1, v2));
1835     r2.assertValue(subtract(v1, v2));
1836     r3.assertValue(subtract(v1, v2));
1837 jsr166 1.35 checkCompletedNormally(f, v1);
1838     checkCompletedNormally(g, v2);
1839 jsr166 1.47 }}
1840 dl 1.5
1841     /**
1842     * thenAcceptBoth result completes exceptionally after exceptional
1843     * completion of either source
1844     */
1845 jsr166 1.80 public void testThenAcceptBoth_exceptionalCompletion() throws Throwable {
1846 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1847 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1848 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1849 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1850     {
1851 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1852     final CompletableFuture<Integer> g = new CompletableFuture<>();
1853     final CFException ex = new CFException();
1854 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1855     final SubtractAction r2 = new SubtractAction(m);
1856     final SubtractAction r3 = new SubtractAction(m);
1857    
1858     final CompletableFuture<Integer> fst = fFirst ? f : g;
1859     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1860     final Callable<Boolean> complete1 = failFirst ?
1861     () -> fst.completeExceptionally(ex) :
1862     () -> fst.complete(v1);
1863     final Callable<Boolean> complete2 = failFirst ?
1864     () -> snd.complete(v1) :
1865     () -> snd.completeExceptionally(ex);
1866    
1867     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1868     assertTrue(complete1.call());
1869     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1870     checkIncomplete(h1);
1871     checkIncomplete(h2);
1872     assertTrue(complete2.call());
1873     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1874 jsr166 1.35
1875 jsr166 1.80 checkCompletedWithWrappedException(h1, ex);
1876     checkCompletedWithWrappedException(h2, ex);
1877     checkCompletedWithWrappedException(h3, ex);
1878     r1.assertNotInvoked();
1879     r2.assertNotInvoked();
1880     r3.assertNotInvoked();
1881     checkCompletedNormally(failFirst ? snd : fst, v1);
1882     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1883 jsr166 1.47 }}
1884 dl 1.5
1885     /**
1886     * thenAcceptBoth result completes exceptionally if either source cancelled
1887     */
1888 jsr166 1.80 public void testThenAcceptBoth_sourceCancelled() throws Throwable {
1889 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1890     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1891 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1892 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1893 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1894     {
1895 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1896     final CompletableFuture<Integer> g = new CompletableFuture<>();
1897 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1898     final SubtractAction r2 = new SubtractAction(m);
1899     final SubtractAction r3 = new SubtractAction(m);
1900    
1901     final CompletableFuture<Integer> fst = fFirst ? f : g;
1902     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1903     final Callable<Boolean> complete1 = failFirst ?
1904     () -> fst.cancel(mayInterruptIfRunning) :
1905     () -> fst.complete(v1);
1906     final Callable<Boolean> complete2 = failFirst ?
1907     () -> snd.complete(v1) :
1908     () -> snd.cancel(mayInterruptIfRunning);
1909 jsr166 1.35
1910 jsr166 1.80 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1911     assertTrue(complete1.call());
1912     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1913     checkIncomplete(h1);
1914     checkIncomplete(h2);
1915     assertTrue(complete2.call());
1916     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1917 jsr166 1.22
1918 jsr166 1.80 checkCompletedWithWrappedCancellationException(h1);
1919     checkCompletedWithWrappedCancellationException(h2);
1920     checkCompletedWithWrappedCancellationException(h3);
1921     r1.assertNotInvoked();
1922     r2.assertNotInvoked();
1923     r3.assertNotInvoked();
1924     checkCompletedNormally(failFirst ? snd : fst, v1);
1925     checkCancelled(failFirst ? fst : snd);
1926 jsr166 1.47 }}
1927 jsr166 1.34
1928     /**
1929 jsr166 1.61 * thenAcceptBoth result completes exceptionally if action does
1930     */
1931     public void testThenAcceptBoth_actionFailed() {
1932     for (ExecutionMode m : ExecutionMode.values())
1933     for (boolean fFirst : new boolean[] { true, false })
1934     for (Integer v1 : new Integer[] { 1, null })
1935     for (Integer v2 : new Integer[] { 2, null })
1936     {
1937     final CompletableFuture<Integer> f = new CompletableFuture<>();
1938     final CompletableFuture<Integer> g = new CompletableFuture<>();
1939 jsr166 1.80 final FailingBiConsumer r1 = new FailingBiConsumer(m);
1940     final FailingBiConsumer r2 = new FailingBiConsumer(m);
1941     final FailingBiConsumer r3 = new FailingBiConsumer(m);
1942    
1943     final CompletableFuture<Integer> fst = fFirst ? f : g;
1944     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1945     final Integer w1 = fFirst ? v1 : v2;
1946     final Integer w2 = !fFirst ? v1 : v2;
1947    
1948     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1949     assertTrue(fst.complete(w1));
1950     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1951     assertTrue(snd.complete(w2));
1952     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1953 jsr166 1.61
1954 jsr166 1.151 checkCompletedWithWrappedException(h1, r1.ex);
1955     checkCompletedWithWrappedException(h2, r2.ex);
1956     checkCompletedWithWrappedException(h3, r3.ex);
1957 jsr166 1.81 r1.assertInvoked();
1958     r2.assertInvoked();
1959     r3.assertInvoked();
1960 jsr166 1.61 checkCompletedNormally(f, v1);
1961     checkCompletedNormally(g, v2);
1962     }}
1963    
1964     /**
1965 dl 1.5 * runAfterBoth result completes normally after normal
1966     * completion of sources
1967     */
1968 jsr166 1.54 public void testRunAfterBoth_normalCompletion() {
1969 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1970 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
1971 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1972 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1973     {
1974 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1975     final CompletableFuture<Integer> g = new CompletableFuture<>();
1976 jsr166 1.81 final Noop r1 = new Noop(m);
1977     final Noop r2 = new Noop(m);
1978     final Noop r3 = new Noop(m);
1979    
1980     final CompletableFuture<Integer> fst = fFirst ? f : g;
1981     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1982     final Integer w1 = fFirst ? v1 : v2;
1983     final Integer w2 = !fFirst ? v1 : v2;
1984 jsr166 1.33
1985 jsr166 1.81 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1986     assertTrue(fst.complete(w1));
1987     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1988     checkIncomplete(h1);
1989     checkIncomplete(h2);
1990     r1.assertNotInvoked();
1991     r2.assertNotInvoked();
1992     assertTrue(snd.complete(w2));
1993     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
1994 dl 1.5
1995 jsr166 1.81 checkCompletedNormally(h1, null);
1996     checkCompletedNormally(h2, null);
1997     checkCompletedNormally(h3, null);
1998     r1.assertInvoked();
1999     r2.assertInvoked();
2000     r3.assertInvoked();
2001 jsr166 1.33 checkCompletedNormally(f, v1);
2002     checkCompletedNormally(g, v2);
2003 jsr166 1.47 }}
2004 dl 1.5
2005     /**
2006     * runAfterBoth result completes exceptionally after exceptional
2007     * completion of either source
2008     */
2009 jsr166 1.81 public void testRunAfterBoth_exceptionalCompletion() throws Throwable {
2010 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2011 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
2012 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
2013 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2014     {
2015 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2016     final CompletableFuture<Integer> g = new CompletableFuture<>();
2017     final CFException ex = new CFException();
2018 jsr166 1.81 final Noop r1 = new Noop(m);
2019     final Noop r2 = new Noop(m);
2020     final Noop r3 = new Noop(m);
2021 jsr166 1.33
2022 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2023     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2024     final Callable<Boolean> complete1 = failFirst ?
2025     () -> fst.completeExceptionally(ex) :
2026     () -> fst.complete(v1);
2027     final Callable<Boolean> complete2 = failFirst ?
2028     () -> snd.complete(v1) :
2029     () -> snd.completeExceptionally(ex);
2030    
2031     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2032     assertTrue(complete1.call());
2033     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2034     checkIncomplete(h1);
2035     checkIncomplete(h2);
2036     assertTrue(complete2.call());
2037     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2038 dl 1.5
2039 jsr166 1.81 checkCompletedWithWrappedException(h1, ex);
2040     checkCompletedWithWrappedException(h2, ex);
2041     checkCompletedWithWrappedException(h3, ex);
2042     r1.assertNotInvoked();
2043     r2.assertNotInvoked();
2044     r3.assertNotInvoked();
2045     checkCompletedNormally(failFirst ? snd : fst, v1);
2046     checkCompletedExceptionally(failFirst ? fst : snd, ex);
2047 jsr166 1.47 }}
2048 dl 1.5
2049 jsr166 1.4 /**
2050 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
2051 jsr166 1.4 */
2052 jsr166 1.81 public void testRunAfterBoth_sourceCancelled() throws Throwable {
2053 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2054 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2055 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
2056 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
2057 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2058     {
2059 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2060     final CompletableFuture<Integer> g = new CompletableFuture<>();
2061 jsr166 1.81 final Noop r1 = new Noop(m);
2062     final Noop r2 = new Noop(m);
2063     final Noop r3 = new Noop(m);
2064 jsr166 1.33
2065 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2066     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2067     final Callable<Boolean> complete1 = failFirst ?
2068     () -> fst.cancel(mayInterruptIfRunning) :
2069     () -> fst.complete(v1);
2070     final Callable<Boolean> complete2 = failFirst ?
2071     () -> snd.complete(v1) :
2072     () -> snd.cancel(mayInterruptIfRunning);
2073    
2074     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2075     assertTrue(complete1.call());
2076     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2077     checkIncomplete(h1);
2078     checkIncomplete(h2);
2079     assertTrue(complete2.call());
2080     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2081 jsr166 1.33
2082 jsr166 1.81 checkCompletedWithWrappedCancellationException(h1);
2083     checkCompletedWithWrappedCancellationException(h2);
2084     checkCompletedWithWrappedCancellationException(h3);
2085     r1.assertNotInvoked();
2086     r2.assertNotInvoked();
2087     r3.assertNotInvoked();
2088     checkCompletedNormally(failFirst ? snd : fst, v1);
2089     checkCancelled(failFirst ? fst : snd);
2090 jsr166 1.47 }}
2091 dl 1.5
2092     /**
2093 jsr166 1.61 * runAfterBoth result completes exceptionally if action does
2094     */
2095     public void testRunAfterBoth_actionFailed() {
2096     for (ExecutionMode m : ExecutionMode.values())
2097     for (boolean fFirst : new boolean[] { true, false })
2098     for (Integer v1 : new Integer[] { 1, null })
2099     for (Integer v2 : new Integer[] { 2, null })
2100     {
2101     final CompletableFuture<Integer> f = new CompletableFuture<>();
2102     final CompletableFuture<Integer> g = new CompletableFuture<>();
2103 jsr166 1.62 final FailingRunnable r1 = new FailingRunnable(m);
2104     final FailingRunnable r2 = new FailingRunnable(m);
2105 jsr166 1.81 final FailingRunnable r3 = new FailingRunnable(m);
2106 jsr166 1.61
2107 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2108     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2109     final Integer w1 = fFirst ? v1 : v2;
2110     final Integer w2 = !fFirst ? v1 : v2;
2111    
2112     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2113     assertTrue(fst.complete(w1));
2114     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2115     assertTrue(snd.complete(w2));
2116     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2117 jsr166 1.61
2118 jsr166 1.151 checkCompletedWithWrappedException(h1, r1.ex);
2119     checkCompletedWithWrappedException(h2, r2.ex);
2120     checkCompletedWithWrappedException(h3, r3.ex);
2121 jsr166 1.81 r1.assertInvoked();
2122     r2.assertInvoked();
2123     r3.assertInvoked();
2124 jsr166 1.61 checkCompletedNormally(f, v1);
2125     checkCompletedNormally(g, v2);
2126     }}
2127    
2128     /**
2129 dl 1.5 * applyToEither result completes normally after normal completion
2130     * of either source
2131     */
2132 jsr166 1.54 public void testApplyToEither_normalCompletion() {
2133 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2134     for (Integer v1 : new Integer[] { 1, null })
2135 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2136     {
2137 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2138     final CompletableFuture<Integer> g = new CompletableFuture<>();
2139 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2140     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2141 jsr166 1.54
2142 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2143     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2144     checkIncomplete(h0);
2145     checkIncomplete(h1);
2146     rs[0].assertNotInvoked();
2147     rs[1].assertNotInvoked();
2148     f.complete(v1);
2149     checkCompletedNormally(h0, inc(v1));
2150     checkCompletedNormally(h1, inc(v1));
2151     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2152     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2153     checkCompletedNormally(h2, inc(v1));
2154     checkCompletedNormally(h3, inc(v1));
2155     g.complete(v2);
2156 jsr166 1.39
2157 jsr166 1.62 // unspecified behavior - both source completions available
2158     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2159     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2160     rs[4].assertValue(h4.join());
2161     rs[5].assertValue(h5.join());
2162     assertTrue(Objects.equals(inc(v1), h4.join()) ||
2163     Objects.equals(inc(v2), h4.join()));
2164     assertTrue(Objects.equals(inc(v1), h5.join()) ||
2165     Objects.equals(inc(v2), h5.join()));
2166 jsr166 1.39
2167     checkCompletedNormally(f, v1);
2168     checkCompletedNormally(g, v2);
2169 jsr166 1.62 checkCompletedNormally(h0, inc(v1));
2170     checkCompletedNormally(h1, inc(v1));
2171     checkCompletedNormally(h2, inc(v1));
2172     checkCompletedNormally(h3, inc(v1));
2173     for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
2174 jsr166 1.47 }}
2175 dl 1.5
2176     /**
2177     * applyToEither result completes exceptionally after exceptional
2178     * completion of either source
2179     */
2180 jsr166 1.62 public void testApplyToEither_exceptionalCompletion() {
2181 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2182 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2183     {
2184 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2185     final CompletableFuture<Integer> g = new CompletableFuture<>();
2186 jsr166 1.54 final CFException ex = new CFException();
2187 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2188     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2189    
2190     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2191     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2192     checkIncomplete(h0);
2193     checkIncomplete(h1);
2194     rs[0].assertNotInvoked();
2195     rs[1].assertNotInvoked();
2196     f.completeExceptionally(ex);
2197 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2198     checkCompletedWithWrappedException(h1, ex);
2199 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2200     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2201 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2202     checkCompletedWithWrappedException(h3, ex);
2203 jsr166 1.62 g.complete(v1);
2204 jsr166 1.54
2205 jsr166 1.62 // unspecified behavior - both source completions available
2206     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2207     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2208     try {
2209     assertEquals(inc(v1), h4.join());
2210 jsr166 1.66 rs[4].assertValue(inc(v1));
2211 jsr166 1.62 } catch (CompletionException ok) {
2212 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2213 jsr166 1.62 rs[4].assertNotInvoked();
2214     }
2215     try {
2216     assertEquals(inc(v1), h5.join());
2217 jsr166 1.66 rs[5].assertValue(inc(v1));
2218 jsr166 1.62 } catch (CompletionException ok) {
2219 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2220 jsr166 1.62 rs[5].assertNotInvoked();
2221 jsr166 1.54 }
2222 jsr166 1.39
2223 jsr166 1.72 checkCompletedExceptionally(f, ex);
2224 jsr166 1.62 checkCompletedNormally(g, v1);
2225 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2226     checkCompletedWithWrappedException(h1, ex);
2227     checkCompletedWithWrappedException(h2, ex);
2228     checkCompletedWithWrappedException(h3, ex);
2229     checkCompletedWithWrappedException(h4, ex);
2230 jsr166 1.62 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2231 jsr166 1.47 }}
2232 jsr166 1.39
2233 jsr166 1.66 public void testApplyToEither_exceptionalCompletion2() {
2234     for (ExecutionMode m : ExecutionMode.values())
2235     for (boolean fFirst : new boolean[] { true, false })
2236     for (Integer v1 : new Integer[] { 1, null })
2237     {
2238     final CompletableFuture<Integer> f = new CompletableFuture<>();
2239     final CompletableFuture<Integer> g = new CompletableFuture<>();
2240     final CFException ex = new CFException();
2241     final IncFunction[] rs = new IncFunction[6];
2242     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2243    
2244     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2245     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2246 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2247     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2248 jsr166 1.66 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2249     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2250    
2251     // unspecified behavior - both source completions available
2252     try {
2253     assertEquals(inc(v1), h0.join());
2254     rs[0].assertValue(inc(v1));
2255     } catch (CompletionException ok) {
2256 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2257 jsr166 1.66 rs[0].assertNotInvoked();
2258     }
2259     try {
2260     assertEquals(inc(v1), h1.join());
2261     rs[1].assertValue(inc(v1));
2262     } catch (CompletionException ok) {
2263 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2264 jsr166 1.66 rs[1].assertNotInvoked();
2265     }
2266     try {
2267     assertEquals(inc(v1), h2.join());
2268     rs[2].assertValue(inc(v1));
2269     } catch (CompletionException ok) {
2270 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2271 jsr166 1.66 rs[2].assertNotInvoked();
2272     }
2273     try {
2274     assertEquals(inc(v1), h3.join());
2275     rs[3].assertValue(inc(v1));
2276     } catch (CompletionException ok) {
2277 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2278 jsr166 1.66 rs[3].assertNotInvoked();
2279     }
2280    
2281     checkCompletedNormally(f, v1);
2282 jsr166 1.72 checkCompletedExceptionally(g, ex);
2283 jsr166 1.66 }}
2284    
2285 jsr166 1.62 /**
2286     * applyToEither result completes exceptionally if either source cancelled
2287     */
2288     public void testApplyToEither_sourceCancelled() {
2289 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2290 jsr166 1.62 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2291 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2292     {
2293 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2294     final CompletableFuture<Integer> g = new CompletableFuture<>();
2295 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2296     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2297    
2298     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2299     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2300     checkIncomplete(h0);
2301     checkIncomplete(h1);
2302     rs[0].assertNotInvoked();
2303     rs[1].assertNotInvoked();
2304     f.cancel(mayInterruptIfRunning);
2305     checkCompletedWithWrappedCancellationException(h0);
2306     checkCompletedWithWrappedCancellationException(h1);
2307     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2308     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2309     checkCompletedWithWrappedCancellationException(h2);
2310     checkCompletedWithWrappedCancellationException(h3);
2311     g.complete(v1);
2312 jsr166 1.39
2313 jsr166 1.62 // unspecified behavior - both source completions available
2314     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2315     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2316 jsr166 1.39 try {
2317 jsr166 1.62 assertEquals(inc(v1), h4.join());
2318 jsr166 1.66 rs[4].assertValue(inc(v1));
2319 jsr166 1.39 } catch (CompletionException ok) {
2320 jsr166 1.62 checkCompletedWithWrappedCancellationException(h4);
2321     rs[4].assertNotInvoked();
2322 jsr166 1.39 }
2323     try {
2324 jsr166 1.62 assertEquals(inc(v1), h5.join());
2325 jsr166 1.66 rs[5].assertValue(inc(v1));
2326 jsr166 1.39 } catch (CompletionException ok) {
2327 jsr166 1.62 checkCompletedWithWrappedCancellationException(h5);
2328     rs[5].assertNotInvoked();
2329 jsr166 1.39 }
2330 dl 1.5
2331 jsr166 1.62 checkCancelled(f);
2332     checkCompletedNormally(g, v1);
2333     checkCompletedWithWrappedCancellationException(h0);
2334     checkCompletedWithWrappedCancellationException(h1);
2335     checkCompletedWithWrappedCancellationException(h2);
2336     checkCompletedWithWrappedCancellationException(h3);
2337     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2338 jsr166 1.47 }}
2339 dl 1.5
2340 jsr166 1.67 public void testApplyToEither_sourceCancelled2() {
2341     for (ExecutionMode m : ExecutionMode.values())
2342     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2343     for (boolean fFirst : new boolean[] { true, false })
2344     for (Integer v1 : new Integer[] { 1, null })
2345     {
2346     final CompletableFuture<Integer> f = new CompletableFuture<>();
2347     final CompletableFuture<Integer> g = new CompletableFuture<>();
2348     final IncFunction[] rs = new IncFunction[6];
2349     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2350    
2351     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2352     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2353 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2354     assertTrue(!fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2355 jsr166 1.67 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2356     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2357    
2358     // unspecified behavior - both source completions available
2359     try {
2360     assertEquals(inc(v1), h0.join());
2361     rs[0].assertValue(inc(v1));
2362     } catch (CompletionException ok) {
2363     checkCompletedWithWrappedCancellationException(h0);
2364     rs[0].assertNotInvoked();
2365     }
2366     try {
2367     assertEquals(inc(v1), h1.join());
2368     rs[1].assertValue(inc(v1));
2369     } catch (CompletionException ok) {
2370     checkCompletedWithWrappedCancellationException(h1);
2371     rs[1].assertNotInvoked();
2372     }
2373     try {
2374     assertEquals(inc(v1), h2.join());
2375     rs[2].assertValue(inc(v1));
2376     } catch (CompletionException ok) {
2377     checkCompletedWithWrappedCancellationException(h2);
2378     rs[2].assertNotInvoked();
2379     }
2380     try {
2381     assertEquals(inc(v1), h3.join());
2382     rs[3].assertValue(inc(v1));
2383     } catch (CompletionException ok) {
2384     checkCompletedWithWrappedCancellationException(h3);
2385     rs[3].assertNotInvoked();
2386     }
2387    
2388     checkCompletedNormally(f, v1);
2389     checkCancelled(g);
2390     }}
2391    
2392 dl 1.5 /**
2393     * applyToEither result completes exceptionally if action does
2394     */
2395 jsr166 1.62 public void testApplyToEither_actionFailed() {
2396 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2397     for (Integer v1 : new Integer[] { 1, null })
2398 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2399     {
2400 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2401     final CompletableFuture<Integer> g = new CompletableFuture<>();
2402 jsr166 1.62 final FailingFunction[] rs = new FailingFunction[6];
2403     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2404 jsr166 1.39
2405 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2406     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2407 jsr166 1.39 f.complete(v1);
2408 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2409     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2410 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
2411     checkCompletedWithWrappedException(h1, rs[1].ex);
2412     checkCompletedWithWrappedException(h2, rs[2].ex);
2413     checkCompletedWithWrappedException(h3, rs[3].ex);
2414 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2415    
2416     g.complete(v2);
2417    
2418     // unspecified behavior - both source completions available
2419     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2420     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2421    
2422 jsr166 1.151 checkCompletedWithWrappedException(h4, rs[4].ex);
2423 jsr166 1.63 assertTrue(Objects.equals(v1, rs[4].value) ||
2424     Objects.equals(v2, rs[4].value));
2425 jsr166 1.151 checkCompletedWithWrappedException(h5, rs[5].ex);
2426 jsr166 1.63 assertTrue(Objects.equals(v1, rs[5].value) ||
2427     Objects.equals(v2, rs[5].value));
2428    
2429     checkCompletedNormally(f, v1);
2430     checkCompletedNormally(g, v2);
2431 jsr166 1.47 }}
2432 dl 1.5
2433     /**
2434     * acceptEither result completes normally after normal completion
2435     * of either source
2436     */
2437 jsr166 1.63 public void testAcceptEither_normalCompletion() {
2438 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2439     for (Integer v1 : new Integer[] { 1, null })
2440 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2441     {
2442 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2443     final CompletableFuture<Integer> g = new CompletableFuture<>();
2444 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2445     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2446 jsr166 1.40
2447 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2448     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2449     checkIncomplete(h0);
2450     checkIncomplete(h1);
2451     rs[0].assertNotInvoked();
2452     rs[1].assertNotInvoked();
2453 jsr166 1.40 f.complete(v1);
2454 jsr166 1.63 checkCompletedNormally(h0, null);
2455     checkCompletedNormally(h1, null);
2456 jsr166 1.64 rs[0].assertValue(v1);
2457     rs[1].assertValue(v1);
2458 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2459     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2460     checkCompletedNormally(h2, null);
2461     checkCompletedNormally(h3, null);
2462 jsr166 1.64 rs[2].assertValue(v1);
2463     rs[3].assertValue(v1);
2464 jsr166 1.40 g.complete(v2);
2465    
2466 jsr166 1.63 // unspecified behavior - both source completions available
2467     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2468     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2469     checkCompletedNormally(h4, null);
2470     checkCompletedNormally(h5, null);
2471 jsr166 1.64 assertTrue(Objects.equals(v1, rs[4].value) ||
2472     Objects.equals(v2, rs[4].value));
2473     assertTrue(Objects.equals(v1, rs[5].value) ||
2474     Objects.equals(v2, rs[5].value));
2475 jsr166 1.40
2476     checkCompletedNormally(f, v1);
2477     checkCompletedNormally(g, v2);
2478 jsr166 1.63 checkCompletedNormally(h0, null);
2479     checkCompletedNormally(h1, null);
2480     checkCompletedNormally(h2, null);
2481     checkCompletedNormally(h3, null);
2482 jsr166 1.64 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2483 jsr166 1.47 }}
2484 dl 1.5
2485     /**
2486     * acceptEither result completes exceptionally after exceptional
2487     * completion of either source
2488     */
2489 jsr166 1.63 public void testAcceptEither_exceptionalCompletion() {
2490 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2491 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2492     {
2493 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2494     final CompletableFuture<Integer> g = new CompletableFuture<>();
2495     final CFException ex = new CFException();
2496 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2497     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2498 jsr166 1.40
2499 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2500     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2501     checkIncomplete(h0);
2502     checkIncomplete(h1);
2503     rs[0].assertNotInvoked();
2504     rs[1].assertNotInvoked();
2505 jsr166 1.40 f.completeExceptionally(ex);
2506 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2507     checkCompletedWithWrappedException(h1, ex);
2508 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2509     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2510 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2511     checkCompletedWithWrappedException(h3, ex);
2512 jsr166 1.63
2513 jsr166 1.40 g.complete(v1);
2514    
2515 jsr166 1.63 // unspecified behavior - both source completions available
2516     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2517     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2518 jsr166 1.40 try {
2519 jsr166 1.63 assertNull(h4.join());
2520 jsr166 1.64 rs[4].assertValue(v1);
2521 jsr166 1.40 } catch (CompletionException ok) {
2522 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2523 jsr166 1.63 rs[4].assertNotInvoked();
2524 jsr166 1.40 }
2525     try {
2526 jsr166 1.63 assertNull(h5.join());
2527 jsr166 1.64 rs[5].assertValue(v1);
2528 jsr166 1.40 } catch (CompletionException ok) {
2529 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2530 jsr166 1.63 rs[5].assertNotInvoked();
2531 jsr166 1.40 }
2532 dl 1.5
2533 jsr166 1.72 checkCompletedExceptionally(f, ex);
2534 jsr166 1.40 checkCompletedNormally(g, v1);
2535 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2536     checkCompletedWithWrappedException(h1, ex);
2537     checkCompletedWithWrappedException(h2, ex);
2538     checkCompletedWithWrappedException(h3, ex);
2539     checkCompletedWithWrappedException(h4, ex);
2540 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2541 jsr166 1.47 }}
2542 dl 1.5
2543 jsr166 1.68 public void testAcceptEither_exceptionalCompletion2() {
2544     for (ExecutionMode m : ExecutionMode.values())
2545     for (boolean fFirst : new boolean[] { true, false })
2546     for (Integer v1 : new Integer[] { 1, null })
2547     {
2548     final CompletableFuture<Integer> f = new CompletableFuture<>();
2549     final CompletableFuture<Integer> g = new CompletableFuture<>();
2550     final CFException ex = new CFException();
2551     final NoopConsumer[] rs = new NoopConsumer[6];
2552     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2553    
2554     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2555     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2556 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2557     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2558 jsr166 1.68 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2559     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2560    
2561     // unspecified behavior - both source completions available
2562     try {
2563 jsr166 1.184 assertNull(h0.join());
2564 jsr166 1.68 rs[0].assertValue(v1);
2565     } catch (CompletionException ok) {
2566 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2567 jsr166 1.68 rs[0].assertNotInvoked();
2568     }
2569     try {
2570 jsr166 1.184 assertNull(h1.join());
2571 jsr166 1.68 rs[1].assertValue(v1);
2572     } catch (CompletionException ok) {
2573 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2574 jsr166 1.68 rs[1].assertNotInvoked();
2575     }
2576     try {
2577 jsr166 1.184 assertNull(h2.join());
2578 jsr166 1.68 rs[2].assertValue(v1);
2579     } catch (CompletionException ok) {
2580 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2581 jsr166 1.68 rs[2].assertNotInvoked();
2582     }
2583     try {
2584 jsr166 1.184 assertNull(h3.join());
2585 jsr166 1.68 rs[3].assertValue(v1);
2586     } catch (CompletionException ok) {
2587 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2588 jsr166 1.68 rs[3].assertNotInvoked();
2589     }
2590    
2591     checkCompletedNormally(f, v1);
2592 jsr166 1.72 checkCompletedExceptionally(g, ex);
2593 jsr166 1.68 }}
2594    
2595 dl 1.5 /**
2596     * acceptEither result completes exceptionally if either source cancelled
2597     */
2598 jsr166 1.63 public void testAcceptEither_sourceCancelled() {
2599 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2600     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2601 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2602     {
2603 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2604     final CompletableFuture<Integer> g = new CompletableFuture<>();
2605 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2606     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2607 jsr166 1.63
2608     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2609     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2610     checkIncomplete(h0);
2611     checkIncomplete(h1);
2612     rs[0].assertNotInvoked();
2613     rs[1].assertNotInvoked();
2614     f.cancel(mayInterruptIfRunning);
2615     checkCompletedWithWrappedCancellationException(h0);
2616     checkCompletedWithWrappedCancellationException(h1);
2617     final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2618     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2619     checkCompletedWithWrappedCancellationException(h2);
2620     checkCompletedWithWrappedCancellationException(h3);
2621 jsr166 1.40
2622     g.complete(v1);
2623    
2624 jsr166 1.63 // unspecified behavior - both source completions available
2625     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2626     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2627     try {
2628     assertNull(h4.join());
2629 jsr166 1.64 rs[4].assertValue(v1);
2630 jsr166 1.63 } catch (CompletionException ok) {
2631     checkCompletedWithWrappedCancellationException(h4);
2632     rs[4].assertNotInvoked();
2633     }
2634     try {
2635     assertNull(h5.join());
2636 jsr166 1.64 rs[5].assertValue(v1);
2637 jsr166 1.63 } catch (CompletionException ok) {
2638     checkCompletedWithWrappedCancellationException(h5);
2639     rs[5].assertNotInvoked();
2640     }
2641    
2642 jsr166 1.40 checkCancelled(f);
2643     checkCompletedNormally(g, v1);
2644 jsr166 1.63 checkCompletedWithWrappedCancellationException(h0);
2645     checkCompletedWithWrappedCancellationException(h1);
2646     checkCompletedWithWrappedCancellationException(h2);
2647     checkCompletedWithWrappedCancellationException(h3);
2648     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2649 jsr166 1.47 }}
2650 jsr166 1.40
2651 jsr166 1.63 /**
2652     * acceptEither result completes exceptionally if action does
2653     */
2654     public void testAcceptEither_actionFailed() {
2655 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2656 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2657 jsr166 1.63 for (Integer v2 : new Integer[] { 2, null })
2658 jsr166 1.47 {
2659 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2660     final CompletableFuture<Integer> g = new CompletableFuture<>();
2661 jsr166 1.63 final FailingConsumer[] rs = new FailingConsumer[6];
2662     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2663 jsr166 1.40
2664 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2665     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2666 jsr166 1.40 f.complete(v1);
2667 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2668     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2669 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
2670     checkCompletedWithWrappedException(h1, rs[1].ex);
2671     checkCompletedWithWrappedException(h2, rs[2].ex);
2672     checkCompletedWithWrappedException(h3, rs[3].ex);
2673 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2674 jsr166 1.40
2675 jsr166 1.63 g.complete(v2);
2676 jsr166 1.40
2677 jsr166 1.63 // unspecified behavior - both source completions available
2678     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2679     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2680 jsr166 1.40
2681 jsr166 1.151 checkCompletedWithWrappedException(h4, rs[4].ex);
2682 jsr166 1.63 assertTrue(Objects.equals(v1, rs[4].value) ||
2683     Objects.equals(v2, rs[4].value));
2684 jsr166 1.151 checkCompletedWithWrappedException(h5, rs[5].ex);
2685 jsr166 1.63 assertTrue(Objects.equals(v1, rs[5].value) ||
2686     Objects.equals(v2, rs[5].value));
2687 jsr166 1.40
2688     checkCompletedNormally(f, v1);
2689 jsr166 1.63 checkCompletedNormally(g, v2);
2690 jsr166 1.47 }}
2691 dl 1.5
2692     /**
2693     * runAfterEither result completes normally after normal completion
2694     * of either source
2695     */
2696 jsr166 1.65 public void testRunAfterEither_normalCompletion() {
2697 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2698     for (Integer v1 : new Integer[] { 1, null })
2699 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2700 jsr166 1.162 for (boolean pushNop : new boolean[] { true, false })
2701 jsr166 1.47 {
2702 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2703     final CompletableFuture<Integer> g = new CompletableFuture<>();
2704 jsr166 1.65 final Noop[] rs = new Noop[6];
2705     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2706 jsr166 1.41
2707 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2708     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2709     checkIncomplete(h0);
2710     checkIncomplete(h1);
2711     rs[0].assertNotInvoked();
2712     rs[1].assertNotInvoked();
2713 jsr166 1.162 if (pushNop) { // ad hoc test of intra-completion interference
2714     m.thenRun(f, () -> {});
2715     m.thenRun(g, () -> {});
2716     }
2717 jsr166 1.41 f.complete(v1);
2718 jsr166 1.65 checkCompletedNormally(h0, null);
2719     checkCompletedNormally(h1, null);
2720     rs[0].assertInvoked();
2721     rs[1].assertInvoked();
2722     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2723     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2724     checkCompletedNormally(h2, null);
2725     checkCompletedNormally(h3, null);
2726     rs[2].assertInvoked();
2727     rs[3].assertInvoked();
2728 jsr166 1.41
2729     g.complete(v2);
2730    
2731 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2732     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2733 jsr166 1.47
2734 jsr166 1.41 checkCompletedNormally(f, v1);
2735     checkCompletedNormally(g, v2);
2736 jsr166 1.65 checkCompletedNormally(h0, null);
2737     checkCompletedNormally(h1, null);
2738     checkCompletedNormally(h2, null);
2739     checkCompletedNormally(h3, null);
2740     checkCompletedNormally(h4, null);
2741     checkCompletedNormally(h5, null);
2742     for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2743 jsr166 1.47 }}
2744 dl 1.5
2745     /**
2746     * runAfterEither result completes exceptionally after exceptional
2747     * completion of either source
2748     */
2749 jsr166 1.65 public void testRunAfterEither_exceptionalCompletion() {
2750 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2751 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2752     {
2753 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2754     final CompletableFuture<Integer> g = new CompletableFuture<>();
2755     final CFException ex = new CFException();
2756 jsr166 1.65 final Noop[] rs = new Noop[6];
2757     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2758 jsr166 1.41
2759 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2760     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2761     checkIncomplete(h0);
2762     checkIncomplete(h1);
2763     rs[0].assertNotInvoked();
2764     rs[1].assertNotInvoked();
2765 jsr166 1.78 assertTrue(f.completeExceptionally(ex));
2766 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2767     checkCompletedWithWrappedException(h1, ex);
2768 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2769     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2770 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2771     checkCompletedWithWrappedException(h3, ex);
2772 jsr166 1.65
2773 jsr166 1.78 assertTrue(g.complete(v1));
2774 jsr166 1.41
2775 jsr166 1.65 // unspecified behavior - both source completions available
2776     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2777     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2778     try {
2779     assertNull(h4.join());
2780     rs[4].assertInvoked();
2781     } catch (CompletionException ok) {
2782 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2783 jsr166 1.65 rs[4].assertNotInvoked();
2784     }
2785     try {
2786     assertNull(h5.join());
2787     rs[5].assertInvoked();
2788     } catch (CompletionException ok) {
2789 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2790 jsr166 1.65 rs[5].assertNotInvoked();
2791     }
2792    
2793 jsr166 1.72 checkCompletedExceptionally(f, ex);
2794 jsr166 1.41 checkCompletedNormally(g, v1);
2795 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2796     checkCompletedWithWrappedException(h1, ex);
2797     checkCompletedWithWrappedException(h2, ex);
2798     checkCompletedWithWrappedException(h3, ex);
2799     checkCompletedWithWrappedException(h4, ex);
2800 jsr166 1.65 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2801 jsr166 1.47 }}
2802 jsr166 1.41
2803 jsr166 1.69 public void testRunAfterEither_exceptionalCompletion2() {
2804     for (ExecutionMode m : ExecutionMode.values())
2805     for (boolean fFirst : new boolean[] { true, false })
2806     for (Integer v1 : new Integer[] { 1, null })
2807     {
2808     final CompletableFuture<Integer> f = new CompletableFuture<>();
2809     final CompletableFuture<Integer> g = new CompletableFuture<>();
2810     final CFException ex = new CFException();
2811     final Noop[] rs = new Noop[6];
2812     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2813    
2814     final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2815     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2816 jsr166 1.78 assertTrue( fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2817     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2818 jsr166 1.69 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2819     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2820    
2821     // unspecified behavior - both source completions available
2822     try {
2823 jsr166 1.184 assertNull(h0.join());
2824 jsr166 1.69 rs[0].assertInvoked();
2825     } catch (CompletionException ok) {
2826 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2827 jsr166 1.69 rs[0].assertNotInvoked();
2828     }
2829     try {
2830 jsr166 1.184 assertNull(h1.join());
2831 jsr166 1.69 rs[1].assertInvoked();
2832     } catch (CompletionException ok) {
2833 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2834 jsr166 1.69 rs[1].assertNotInvoked();
2835     }
2836     try {
2837 jsr166 1.184 assertNull(h2.join());
2838 jsr166 1.69 rs[2].assertInvoked();
2839     } catch (CompletionException ok) {
2840 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2841 jsr166 1.69 rs[2].assertNotInvoked();
2842     }
2843     try {
2844 jsr166 1.184 assertNull(h3.join());
2845 jsr166 1.69 rs[3].assertInvoked();
2846     } catch (CompletionException ok) {
2847 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2848 jsr166 1.69 rs[3].assertNotInvoked();
2849     }
2850    
2851     checkCompletedNormally(f, v1);
2852 jsr166 1.72 checkCompletedExceptionally(g, ex);
2853 jsr166 1.69 }}
2854    
2855 jsr166 1.65 /**
2856     * runAfterEither result completes exceptionally if either source cancelled
2857     */
2858     public void testRunAfterEither_sourceCancelled() {
2859 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2860 jsr166 1.65 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2861 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2862     {
2863 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2864     final CompletableFuture<Integer> g = new CompletableFuture<>();
2865 jsr166 1.65 final Noop[] rs = new Noop[6];
2866     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2867 jsr166 1.41
2868 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2869     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2870     checkIncomplete(h0);
2871     checkIncomplete(h1);
2872     rs[0].assertNotInvoked();
2873     rs[1].assertNotInvoked();
2874     f.cancel(mayInterruptIfRunning);
2875     checkCompletedWithWrappedCancellationException(h0);
2876     checkCompletedWithWrappedCancellationException(h1);
2877     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2878     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2879     checkCompletedWithWrappedCancellationException(h2);
2880     checkCompletedWithWrappedCancellationException(h3);
2881 jsr166 1.41
2882 jsr166 1.78 assertTrue(g.complete(v1));
2883 jsr166 1.41
2884 jsr166 1.65 // unspecified behavior - both source completions available
2885     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2886     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2887 jsr166 1.41 try {
2888 jsr166 1.65 assertNull(h4.join());
2889     rs[4].assertInvoked();
2890 jsr166 1.41 } catch (CompletionException ok) {
2891 jsr166 1.65 checkCompletedWithWrappedCancellationException(h4);
2892     rs[4].assertNotInvoked();
2893 jsr166 1.41 }
2894     try {
2895 jsr166 1.65 assertNull(h5.join());
2896     rs[5].assertInvoked();
2897 jsr166 1.41 } catch (CompletionException ok) {
2898 jsr166 1.65 checkCompletedWithWrappedCancellationException(h5);
2899     rs[5].assertNotInvoked();
2900 jsr166 1.41 }
2901 dl 1.5
2902 jsr166 1.65 checkCancelled(f);
2903 jsr166 1.41 checkCompletedNormally(g, v1);
2904 jsr166 1.65 checkCompletedWithWrappedCancellationException(h0);
2905     checkCompletedWithWrappedCancellationException(h1);
2906     checkCompletedWithWrappedCancellationException(h2);
2907     checkCompletedWithWrappedCancellationException(h3);
2908     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2909 jsr166 1.47 }}
2910 dl 1.5
2911     /**
2912     * runAfterEither result completes exceptionally if action does
2913     */
2914 jsr166 1.65 public void testRunAfterEither_actionFailed() {
2915 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2916     for (Integer v1 : new Integer[] { 1, null })
2917 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2918     {
2919 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2920     final CompletableFuture<Integer> g = new CompletableFuture<>();
2921 jsr166 1.65 final FailingRunnable[] rs = new FailingRunnable[6];
2922     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2923 jsr166 1.41
2924 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2925     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2926 jsr166 1.78 assertTrue(f.complete(v1));
2927 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2928     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2929 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
2930     checkCompletedWithWrappedException(h1, rs[1].ex);
2931     checkCompletedWithWrappedException(h2, rs[2].ex);
2932     checkCompletedWithWrappedException(h3, rs[3].ex);
2933 jsr166 1.65 for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2934 jsr166 1.78 assertTrue(g.complete(v2));
2935 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2936     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2937 jsr166 1.151 checkCompletedWithWrappedException(h4, rs[4].ex);
2938     checkCompletedWithWrappedException(h5, rs[5].ex);
2939 jsr166 1.41
2940     checkCompletedNormally(f, v1);
2941     checkCompletedNormally(g, v2);
2942 jsr166 1.65 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2943 jsr166 1.47 }}
2944 dl 1.5
2945     /**
2946     * thenCompose result completes normally after normal completion of source
2947     */
2948 jsr166 1.48 public void testThenCompose_normalCompletion() {
2949 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2950 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2951 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2952     {
2953 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2954 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2955 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2956 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2957 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2958 jsr166 1.21
2959 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2960     checkCompletedNormally(f, v1);
2961 jsr166 1.70 r.assertValue(v1);
2962 jsr166 1.47 }}
2963 dl 1.5
2964     /**
2965     * thenCompose result completes exceptionally after exceptional
2966     * completion of source
2967     */
2968 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2969 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2970 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2971 jsr166 1.47 {
2972 jsr166 1.44 final CFException ex = new CFException();
2973 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2974 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2975 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2976 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2977 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2978 jsr166 1.21
2979 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
2980     checkCompletedExceptionally(f, ex);
2981 jsr166 1.62 r.assertNotInvoked();
2982 jsr166 1.47 }}
2983 dl 1.5
2984     /**
2985     * thenCompose result completes exceptionally if action does
2986     */
2987 jsr166 1.48 public void testThenCompose_actionFailed() {
2988 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2989 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2990 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2991     {
2992 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2993     final FailingCompletableFutureFunction r
2994 jsr166 1.56 = new FailingCompletableFutureFunction(m);
2995 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2996 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2997 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2998 jsr166 1.44
2999 jsr166 1.151 checkCompletedWithWrappedException(g, r.ex);
3000 jsr166 1.44 checkCompletedNormally(f, v1);
3001 jsr166 1.47 }}
3002 dl 1.5
3003     /**
3004     * thenCompose result completes exceptionally if source cancelled
3005     */
3006 jsr166 1.48 public void testThenCompose_sourceCancelled() {
3007 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
3008 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
3009 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3010     {
3011 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
3012 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
3013 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3014 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
3015 jsr166 1.50 if (createIncomplete) {
3016     checkIncomplete(g);
3017     assertTrue(f.cancel(mayInterruptIfRunning));
3018     }
3019 jsr166 1.44
3020 dl 1.5 checkCompletedWithWrappedCancellationException(g);
3021 jsr166 1.44 checkCancelled(f);
3022 jsr166 1.47 }}
3023 dl 1.5
3024 jsr166 1.99 /**
3025     * thenCompose result completes exceptionally if the result of the action does
3026     */
3027     public void testThenCompose_actionReturnsFailingFuture() {
3028     for (ExecutionMode m : ExecutionMode.values())
3029     for (int order = 0; order < 6; order++)
3030     for (Integer v1 : new Integer[] { 1, null })
3031     {
3032     final CFException ex = new CFException();
3033     final CompletableFuture<Integer> f = new CompletableFuture<>();
3034     final CompletableFuture<Integer> g = new CompletableFuture<>();
3035     final CompletableFuture<Integer> h;
3036     // Test all permutations of orders
3037     switch (order) {
3038     case 0:
3039     assertTrue(f.complete(v1));
3040     assertTrue(g.completeExceptionally(ex));
3041     h = m.thenCompose(f, (x -> g));
3042     break;
3043     case 1:
3044     assertTrue(f.complete(v1));
3045     h = m.thenCompose(f, (x -> g));
3046     assertTrue(g.completeExceptionally(ex));
3047     break;
3048     case 2:
3049     assertTrue(g.completeExceptionally(ex));
3050     assertTrue(f.complete(v1));
3051     h = m.thenCompose(f, (x -> g));
3052     break;
3053     case 3:
3054     assertTrue(g.completeExceptionally(ex));
3055     h = m.thenCompose(f, (x -> g));
3056     assertTrue(f.complete(v1));
3057     break;
3058     case 4:
3059     h = m.thenCompose(f, (x -> g));
3060     assertTrue(f.complete(v1));
3061     assertTrue(g.completeExceptionally(ex));
3062     break;
3063     case 5:
3064     h = m.thenCompose(f, (x -> g));
3065     assertTrue(f.complete(v1));
3066     assertTrue(g.completeExceptionally(ex));
3067     break;
3068     default: throw new AssertionError();
3069     }
3070    
3071     checkCompletedExceptionally(g, ex);
3072     checkCompletedWithWrappedException(h, ex);
3073     checkCompletedNormally(f, v1);
3074     }}
3075    
3076 jsr166 1.6 // other static methods
3077 dl 1.5
3078     /**
3079     * allOf(no component futures) returns a future completed normally
3080     * with the value null
3081     */
3082     public void testAllOf_empty() throws Exception {
3083 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
3084 dl 1.5 checkCompletedNormally(f, null);
3085     }
3086    
3087     /**
3088 jsr166 1.25 * allOf returns a future completed normally with the value null
3089     * when all components complete normally
3090 dl 1.5 */
3091 jsr166 1.25 public void testAllOf_normal() throws Exception {
3092 jsr166 1.88 for (int k = 1; k < 10; k++) {
3093 jsr166 1.59 CompletableFuture<Integer>[] fs
3094     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3095 jsr166 1.86 for (int i = 0; i < k; i++)
3096 jsr166 1.22 fs[i] = new CompletableFuture<>();
3097 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3098 jsr166 1.86 for (int i = 0; i < k; i++) {
3099 dl 1.5 checkIncomplete(f);
3100 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
3101 dl 1.5 fs[i].complete(one);
3102     }
3103 dl 1.9 checkCompletedNormally(f, null);
3104 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3105 dl 1.5 }
3106     }
3107    
3108 jsr166 1.150 public void testAllOf_normal_backwards() throws Exception {
3109 jsr166 1.88 for (int k = 1; k < 10; k++) {
3110 jsr166 1.59 CompletableFuture<Integer>[] fs
3111     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3112 jsr166 1.86 for (int i = 0; i < k; i++)
3113 jsr166 1.59 fs[i] = new CompletableFuture<>();
3114     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3115     for (int i = k - 1; i >= 0; i--) {
3116     checkIncomplete(f);
3117     checkIncomplete(CompletableFuture.allOf(fs));
3118     fs[i].complete(one);
3119     }
3120     checkCompletedNormally(f, null);
3121     checkCompletedNormally(CompletableFuture.allOf(fs), null);
3122     }
3123     }
3124    
3125 jsr166 1.88 public void testAllOf_exceptional() throws Exception {
3126     for (int k = 1; k < 10; k++) {
3127     CompletableFuture<Integer>[] fs
3128     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3129     CFException ex = new CFException();
3130     for (int i = 0; i < k; i++)
3131     fs[i] = new CompletableFuture<>();
3132     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3133     for (int i = 0; i < k; i++) {
3134     checkIncomplete(f);
3135     checkIncomplete(CompletableFuture.allOf(fs));
3136 jsr166 1.121 if (i != k / 2) {
3137 jsr166 1.88 fs[i].complete(i);
3138     checkCompletedNormally(fs[i], i);
3139     } else {
3140     fs[i].completeExceptionally(ex);
3141     checkCompletedExceptionally(fs[i], ex);
3142     }
3143     }
3144     checkCompletedWithWrappedException(f, ex);
3145     checkCompletedWithWrappedException(CompletableFuture.allOf(fs), ex);
3146     }
3147     }
3148    
3149 dl 1.5 /**
3150     * anyOf(no component futures) returns an incomplete future
3151     */
3152     public void testAnyOf_empty() throws Exception {
3153 jsr166 1.86 for (Integer v1 : new Integer[] { 1, null })
3154     {
3155 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
3156 dl 1.5 checkIncomplete(f);
3157 jsr166 1.86
3158     f.complete(v1);
3159     checkCompletedNormally(f, v1);
3160     }}
3161 dl 1.5
3162     /**
3163 jsr166 1.25 * anyOf returns a future completed normally with a value when
3164     * a component future does
3165 dl 1.5 */
3166 jsr166 1.24 public void testAnyOf_normal() throws Exception {
3167 jsr166 1.86 for (int k = 0; k < 10; k++) {
3168 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
3169 jsr166 1.86 for (int i = 0; i < k; i++)
3170 jsr166 1.22 fs[i] = new CompletableFuture<>();
3171 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3172 dl 1.5 checkIncomplete(f);
3173 jsr166 1.86 for (int i = 0; i < k; i++) {
3174     fs[i].complete(i);
3175     checkCompletedNormally(f, 0);
3176     int x = (int) CompletableFuture.anyOf(fs).join();
3177     assertTrue(0 <= x && x <= i);
3178     }
3179     }
3180     }
3181     public void testAnyOf_normal_backwards() throws Exception {
3182     for (int k = 0; k < 10; k++) {
3183     CompletableFuture[] fs = new CompletableFuture[k];
3184     for (int i = 0; i < k; i++)
3185     fs[i] = new CompletableFuture<>();
3186     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3187     checkIncomplete(f);
3188     for (int i = k - 1; i >= 0; i--) {
3189     fs[i].complete(i);
3190     checkCompletedNormally(f, k - 1);
3191     int x = (int) CompletableFuture.anyOf(fs).join();
3192     assertTrue(i <= x && x <= k - 1);
3193 jsr166 1.24 }
3194     }
3195     }
3196    
3197     /**
3198     * anyOf result completes exceptionally when any component does.
3199     */
3200     public void testAnyOf_exceptional() throws Exception {
3201 jsr166 1.86 for (int k = 0; k < 10; k++) {
3202 jsr166 1.24 CompletableFuture[] fs = new CompletableFuture[k];
3203 jsr166 1.87 CFException[] exs = new CFException[k];
3204     for (int i = 0; i < k; i++) {
3205 jsr166 1.24 fs[i] = new CompletableFuture<>();
3206 jsr166 1.87 exs[i] = new CFException();
3207     }
3208 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3209     checkIncomplete(f);
3210 jsr166 1.86 for (int i = 0; i < k; i++) {
3211 jsr166 1.87 fs[i].completeExceptionally(exs[i]);
3212     checkCompletedWithWrappedException(f, exs[0]);
3213     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3214     }
3215     }
3216     }
3217    
3218     public void testAnyOf_exceptional_backwards() throws Exception {
3219     for (int k = 0; k < 10; k++) {
3220     CompletableFuture[] fs = new CompletableFuture[k];
3221     CFException[] exs = new CFException[k];
3222     for (int i = 0; i < k; i++) {
3223     fs[i] = new CompletableFuture<>();
3224     exs[i] = new CFException();
3225     }
3226     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3227     checkIncomplete(f);
3228     for (int i = k - 1; i >= 0; i--) {
3229     fs[i].completeExceptionally(exs[i]);
3230     checkCompletedWithWrappedException(f, exs[k - 1]);
3231 jsr166 1.24 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3232 dl 1.5 }
3233     }
3234     }
3235    
3236     /**
3237     * Completion methods throw NullPointerException with null arguments
3238     */
3239 jsr166 1.186 @SuppressWarnings("FutureReturnValueIgnored")
3240 dl 1.5 public void testNPE() {
3241 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3242     CompletableFuture<Integer> g = new CompletableFuture<>();
3243 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3244 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
3245 jsr166 1.14
3246     Runnable[] throwingActions = {
3247 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
3248     () -> CompletableFuture.supplyAsync(null, exec),
3249 jsr166 1.95 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.SYNC, 42), null),
3250 jsr166 1.31
3251     () -> CompletableFuture.runAsync(null),
3252     () -> CompletableFuture.runAsync(null, exec),
3253     () -> CompletableFuture.runAsync(() -> {}, null),
3254    
3255     () -> f.completeExceptionally(null),
3256    
3257     () -> f.thenApply(null),
3258     () -> f.thenApplyAsync(null),
3259 jsr166 1.180 () -> f.thenApplyAsync(x -> x, null),
3260 jsr166 1.31 () -> f.thenApplyAsync(null, exec),
3261    
3262     () -> f.thenAccept(null),
3263     () -> f.thenAcceptAsync(null),
3264 jsr166 1.180 () -> f.thenAcceptAsync(x -> {} , null),
3265 jsr166 1.31 () -> f.thenAcceptAsync(null, exec),
3266    
3267     () -> f.thenRun(null),
3268     () -> f.thenRunAsync(null),
3269     () -> f.thenRunAsync(() -> {} , null),
3270     () -> f.thenRunAsync(null, exec),
3271    
3272     () -> f.thenCombine(g, null),
3273     () -> f.thenCombineAsync(g, null),
3274     () -> f.thenCombineAsync(g, null, exec),
3275     () -> f.thenCombine(nullFuture, (x, y) -> x),
3276     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3277     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3278     () -> f.thenCombineAsync(g, (x, y) -> x, null),
3279    
3280     () -> f.thenAcceptBoth(g, null),
3281     () -> f.thenAcceptBothAsync(g, null),
3282     () -> f.thenAcceptBothAsync(g, null, exec),
3283     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3284     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3285     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3286     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3287    
3288     () -> f.runAfterBoth(g, null),
3289     () -> f.runAfterBothAsync(g, null),
3290     () -> f.runAfterBothAsync(g, null, exec),
3291     () -> f.runAfterBoth(nullFuture, () -> {}),
3292     () -> f.runAfterBothAsync(nullFuture, () -> {}),
3293     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3294     () -> f.runAfterBothAsync(g, () -> {}, null),
3295    
3296     () -> f.applyToEither(g, null),
3297     () -> f.applyToEitherAsync(g, null),
3298     () -> f.applyToEitherAsync(g, null, exec),
3299 jsr166 1.180 () -> f.applyToEither(nullFuture, x -> x),
3300     () -> f.applyToEitherAsync(nullFuture, x -> x),
3301     () -> f.applyToEitherAsync(nullFuture, x -> x, exec),
3302     () -> f.applyToEitherAsync(g, x -> x, null),
3303 jsr166 1.31
3304     () -> f.acceptEither(g, null),
3305     () -> f.acceptEitherAsync(g, null),
3306     () -> f.acceptEitherAsync(g, null, exec),
3307 jsr166 1.180 () -> f.acceptEither(nullFuture, x -> {}),
3308     () -> f.acceptEitherAsync(nullFuture, x -> {}),
3309     () -> f.acceptEitherAsync(nullFuture, x -> {}, exec),
3310     () -> f.acceptEitherAsync(g, x -> {}, null),
3311 jsr166 1.31
3312     () -> f.runAfterEither(g, null),
3313     () -> f.runAfterEitherAsync(g, null),
3314     () -> f.runAfterEitherAsync(g, null, exec),
3315     () -> f.runAfterEither(nullFuture, () -> {}),
3316     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3317     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3318     () -> f.runAfterEitherAsync(g, () -> {}, null),
3319    
3320     () -> f.thenCompose(null),
3321     () -> f.thenComposeAsync(null),
3322 jsr166 1.56 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
3323 jsr166 1.31 () -> f.thenComposeAsync(null, exec),
3324    
3325     () -> f.exceptionally(null),
3326    
3327     () -> f.handle(null),
3328 jsr166 1.107
3329 jsr166 1.31 () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3330     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3331     () -> CompletableFuture.allOf(f, null),
3332     () -> CompletableFuture.allOf(null, f),
3333    
3334     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3335     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3336     () -> CompletableFuture.anyOf(f, null),
3337     () -> CompletableFuture.anyOf(null, f),
3338 jsr166 1.32
3339     () -> f.obtrudeException(null),
3340 jsr166 1.115
3341     () -> CompletableFuture.delayedExecutor(1L, SECONDS, null),
3342 jsr166 1.143 () -> CompletableFuture.delayedExecutor(1L, null, exec),
3343 jsr166 1.115 () -> CompletableFuture.delayedExecutor(1L, null),
3344 jsr166 1.116
3345     () -> f.orTimeout(1L, null),
3346     () -> f.completeOnTimeout(42, 1L, null),
3347 jsr166 1.121
3348     () -> CompletableFuture.failedFuture(null),
3349     () -> CompletableFuture.failedStage(null),
3350 jsr166 1.14 };
3351 dl 1.5
3352 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3353 jsr166 1.17 assertEquals(0, exec.count.get());
3354 dl 1.5 }
3355    
3356 dl 1.26 /**
3357 jsr166 1.152 * Test submissions to an executor that rejects all tasks.
3358     */
3359     public void testRejectingExecutor() {
3360 jsr166 1.161 for (Integer v : new Integer[] { 1, null })
3361     {
3362 jsr166 1.154 final CountingRejectingExecutor e = new CountingRejectingExecutor();
3363 jsr166 1.152
3364     final CompletableFuture<Integer> complete = CompletableFuture.completedFuture(v);
3365     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3366    
3367     List<CompletableFuture<?>> futures = new ArrayList<>();
3368    
3369     List<CompletableFuture<Integer>> srcs = new ArrayList<>();
3370     srcs.add(complete);
3371     srcs.add(incomplete);
3372    
3373     for (CompletableFuture<Integer> src : srcs) {
3374     List<CompletableFuture<?>> fs = new ArrayList<>();
3375     fs.add(src.thenRunAsync(() -> {}, e));
3376 jsr166 1.180 fs.add(src.thenAcceptAsync(z -> {}, e));
3377     fs.add(src.thenApplyAsync(z -> z, e));
3378 jsr166 1.152
3379     fs.add(src.thenCombineAsync(src, (x, y) -> x, e));
3380     fs.add(src.thenAcceptBothAsync(src, (x, y) -> {}, e));
3381     fs.add(src.runAfterBothAsync(src, () -> {}, e));
3382    
3383 jsr166 1.180 fs.add(src.applyToEitherAsync(src, z -> z, e));
3384     fs.add(src.acceptEitherAsync(src, z -> {}, e));
3385 jsr166 1.152 fs.add(src.runAfterEitherAsync(src, () -> {}, e));
3386    
3387 jsr166 1.180 fs.add(src.thenComposeAsync(z -> null, e));
3388 jsr166 1.152 fs.add(src.whenCompleteAsync((z, t) -> {}, e));
3389     fs.add(src.handleAsync((z, t) -> null, e));
3390    
3391     for (CompletableFuture<?> future : fs) {
3392     if (src.isDone())
3393 jsr166 1.154 checkCompletedWithWrappedException(future, e.ex);
3394 jsr166 1.152 else
3395     checkIncomplete(future);
3396     }
3397     futures.addAll(fs);
3398     }
3399    
3400     {
3401     List<CompletableFuture<?>> fs = new ArrayList<>();
3402    
3403     fs.add(complete.thenCombineAsync(incomplete, (x, y) -> x, e));
3404     fs.add(incomplete.thenCombineAsync(complete, (x, y) -> x, e));
3405    
3406     fs.add(complete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3407     fs.add(incomplete.thenAcceptBothAsync(complete, (x, y) -> {}, e));
3408    
3409     fs.add(complete.runAfterBothAsync(incomplete, () -> {}, e));
3410     fs.add(incomplete.runAfterBothAsync(complete, () -> {}, e));
3411    
3412     for (CompletableFuture<?> future : fs)
3413     checkIncomplete(future);
3414     futures.addAll(fs);
3415     }
3416    
3417     {
3418     List<CompletableFuture<?>> fs = new ArrayList<>();
3419    
3420 jsr166 1.180 fs.add(complete.applyToEitherAsync(incomplete, z -> z, e));
3421     fs.add(incomplete.applyToEitherAsync(complete, z -> z, e));
3422 jsr166 1.152
3423 jsr166 1.180 fs.add(complete.acceptEitherAsync(incomplete, z -> {}, e));
3424     fs.add(incomplete.acceptEitherAsync(complete, z -> {}, e));
3425 jsr166 1.152
3426     fs.add(complete.runAfterEitherAsync(incomplete, () -> {}, e));
3427     fs.add(incomplete.runAfterEitherAsync(complete, () -> {}, e));
3428    
3429     for (CompletableFuture<?> future : fs)
3430 jsr166 1.154 checkCompletedWithWrappedException(future, e.ex);
3431 jsr166 1.152 futures.addAll(fs);
3432     }
3433    
3434     incomplete.complete(v);
3435    
3436     for (CompletableFuture<?> future : futures)
3437 jsr166 1.154 checkCompletedWithWrappedException(future, e.ex);
3438    
3439     assertEquals(futures.size(), e.count.get());
3440 jsr166 1.161 }}
3441 jsr166 1.152
3442     /**
3443 jsr166 1.153 * Test submissions to an executor that rejects all tasks, but
3444     * should never be invoked because the dependent future is
3445     * explicitly completed.
3446     */
3447     public void testRejectingExecutorNeverInvoked() {
3448 jsr166 1.161 for (Integer v : new Integer[] { 1, null })
3449     {
3450 jsr166 1.153 final CountingRejectingExecutor e = new CountingRejectingExecutor();
3451    
3452     final CompletableFuture<Integer> complete = CompletableFuture.completedFuture(v);
3453     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3454    
3455     List<CompletableFuture<?>> futures = new ArrayList<>();
3456    
3457     List<CompletableFuture<Integer>> srcs = new ArrayList<>();
3458     srcs.add(complete);
3459     srcs.add(incomplete);
3460    
3461     List<CompletableFuture<?>> fs = new ArrayList<>();
3462     fs.add(incomplete.thenRunAsync(() -> {}, e));
3463 jsr166 1.180 fs.add(incomplete.thenAcceptAsync(z -> {}, e));
3464     fs.add(incomplete.thenApplyAsync(z -> z, e));
3465 jsr166 1.153
3466     fs.add(incomplete.thenCombineAsync(incomplete, (x, y) -> x, e));
3467     fs.add(incomplete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3468     fs.add(incomplete.runAfterBothAsync(incomplete, () -> {}, e));
3469    
3470 jsr166 1.180 fs.add(incomplete.applyToEitherAsync(incomplete, z -> z, e));
3471     fs.add(incomplete.acceptEitherAsync(incomplete, z -> {}, e));
3472 jsr166 1.153 fs.add(incomplete.runAfterEitherAsync(incomplete, () -> {}, e));
3473    
3474 jsr166 1.180 fs.add(incomplete.thenComposeAsync(z -> null, e));
3475 jsr166 1.153 fs.add(incomplete.whenCompleteAsync((z, t) -> {}, e));
3476     fs.add(incomplete.handleAsync((z, t) -> null, e));
3477    
3478     fs.add(complete.thenCombineAsync(incomplete, (x, y) -> x, e));
3479     fs.add(incomplete.thenCombineAsync(complete, (x, y) -> x, e));
3480    
3481     fs.add(complete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3482     fs.add(incomplete.thenAcceptBothAsync(complete, (x, y) -> {}, e));
3483    
3484     fs.add(complete.runAfterBothAsync(incomplete, () -> {}, e));
3485     fs.add(incomplete.runAfterBothAsync(complete, () -> {}, e));
3486    
3487     for (CompletableFuture<?> future : fs)
3488     checkIncomplete(future);
3489    
3490     for (CompletableFuture<?> future : fs)
3491     future.complete(null);
3492    
3493     incomplete.complete(v);
3494    
3495     for (CompletableFuture<?> future : fs)
3496     checkCompletedNormally(future, null);
3497    
3498     assertEquals(0, e.count.get());
3499 jsr166 1.161 }}
3500 jsr166 1.153
3501     /**
3502 dl 1.26 * toCompletableFuture returns this CompletableFuture.
3503     */
3504     public void testToCompletableFuture() {
3505     CompletableFuture<Integer> f = new CompletableFuture<>();
3506     assertSame(f, f.toCompletableFuture());
3507     }
3508    
3509 dl 1.103 // jdk9
3510 jsr166 1.104
3511 dl 1.103 /**
3512     * newIncompleteFuture returns an incomplete CompletableFuture
3513     */
3514     public void testNewIncompleteFuture() {
3515 jsr166 1.117 for (Integer v1 : new Integer[] { 1, null })
3516     {
3517 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3518     CompletableFuture<Integer> g = f.newIncompleteFuture();
3519     checkIncomplete(f);
3520     checkIncomplete(g);
3521 jsr166 1.117 f.complete(v1);
3522     checkCompletedNormally(f, v1);
3523     checkIncomplete(g);
3524     g.complete(v1);
3525     checkCompletedNormally(g, v1);
3526     assertSame(g.getClass(), CompletableFuture.class);
3527     }}
3528 dl 1.103
3529     /**
3530     * completedStage returns a completed CompletionStage
3531     */
3532     public void testCompletedStage() {
3533 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3534 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3535 dl 1.103 CompletionStage<Integer> f = CompletableFuture.completedStage(1);
3536     f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3537     assertEquals(x.get(), 1);
3538     assertNull(r.get());
3539     }
3540    
3541     /**
3542     * defaultExecutor by default returns the commonPool if
3543 dl 1.110 * it supports more than one thread.
3544 dl 1.103 */
3545     public void testDefaultExecutor() {
3546     CompletableFuture<Integer> f = new CompletableFuture<>();
3547     Executor e = f.defaultExecutor();
3548 jsr166 1.108 Executor c = ForkJoinPool.commonPool();
3549 dl 1.105 if (ForkJoinPool.getCommonPoolParallelism() > 1)
3550 dl 1.103 assertSame(e, c);
3551 jsr166 1.111 else
3552     assertNotSame(e, c);
3553 dl 1.103 }
3554    
3555     /**
3556     * failedFuture returns a CompletableFuture completed
3557     * exceptionally with the given Exception
3558     */
3559     public void testFailedFuture() {
3560     CFException ex = new CFException();
3561     CompletableFuture<Integer> f = CompletableFuture.failedFuture(ex);
3562 jsr166 1.119 checkCompletedExceptionally(f, ex);
3563 dl 1.103 }
3564    
3565     /**
3566     * failedFuture(null) throws NPE
3567     */
3568 jsr166 1.118 public void testFailedFuture_null() {
3569 dl 1.103 try {
3570     CompletableFuture<Integer> f = CompletableFuture.failedFuture(null);
3571 jsr166 1.104 shouldThrow();
3572     } catch (NullPointerException success) {}
3573 dl 1.103 }
3574    
3575     /**
3576     * copy returns a CompletableFuture that is completed normally,
3577     * with the same value, when source is.
3578     */
3579 jsr166 1.174 public void testCopy_normalCompletion() {
3580     for (boolean createIncomplete : new boolean[] { true, false })
3581     for (Integer v1 : new Integer[] { 1, null })
3582     {
3583 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3584 jsr166 1.174 if (!createIncomplete) assertTrue(f.complete(v1));
3585 dl 1.103 CompletableFuture<Integer> g = f.copy();
3586 jsr166 1.174 if (createIncomplete) {
3587     checkIncomplete(f);
3588     checkIncomplete(g);
3589     assertTrue(f.complete(v1));
3590     }
3591     checkCompletedNormally(f, v1);
3592     checkCompletedNormally(g, v1);
3593     }}
3594 dl 1.103
3595     /**
3596     * copy returns a CompletableFuture that is completed exceptionally
3597     * when source is.
3598     */
3599 jsr166 1.174 public void testCopy_exceptionalCompletion() {
3600     for (boolean createIncomplete : new boolean[] { true, false })
3601     {
3602     CFException ex = new CFException();
3603 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3604 jsr166 1.174 if (!createIncomplete) f.completeExceptionally(ex);
3605 dl 1.103 CompletableFuture<Integer> g = f.copy();
3606 jsr166 1.174 if (createIncomplete) {
3607     checkIncomplete(f);
3608     checkIncomplete(g);
3609     f.completeExceptionally(ex);
3610     }
3611 dl 1.103 checkCompletedExceptionally(f, ex);
3612 jsr166 1.121 checkCompletedWithWrappedException(g, ex);
3613 jsr166 1.174 }}
3614    
3615     /**
3616     * Completion of a copy does not complete its source.
3617     */
3618     public void testCopy_oneWayPropagation() {
3619     CompletableFuture<Integer> f = new CompletableFuture<>();
3620     assertTrue(f.copy().complete(1));
3621     assertTrue(f.copy().complete(null));
3622     assertTrue(f.copy().cancel(true));
3623     assertTrue(f.copy().cancel(false));
3624     assertTrue(f.copy().completeExceptionally(new CFException()));
3625     checkIncomplete(f);
3626 dl 1.103 }
3627    
3628     /**
3629     * minimalCompletionStage returns a CompletableFuture that is
3630     * completed normally, with the same value, when source is.
3631     */
3632     public void testMinimalCompletionStage() {
3633     CompletableFuture<Integer> f = new CompletableFuture<>();
3634     CompletionStage<Integer> g = f.minimalCompletionStage();
3635 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3636 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3637 dl 1.103 checkIncomplete(f);
3638     g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3639     f.complete(1);
3640     checkCompletedNormally(f, 1);
3641     assertEquals(x.get(), 1);
3642     assertNull(r.get());
3643     }
3644    
3645     /**
3646     * minimalCompletionStage returns a CompletableFuture that is
3647     * completed exceptionally when source is.
3648     */
3649     public void testMinimalCompletionStage2() {
3650     CompletableFuture<Integer> f = new CompletableFuture<>();
3651     CompletionStage<Integer> g = f.minimalCompletionStage();
3652 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3653 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3654 dl 1.103 g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3655     checkIncomplete(f);
3656     CFException ex = new CFException();
3657     f.completeExceptionally(ex);
3658     checkCompletedExceptionally(f, ex);
3659     assertEquals(x.get(), 0);
3660     assertEquals(r.get().getCause(), ex);
3661     }
3662    
3663     /**
3664 jsr166 1.109 * failedStage returns a CompletionStage completed
3665 dl 1.103 * exceptionally with the given Exception
3666     */
3667     public void testFailedStage() {
3668     CFException ex = new CFException();
3669     CompletionStage<Integer> f = CompletableFuture.failedStage(ex);
3670 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3671 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3672 dl 1.103 f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3673     assertEquals(x.get(), 0);
3674 jsr166 1.119 assertEquals(r.get(), ex);
3675 dl 1.103 }
3676    
3677     /**
3678     * completeAsync completes with value of given supplier
3679     */
3680     public void testCompleteAsync() {
3681 jsr166 1.121 for (Integer v1 : new Integer[] { 1, null })
3682     {
3683 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3684 jsr166 1.121 f.completeAsync(() -> v1);
3685 dl 1.103 f.join();
3686 jsr166 1.121 checkCompletedNormally(f, v1);
3687     }}
3688 dl 1.103
3689     /**
3690     * completeAsync completes exceptionally if given supplier throws
3691     */
3692     public void testCompleteAsync2() {
3693     CompletableFuture<Integer> f = new CompletableFuture<>();
3694     CFException ex = new CFException();
3695 jsr166 1.181 f.completeAsync(() -> { throw ex; });
3696 dl 1.103 try {
3697     f.join();
3698     shouldThrow();
3699 jsr166 1.121 } catch (CompletionException success) {}
3700     checkCompletedWithWrappedException(f, ex);
3701 dl 1.103 }
3702    
3703     /**
3704     * completeAsync with given executor completes with value of given supplier
3705     */
3706     public void testCompleteAsync3() {
3707 jsr166 1.121 for (Integer v1 : new Integer[] { 1, null })
3708     {
3709 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3710 jsr166 1.121 ThreadExecutor executor = new ThreadExecutor();
3711     f.completeAsync(() -> v1, executor);
3712     assertSame(v1, f.join());
3713     checkCompletedNormally(f, v1);
3714     assertEquals(1, executor.count.get());
3715     }}
3716 dl 1.103
3717     /**
3718     * completeAsync with given executor completes exceptionally if
3719     * given supplier throws
3720     */
3721     public void testCompleteAsync4() {
3722     CompletableFuture<Integer> f = new CompletableFuture<>();
3723     CFException ex = new CFException();
3724 jsr166 1.121 ThreadExecutor executor = new ThreadExecutor();
3725 jsr166 1.181 f.completeAsync(() -> { throw ex; }, executor);
3726 dl 1.103 try {
3727     f.join();
3728     shouldThrow();
3729 jsr166 1.121 } catch (CompletionException success) {}
3730     checkCompletedWithWrappedException(f, ex);
3731     assertEquals(1, executor.count.get());
3732 dl 1.103 }
3733    
3734     /**
3735 jsr166 1.106 * orTimeout completes with TimeoutException if not complete
3736 dl 1.103 */
3737 jsr166 1.121 public void testOrTimeout_timesOut() {
3738     long timeoutMillis = timeoutMillis();
3739 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3740 jsr166 1.121 long startTime = System.nanoTime();
3741 jsr166 1.145 assertSame(f, f.orTimeout(timeoutMillis, MILLISECONDS));
3742 jsr166 1.121 checkCompletedWithTimeoutException(f);
3743     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3744 dl 1.103 }
3745    
3746     /**
3747 jsr166 1.106 * orTimeout completes normally if completed before timeout
3748 dl 1.103 */
3749 jsr166 1.121 public void testOrTimeout_completed() {
3750     for (Integer v1 : new Integer[] { 1, null })
3751     {
3752 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3753 jsr166 1.121 CompletableFuture<Integer> g = new CompletableFuture<>();
3754     long startTime = System.nanoTime();
3755     f.complete(v1);
3756 jsr166 1.145 assertSame(f, f.orTimeout(LONG_DELAY_MS, MILLISECONDS));
3757     assertSame(g, g.orTimeout(LONG_DELAY_MS, MILLISECONDS));
3758 jsr166 1.121 g.complete(v1);
3759     checkCompletedNormally(f, v1);
3760     checkCompletedNormally(g, v1);
3761     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3762     }}
3763 dl 1.103
3764     /**
3765 jsr166 1.106 * completeOnTimeout completes with given value if not complete
3766 dl 1.103 */
3767 jsr166 1.121 public void testCompleteOnTimeout_timesOut() {
3768     testInParallel(() -> testCompleteOnTimeout_timesOut(42),
3769     () -> testCompleteOnTimeout_timesOut(null));
3770     }
3771    
3772 jsr166 1.146 /**
3773     * completeOnTimeout completes with given value if not complete
3774     */
3775 jsr166 1.121 public void testCompleteOnTimeout_timesOut(Integer v) {
3776     long timeoutMillis = timeoutMillis();
3777 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3778 jsr166 1.121 long startTime = System.nanoTime();
3779 jsr166 1.145 assertSame(f, f.completeOnTimeout(v, timeoutMillis, MILLISECONDS));
3780 jsr166 1.121 assertSame(v, f.join());
3781     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3782     f.complete(99); // should have no effect
3783     checkCompletedNormally(f, v);
3784 dl 1.103 }
3785    
3786     /**
3787 jsr166 1.106 * completeOnTimeout has no effect if completed within timeout
3788 dl 1.103 */
3789 jsr166 1.121 public void testCompleteOnTimeout_completed() {
3790     for (Integer v1 : new Integer[] { 1, null })
3791     {
3792 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3793 jsr166 1.121 CompletableFuture<Integer> g = new CompletableFuture<>();
3794     long startTime = System.nanoTime();
3795     f.complete(v1);
3796 jsr166 1.145 assertSame(f, f.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
3797     assertSame(g, g.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
3798 jsr166 1.121 g.complete(v1);
3799     checkCompletedNormally(f, v1);
3800     checkCompletedNormally(g, v1);
3801     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3802     }}
3803 dl 1.103
3804     /**
3805     * delayedExecutor returns an executor that delays submission
3806     */
3807 jsr166 1.121 public void testDelayedExecutor() {
3808     testInParallel(() -> testDelayedExecutor(null, null),
3809     () -> testDelayedExecutor(null, 1),
3810     () -> testDelayedExecutor(new ThreadExecutor(), 1),
3811     () -> testDelayedExecutor(new ThreadExecutor(), 1));
3812 dl 1.103 }
3813    
3814 jsr166 1.121 public void testDelayedExecutor(Executor executor, Integer v) throws Exception {
3815     long timeoutMillis = timeoutMillis();
3816     // Use an "unreasonably long" long timeout to catch lingering threads
3817     long longTimeoutMillis = 1000 * 60 * 60 * 24;
3818     final Executor delayer, longDelayer;
3819     if (executor == null) {
3820     delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS);
3821     longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS);
3822     } else {
3823     delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS, executor);
3824     longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS, executor);
3825     }
3826 dl 1.103 long startTime = System.nanoTime();
3827 jsr166 1.121 CompletableFuture<Integer> f =
3828     CompletableFuture.supplyAsync(() -> v, delayer);
3829     CompletableFuture<Integer> g =
3830     CompletableFuture.supplyAsync(() -> v, longDelayer);
3831    
3832     assertNull(g.getNow(null));
3833    
3834     assertSame(v, f.get(LONG_DELAY_MS, MILLISECONDS));
3835     long millisElapsed = millisElapsedSince(startTime);
3836     assertTrue(millisElapsed >= timeoutMillis);
3837     assertTrue(millisElapsed < LONG_DELAY_MS / 2);
3838    
3839     checkCompletedNormally(f, v);
3840    
3841     checkIncomplete(g);
3842     assertTrue(g.cancel(true));
3843 dl 1.103 }
3844    
3845 jsr166 1.82 //--- tests of implementation details; not part of official tck ---
3846    
3847     Object resultOf(CompletableFuture<?> f) {
3848 jsr166 1.147 SecurityManager sm = System.getSecurityManager();
3849     if (sm != null) {
3850     try {
3851     System.setSecurityManager(null);
3852     } catch (SecurityException giveUp) {
3853     return "Reflection not available";
3854     }
3855     }
3856    
3857 jsr166 1.82 try {
3858     java.lang.reflect.Field resultField
3859     = CompletableFuture.class.getDeclaredField("result");
3860     resultField.setAccessible(true);
3861     return resultField.get(f);
3862 jsr166 1.147 } catch (Throwable t) {
3863     throw new AssertionError(t);
3864     } finally {
3865     if (sm != null) System.setSecurityManager(sm);
3866     }
3867 jsr166 1.82 }
3868    
3869     public void testExceptionPropagationReusesResultObject() {
3870     if (!testImplementationDetails) return;
3871     for (ExecutionMode m : ExecutionMode.values())
3872     {
3873 jsr166 1.83 final CFException ex = new CFException();
3874     final CompletableFuture<Integer> v42 = CompletableFuture.completedFuture(42);
3875     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3876    
3877 jsr166 1.164 final Runnable noopRunnable = new Noop(m);
3878     final Consumer<Integer> noopConsumer = new NoopConsumer(m);
3879     final Function<Integer, Integer> incFunction = new IncFunction(m);
3880    
3881 jsr166 1.89 List<Function<CompletableFuture<Integer>, CompletableFuture<?>>> funs
3882 jsr166 1.83 = new ArrayList<>();
3883    
3884 jsr166 1.180 funs.add(y -> m.thenRun(y, noopRunnable));
3885     funs.add(y -> m.thenAccept(y, noopConsumer));
3886     funs.add(y -> m.thenApply(y, incFunction));
3887    
3888     funs.add(y -> m.runAfterEither(y, incomplete, noopRunnable));
3889     funs.add(y -> m.acceptEither(y, incomplete, noopConsumer));
3890     funs.add(y -> m.applyToEither(y, incomplete, incFunction));
3891    
3892     funs.add(y -> m.runAfterBoth(y, v42, noopRunnable));
3893     funs.add(y -> m.runAfterBoth(v42, y, noopRunnable));
3894     funs.add(y -> m.thenAcceptBoth(y, v42, new SubtractAction(m)));
3895     funs.add(y -> m.thenAcceptBoth(v42, y, new SubtractAction(m)));
3896     funs.add(y -> m.thenCombine(y, v42, new SubtractFunction(m)));
3897     funs.add(y -> m.thenCombine(v42, y, new SubtractFunction(m)));
3898    
3899     funs.add(y -> m.whenComplete(y, (Integer r, Throwable t) -> {}));
3900    
3901     funs.add(y -> m.thenCompose(y, new CompletableFutureInc(m)));
3902    
3903     funs.add(y -> CompletableFuture.allOf(y));
3904     funs.add(y -> CompletableFuture.allOf(y, v42));
3905     funs.add(y -> CompletableFuture.allOf(v42, y));
3906     funs.add(y -> CompletableFuture.anyOf(y));
3907     funs.add(y -> CompletableFuture.anyOf(y, incomplete));
3908     funs.add(y -> CompletableFuture.anyOf(incomplete, y));
3909 jsr166 1.85
3910 jsr166 1.83 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3911 jsr166 1.89 fun : funs) {
3912 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3913     f.completeExceptionally(ex);
3914 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3915 jsr166 1.83 checkCompletedWithWrappedException(src, ex);
3916 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3917 jsr166 1.83 checkCompletedWithWrappedException(dep, ex);
3918     assertSame(resultOf(src), resultOf(dep));
3919     }
3920    
3921     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3922 jsr166 1.89 fun : funs) {
3923 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3924 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3925 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3926 jsr166 1.83 f.completeExceptionally(ex);
3927     checkCompletedWithWrappedException(src, ex);
3928     checkCompletedWithWrappedException(dep, ex);
3929     assertSame(resultOf(src), resultOf(dep));
3930     }
3931    
3932     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3933     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3934 jsr166 1.89 fun : funs) {
3935 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3936     f.cancel(mayInterruptIfRunning);
3937     checkCancelled(f);
3938 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3939 jsr166 1.83 checkCompletedWithWrappedCancellationException(src);
3940 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3941 jsr166 1.83 checkCompletedWithWrappedCancellationException(dep);
3942     assertSame(resultOf(src), resultOf(dep));
3943     }
3944    
3945     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3946     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3947 jsr166 1.89 fun : funs) {
3948 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3949 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3950 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3951 jsr166 1.83 f.cancel(mayInterruptIfRunning);
3952     checkCancelled(f);
3953     checkCompletedWithWrappedCancellationException(src);
3954     checkCompletedWithWrappedCancellationException(dep);
3955     assertSame(resultOf(src), resultOf(dep));
3956     }
3957 jsr166 1.82 }}
3958    
3959 jsr166 1.123 /**
3960 jsr166 1.165 * Minimal completion stages throw UOE for most non-CompletionStage methods
3961 jsr166 1.123 */
3962     public void testMinimalCompletionStage_minimality() {
3963     if (!testImplementationDetails) return;
3964     Function<Method, String> toSignature =
3965 jsr166 1.180 method -> method.getName() + Arrays.toString(method.getParameterTypes());
3966 jsr166 1.124 Predicate<Method> isNotStatic =
3967 jsr166 1.180 method -> (method.getModifiers() & Modifier.STATIC) == 0;
3968 jsr166 1.123 List<Method> minimalMethods =
3969     Stream.of(Object.class, CompletionStage.class)
3970 jsr166 1.180 .flatMap(klazz -> Stream.of(klazz.getMethods()))
3971 jsr166 1.124 .filter(isNotStatic)
3972 jsr166 1.123 .collect(Collectors.toList());
3973     // Methods from CompletableFuture permitted NOT to throw UOE
3974     String[] signatureWhitelist = {
3975     "newIncompleteFuture[]",
3976     "defaultExecutor[]",
3977     "minimalCompletionStage[]",
3978     "copy[]",
3979     };
3980     Set<String> permittedMethodSignatures =
3981     Stream.concat(minimalMethods.stream().map(toSignature),
3982     Stream.of(signatureWhitelist))
3983     .collect(Collectors.toSet());
3984     List<Method> allMethods = Stream.of(CompletableFuture.class.getMethods())
3985 jsr166 1.124 .filter(isNotStatic)
3986 jsr166 1.180 .filter(method -> !permittedMethodSignatures.contains(toSignature.apply(method)))
3987 jsr166 1.123 .collect(Collectors.toList());
3988    
3989 jsr166 1.165 List<CompletionStage<Integer>> stages = new ArrayList<>();
3990 jsr166 1.173 CompletionStage<Integer> min =
3991     new CompletableFuture<Integer>().minimalCompletionStage();
3992     stages.add(min);
3993     stages.add(min.thenApply(x -> x));
3994 jsr166 1.165 stages.add(CompletableFuture.completedStage(1));
3995 jsr166 1.166 stages.add(CompletableFuture.failedStage(new CFException()));
3996 jsr166 1.123
3997     List<Method> bugs = new ArrayList<>();
3998     for (Method method : allMethods) {
3999     Class<?>[] parameterTypes = method.getParameterTypes();
4000     Object[] args = new Object[parameterTypes.length];
4001     // Manufacture boxed primitives for primitive params
4002     for (int i = 0; i < args.length; i++) {
4003     Class<?> type = parameterTypes[i];
4004     if (parameterTypes[i] == boolean.class)
4005     args[i] = false;
4006     else if (parameterTypes[i] == int.class)
4007     args[i] = 0;
4008     else if (parameterTypes[i] == long.class)
4009     args[i] = 0L;
4010     }
4011 jsr166 1.165 for (CompletionStage<Integer> stage : stages) {
4012     try {
4013     method.invoke(stage, args);
4014 jsr166 1.123 bugs.add(method);
4015     }
4016 jsr166 1.165 catch (java.lang.reflect.InvocationTargetException expected) {
4017     if (! (expected.getCause() instanceof UnsupportedOperationException)) {
4018     bugs.add(method);
4019     // expected.getCause().printStackTrace();
4020     }
4021     }
4022     catch (ReflectiveOperationException bad) { throw new Error(bad); }
4023 jsr166 1.123 }
4024     }
4025     if (!bugs.isEmpty())
4026 jsr166 1.165 throw new Error("Methods did not throw UOE: " + bugs);
4027 jsr166 1.123 }
4028    
4029 jsr166 1.173 /**
4030 jsr166 1.176 * minimalStage.toCompletableFuture() returns a CompletableFuture that
4031     * is completed normally, with the same value, when source is.
4032     */
4033     public void testMinimalCompletionStage_toCompletableFuture_normalCompletion() {
4034     for (boolean createIncomplete : new boolean[] { true, false })
4035     for (Integer v1 : new Integer[] { 1, null })
4036     {
4037     CompletableFuture<Integer> f = new CompletableFuture<>();
4038     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4039     if (!createIncomplete) assertTrue(f.complete(v1));
4040     CompletableFuture<Integer> g = minimal.toCompletableFuture();
4041     if (createIncomplete) {
4042     checkIncomplete(f);
4043     checkIncomplete(g);
4044     assertTrue(f.complete(v1));
4045     }
4046     checkCompletedNormally(f, v1);
4047     checkCompletedNormally(g, v1);
4048     }}
4049    
4050     /**
4051 jsr166 1.177 * minimalStage.toCompletableFuture() returns a CompletableFuture that
4052     * is completed exceptionally when source is.
4053     */
4054     public void testMinimalCompletionStage_toCompletableFuture_exceptionalCompletion() {
4055     for (boolean createIncomplete : new boolean[] { true, false })
4056     {
4057     CFException ex = new CFException();
4058     CompletableFuture<Integer> f = new CompletableFuture<>();
4059     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4060     if (!createIncomplete) f.completeExceptionally(ex);
4061     CompletableFuture<Integer> g = minimal.toCompletableFuture();
4062     if (createIncomplete) {
4063     checkIncomplete(f);
4064     checkIncomplete(g);
4065     f.completeExceptionally(ex);
4066     }
4067     checkCompletedExceptionally(f, ex);
4068     checkCompletedWithWrappedException(g, ex);
4069     }}
4070    
4071     /**
4072 jsr166 1.173 * minimalStage.toCompletableFuture() gives mutable CompletableFuture
4073     */
4074     public void testMinimalCompletionStage_toCompletableFuture_mutable() {
4075     for (Integer v1 : new Integer[] { 1, null })
4076     {
4077     CompletableFuture<Integer> f = new CompletableFuture<>();
4078     CompletionStage minimal = f.minimalCompletionStage();
4079     CompletableFuture<Integer> g = minimal.toCompletableFuture();
4080 jsr166 1.178 assertTrue(g.complete(v1));
4081 jsr166 1.173 checkCompletedNormally(g, v1);
4082     checkIncomplete(f);
4083     checkIncomplete(minimal.toCompletableFuture());
4084     }}
4085    
4086     /**
4087     * minimalStage.toCompletableFuture().join() awaits completion
4088     */
4089     public void testMinimalCompletionStage_toCompletableFuture_join() throws Exception {
4090     for (boolean createIncomplete : new boolean[] { true, false })
4091     for (Integer v1 : new Integer[] { 1, null })
4092     {
4093     CompletableFuture<Integer> f = new CompletableFuture<>();
4094     if (!createIncomplete) assertTrue(f.complete(v1));
4095     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4096     if (createIncomplete) assertTrue(f.complete(v1));
4097     assertEquals(v1, minimal.toCompletableFuture().join());
4098     assertEquals(v1, minimal.toCompletableFuture().get());
4099     checkCompletedNormally(minimal.toCompletableFuture(), v1);
4100     }}
4101    
4102 jsr166 1.175 /**
4103     * Completion of a toCompletableFuture copy of a minimal stage
4104     * does not complete its source.
4105     */
4106     public void testMinimalCompletionStage_toCompletableFuture_oneWayPropagation() {
4107     CompletableFuture<Integer> f = new CompletableFuture<>();
4108     CompletionStage<Integer> g = f.minimalCompletionStage();
4109     assertTrue(g.toCompletableFuture().complete(1));
4110     assertTrue(g.toCompletableFuture().complete(null));
4111     assertTrue(g.toCompletableFuture().cancel(true));
4112     assertTrue(g.toCompletableFuture().cancel(false));
4113     assertTrue(g.toCompletableFuture().completeExceptionally(new CFException()));
4114     checkIncomplete(g.toCompletableFuture());
4115     f.complete(1);
4116     checkCompletedNormally(g.toCompletableFuture(), 1);
4117     }
4118    
4119 jsr166 1.173 /** Demo utility method for external reliable toCompletableFuture */
4120     static <T> CompletableFuture<T> toCompletableFuture(CompletionStage<T> stage) {
4121     CompletableFuture<T> f = new CompletableFuture<>();
4122     stage.handle((T t, Throwable ex) -> {
4123     if (ex != null) f.completeExceptionally(ex);
4124     else f.complete(t);
4125     return null;
4126     });
4127     return f;
4128     }
4129    
4130     /** Demo utility method to join a CompletionStage */
4131     static <T> T join(CompletionStage<T> stage) {
4132     return toCompletableFuture(stage).join();
4133     }
4134    
4135     /**
4136     * Joining a minimal stage "by hand" works
4137     */
4138     public void testMinimalCompletionStage_join_by_hand() {
4139     for (boolean createIncomplete : new boolean[] { true, false })
4140     for (Integer v1 : new Integer[] { 1, null })
4141     {
4142     CompletableFuture<Integer> f = new CompletableFuture<>();
4143     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4144     CompletableFuture<Integer> g = new CompletableFuture<>();
4145     if (!createIncomplete) assertTrue(f.complete(v1));
4146 jsr166 1.180 minimal.thenAccept(x -> g.complete(x));
4147 jsr166 1.173 if (createIncomplete) assertTrue(f.complete(v1));
4148     g.join();
4149     checkCompletedNormally(g, v1);
4150     checkCompletedNormally(f, v1);
4151     assertEquals(v1, join(minimal));
4152     }}
4153    
4154 jsr166 1.128 static class Monad {
4155 jsr166 1.131 static class ZeroException extends RuntimeException {
4156     public ZeroException() { super("monadic zero"); }
4157 jsr166 1.128 }
4158     // "return", "unit"
4159     static <T> CompletableFuture<T> unit(T value) {
4160     return completedFuture(value);
4161     }
4162     // monadic zero ?
4163 jsr166 1.129 static <T> CompletableFuture<T> zero() {
4164 jsr166 1.131 return failedFuture(new ZeroException());
4165 jsr166 1.128 }
4166     // >=>
4167     static <T,U,V> Function<T, CompletableFuture<V>> compose
4168     (Function<T, CompletableFuture<U>> f,
4169     Function<U, CompletableFuture<V>> g) {
4170 jsr166 1.180 return x -> f.apply(x).thenCompose(g);
4171 jsr166 1.128 }
4172    
4173     static void assertZero(CompletableFuture<?> f) {
4174     try {
4175     f.getNow(null);
4176     throw new AssertionFailedError("should throw");
4177     } catch (CompletionException success) {
4178 jsr166 1.131 assertTrue(success.getCause() instanceof ZeroException);
4179 jsr166 1.128 }
4180     }
4181    
4182     static <T> void assertFutureEquals(CompletableFuture<T> f,
4183     CompletableFuture<T> g) {
4184     T fval = null, gval = null;
4185     Throwable fex = null, gex = null;
4186    
4187     try { fval = f.get(); }
4188     catch (ExecutionException ex) { fex = ex.getCause(); }
4189     catch (Throwable ex) { fex = ex; }
4190    
4191     try { gval = g.get(); }
4192     catch (ExecutionException ex) { gex = ex.getCause(); }
4193     catch (Throwable ex) { gex = ex; }
4194    
4195     if (fex != null || gex != null)
4196     assertSame(fex.getClass(), gex.getClass());
4197     else
4198     assertEquals(fval, gval);
4199     }
4200    
4201     static class PlusFuture<T> extends CompletableFuture<T> {
4202     AtomicReference<Throwable> firstFailure = new AtomicReference<>(null);
4203     }
4204    
4205 jsr166 1.137 /** Implements "monadic plus". */
4206 jsr166 1.128 static <T> CompletableFuture<T> plus(CompletableFuture<? extends T> f,
4207     CompletableFuture<? extends T> g) {
4208     PlusFuture<T> plus = new PlusFuture<T>();
4209 jsr166 1.129 BiConsumer<T, Throwable> action = (T result, Throwable ex) -> {
4210 jsr166 1.137 try {
4211     if (ex == null) {
4212     if (plus.complete(result))
4213     if (plus.firstFailure.get() != null)
4214     plus.firstFailure.set(null);
4215     }
4216     else if (plus.firstFailure.compareAndSet(null, ex)) {
4217     if (plus.isDone())
4218 jsr166 1.128 plus.firstFailure.set(null);
4219 jsr166 1.137 }
4220     else {
4221     // first failure has precedence
4222     Throwable first = plus.firstFailure.getAndSet(null);
4223    
4224     // may fail with "Self-suppression not permitted"
4225     try { first.addSuppressed(ex); }
4226     catch (Exception ignored) {}
4227    
4228     plus.completeExceptionally(first);
4229     }
4230     } catch (Throwable unexpected) {
4231     plus.completeExceptionally(unexpected);
4232 jsr166 1.128 }
4233     };
4234     f.whenComplete(action);
4235     g.whenComplete(action);
4236     return plus;
4237     }
4238     }
4239    
4240     /**
4241     * CompletableFuture is an additive monad - sort of.
4242     * https://en.wikipedia.org/wiki/Monad_(functional_programming)#Additive_monads
4243     */
4244     public void testAdditiveMonad() throws Throwable {
4245 jsr166 1.129 Function<Long, CompletableFuture<Long>> unit = Monad::unit;
4246     CompletableFuture<Long> zero = Monad.zero();
4247    
4248 jsr166 1.128 // Some mutually non-commutative functions
4249     Function<Long, CompletableFuture<Long>> triple
4250 jsr166 1.180 = x -> Monad.unit(3 * x);
4251 jsr166 1.128 Function<Long, CompletableFuture<Long>> inc
4252 jsr166 1.180 = x -> Monad.unit(x + 1);
4253 jsr166 1.128
4254     // unit is a right identity: m >>= unit === m
4255 jsr166 1.129 Monad.assertFutureEquals(inc.apply(5L).thenCompose(unit),
4256     inc.apply(5L));
4257 jsr166 1.128 // unit is a left identity: (unit x) >>= f === f x
4258 jsr166 1.129 Monad.assertFutureEquals(unit.apply(5L).thenCompose(inc),
4259     inc.apply(5L));
4260    
4261 jsr166 1.128 // associativity: (m >>= f) >>= g === m >>= ( \x -> (f x >>= g) )
4262     Monad.assertFutureEquals(
4263     unit.apply(5L).thenCompose(inc).thenCompose(triple),
4264 jsr166 1.180 unit.apply(5L).thenCompose(x -> inc.apply(x).thenCompose(triple)));
4265 jsr166 1.128
4266 jsr166 1.129 // The case for CompletableFuture as an additive monad is weaker...
4267    
4268 jsr166 1.128 // zero is a monadic zero
4269 jsr166 1.129 Monad.assertZero(zero);
4270    
4271 jsr166 1.128 // left zero: zero >>= f === zero
4272 jsr166 1.129 Monad.assertZero(zero.thenCompose(inc));
4273     // right zero: f >>= (\x -> zero) === zero
4274 jsr166 1.180 Monad.assertZero(inc.apply(5L).thenCompose(x -> zero));
4275 jsr166 1.129
4276     // f plus zero === f
4277     Monad.assertFutureEquals(Monad.unit(5L),
4278     Monad.plus(Monad.unit(5L), zero));
4279     // zero plus f === f
4280     Monad.assertFutureEquals(Monad.unit(5L),
4281     Monad.plus(zero, Monad.unit(5L)));
4282 jsr166 1.128 // zero plus zero === zero
4283 jsr166 1.129 Monad.assertZero(Monad.plus(zero, zero));
4284 jsr166 1.128 {
4285 jsr166 1.129 CompletableFuture<Long> f = Monad.plus(Monad.unit(5L),
4286     Monad.unit(8L));
4287     // non-determinism
4288     assertTrue(f.get() == 5L || f.get() == 8L);
4289 jsr166 1.128 }
4290    
4291     CompletableFuture<Long> godot = new CompletableFuture<>();
4292 jsr166 1.129 // f plus godot === f (doesn't wait for godot)
4293     Monad.assertFutureEquals(Monad.unit(5L),
4294     Monad.plus(Monad.unit(5L), godot));
4295     // godot plus f === f (doesn't wait for godot)
4296     Monad.assertFutureEquals(Monad.unit(5L),
4297     Monad.plus(godot, Monad.unit(5L)));
4298 jsr166 1.128 }
4299    
4300 jsr166 1.163 /** Test long recursive chains of CompletableFutures with cascading completions */
4301 jsr166 1.187 @SuppressWarnings("FutureReturnValueIgnored")
4302 jsr166 1.163 public void testRecursiveChains() throws Throwable {
4303     for (ExecutionMode m : ExecutionMode.values())
4304     for (boolean addDeadEnds : new boolean[] { true, false })
4305     {
4306     final int val = 42;
4307     final int n = expensiveTests ? 1_000 : 2;
4308     CompletableFuture<Integer> head = new CompletableFuture<>();
4309     CompletableFuture<Integer> tail = head;
4310     for (int i = 0; i < n; i++) {
4311     if (addDeadEnds) m.thenApply(tail, v -> v + 1);
4312     tail = m.thenApply(tail, v -> v + 1);
4313     if (addDeadEnds) m.applyToEither(tail, tail, v -> v + 1);
4314     tail = m.applyToEither(tail, tail, v -> v + 1);
4315     if (addDeadEnds) m.thenCombine(tail, tail, (v, w) -> v + 1);
4316     tail = m.thenCombine(tail, tail, (v, w) -> v + 1);
4317     }
4318     head.complete(val);
4319     assertEquals(val + 3 * n, (int) tail.join());
4320     }}
4321    
4322 jsr166 1.140 /**
4323     * A single CompletableFuture with many dependents.
4324 jsr166 1.141 * A demo of scalability - runtime is O(n).
4325 jsr166 1.140 */
4326 jsr166 1.187 @SuppressWarnings("FutureReturnValueIgnored")
4327 jsr166 1.140 public void testManyDependents() throws Throwable {
4328 jsr166 1.159 final int n = expensiveTests ? 1_000_000 : 10;
4329 jsr166 1.140 final CompletableFuture<Void> head = new CompletableFuture<>();
4330     final CompletableFuture<Void> complete = CompletableFuture.completedFuture((Void)null);
4331     final AtomicInteger count = new AtomicInteger(0);
4332     for (int i = 0; i < n; i++) {
4333     head.thenRun(() -> count.getAndIncrement());
4334 jsr166 1.180 head.thenAccept(x -> count.getAndIncrement());
4335     head.thenApply(x -> count.getAndIncrement());
4336 jsr166 1.141
4337 jsr166 1.140 head.runAfterBoth(complete, () -> count.getAndIncrement());
4338     head.thenAcceptBoth(complete, (x, y) -> count.getAndIncrement());
4339     head.thenCombine(complete, (x, y) -> count.getAndIncrement());
4340 jsr166 1.141 complete.runAfterBoth(head, () -> count.getAndIncrement());
4341     complete.thenAcceptBoth(head, (x, y) -> count.getAndIncrement());
4342     complete.thenCombine(head, (x, y) -> count.getAndIncrement());
4343    
4344     head.runAfterEither(new CompletableFuture<Void>(), () -> count.getAndIncrement());
4345 jsr166 1.180 head.acceptEither(new CompletableFuture<Void>(), x -> count.getAndIncrement());
4346     head.applyToEither(new CompletableFuture<Void>(), x -> count.getAndIncrement());
4347 jsr166 1.141 new CompletableFuture<Void>().runAfterEither(head, () -> count.getAndIncrement());
4348 jsr166 1.180 new CompletableFuture<Void>().acceptEither(head, x -> count.getAndIncrement());
4349     new CompletableFuture<Void>().applyToEither(head, x -> count.getAndIncrement());
4350 jsr166 1.140 }
4351     head.complete(null);
4352 jsr166 1.141 assertEquals(5 * 3 * n, count.get());
4353 jsr166 1.140 }
4354    
4355 jsr166 1.160 /** ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest tck */
4356 jsr166 1.187 @SuppressWarnings("FutureReturnValueIgnored")
4357 jsr166 1.160 public void testCoCompletionGarbageRetention() throws Throwable {
4358 jsr166 1.159 final int n = expensiveTests ? 1_000_000 : 10;
4359 jsr166 1.156 final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
4360     CompletableFuture<Integer> f;
4361     for (int i = 0; i < n; i++) {
4362     f = new CompletableFuture<>();
4363     f.runAfterEither(incomplete, () -> {});
4364     f.complete(null);
4365    
4366     f = new CompletableFuture<>();
4367 jsr166 1.180 f.acceptEither(incomplete, x -> {});
4368 jsr166 1.156 f.complete(null);
4369    
4370     f = new CompletableFuture<>();
4371 jsr166 1.180 f.applyToEither(incomplete, x -> x);
4372 jsr166 1.156 f.complete(null);
4373    
4374     f = new CompletableFuture<>();
4375     CompletableFuture.anyOf(new CompletableFuture<?>[] { f, incomplete });
4376     f.complete(null);
4377     }
4378    
4379     for (int i = 0; i < n; i++) {
4380     f = new CompletableFuture<>();
4381     incomplete.runAfterEither(f, () -> {});
4382     f.complete(null);
4383    
4384     f = new CompletableFuture<>();
4385 jsr166 1.180 incomplete.acceptEither(f, x -> {});
4386 jsr166 1.156 f.complete(null);
4387    
4388     f = new CompletableFuture<>();
4389 jsr166 1.180 incomplete.applyToEither(f, x -> x);
4390 jsr166 1.156 f.complete(null);
4391    
4392     f = new CompletableFuture<>();
4393     CompletableFuture.anyOf(new CompletableFuture<?>[] { incomplete, f });
4394     f.complete(null);
4395     }
4396     }
4397    
4398 jsr166 1.167 /**
4399 jsr166 1.170 * Reproduction recipe for:
4400     * 8160402: Garbage retention with CompletableFuture.anyOf
4401     * cvs update -D '2016-05-01' ./src/main/java/util/concurrent/CompletableFuture.java && ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testAnyOfGarbageRetention tck; cvs update -A
4402 jsr166 1.158 */
4403     public void testAnyOfGarbageRetention() throws Throwable {
4404     for (Integer v : new Integer[] { 1, null })
4405     {
4406     final int n = expensiveTests ? 100_000 : 10;
4407     CompletableFuture<Integer>[] fs
4408     = (CompletableFuture<Integer>[]) new CompletableFuture<?>[100];
4409     for (int i = 0; i < fs.length; i++)
4410     fs[i] = new CompletableFuture<>();
4411     fs[fs.length - 1].complete(v);
4412     for (int i = 0; i < n; i++)
4413     checkCompletedNormally(CompletableFuture.anyOf(fs), v);
4414     }}
4415    
4416 jsr166 1.167 /**
4417     * Checks for garbage retention with allOf.
4418     *
4419     * As of 2016-07, fails with OOME:
4420     * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testCancelledAllOfGarbageRetention tck
4421     */
4422 jsr166 1.158 public void testCancelledAllOfGarbageRetention() throws Throwable {
4423     final int n = expensiveTests ? 100_000 : 10;
4424     CompletableFuture<Integer>[] fs
4425     = (CompletableFuture<Integer>[]) new CompletableFuture<?>[100];
4426     for (int i = 0; i < fs.length; i++)
4427     fs[i] = new CompletableFuture<>();
4428     for (int i = 0; i < n; i++)
4429     assertTrue(CompletableFuture.allOf(fs).cancel(false));
4430     }
4431    
4432 jsr166 1.168 /**
4433     * Checks for garbage retention when a dependent future is
4434     * cancelled and garbage-collected.
4435 jsr166 1.169 * 8161600: Garbage retention when source CompletableFutures are never completed
4436 jsr166 1.168 *
4437     * As of 2016-07, fails with OOME:
4438     * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testCancelledGarbageRetention tck
4439     */
4440     public void testCancelledGarbageRetention() throws Throwable {
4441     final int n = expensiveTests ? 100_000 : 10;
4442     CompletableFuture<Integer> neverCompleted = new CompletableFuture<>();
4443     for (int i = 0; i < n; i++)
4444     assertTrue(neverCompleted.thenRun(() -> {}).cancel(true));
4445     }
4446    
4447 jsr166 1.179 /**
4448     * Checks for garbage retention when MinimalStage.toCompletableFuture()
4449     * is invoked many times.
4450     * 8161600: Garbage retention when source CompletableFutures are never completed
4451     *
4452     * As of 2016-07, fails with OOME:
4453     * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testToCompletableFutureGarbageRetention tck
4454     */
4455     public void testToCompletableFutureGarbageRetention() throws Throwable {
4456     final int n = expensiveTests ? 900_000 : 10;
4457     CompletableFuture<Integer> neverCompleted = new CompletableFuture<>();
4458     CompletionStage minimal = neverCompleted.minimalCompletionStage();
4459     for (int i = 0; i < n; i++)
4460     assertTrue(minimal.toCompletableFuture().cancel(true));
4461     }
4462    
4463 jsr166 1.123 // static <U> U join(CompletionStage<U> stage) {
4464     // CompletableFuture<U> f = new CompletableFuture<>();
4465     // stage.whenComplete((v, ex) -> {
4466     // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
4467     // });
4468     // return f.join();
4469     // }
4470    
4471     // static <U> boolean isDone(CompletionStage<U> stage) {
4472     // CompletableFuture<U> f = new CompletableFuture<>();
4473     // stage.whenComplete((v, ex) -> {
4474     // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
4475     // });
4476     // return f.isDone();
4477     // }
4478    
4479     // static <U> U join2(CompletionStage<U> stage) {
4480     // return stage.toCompletableFuture().copy().join();
4481     // }
4482    
4483     // static <U> boolean isDone2(CompletionStage<U> stage) {
4484     // return stage.toCompletableFuture().copy().isDone();
4485     // }
4486    
4487 jsr166 1.1 }