ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.185
Committed: Mon May 29 19:15:02 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.184: +1 -5 lines
Log Message:
more timeout handling rework; remove most uses of SMALL_DELAY_MS; randomize timeouts and TimeUnits; remove hardcoded 5 second timeouts

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.155 public void testRunAsync_rejectingExecutor() {
1242     CountingRejectingExecutor e = new CountingRejectingExecutor();
1243     try {
1244     CompletableFuture.runAsync(() -> {}, e);
1245     shouldThrow();
1246     } catch (Throwable t) {
1247     assertSame(e.ex, t);
1248     }
1249    
1250     assertEquals(1, e.count.get());
1251     }
1252    
1253 dl 1.5 /**
1254     * supplyAsync completes with result of supplier
1255     */
1256 jsr166 1.58 public void testSupplyAsync_normalCompletion() {
1257     ExecutionMode[] executionModes = {
1258     ExecutionMode.ASYNC,
1259     ExecutionMode.EXECUTOR,
1260     };
1261     for (ExecutionMode m : executionModes)
1262     for (Integer v1 : new Integer[] { 1, null })
1263     {
1264     final IntegerSupplier r = new IntegerSupplier(m, v1);
1265     final CompletableFuture<Integer> f = m.supplyAsync(r);
1266     assertSame(v1, f.join());
1267     checkCompletedNormally(f, v1);
1268 jsr166 1.62 r.assertInvoked();
1269 jsr166 1.58 }}
1270 dl 1.5
1271     /**
1272     * Failing supplyAsync completes exceptionally
1273     */
1274 jsr166 1.58 public void testSupplyAsync_exceptionalCompletion() {
1275     ExecutionMode[] executionModes = {
1276     ExecutionMode.ASYNC,
1277     ExecutionMode.EXECUTOR,
1278     };
1279     for (ExecutionMode m : executionModes)
1280     {
1281     FailingSupplier r = new FailingSupplier(m);
1282     CompletableFuture<Integer> f = m.supplyAsync(r);
1283 jsr166 1.151 checkCompletedWithWrappedException(f, r.ex);
1284 jsr166 1.62 r.assertInvoked();
1285 jsr166 1.58 }}
1286 dl 1.5
1287 jsr166 1.155 public void testSupplyAsync_rejectingExecutor() {
1288     CountingRejectingExecutor e = new CountingRejectingExecutor();
1289     try {
1290     CompletableFuture.supplyAsync(() -> null, e);
1291     shouldThrow();
1292     } catch (Throwable t) {
1293     assertSame(e.ex, t);
1294     }
1295    
1296     assertEquals(1, e.count.get());
1297     }
1298    
1299 jsr166 1.7 // seq completion methods
1300 jsr166 1.6
1301 dl 1.5 /**
1302     * thenRun result completes normally after normal completion of source
1303     */
1304 jsr166 1.48 public void testThenRun_normalCompletion() {
1305     for (ExecutionMode m : ExecutionMode.values())
1306     for (Integer v1 : new Integer[] { 1, null })
1307     {
1308     final CompletableFuture<Integer> f = new CompletableFuture<>();
1309 jsr166 1.90 final Noop[] rs = new Noop[6];
1310     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1311    
1312     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1313     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1314     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1315     checkIncomplete(h0);
1316     checkIncomplete(h1);
1317     checkIncomplete(h2);
1318     assertTrue(f.complete(v1));
1319     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1320     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1321     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1322 jsr166 1.23
1323 jsr166 1.90 checkCompletedNormally(h0, null);
1324     checkCompletedNormally(h1, null);
1325     checkCompletedNormally(h2, null);
1326     checkCompletedNormally(h3, null);
1327     checkCompletedNormally(h4, null);
1328     checkCompletedNormally(h5, null);
1329 jsr166 1.48 checkCompletedNormally(f, v1);
1330 jsr166 1.90 for (Noop r : rs) r.assertInvoked();
1331 jsr166 1.48 }}
1332 dl 1.5
1333     /**
1334     * thenRun result completes exceptionally after exceptional
1335     * completion of source
1336     */
1337 jsr166 1.48 public void testThenRun_exceptionalCompletion() {
1338     for (ExecutionMode m : ExecutionMode.values())
1339     {
1340     final CFException ex = new CFException();
1341     final CompletableFuture<Integer> f = new CompletableFuture<>();
1342 jsr166 1.90 final Noop[] rs = new Noop[6];
1343     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1344    
1345     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1346     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1347     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1348     checkIncomplete(h0);
1349     checkIncomplete(h1);
1350     checkIncomplete(h2);
1351     assertTrue(f.completeExceptionally(ex));
1352     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1353     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1354     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1355 jsr166 1.23
1356 jsr166 1.90 checkCompletedWithWrappedException(h0, ex);
1357     checkCompletedWithWrappedException(h1, ex);
1358     checkCompletedWithWrappedException(h2, ex);
1359     checkCompletedWithWrappedException(h3, ex);
1360     checkCompletedWithWrappedException(h4, ex);
1361     checkCompletedWithWrappedException(h5, ex);
1362 jsr166 1.72 checkCompletedExceptionally(f, ex);
1363 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1364 jsr166 1.48 }}
1365    
1366     /**
1367     * thenRun result completes exceptionally if source cancelled
1368     */
1369     public void testThenRun_sourceCancelled() {
1370     for (ExecutionMode m : ExecutionMode.values())
1371     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1372     {
1373     final CompletableFuture<Integer> f = new CompletableFuture<>();
1374 jsr166 1.90 final Noop[] rs = new Noop[6];
1375     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1376    
1377     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1378     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1379     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1380     checkIncomplete(h0);
1381     checkIncomplete(h1);
1382     checkIncomplete(h2);
1383     assertTrue(f.cancel(mayInterruptIfRunning));
1384     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1385     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1386     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1387 jsr166 1.23
1388 jsr166 1.90 checkCompletedWithWrappedCancellationException(h0);
1389     checkCompletedWithWrappedCancellationException(h1);
1390     checkCompletedWithWrappedCancellationException(h2);
1391     checkCompletedWithWrappedCancellationException(h3);
1392     checkCompletedWithWrappedCancellationException(h4);
1393     checkCompletedWithWrappedCancellationException(h5);
1394 jsr166 1.48 checkCancelled(f);
1395 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1396 jsr166 1.48 }}
1397 dl 1.5
1398     /**
1399     * thenRun result completes exceptionally if action does
1400     */
1401 jsr166 1.48 public void testThenRun_actionFailed() {
1402     for (ExecutionMode m : ExecutionMode.values())
1403     for (Integer v1 : new Integer[] { 1, null })
1404     {
1405     final CompletableFuture<Integer> f = new CompletableFuture<>();
1406 jsr166 1.90 final FailingRunnable[] rs = new FailingRunnable[6];
1407     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
1408    
1409     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1410     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1411     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1412     assertTrue(f.complete(v1));
1413     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1414     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1415     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1416 jsr166 1.23
1417 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
1418     checkCompletedWithWrappedException(h1, rs[1].ex);
1419     checkCompletedWithWrappedException(h2, rs[2].ex);
1420     checkCompletedWithWrappedException(h3, rs[3].ex);
1421     checkCompletedWithWrappedException(h4, rs[4].ex);
1422     checkCompletedWithWrappedException(h5, rs[5].ex);
1423 jsr166 1.48 checkCompletedNormally(f, v1);
1424     }}
1425 dl 1.5
1426     /**
1427     * thenApply result completes normally after normal completion of source
1428     */
1429 jsr166 1.49 public void testThenApply_normalCompletion() {
1430     for (ExecutionMode m : ExecutionMode.values())
1431     for (Integer v1 : new Integer[] { 1, null })
1432     {
1433     final CompletableFuture<Integer> f = new CompletableFuture<>();
1434 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1435     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1436    
1437     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1438     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1439     checkIncomplete(h0);
1440     checkIncomplete(h1);
1441     assertTrue(f.complete(v1));
1442     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1443     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1444 jsr166 1.49
1445 jsr166 1.91 checkCompletedNormally(h0, inc(v1));
1446     checkCompletedNormally(h1, inc(v1));
1447     checkCompletedNormally(h2, inc(v1));
1448     checkCompletedNormally(h3, inc(v1));
1449 jsr166 1.49 checkCompletedNormally(f, v1);
1450 jsr166 1.91 for (IncFunction r : rs) r.assertValue(inc(v1));
1451 jsr166 1.49 }}
1452 dl 1.5
1453     /**
1454     * thenApply result completes exceptionally after exceptional
1455     * completion of source
1456     */
1457 jsr166 1.49 public void testThenApply_exceptionalCompletion() {
1458     for (ExecutionMode m : ExecutionMode.values())
1459     {
1460     final CFException ex = new CFException();
1461     final CompletableFuture<Integer> f = new CompletableFuture<>();
1462 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1463     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1464    
1465     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1466     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1467     assertTrue(f.completeExceptionally(ex));
1468     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1469     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1470 jsr166 1.49
1471 jsr166 1.91 checkCompletedWithWrappedException(h0, ex);
1472     checkCompletedWithWrappedException(h1, ex);
1473     checkCompletedWithWrappedException(h2, ex);
1474     checkCompletedWithWrappedException(h3, ex);
1475 jsr166 1.72 checkCompletedExceptionally(f, ex);
1476 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1477 jsr166 1.49 }}
1478 dl 1.5
1479     /**
1480 jsr166 1.49 * thenApply result completes exceptionally if source cancelled
1481 dl 1.5 */
1482 jsr166 1.49 public void testThenApply_sourceCancelled() {
1483     for (ExecutionMode m : ExecutionMode.values())
1484     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1485     {
1486     final CompletableFuture<Integer> f = new CompletableFuture<>();
1487 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1488     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1489    
1490     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1491     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1492     assertTrue(f.cancel(mayInterruptIfRunning));
1493     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1494     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1495 jsr166 1.49
1496 jsr166 1.91 checkCompletedWithWrappedCancellationException(h0);
1497     checkCompletedWithWrappedCancellationException(h1);
1498     checkCompletedWithWrappedCancellationException(h2);
1499     checkCompletedWithWrappedCancellationException(h3);
1500 jsr166 1.49 checkCancelled(f);
1501 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1502 jsr166 1.49 }}
1503 dl 1.5
1504     /**
1505 jsr166 1.49 * thenApply result completes exceptionally if action does
1506 dl 1.5 */
1507 jsr166 1.49 public void testThenApply_actionFailed() {
1508     for (ExecutionMode m : ExecutionMode.values())
1509     for (Integer v1 : new Integer[] { 1, null })
1510     {
1511     final CompletableFuture<Integer> f = new CompletableFuture<>();
1512 jsr166 1.91 final FailingFunction[] rs = new FailingFunction[4];
1513     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
1514    
1515     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1516     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1517     assertTrue(f.complete(v1));
1518     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1519     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1520 jsr166 1.49
1521 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
1522     checkCompletedWithWrappedException(h1, rs[1].ex);
1523     checkCompletedWithWrappedException(h2, rs[2].ex);
1524     checkCompletedWithWrappedException(h3, rs[3].ex);
1525 jsr166 1.49 checkCompletedNormally(f, v1);
1526     }}
1527 dl 1.5
1528     /**
1529     * thenAccept result completes normally after normal completion of source
1530     */
1531 jsr166 1.50 public void testThenAccept_normalCompletion() {
1532     for (ExecutionMode m : ExecutionMode.values())
1533     for (Integer v1 : new Integer[] { 1, null })
1534     {
1535     final CompletableFuture<Integer> f = new CompletableFuture<>();
1536 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1537     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1538    
1539     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1540     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1541     checkIncomplete(h0);
1542     checkIncomplete(h1);
1543     assertTrue(f.complete(v1));
1544     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1545     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1546 jsr166 1.50
1547 jsr166 1.92 checkCompletedNormally(h0, null);
1548     checkCompletedNormally(h1, null);
1549     checkCompletedNormally(h2, null);
1550     checkCompletedNormally(h3, null);
1551 jsr166 1.50 checkCompletedNormally(f, v1);
1552 jsr166 1.92 for (NoopConsumer r : rs) r.assertValue(v1);
1553 jsr166 1.50 }}
1554 dl 1.5
1555     /**
1556     * thenAccept result completes exceptionally after exceptional
1557     * completion of source
1558     */
1559 jsr166 1.50 public void testThenAccept_exceptionalCompletion() {
1560     for (ExecutionMode m : ExecutionMode.values())
1561     {
1562     final CFException ex = new CFException();
1563     final CompletableFuture<Integer> f = new CompletableFuture<>();
1564 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1565     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1566    
1567     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1568     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1569     assertTrue(f.completeExceptionally(ex));
1570     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1571     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1572 jsr166 1.50
1573 jsr166 1.92 checkCompletedWithWrappedException(h0, ex);
1574     checkCompletedWithWrappedException(h1, ex);
1575     checkCompletedWithWrappedException(h2, ex);
1576     checkCompletedWithWrappedException(h3, ex);
1577 jsr166 1.72 checkCompletedExceptionally(f, ex);
1578 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1579 jsr166 1.50 }}
1580 dl 1.5
1581     /**
1582 jsr166 1.61 * thenAccept result completes exceptionally if source cancelled
1583 dl 1.5 */
1584 jsr166 1.61 public void testThenAccept_sourceCancelled() {
1585 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1586 jsr166 1.61 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1587 jsr166 1.50 {
1588     final CompletableFuture<Integer> f = new CompletableFuture<>();
1589 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1590     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1591    
1592     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1593     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1594     assertTrue(f.cancel(mayInterruptIfRunning));
1595     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1596     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1597 jsr166 1.50
1598 jsr166 1.92 checkCompletedWithWrappedCancellationException(h0);
1599     checkCompletedWithWrappedCancellationException(h1);
1600     checkCompletedWithWrappedCancellationException(h2);
1601     checkCompletedWithWrappedCancellationException(h3);
1602 jsr166 1.61 checkCancelled(f);
1603 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1604 jsr166 1.50 }}
1605 dl 1.5
1606     /**
1607 jsr166 1.61 * thenAccept result completes exceptionally if action does
1608 dl 1.5 */
1609 jsr166 1.61 public void testThenAccept_actionFailed() {
1610 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1611 jsr166 1.61 for (Integer v1 : new Integer[] { 1, null })
1612 jsr166 1.50 {
1613     final CompletableFuture<Integer> f = new CompletableFuture<>();
1614 jsr166 1.92 final FailingConsumer[] rs = new FailingConsumer[4];
1615     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
1616    
1617     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1618     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1619     assertTrue(f.complete(v1));
1620     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1621     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1622 jsr166 1.50
1623 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
1624     checkCompletedWithWrappedException(h1, rs[1].ex);
1625     checkCompletedWithWrappedException(h2, rs[2].ex);
1626     checkCompletedWithWrappedException(h3, rs[3].ex);
1627 jsr166 1.61 checkCompletedNormally(f, v1);
1628 jsr166 1.50 }}
1629 dl 1.5
1630     /**
1631 jsr166 1.18 * thenCombine result completes normally after normal completion
1632     * of sources
1633 dl 1.5 */
1634 jsr166 1.51 public void testThenCombine_normalCompletion() {
1635     for (ExecutionMode m : ExecutionMode.values())
1636 jsr166 1.43 for (boolean fFirst : new boolean[] { true, false })
1637 jsr166 1.36 for (Integer v1 : new Integer[] { 1, null })
1638 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1639     {
1640 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1641     final CompletableFuture<Integer> g = new CompletableFuture<>();
1642 jsr166 1.93 final SubtractFunction[] rs = new SubtractFunction[6];
1643     for (int i = 0; i < rs.length; i++) rs[i] = new SubtractFunction(m);
1644 jsr166 1.79
1645     final CompletableFuture<Integer> fst = fFirst ? f : g;
1646     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1647     final Integer w1 = fFirst ? v1 : v2;
1648     final Integer w2 = !fFirst ? v1 : v2;
1649    
1650 jsr166 1.93 final CompletableFuture<Integer> h0 = m.thenCombine(f, g, rs[0]);
1651     final CompletableFuture<Integer> h1 = m.thenCombine(fst, fst, rs[1]);
1652 jsr166 1.79 assertTrue(fst.complete(w1));
1653 jsr166 1.93 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, rs[2]);
1654     final CompletableFuture<Integer> h3 = m.thenCombine(fst, fst, rs[3]);
1655     checkIncomplete(h0); rs[0].assertNotInvoked();
1656     checkIncomplete(h2); rs[2].assertNotInvoked();
1657     checkCompletedNormally(h1, subtract(w1, w1));
1658     checkCompletedNormally(h3, subtract(w1, w1));
1659     rs[1].assertValue(subtract(w1, w1));
1660     rs[3].assertValue(subtract(w1, w1));
1661 jsr166 1.79 assertTrue(snd.complete(w2));
1662 jsr166 1.93 final CompletableFuture<Integer> h4 = m.thenCombine(f, g, rs[4]);
1663 jsr166 1.79
1664 jsr166 1.93 checkCompletedNormally(h0, subtract(v1, v2));
1665 jsr166 1.79 checkCompletedNormally(h2, subtract(v1, v2));
1666 jsr166 1.93 checkCompletedNormally(h4, subtract(v1, v2));
1667     rs[0].assertValue(subtract(v1, v2));
1668     rs[2].assertValue(subtract(v1, v2));
1669     rs[4].assertValue(subtract(v1, v2));
1670 jsr166 1.94
1671 jsr166 1.36 checkCompletedNormally(f, v1);
1672     checkCompletedNormally(g, v2);
1673 jsr166 1.47 }}
1674 dl 1.5
1675     /**
1676     * thenCombine result completes exceptionally after exceptional
1677     * completion of either source
1678     */
1679 jsr166 1.79 public void testThenCombine_exceptionalCompletion() throws Throwable {
1680 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1681 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1682 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1683 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1684     {
1685 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1686     final CompletableFuture<Integer> g = new CompletableFuture<>();
1687     final CFException ex = new CFException();
1688 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1689     final SubtractFunction r2 = new SubtractFunction(m);
1690     final SubtractFunction r3 = new SubtractFunction(m);
1691    
1692     final CompletableFuture<Integer> fst = fFirst ? f : g;
1693     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1694     final Callable<Boolean> complete1 = failFirst ?
1695     () -> fst.completeExceptionally(ex) :
1696     () -> fst.complete(v1);
1697     final Callable<Boolean> complete2 = failFirst ?
1698     () -> snd.complete(v1) :
1699     () -> snd.completeExceptionally(ex);
1700    
1701     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1702     assertTrue(complete1.call());
1703     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1704     checkIncomplete(h1);
1705     checkIncomplete(h2);
1706     assertTrue(complete2.call());
1707     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1708 jsr166 1.18
1709 jsr166 1.79 checkCompletedWithWrappedException(h1, ex);
1710     checkCompletedWithWrappedException(h2, ex);
1711     checkCompletedWithWrappedException(h3, ex);
1712     r1.assertNotInvoked();
1713     r2.assertNotInvoked();
1714     r3.assertNotInvoked();
1715     checkCompletedNormally(failFirst ? snd : fst, v1);
1716     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1717 jsr166 1.47 }}
1718 dl 1.5
1719     /**
1720     * thenCombine result completes exceptionally if either source cancelled
1721     */
1722 jsr166 1.79 public void testThenCombine_sourceCancelled() throws Throwable {
1723 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1724     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1725 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1726 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1727 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1728     {
1729 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1730     final CompletableFuture<Integer> g = new CompletableFuture<>();
1731 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1732     final SubtractFunction r2 = new SubtractFunction(m);
1733     final SubtractFunction r3 = new SubtractFunction(m);
1734 jsr166 1.18
1735 jsr166 1.79 final CompletableFuture<Integer> fst = fFirst ? f : g;
1736     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1737     final Callable<Boolean> complete1 = failFirst ?
1738     () -> fst.cancel(mayInterruptIfRunning) :
1739     () -> fst.complete(v1);
1740     final Callable<Boolean> complete2 = failFirst ?
1741     () -> snd.complete(v1) :
1742     () -> snd.cancel(mayInterruptIfRunning);
1743    
1744     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1745     assertTrue(complete1.call());
1746     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1747     checkIncomplete(h1);
1748     checkIncomplete(h2);
1749     assertTrue(complete2.call());
1750     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1751 jsr166 1.36
1752 jsr166 1.79 checkCompletedWithWrappedCancellationException(h1);
1753     checkCompletedWithWrappedCancellationException(h2);
1754     checkCompletedWithWrappedCancellationException(h3);
1755     r1.assertNotInvoked();
1756     r2.assertNotInvoked();
1757     r3.assertNotInvoked();
1758     checkCompletedNormally(failFirst ? snd : fst, v1);
1759     checkCancelled(failFirst ? fst : snd);
1760 jsr166 1.47 }}
1761 dl 1.5
1762     /**
1763 jsr166 1.61 * thenCombine result completes exceptionally if action does
1764     */
1765     public void testThenCombine_actionFailed() {
1766     for (ExecutionMode m : ExecutionMode.values())
1767     for (boolean fFirst : new boolean[] { true, false })
1768     for (Integer v1 : new Integer[] { 1, null })
1769     for (Integer v2 : new Integer[] { 2, null })
1770     {
1771     final CompletableFuture<Integer> f = new CompletableFuture<>();
1772     final CompletableFuture<Integer> g = new CompletableFuture<>();
1773 jsr166 1.79 final FailingBiFunction r1 = new FailingBiFunction(m);
1774     final FailingBiFunction r2 = new FailingBiFunction(m);
1775     final FailingBiFunction r3 = new FailingBiFunction(m);
1776    
1777     final CompletableFuture<Integer> fst = fFirst ? f : g;
1778     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1779     final Integer w1 = fFirst ? v1 : v2;
1780     final Integer w2 = !fFirst ? v1 : v2;
1781    
1782     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1783     assertTrue(fst.complete(w1));
1784     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1785     assertTrue(snd.complete(w2));
1786     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1787 jsr166 1.61
1788 jsr166 1.151 checkCompletedWithWrappedException(h1, r1.ex);
1789     checkCompletedWithWrappedException(h2, r2.ex);
1790     checkCompletedWithWrappedException(h3, r3.ex);
1791 jsr166 1.81 r1.assertInvoked();
1792     r2.assertInvoked();
1793     r3.assertInvoked();
1794 jsr166 1.61 checkCompletedNormally(f, v1);
1795     checkCompletedNormally(g, v2);
1796     }}
1797    
1798     /**
1799 dl 1.5 * thenAcceptBoth result completes normally after normal
1800     * completion of sources
1801     */
1802 jsr166 1.53 public void testThenAcceptBoth_normalCompletion() {
1803 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1804 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1805 jsr166 1.35 for (Integer v1 : new Integer[] { 1, null })
1806 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1807     {
1808 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1809     final CompletableFuture<Integer> g = new CompletableFuture<>();
1810 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1811     final SubtractAction r2 = new SubtractAction(m);
1812     final SubtractAction r3 = new SubtractAction(m);
1813    
1814     final CompletableFuture<Integer> fst = fFirst ? f : g;
1815     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1816     final Integer w1 = fFirst ? v1 : v2;
1817     final Integer w2 = !fFirst ? v1 : v2;
1818    
1819     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1820     assertTrue(fst.complete(w1));
1821     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1822     checkIncomplete(h1);
1823     checkIncomplete(h2);
1824     r1.assertNotInvoked();
1825     r2.assertNotInvoked();
1826     assertTrue(snd.complete(w2));
1827     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1828 jsr166 1.35
1829 jsr166 1.80 checkCompletedNormally(h1, null);
1830     checkCompletedNormally(h2, null);
1831     checkCompletedNormally(h3, null);
1832     r1.assertValue(subtract(v1, v2));
1833     r2.assertValue(subtract(v1, v2));
1834     r3.assertValue(subtract(v1, v2));
1835 jsr166 1.35 checkCompletedNormally(f, v1);
1836     checkCompletedNormally(g, v2);
1837 jsr166 1.47 }}
1838 dl 1.5
1839     /**
1840     * thenAcceptBoth result completes exceptionally after exceptional
1841     * completion of either source
1842     */
1843 jsr166 1.80 public void testThenAcceptBoth_exceptionalCompletion() throws Throwable {
1844 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1845 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1846 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1847 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1848     {
1849 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1850     final CompletableFuture<Integer> g = new CompletableFuture<>();
1851     final CFException ex = new CFException();
1852 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1853     final SubtractAction r2 = new SubtractAction(m);
1854     final SubtractAction r3 = new SubtractAction(m);
1855    
1856     final CompletableFuture<Integer> fst = fFirst ? f : g;
1857     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1858     final Callable<Boolean> complete1 = failFirst ?
1859     () -> fst.completeExceptionally(ex) :
1860     () -> fst.complete(v1);
1861     final Callable<Boolean> complete2 = failFirst ?
1862     () -> snd.complete(v1) :
1863     () -> snd.completeExceptionally(ex);
1864    
1865     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1866     assertTrue(complete1.call());
1867     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1868     checkIncomplete(h1);
1869     checkIncomplete(h2);
1870     assertTrue(complete2.call());
1871     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1872 jsr166 1.35
1873 jsr166 1.80 checkCompletedWithWrappedException(h1, ex);
1874     checkCompletedWithWrappedException(h2, ex);
1875     checkCompletedWithWrappedException(h3, ex);
1876     r1.assertNotInvoked();
1877     r2.assertNotInvoked();
1878     r3.assertNotInvoked();
1879     checkCompletedNormally(failFirst ? snd : fst, v1);
1880     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1881 jsr166 1.47 }}
1882 dl 1.5
1883     /**
1884     * thenAcceptBoth result completes exceptionally if either source cancelled
1885     */
1886 jsr166 1.80 public void testThenAcceptBoth_sourceCancelled() throws Throwable {
1887 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1888     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1889 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1890 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1891 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1892     {
1893 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1894     final CompletableFuture<Integer> g = new CompletableFuture<>();
1895 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1896     final SubtractAction r2 = new SubtractAction(m);
1897     final SubtractAction r3 = new SubtractAction(m);
1898    
1899     final CompletableFuture<Integer> fst = fFirst ? f : g;
1900     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1901     final Callable<Boolean> complete1 = failFirst ?
1902     () -> fst.cancel(mayInterruptIfRunning) :
1903     () -> fst.complete(v1);
1904     final Callable<Boolean> complete2 = failFirst ?
1905     () -> snd.complete(v1) :
1906     () -> snd.cancel(mayInterruptIfRunning);
1907 jsr166 1.35
1908 jsr166 1.80 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1909     assertTrue(complete1.call());
1910     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1911     checkIncomplete(h1);
1912     checkIncomplete(h2);
1913     assertTrue(complete2.call());
1914     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1915 jsr166 1.22
1916 jsr166 1.80 checkCompletedWithWrappedCancellationException(h1);
1917     checkCompletedWithWrappedCancellationException(h2);
1918     checkCompletedWithWrappedCancellationException(h3);
1919     r1.assertNotInvoked();
1920     r2.assertNotInvoked();
1921     r3.assertNotInvoked();
1922     checkCompletedNormally(failFirst ? snd : fst, v1);
1923     checkCancelled(failFirst ? fst : snd);
1924 jsr166 1.47 }}
1925 jsr166 1.34
1926     /**
1927 jsr166 1.61 * thenAcceptBoth result completes exceptionally if action does
1928     */
1929     public void testThenAcceptBoth_actionFailed() {
1930     for (ExecutionMode m : ExecutionMode.values())
1931     for (boolean fFirst : new boolean[] { true, false })
1932     for (Integer v1 : new Integer[] { 1, null })
1933     for (Integer v2 : new Integer[] { 2, null })
1934     {
1935     final CompletableFuture<Integer> f = new CompletableFuture<>();
1936     final CompletableFuture<Integer> g = new CompletableFuture<>();
1937 jsr166 1.80 final FailingBiConsumer r1 = new FailingBiConsumer(m);
1938     final FailingBiConsumer r2 = new FailingBiConsumer(m);
1939     final FailingBiConsumer r3 = new FailingBiConsumer(m);
1940    
1941     final CompletableFuture<Integer> fst = fFirst ? f : g;
1942     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1943     final Integer w1 = fFirst ? v1 : v2;
1944     final Integer w2 = !fFirst ? v1 : v2;
1945    
1946     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1947     assertTrue(fst.complete(w1));
1948     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1949     assertTrue(snd.complete(w2));
1950     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1951 jsr166 1.61
1952 jsr166 1.151 checkCompletedWithWrappedException(h1, r1.ex);
1953     checkCompletedWithWrappedException(h2, r2.ex);
1954     checkCompletedWithWrappedException(h3, r3.ex);
1955 jsr166 1.81 r1.assertInvoked();
1956     r2.assertInvoked();
1957     r3.assertInvoked();
1958 jsr166 1.61 checkCompletedNormally(f, v1);
1959     checkCompletedNormally(g, v2);
1960     }}
1961    
1962     /**
1963 dl 1.5 * runAfterBoth result completes normally after normal
1964     * completion of sources
1965     */
1966 jsr166 1.54 public void testRunAfterBoth_normalCompletion() {
1967 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1968 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
1969 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1970 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1971     {
1972 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1973     final CompletableFuture<Integer> g = new CompletableFuture<>();
1974 jsr166 1.81 final Noop r1 = new Noop(m);
1975     final Noop r2 = new Noop(m);
1976     final Noop r3 = new Noop(m);
1977    
1978     final CompletableFuture<Integer> fst = fFirst ? f : g;
1979     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1980     final Integer w1 = fFirst ? v1 : v2;
1981     final Integer w2 = !fFirst ? v1 : v2;
1982 jsr166 1.33
1983 jsr166 1.81 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1984     assertTrue(fst.complete(w1));
1985     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1986     checkIncomplete(h1);
1987     checkIncomplete(h2);
1988     r1.assertNotInvoked();
1989     r2.assertNotInvoked();
1990     assertTrue(snd.complete(w2));
1991     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
1992 dl 1.5
1993 jsr166 1.81 checkCompletedNormally(h1, null);
1994     checkCompletedNormally(h2, null);
1995     checkCompletedNormally(h3, null);
1996     r1.assertInvoked();
1997     r2.assertInvoked();
1998     r3.assertInvoked();
1999 jsr166 1.33 checkCompletedNormally(f, v1);
2000     checkCompletedNormally(g, v2);
2001 jsr166 1.47 }}
2002 dl 1.5
2003     /**
2004     * runAfterBoth result completes exceptionally after exceptional
2005     * completion of either source
2006     */
2007 jsr166 1.81 public void testRunAfterBoth_exceptionalCompletion() throws Throwable {
2008 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2009 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
2010 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
2011 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2012     {
2013 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2014     final CompletableFuture<Integer> g = new CompletableFuture<>();
2015     final CFException ex = new CFException();
2016 jsr166 1.81 final Noop r1 = new Noop(m);
2017     final Noop r2 = new Noop(m);
2018     final Noop r3 = new Noop(m);
2019 jsr166 1.33
2020 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2021     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2022     final Callable<Boolean> complete1 = failFirst ?
2023     () -> fst.completeExceptionally(ex) :
2024     () -> fst.complete(v1);
2025     final Callable<Boolean> complete2 = failFirst ?
2026     () -> snd.complete(v1) :
2027     () -> snd.completeExceptionally(ex);
2028    
2029     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2030     assertTrue(complete1.call());
2031     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2032     checkIncomplete(h1);
2033     checkIncomplete(h2);
2034     assertTrue(complete2.call());
2035     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2036 dl 1.5
2037 jsr166 1.81 checkCompletedWithWrappedException(h1, ex);
2038     checkCompletedWithWrappedException(h2, ex);
2039     checkCompletedWithWrappedException(h3, ex);
2040     r1.assertNotInvoked();
2041     r2.assertNotInvoked();
2042     r3.assertNotInvoked();
2043     checkCompletedNormally(failFirst ? snd : fst, v1);
2044     checkCompletedExceptionally(failFirst ? fst : snd, ex);
2045 jsr166 1.47 }}
2046 dl 1.5
2047 jsr166 1.4 /**
2048 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
2049 jsr166 1.4 */
2050 jsr166 1.81 public void testRunAfterBoth_sourceCancelled() throws Throwable {
2051 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2052 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2053 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
2054 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
2055 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2056     {
2057 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2058     final CompletableFuture<Integer> g = new CompletableFuture<>();
2059 jsr166 1.81 final Noop r1 = new Noop(m);
2060     final Noop r2 = new Noop(m);
2061     final Noop r3 = new Noop(m);
2062 jsr166 1.33
2063 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2064     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2065     final Callable<Boolean> complete1 = failFirst ?
2066     () -> fst.cancel(mayInterruptIfRunning) :
2067     () -> fst.complete(v1);
2068     final Callable<Boolean> complete2 = failFirst ?
2069     () -> snd.complete(v1) :
2070     () -> snd.cancel(mayInterruptIfRunning);
2071    
2072     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2073     assertTrue(complete1.call());
2074     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2075     checkIncomplete(h1);
2076     checkIncomplete(h2);
2077     assertTrue(complete2.call());
2078     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2079 jsr166 1.33
2080 jsr166 1.81 checkCompletedWithWrappedCancellationException(h1);
2081     checkCompletedWithWrappedCancellationException(h2);
2082     checkCompletedWithWrappedCancellationException(h3);
2083     r1.assertNotInvoked();
2084     r2.assertNotInvoked();
2085     r3.assertNotInvoked();
2086     checkCompletedNormally(failFirst ? snd : fst, v1);
2087     checkCancelled(failFirst ? fst : snd);
2088 jsr166 1.47 }}
2089 dl 1.5
2090     /**
2091 jsr166 1.61 * runAfterBoth result completes exceptionally if action does
2092     */
2093     public void testRunAfterBoth_actionFailed() {
2094     for (ExecutionMode m : ExecutionMode.values())
2095     for (boolean fFirst : new boolean[] { true, false })
2096     for (Integer v1 : new Integer[] { 1, null })
2097     for (Integer v2 : new Integer[] { 2, null })
2098     {
2099     final CompletableFuture<Integer> f = new CompletableFuture<>();
2100     final CompletableFuture<Integer> g = new CompletableFuture<>();
2101 jsr166 1.62 final FailingRunnable r1 = new FailingRunnable(m);
2102     final FailingRunnable r2 = new FailingRunnable(m);
2103 jsr166 1.81 final FailingRunnable r3 = new FailingRunnable(m);
2104 jsr166 1.61
2105 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2106     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2107     final Integer w1 = fFirst ? v1 : v2;
2108     final Integer w2 = !fFirst ? v1 : v2;
2109    
2110     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2111     assertTrue(fst.complete(w1));
2112     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2113     assertTrue(snd.complete(w2));
2114     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2115 jsr166 1.61
2116 jsr166 1.151 checkCompletedWithWrappedException(h1, r1.ex);
2117     checkCompletedWithWrappedException(h2, r2.ex);
2118     checkCompletedWithWrappedException(h3, r3.ex);
2119 jsr166 1.81 r1.assertInvoked();
2120     r2.assertInvoked();
2121     r3.assertInvoked();
2122 jsr166 1.61 checkCompletedNormally(f, v1);
2123     checkCompletedNormally(g, v2);
2124     }}
2125    
2126     /**
2127 dl 1.5 * applyToEither result completes normally after normal completion
2128     * of either source
2129     */
2130 jsr166 1.54 public void testApplyToEither_normalCompletion() {
2131 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2132     for (Integer v1 : new Integer[] { 1, null })
2133 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2134     {
2135 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2136     final CompletableFuture<Integer> g = new CompletableFuture<>();
2137 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2138     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2139 jsr166 1.54
2140 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2141     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2142     checkIncomplete(h0);
2143     checkIncomplete(h1);
2144     rs[0].assertNotInvoked();
2145     rs[1].assertNotInvoked();
2146     f.complete(v1);
2147     checkCompletedNormally(h0, inc(v1));
2148     checkCompletedNormally(h1, inc(v1));
2149     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2150     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2151     checkCompletedNormally(h2, inc(v1));
2152     checkCompletedNormally(h3, inc(v1));
2153     g.complete(v2);
2154 jsr166 1.39
2155 jsr166 1.62 // unspecified behavior - both source completions available
2156     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2157     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2158     rs[4].assertValue(h4.join());
2159     rs[5].assertValue(h5.join());
2160     assertTrue(Objects.equals(inc(v1), h4.join()) ||
2161     Objects.equals(inc(v2), h4.join()));
2162     assertTrue(Objects.equals(inc(v1), h5.join()) ||
2163     Objects.equals(inc(v2), h5.join()));
2164 jsr166 1.39
2165     checkCompletedNormally(f, v1);
2166     checkCompletedNormally(g, v2);
2167 jsr166 1.62 checkCompletedNormally(h0, inc(v1));
2168     checkCompletedNormally(h1, inc(v1));
2169     checkCompletedNormally(h2, inc(v1));
2170     checkCompletedNormally(h3, inc(v1));
2171     for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
2172 jsr166 1.47 }}
2173 dl 1.5
2174     /**
2175     * applyToEither result completes exceptionally after exceptional
2176     * completion of either source
2177     */
2178 jsr166 1.62 public void testApplyToEither_exceptionalCompletion() {
2179 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2180 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2181     {
2182 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2183     final CompletableFuture<Integer> g = new CompletableFuture<>();
2184 jsr166 1.54 final CFException ex = new CFException();
2185 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2186     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2187    
2188     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2189     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2190     checkIncomplete(h0);
2191     checkIncomplete(h1);
2192     rs[0].assertNotInvoked();
2193     rs[1].assertNotInvoked();
2194     f.completeExceptionally(ex);
2195 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2196     checkCompletedWithWrappedException(h1, ex);
2197 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2198     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2199 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2200     checkCompletedWithWrappedException(h3, ex);
2201 jsr166 1.62 g.complete(v1);
2202 jsr166 1.54
2203 jsr166 1.62 // unspecified behavior - both source completions available
2204     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2205     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2206     try {
2207     assertEquals(inc(v1), h4.join());
2208 jsr166 1.66 rs[4].assertValue(inc(v1));
2209 jsr166 1.62 } catch (CompletionException ok) {
2210 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2211 jsr166 1.62 rs[4].assertNotInvoked();
2212     }
2213     try {
2214     assertEquals(inc(v1), h5.join());
2215 jsr166 1.66 rs[5].assertValue(inc(v1));
2216 jsr166 1.62 } catch (CompletionException ok) {
2217 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2218 jsr166 1.62 rs[5].assertNotInvoked();
2219 jsr166 1.54 }
2220 jsr166 1.39
2221 jsr166 1.72 checkCompletedExceptionally(f, ex);
2222 jsr166 1.62 checkCompletedNormally(g, v1);
2223 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2224     checkCompletedWithWrappedException(h1, ex);
2225     checkCompletedWithWrappedException(h2, ex);
2226     checkCompletedWithWrappedException(h3, ex);
2227     checkCompletedWithWrappedException(h4, ex);
2228 jsr166 1.62 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2229 jsr166 1.47 }}
2230 jsr166 1.39
2231 jsr166 1.66 public void testApplyToEither_exceptionalCompletion2() {
2232     for (ExecutionMode m : ExecutionMode.values())
2233     for (boolean fFirst : new boolean[] { true, false })
2234     for (Integer v1 : new Integer[] { 1, null })
2235     {
2236     final CompletableFuture<Integer> f = new CompletableFuture<>();
2237     final CompletableFuture<Integer> g = new CompletableFuture<>();
2238     final CFException ex = new CFException();
2239     final IncFunction[] rs = new IncFunction[6];
2240     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2241    
2242     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2243     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2244 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2245     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2246 jsr166 1.66 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2247     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2248    
2249     // unspecified behavior - both source completions available
2250     try {
2251     assertEquals(inc(v1), h0.join());
2252     rs[0].assertValue(inc(v1));
2253     } catch (CompletionException ok) {
2254 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2255 jsr166 1.66 rs[0].assertNotInvoked();
2256     }
2257     try {
2258     assertEquals(inc(v1), h1.join());
2259     rs[1].assertValue(inc(v1));
2260     } catch (CompletionException ok) {
2261 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2262 jsr166 1.66 rs[1].assertNotInvoked();
2263     }
2264     try {
2265     assertEquals(inc(v1), h2.join());
2266     rs[2].assertValue(inc(v1));
2267     } catch (CompletionException ok) {
2268 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2269 jsr166 1.66 rs[2].assertNotInvoked();
2270     }
2271     try {
2272     assertEquals(inc(v1), h3.join());
2273     rs[3].assertValue(inc(v1));
2274     } catch (CompletionException ok) {
2275 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2276 jsr166 1.66 rs[3].assertNotInvoked();
2277     }
2278    
2279     checkCompletedNormally(f, v1);
2280 jsr166 1.72 checkCompletedExceptionally(g, ex);
2281 jsr166 1.66 }}
2282    
2283 jsr166 1.62 /**
2284     * applyToEither result completes exceptionally if either source cancelled
2285     */
2286     public void testApplyToEither_sourceCancelled() {
2287 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2288 jsr166 1.62 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2289 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2290     {
2291 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2292     final CompletableFuture<Integer> g = new CompletableFuture<>();
2293 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2294     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2295    
2296     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2297     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2298     checkIncomplete(h0);
2299     checkIncomplete(h1);
2300     rs[0].assertNotInvoked();
2301     rs[1].assertNotInvoked();
2302     f.cancel(mayInterruptIfRunning);
2303     checkCompletedWithWrappedCancellationException(h0);
2304     checkCompletedWithWrappedCancellationException(h1);
2305     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2306     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2307     checkCompletedWithWrappedCancellationException(h2);
2308     checkCompletedWithWrappedCancellationException(h3);
2309     g.complete(v1);
2310 jsr166 1.39
2311 jsr166 1.62 // unspecified behavior - both source completions available
2312     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2313     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2314 jsr166 1.39 try {
2315 jsr166 1.62 assertEquals(inc(v1), h4.join());
2316 jsr166 1.66 rs[4].assertValue(inc(v1));
2317 jsr166 1.39 } catch (CompletionException ok) {
2318 jsr166 1.62 checkCompletedWithWrappedCancellationException(h4);
2319     rs[4].assertNotInvoked();
2320 jsr166 1.39 }
2321     try {
2322 jsr166 1.62 assertEquals(inc(v1), h5.join());
2323 jsr166 1.66 rs[5].assertValue(inc(v1));
2324 jsr166 1.39 } catch (CompletionException ok) {
2325 jsr166 1.62 checkCompletedWithWrappedCancellationException(h5);
2326     rs[5].assertNotInvoked();
2327 jsr166 1.39 }
2328 dl 1.5
2329 jsr166 1.62 checkCancelled(f);
2330     checkCompletedNormally(g, v1);
2331     checkCompletedWithWrappedCancellationException(h0);
2332     checkCompletedWithWrappedCancellationException(h1);
2333     checkCompletedWithWrappedCancellationException(h2);
2334     checkCompletedWithWrappedCancellationException(h3);
2335     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2336 jsr166 1.47 }}
2337 dl 1.5
2338 jsr166 1.67 public void testApplyToEither_sourceCancelled2() {
2339     for (ExecutionMode m : ExecutionMode.values())
2340     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2341     for (boolean fFirst : new boolean[] { true, false })
2342     for (Integer v1 : new Integer[] { 1, null })
2343     {
2344     final CompletableFuture<Integer> f = new CompletableFuture<>();
2345     final CompletableFuture<Integer> g = new CompletableFuture<>();
2346     final IncFunction[] rs = new IncFunction[6];
2347     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2348    
2349     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2350     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2351 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2352     assertTrue(!fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2353 jsr166 1.67 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2354     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2355    
2356     // unspecified behavior - both source completions available
2357     try {
2358     assertEquals(inc(v1), h0.join());
2359     rs[0].assertValue(inc(v1));
2360     } catch (CompletionException ok) {
2361     checkCompletedWithWrappedCancellationException(h0);
2362     rs[0].assertNotInvoked();
2363     }
2364     try {
2365     assertEquals(inc(v1), h1.join());
2366     rs[1].assertValue(inc(v1));
2367     } catch (CompletionException ok) {
2368     checkCompletedWithWrappedCancellationException(h1);
2369     rs[1].assertNotInvoked();
2370     }
2371     try {
2372     assertEquals(inc(v1), h2.join());
2373     rs[2].assertValue(inc(v1));
2374     } catch (CompletionException ok) {
2375     checkCompletedWithWrappedCancellationException(h2);
2376     rs[2].assertNotInvoked();
2377     }
2378     try {
2379     assertEquals(inc(v1), h3.join());
2380     rs[3].assertValue(inc(v1));
2381     } catch (CompletionException ok) {
2382     checkCompletedWithWrappedCancellationException(h3);
2383     rs[3].assertNotInvoked();
2384     }
2385    
2386     checkCompletedNormally(f, v1);
2387     checkCancelled(g);
2388     }}
2389    
2390 dl 1.5 /**
2391     * applyToEither result completes exceptionally if action does
2392     */
2393 jsr166 1.62 public void testApplyToEither_actionFailed() {
2394 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2395     for (Integer v1 : new Integer[] { 1, null })
2396 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2397     {
2398 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2399     final CompletableFuture<Integer> g = new CompletableFuture<>();
2400 jsr166 1.62 final FailingFunction[] rs = new FailingFunction[6];
2401     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2402 jsr166 1.39
2403 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2404     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2405 jsr166 1.39 f.complete(v1);
2406 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2407     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2408 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
2409     checkCompletedWithWrappedException(h1, rs[1].ex);
2410     checkCompletedWithWrappedException(h2, rs[2].ex);
2411     checkCompletedWithWrappedException(h3, rs[3].ex);
2412 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2413    
2414     g.complete(v2);
2415    
2416     // unspecified behavior - both source completions available
2417     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2418     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2419    
2420 jsr166 1.151 checkCompletedWithWrappedException(h4, rs[4].ex);
2421 jsr166 1.63 assertTrue(Objects.equals(v1, rs[4].value) ||
2422     Objects.equals(v2, rs[4].value));
2423 jsr166 1.151 checkCompletedWithWrappedException(h5, rs[5].ex);
2424 jsr166 1.63 assertTrue(Objects.equals(v1, rs[5].value) ||
2425     Objects.equals(v2, rs[5].value));
2426    
2427     checkCompletedNormally(f, v1);
2428     checkCompletedNormally(g, v2);
2429 jsr166 1.47 }}
2430 dl 1.5
2431     /**
2432     * acceptEither result completes normally after normal completion
2433     * of either source
2434     */
2435 jsr166 1.63 public void testAcceptEither_normalCompletion() {
2436 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2437     for (Integer v1 : new Integer[] { 1, null })
2438 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2439     {
2440 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2441     final CompletableFuture<Integer> g = new CompletableFuture<>();
2442 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2443     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2444 jsr166 1.40
2445 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2446     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2447     checkIncomplete(h0);
2448     checkIncomplete(h1);
2449     rs[0].assertNotInvoked();
2450     rs[1].assertNotInvoked();
2451 jsr166 1.40 f.complete(v1);
2452 jsr166 1.63 checkCompletedNormally(h0, null);
2453     checkCompletedNormally(h1, null);
2454 jsr166 1.64 rs[0].assertValue(v1);
2455     rs[1].assertValue(v1);
2456 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2457     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2458     checkCompletedNormally(h2, null);
2459     checkCompletedNormally(h3, null);
2460 jsr166 1.64 rs[2].assertValue(v1);
2461     rs[3].assertValue(v1);
2462 jsr166 1.40 g.complete(v2);
2463    
2464 jsr166 1.63 // unspecified behavior - both source completions available
2465     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2466     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2467     checkCompletedNormally(h4, null);
2468     checkCompletedNormally(h5, null);
2469 jsr166 1.64 assertTrue(Objects.equals(v1, rs[4].value) ||
2470     Objects.equals(v2, rs[4].value));
2471     assertTrue(Objects.equals(v1, rs[5].value) ||
2472     Objects.equals(v2, rs[5].value));
2473 jsr166 1.40
2474     checkCompletedNormally(f, v1);
2475     checkCompletedNormally(g, v2);
2476 jsr166 1.63 checkCompletedNormally(h0, null);
2477     checkCompletedNormally(h1, null);
2478     checkCompletedNormally(h2, null);
2479     checkCompletedNormally(h3, null);
2480 jsr166 1.64 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2481 jsr166 1.47 }}
2482 dl 1.5
2483     /**
2484     * acceptEither result completes exceptionally after exceptional
2485     * completion of either source
2486     */
2487 jsr166 1.63 public void testAcceptEither_exceptionalCompletion() {
2488 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2489 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2490     {
2491 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2492     final CompletableFuture<Integer> g = new CompletableFuture<>();
2493     final CFException ex = new CFException();
2494 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2495     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2496 jsr166 1.40
2497 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2498     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2499     checkIncomplete(h0);
2500     checkIncomplete(h1);
2501     rs[0].assertNotInvoked();
2502     rs[1].assertNotInvoked();
2503 jsr166 1.40 f.completeExceptionally(ex);
2504 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2505     checkCompletedWithWrappedException(h1, ex);
2506 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2507     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2508 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2509     checkCompletedWithWrappedException(h3, ex);
2510 jsr166 1.63
2511 jsr166 1.40 g.complete(v1);
2512    
2513 jsr166 1.63 // unspecified behavior - both source completions available
2514     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2515     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2516 jsr166 1.40 try {
2517 jsr166 1.63 assertNull(h4.join());
2518 jsr166 1.64 rs[4].assertValue(v1);
2519 jsr166 1.40 } catch (CompletionException ok) {
2520 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2521 jsr166 1.63 rs[4].assertNotInvoked();
2522 jsr166 1.40 }
2523     try {
2524 jsr166 1.63 assertNull(h5.join());
2525 jsr166 1.64 rs[5].assertValue(v1);
2526 jsr166 1.40 } catch (CompletionException ok) {
2527 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2528 jsr166 1.63 rs[5].assertNotInvoked();
2529 jsr166 1.40 }
2530 dl 1.5
2531 jsr166 1.72 checkCompletedExceptionally(f, ex);
2532 jsr166 1.40 checkCompletedNormally(g, v1);
2533 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2534     checkCompletedWithWrappedException(h1, ex);
2535     checkCompletedWithWrappedException(h2, ex);
2536     checkCompletedWithWrappedException(h3, ex);
2537     checkCompletedWithWrappedException(h4, ex);
2538 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2539 jsr166 1.47 }}
2540 dl 1.5
2541 jsr166 1.68 public void testAcceptEither_exceptionalCompletion2() {
2542     for (ExecutionMode m : ExecutionMode.values())
2543     for (boolean fFirst : new boolean[] { true, false })
2544     for (Integer v1 : new Integer[] { 1, null })
2545     {
2546     final CompletableFuture<Integer> f = new CompletableFuture<>();
2547     final CompletableFuture<Integer> g = new CompletableFuture<>();
2548     final CFException ex = new CFException();
2549     final NoopConsumer[] rs = new NoopConsumer[6];
2550     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2551    
2552     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2553     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2554 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2555     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2556 jsr166 1.68 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2557     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2558    
2559     // unspecified behavior - both source completions available
2560     try {
2561 jsr166 1.184 assertNull(h0.join());
2562 jsr166 1.68 rs[0].assertValue(v1);
2563     } catch (CompletionException ok) {
2564 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2565 jsr166 1.68 rs[0].assertNotInvoked();
2566     }
2567     try {
2568 jsr166 1.184 assertNull(h1.join());
2569 jsr166 1.68 rs[1].assertValue(v1);
2570     } catch (CompletionException ok) {
2571 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2572 jsr166 1.68 rs[1].assertNotInvoked();
2573     }
2574     try {
2575 jsr166 1.184 assertNull(h2.join());
2576 jsr166 1.68 rs[2].assertValue(v1);
2577     } catch (CompletionException ok) {
2578 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2579 jsr166 1.68 rs[2].assertNotInvoked();
2580     }
2581     try {
2582 jsr166 1.184 assertNull(h3.join());
2583 jsr166 1.68 rs[3].assertValue(v1);
2584     } catch (CompletionException ok) {
2585 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2586 jsr166 1.68 rs[3].assertNotInvoked();
2587     }
2588    
2589     checkCompletedNormally(f, v1);
2590 jsr166 1.72 checkCompletedExceptionally(g, ex);
2591 jsr166 1.68 }}
2592    
2593 dl 1.5 /**
2594     * acceptEither result completes exceptionally if either source cancelled
2595     */
2596 jsr166 1.63 public void testAcceptEither_sourceCancelled() {
2597 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2598     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2599 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2600     {
2601 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2602     final CompletableFuture<Integer> g = new CompletableFuture<>();
2603 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2604     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2605 jsr166 1.63
2606     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2607     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2608     checkIncomplete(h0);
2609     checkIncomplete(h1);
2610     rs[0].assertNotInvoked();
2611     rs[1].assertNotInvoked();
2612     f.cancel(mayInterruptIfRunning);
2613     checkCompletedWithWrappedCancellationException(h0);
2614     checkCompletedWithWrappedCancellationException(h1);
2615     final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2616     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2617     checkCompletedWithWrappedCancellationException(h2);
2618     checkCompletedWithWrappedCancellationException(h3);
2619 jsr166 1.40
2620     g.complete(v1);
2621    
2622 jsr166 1.63 // unspecified behavior - both source completions available
2623     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2624     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2625     try {
2626     assertNull(h4.join());
2627 jsr166 1.64 rs[4].assertValue(v1);
2628 jsr166 1.63 } catch (CompletionException ok) {
2629     checkCompletedWithWrappedCancellationException(h4);
2630     rs[4].assertNotInvoked();
2631     }
2632     try {
2633     assertNull(h5.join());
2634 jsr166 1.64 rs[5].assertValue(v1);
2635 jsr166 1.63 } catch (CompletionException ok) {
2636     checkCompletedWithWrappedCancellationException(h5);
2637     rs[5].assertNotInvoked();
2638     }
2639    
2640 jsr166 1.40 checkCancelled(f);
2641     checkCompletedNormally(g, v1);
2642 jsr166 1.63 checkCompletedWithWrappedCancellationException(h0);
2643     checkCompletedWithWrappedCancellationException(h1);
2644     checkCompletedWithWrappedCancellationException(h2);
2645     checkCompletedWithWrappedCancellationException(h3);
2646     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2647 jsr166 1.47 }}
2648 jsr166 1.40
2649 jsr166 1.63 /**
2650     * acceptEither result completes exceptionally if action does
2651     */
2652     public void testAcceptEither_actionFailed() {
2653 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2654 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2655 jsr166 1.63 for (Integer v2 : new Integer[] { 2, null })
2656 jsr166 1.47 {
2657 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2658     final CompletableFuture<Integer> g = new CompletableFuture<>();
2659 jsr166 1.63 final FailingConsumer[] rs = new FailingConsumer[6];
2660     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2661 jsr166 1.40
2662 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2663     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2664 jsr166 1.40 f.complete(v1);
2665 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2666     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2667 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
2668     checkCompletedWithWrappedException(h1, rs[1].ex);
2669     checkCompletedWithWrappedException(h2, rs[2].ex);
2670     checkCompletedWithWrappedException(h3, rs[3].ex);
2671 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2672 jsr166 1.40
2673 jsr166 1.63 g.complete(v2);
2674 jsr166 1.40
2675 jsr166 1.63 // unspecified behavior - both source completions available
2676     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2677     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2678 jsr166 1.40
2679 jsr166 1.151 checkCompletedWithWrappedException(h4, rs[4].ex);
2680 jsr166 1.63 assertTrue(Objects.equals(v1, rs[4].value) ||
2681     Objects.equals(v2, rs[4].value));
2682 jsr166 1.151 checkCompletedWithWrappedException(h5, rs[5].ex);
2683 jsr166 1.63 assertTrue(Objects.equals(v1, rs[5].value) ||
2684     Objects.equals(v2, rs[5].value));
2685 jsr166 1.40
2686     checkCompletedNormally(f, v1);
2687 jsr166 1.63 checkCompletedNormally(g, v2);
2688 jsr166 1.47 }}
2689 dl 1.5
2690     /**
2691     * runAfterEither result completes normally after normal completion
2692     * of either source
2693     */
2694 jsr166 1.65 public void testRunAfterEither_normalCompletion() {
2695 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2696     for (Integer v1 : new Integer[] { 1, null })
2697 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2698 jsr166 1.162 for (boolean pushNop : new boolean[] { true, false })
2699 jsr166 1.47 {
2700 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2701     final CompletableFuture<Integer> g = new CompletableFuture<>();
2702 jsr166 1.65 final Noop[] rs = new Noop[6];
2703     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2704 jsr166 1.41
2705 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2706     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2707     checkIncomplete(h0);
2708     checkIncomplete(h1);
2709     rs[0].assertNotInvoked();
2710     rs[1].assertNotInvoked();
2711 jsr166 1.162 if (pushNop) { // ad hoc test of intra-completion interference
2712     m.thenRun(f, () -> {});
2713     m.thenRun(g, () -> {});
2714     }
2715 jsr166 1.41 f.complete(v1);
2716 jsr166 1.65 checkCompletedNormally(h0, null);
2717     checkCompletedNormally(h1, null);
2718     rs[0].assertInvoked();
2719     rs[1].assertInvoked();
2720     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2721     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2722     checkCompletedNormally(h2, null);
2723     checkCompletedNormally(h3, null);
2724     rs[2].assertInvoked();
2725     rs[3].assertInvoked();
2726 jsr166 1.41
2727     g.complete(v2);
2728    
2729 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2730     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2731 jsr166 1.47
2732 jsr166 1.41 checkCompletedNormally(f, v1);
2733     checkCompletedNormally(g, v2);
2734 jsr166 1.65 checkCompletedNormally(h0, null);
2735     checkCompletedNormally(h1, null);
2736     checkCompletedNormally(h2, null);
2737     checkCompletedNormally(h3, null);
2738     checkCompletedNormally(h4, null);
2739     checkCompletedNormally(h5, null);
2740     for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2741 jsr166 1.47 }}
2742 dl 1.5
2743     /**
2744     * runAfterEither result completes exceptionally after exceptional
2745     * completion of either source
2746     */
2747 jsr166 1.65 public void testRunAfterEither_exceptionalCompletion() {
2748 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2749 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2750     {
2751 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2752     final CompletableFuture<Integer> g = new CompletableFuture<>();
2753     final CFException ex = new CFException();
2754 jsr166 1.65 final Noop[] rs = new Noop[6];
2755     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2756 jsr166 1.41
2757 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2758     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2759     checkIncomplete(h0);
2760     checkIncomplete(h1);
2761     rs[0].assertNotInvoked();
2762     rs[1].assertNotInvoked();
2763 jsr166 1.78 assertTrue(f.completeExceptionally(ex));
2764 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2765     checkCompletedWithWrappedException(h1, ex);
2766 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2767     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2768 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2769     checkCompletedWithWrappedException(h3, ex);
2770 jsr166 1.65
2771 jsr166 1.78 assertTrue(g.complete(v1));
2772 jsr166 1.41
2773 jsr166 1.65 // unspecified behavior - both source completions available
2774     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2775     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2776     try {
2777     assertNull(h4.join());
2778     rs[4].assertInvoked();
2779     } catch (CompletionException ok) {
2780 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2781 jsr166 1.65 rs[4].assertNotInvoked();
2782     }
2783     try {
2784     assertNull(h5.join());
2785     rs[5].assertInvoked();
2786     } catch (CompletionException ok) {
2787 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2788 jsr166 1.65 rs[5].assertNotInvoked();
2789     }
2790    
2791 jsr166 1.72 checkCompletedExceptionally(f, ex);
2792 jsr166 1.41 checkCompletedNormally(g, v1);
2793 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2794     checkCompletedWithWrappedException(h1, ex);
2795     checkCompletedWithWrappedException(h2, ex);
2796     checkCompletedWithWrappedException(h3, ex);
2797     checkCompletedWithWrappedException(h4, ex);
2798 jsr166 1.65 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2799 jsr166 1.47 }}
2800 jsr166 1.41
2801 jsr166 1.69 public void testRunAfterEither_exceptionalCompletion2() {
2802     for (ExecutionMode m : ExecutionMode.values())
2803     for (boolean fFirst : new boolean[] { true, false })
2804     for (Integer v1 : new Integer[] { 1, null })
2805     {
2806     final CompletableFuture<Integer> f = new CompletableFuture<>();
2807     final CompletableFuture<Integer> g = new CompletableFuture<>();
2808     final CFException ex = new CFException();
2809     final Noop[] rs = new Noop[6];
2810     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2811    
2812     final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2813     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2814 jsr166 1.78 assertTrue( fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2815     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2816 jsr166 1.69 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2817     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2818    
2819     // unspecified behavior - both source completions available
2820     try {
2821 jsr166 1.184 assertNull(h0.join());
2822 jsr166 1.69 rs[0].assertInvoked();
2823     } catch (CompletionException ok) {
2824 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2825 jsr166 1.69 rs[0].assertNotInvoked();
2826     }
2827     try {
2828 jsr166 1.184 assertNull(h1.join());
2829 jsr166 1.69 rs[1].assertInvoked();
2830     } catch (CompletionException ok) {
2831 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2832 jsr166 1.69 rs[1].assertNotInvoked();
2833     }
2834     try {
2835 jsr166 1.184 assertNull(h2.join());
2836 jsr166 1.69 rs[2].assertInvoked();
2837     } catch (CompletionException ok) {
2838 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2839 jsr166 1.69 rs[2].assertNotInvoked();
2840     }
2841     try {
2842 jsr166 1.184 assertNull(h3.join());
2843 jsr166 1.69 rs[3].assertInvoked();
2844     } catch (CompletionException ok) {
2845 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2846 jsr166 1.69 rs[3].assertNotInvoked();
2847     }
2848    
2849     checkCompletedNormally(f, v1);
2850 jsr166 1.72 checkCompletedExceptionally(g, ex);
2851 jsr166 1.69 }}
2852    
2853 jsr166 1.65 /**
2854     * runAfterEither result completes exceptionally if either source cancelled
2855     */
2856     public void testRunAfterEither_sourceCancelled() {
2857 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2858 jsr166 1.65 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2859 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2860     {
2861 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2862     final CompletableFuture<Integer> g = new CompletableFuture<>();
2863 jsr166 1.65 final Noop[] rs = new Noop[6];
2864     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2865 jsr166 1.41
2866 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2867     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2868     checkIncomplete(h0);
2869     checkIncomplete(h1);
2870     rs[0].assertNotInvoked();
2871     rs[1].assertNotInvoked();
2872     f.cancel(mayInterruptIfRunning);
2873     checkCompletedWithWrappedCancellationException(h0);
2874     checkCompletedWithWrappedCancellationException(h1);
2875     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2876     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2877     checkCompletedWithWrappedCancellationException(h2);
2878     checkCompletedWithWrappedCancellationException(h3);
2879 jsr166 1.41
2880 jsr166 1.78 assertTrue(g.complete(v1));
2881 jsr166 1.41
2882 jsr166 1.65 // unspecified behavior - both source completions available
2883     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2884     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2885 jsr166 1.41 try {
2886 jsr166 1.65 assertNull(h4.join());
2887     rs[4].assertInvoked();
2888 jsr166 1.41 } catch (CompletionException ok) {
2889 jsr166 1.65 checkCompletedWithWrappedCancellationException(h4);
2890     rs[4].assertNotInvoked();
2891 jsr166 1.41 }
2892     try {
2893 jsr166 1.65 assertNull(h5.join());
2894     rs[5].assertInvoked();
2895 jsr166 1.41 } catch (CompletionException ok) {
2896 jsr166 1.65 checkCompletedWithWrappedCancellationException(h5);
2897     rs[5].assertNotInvoked();
2898 jsr166 1.41 }
2899 dl 1.5
2900 jsr166 1.65 checkCancelled(f);
2901 jsr166 1.41 checkCompletedNormally(g, v1);
2902 jsr166 1.65 checkCompletedWithWrappedCancellationException(h0);
2903     checkCompletedWithWrappedCancellationException(h1);
2904     checkCompletedWithWrappedCancellationException(h2);
2905     checkCompletedWithWrappedCancellationException(h3);
2906     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2907 jsr166 1.47 }}
2908 dl 1.5
2909     /**
2910     * runAfterEither result completes exceptionally if action does
2911     */
2912 jsr166 1.65 public void testRunAfterEither_actionFailed() {
2913 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2914     for (Integer v1 : new Integer[] { 1, null })
2915 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2916     {
2917 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2918     final CompletableFuture<Integer> g = new CompletableFuture<>();
2919 jsr166 1.65 final FailingRunnable[] rs = new FailingRunnable[6];
2920     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2921 jsr166 1.41
2922 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2923     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2924 jsr166 1.78 assertTrue(f.complete(v1));
2925 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2926     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2927 jsr166 1.151 checkCompletedWithWrappedException(h0, rs[0].ex);
2928     checkCompletedWithWrappedException(h1, rs[1].ex);
2929     checkCompletedWithWrappedException(h2, rs[2].ex);
2930     checkCompletedWithWrappedException(h3, rs[3].ex);
2931 jsr166 1.65 for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2932 jsr166 1.78 assertTrue(g.complete(v2));
2933 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2934     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2935 jsr166 1.151 checkCompletedWithWrappedException(h4, rs[4].ex);
2936     checkCompletedWithWrappedException(h5, rs[5].ex);
2937 jsr166 1.41
2938     checkCompletedNormally(f, v1);
2939     checkCompletedNormally(g, v2);
2940 jsr166 1.65 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2941 jsr166 1.47 }}
2942 dl 1.5
2943     /**
2944     * thenCompose result completes normally after normal completion of source
2945     */
2946 jsr166 1.48 public void testThenCompose_normalCompletion() {
2947 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2948 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2949 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2950     {
2951 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2952 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2953 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2954 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2955 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2956 jsr166 1.21
2957 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2958     checkCompletedNormally(f, v1);
2959 jsr166 1.70 r.assertValue(v1);
2960 jsr166 1.47 }}
2961 dl 1.5
2962     /**
2963     * thenCompose result completes exceptionally after exceptional
2964     * completion of source
2965     */
2966 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2967 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2968 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2969 jsr166 1.47 {
2970 jsr166 1.44 final CFException ex = new CFException();
2971 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2972 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2973 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2974 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2975 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2976 jsr166 1.21
2977 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
2978     checkCompletedExceptionally(f, ex);
2979 jsr166 1.62 r.assertNotInvoked();
2980 jsr166 1.47 }}
2981 dl 1.5
2982     /**
2983     * thenCompose result completes exceptionally if action does
2984     */
2985 jsr166 1.48 public void testThenCompose_actionFailed() {
2986 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2987 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2988 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2989     {
2990 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2991     final FailingCompletableFutureFunction r
2992 jsr166 1.56 = new FailingCompletableFutureFunction(m);
2993 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2994 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2995 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2996 jsr166 1.44
2997 jsr166 1.151 checkCompletedWithWrappedException(g, r.ex);
2998 jsr166 1.44 checkCompletedNormally(f, v1);
2999 jsr166 1.47 }}
3000 dl 1.5
3001     /**
3002     * thenCompose result completes exceptionally if source cancelled
3003     */
3004 jsr166 1.48 public void testThenCompose_sourceCancelled() {
3005 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
3006 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
3007 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3008     {
3009 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
3010 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
3011 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3012 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
3013 jsr166 1.50 if (createIncomplete) {
3014     checkIncomplete(g);
3015     assertTrue(f.cancel(mayInterruptIfRunning));
3016     }
3017 jsr166 1.44
3018 dl 1.5 checkCompletedWithWrappedCancellationException(g);
3019 jsr166 1.44 checkCancelled(f);
3020 jsr166 1.47 }}
3021 dl 1.5
3022 jsr166 1.99 /**
3023     * thenCompose result completes exceptionally if the result of the action does
3024     */
3025     public void testThenCompose_actionReturnsFailingFuture() {
3026     for (ExecutionMode m : ExecutionMode.values())
3027     for (int order = 0; order < 6; order++)
3028     for (Integer v1 : new Integer[] { 1, null })
3029     {
3030     final CFException ex = new CFException();
3031     final CompletableFuture<Integer> f = new CompletableFuture<>();
3032     final CompletableFuture<Integer> g = new CompletableFuture<>();
3033     final CompletableFuture<Integer> h;
3034     // Test all permutations of orders
3035     switch (order) {
3036     case 0:
3037     assertTrue(f.complete(v1));
3038     assertTrue(g.completeExceptionally(ex));
3039     h = m.thenCompose(f, (x -> g));
3040     break;
3041     case 1:
3042     assertTrue(f.complete(v1));
3043     h = m.thenCompose(f, (x -> g));
3044     assertTrue(g.completeExceptionally(ex));
3045     break;
3046     case 2:
3047     assertTrue(g.completeExceptionally(ex));
3048     assertTrue(f.complete(v1));
3049     h = m.thenCompose(f, (x -> g));
3050     break;
3051     case 3:
3052     assertTrue(g.completeExceptionally(ex));
3053     h = m.thenCompose(f, (x -> g));
3054     assertTrue(f.complete(v1));
3055     break;
3056     case 4:
3057     h = m.thenCompose(f, (x -> g));
3058     assertTrue(f.complete(v1));
3059     assertTrue(g.completeExceptionally(ex));
3060     break;
3061     case 5:
3062     h = m.thenCompose(f, (x -> g));
3063     assertTrue(f.complete(v1));
3064     assertTrue(g.completeExceptionally(ex));
3065     break;
3066     default: throw new AssertionError();
3067     }
3068    
3069     checkCompletedExceptionally(g, ex);
3070     checkCompletedWithWrappedException(h, ex);
3071     checkCompletedNormally(f, v1);
3072     }}
3073    
3074 jsr166 1.6 // other static methods
3075 dl 1.5
3076     /**
3077     * allOf(no component futures) returns a future completed normally
3078     * with the value null
3079     */
3080     public void testAllOf_empty() throws Exception {
3081 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
3082 dl 1.5 checkCompletedNormally(f, null);
3083     }
3084    
3085     /**
3086 jsr166 1.25 * allOf returns a future completed normally with the value null
3087     * when all components complete normally
3088 dl 1.5 */
3089 jsr166 1.25 public void testAllOf_normal() throws Exception {
3090 jsr166 1.88 for (int k = 1; k < 10; k++) {
3091 jsr166 1.59 CompletableFuture<Integer>[] fs
3092     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3093 jsr166 1.86 for (int i = 0; i < k; i++)
3094 jsr166 1.22 fs[i] = new CompletableFuture<>();
3095 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3096 jsr166 1.86 for (int i = 0; i < k; i++) {
3097 dl 1.5 checkIncomplete(f);
3098 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
3099 dl 1.5 fs[i].complete(one);
3100     }
3101 dl 1.9 checkCompletedNormally(f, null);
3102 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3103 dl 1.5 }
3104     }
3105    
3106 jsr166 1.150 public void testAllOf_normal_backwards() throws Exception {
3107 jsr166 1.88 for (int k = 1; k < 10; k++) {
3108 jsr166 1.59 CompletableFuture<Integer>[] fs
3109     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3110 jsr166 1.86 for (int i = 0; i < k; i++)
3111 jsr166 1.59 fs[i] = new CompletableFuture<>();
3112     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3113     for (int i = k - 1; i >= 0; i--) {
3114     checkIncomplete(f);
3115     checkIncomplete(CompletableFuture.allOf(fs));
3116     fs[i].complete(one);
3117     }
3118     checkCompletedNormally(f, null);
3119     checkCompletedNormally(CompletableFuture.allOf(fs), null);
3120     }
3121     }
3122    
3123 jsr166 1.88 public void testAllOf_exceptional() throws Exception {
3124     for (int k = 1; k < 10; k++) {
3125     CompletableFuture<Integer>[] fs
3126     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3127     CFException ex = new CFException();
3128     for (int i = 0; i < k; i++)
3129     fs[i] = new CompletableFuture<>();
3130     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3131     for (int i = 0; i < k; i++) {
3132     checkIncomplete(f);
3133     checkIncomplete(CompletableFuture.allOf(fs));
3134 jsr166 1.121 if (i != k / 2) {
3135 jsr166 1.88 fs[i].complete(i);
3136     checkCompletedNormally(fs[i], i);
3137     } else {
3138     fs[i].completeExceptionally(ex);
3139     checkCompletedExceptionally(fs[i], ex);
3140     }
3141     }
3142     checkCompletedWithWrappedException(f, ex);
3143     checkCompletedWithWrappedException(CompletableFuture.allOf(fs), ex);
3144     }
3145     }
3146    
3147 dl 1.5 /**
3148     * anyOf(no component futures) returns an incomplete future
3149     */
3150     public void testAnyOf_empty() throws Exception {
3151 jsr166 1.86 for (Integer v1 : new Integer[] { 1, null })
3152     {
3153 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
3154 dl 1.5 checkIncomplete(f);
3155 jsr166 1.86
3156     f.complete(v1);
3157     checkCompletedNormally(f, v1);
3158     }}
3159 dl 1.5
3160     /**
3161 jsr166 1.25 * anyOf returns a future completed normally with a value when
3162     * a component future does
3163 dl 1.5 */
3164 jsr166 1.24 public void testAnyOf_normal() throws Exception {
3165 jsr166 1.86 for (int k = 0; k < 10; k++) {
3166 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
3167 jsr166 1.86 for (int i = 0; i < k; i++)
3168 jsr166 1.22 fs[i] = new CompletableFuture<>();
3169 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3170 dl 1.5 checkIncomplete(f);
3171 jsr166 1.86 for (int i = 0; i < k; i++) {
3172     fs[i].complete(i);
3173     checkCompletedNormally(f, 0);
3174     int x = (int) CompletableFuture.anyOf(fs).join();
3175     assertTrue(0 <= x && x <= i);
3176     }
3177     }
3178     }
3179     public void testAnyOf_normal_backwards() throws Exception {
3180     for (int k = 0; k < 10; k++) {
3181     CompletableFuture[] fs = new CompletableFuture[k];
3182     for (int i = 0; i < k; i++)
3183     fs[i] = new CompletableFuture<>();
3184     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3185     checkIncomplete(f);
3186     for (int i = k - 1; i >= 0; i--) {
3187     fs[i].complete(i);
3188     checkCompletedNormally(f, k - 1);
3189     int x = (int) CompletableFuture.anyOf(fs).join();
3190     assertTrue(i <= x && x <= k - 1);
3191 jsr166 1.24 }
3192     }
3193     }
3194    
3195     /**
3196     * anyOf result completes exceptionally when any component does.
3197     */
3198     public void testAnyOf_exceptional() throws Exception {
3199 jsr166 1.86 for (int k = 0; k < 10; k++) {
3200 jsr166 1.24 CompletableFuture[] fs = new CompletableFuture[k];
3201 jsr166 1.87 CFException[] exs = new CFException[k];
3202     for (int i = 0; i < k; i++) {
3203 jsr166 1.24 fs[i] = new CompletableFuture<>();
3204 jsr166 1.87 exs[i] = new CFException();
3205     }
3206 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3207     checkIncomplete(f);
3208 jsr166 1.86 for (int i = 0; i < k; i++) {
3209 jsr166 1.87 fs[i].completeExceptionally(exs[i]);
3210     checkCompletedWithWrappedException(f, exs[0]);
3211     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3212     }
3213     }
3214     }
3215    
3216     public void testAnyOf_exceptional_backwards() throws Exception {
3217     for (int k = 0; k < 10; k++) {
3218     CompletableFuture[] fs = new CompletableFuture[k];
3219     CFException[] exs = new CFException[k];
3220     for (int i = 0; i < k; i++) {
3221     fs[i] = new CompletableFuture<>();
3222     exs[i] = new CFException();
3223     }
3224     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3225     checkIncomplete(f);
3226     for (int i = k - 1; i >= 0; i--) {
3227     fs[i].completeExceptionally(exs[i]);
3228     checkCompletedWithWrappedException(f, exs[k - 1]);
3229 jsr166 1.24 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3230 dl 1.5 }
3231     }
3232     }
3233    
3234     /**
3235     * Completion methods throw NullPointerException with null arguments
3236     */
3237     public void testNPE() {
3238 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3239     CompletableFuture<Integer> g = new CompletableFuture<>();
3240 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3241 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
3242 jsr166 1.14
3243     Runnable[] throwingActions = {
3244 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
3245     () -> CompletableFuture.supplyAsync(null, exec),
3246 jsr166 1.95 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.SYNC, 42), null),
3247 jsr166 1.31
3248     () -> CompletableFuture.runAsync(null),
3249     () -> CompletableFuture.runAsync(null, exec),
3250     () -> CompletableFuture.runAsync(() -> {}, null),
3251    
3252     () -> f.completeExceptionally(null),
3253    
3254     () -> f.thenApply(null),
3255     () -> f.thenApplyAsync(null),
3256 jsr166 1.180 () -> f.thenApplyAsync(x -> x, null),
3257 jsr166 1.31 () -> f.thenApplyAsync(null, exec),
3258    
3259     () -> f.thenAccept(null),
3260     () -> f.thenAcceptAsync(null),
3261 jsr166 1.180 () -> f.thenAcceptAsync(x -> {} , null),
3262 jsr166 1.31 () -> f.thenAcceptAsync(null, exec),
3263    
3264     () -> f.thenRun(null),
3265     () -> f.thenRunAsync(null),
3266     () -> f.thenRunAsync(() -> {} , null),
3267     () -> f.thenRunAsync(null, exec),
3268    
3269     () -> f.thenCombine(g, null),
3270     () -> f.thenCombineAsync(g, null),
3271     () -> f.thenCombineAsync(g, null, exec),
3272     () -> f.thenCombine(nullFuture, (x, y) -> x),
3273     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3274     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3275     () -> f.thenCombineAsync(g, (x, y) -> x, null),
3276    
3277     () -> f.thenAcceptBoth(g, null),
3278     () -> f.thenAcceptBothAsync(g, null),
3279     () -> f.thenAcceptBothAsync(g, null, exec),
3280     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3281     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3282     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3283     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3284    
3285     () -> f.runAfterBoth(g, null),
3286     () -> f.runAfterBothAsync(g, null),
3287     () -> f.runAfterBothAsync(g, null, exec),
3288     () -> f.runAfterBoth(nullFuture, () -> {}),
3289     () -> f.runAfterBothAsync(nullFuture, () -> {}),
3290     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3291     () -> f.runAfterBothAsync(g, () -> {}, null),
3292    
3293     () -> f.applyToEither(g, null),
3294     () -> f.applyToEitherAsync(g, null),
3295     () -> f.applyToEitherAsync(g, null, exec),
3296 jsr166 1.180 () -> f.applyToEither(nullFuture, x -> x),
3297     () -> f.applyToEitherAsync(nullFuture, x -> x),
3298     () -> f.applyToEitherAsync(nullFuture, x -> x, exec),
3299     () -> f.applyToEitherAsync(g, x -> x, null),
3300 jsr166 1.31
3301     () -> f.acceptEither(g, null),
3302     () -> f.acceptEitherAsync(g, null),
3303     () -> f.acceptEitherAsync(g, null, exec),
3304 jsr166 1.180 () -> f.acceptEither(nullFuture, x -> {}),
3305     () -> f.acceptEitherAsync(nullFuture, x -> {}),
3306     () -> f.acceptEitherAsync(nullFuture, x -> {}, exec),
3307     () -> f.acceptEitherAsync(g, x -> {}, null),
3308 jsr166 1.31
3309     () -> f.runAfterEither(g, null),
3310     () -> f.runAfterEitherAsync(g, null),
3311     () -> f.runAfterEitherAsync(g, null, exec),
3312     () -> f.runAfterEither(nullFuture, () -> {}),
3313     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3314     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3315     () -> f.runAfterEitherAsync(g, () -> {}, null),
3316    
3317     () -> f.thenCompose(null),
3318     () -> f.thenComposeAsync(null),
3319 jsr166 1.56 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
3320 jsr166 1.31 () -> f.thenComposeAsync(null, exec),
3321    
3322     () -> f.exceptionally(null),
3323    
3324     () -> f.handle(null),
3325 jsr166 1.107
3326 jsr166 1.31 () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3327     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3328     () -> CompletableFuture.allOf(f, null),
3329     () -> CompletableFuture.allOf(null, f),
3330    
3331     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3332     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3333     () -> CompletableFuture.anyOf(f, null),
3334     () -> CompletableFuture.anyOf(null, f),
3335 jsr166 1.32
3336     () -> f.obtrudeException(null),
3337 jsr166 1.115
3338     () -> CompletableFuture.delayedExecutor(1L, SECONDS, null),
3339 jsr166 1.143 () -> CompletableFuture.delayedExecutor(1L, null, exec),
3340 jsr166 1.115 () -> CompletableFuture.delayedExecutor(1L, null),
3341 jsr166 1.116
3342     () -> f.orTimeout(1L, null),
3343     () -> f.completeOnTimeout(42, 1L, null),
3344 jsr166 1.121
3345     () -> CompletableFuture.failedFuture(null),
3346     () -> CompletableFuture.failedStage(null),
3347 jsr166 1.14 };
3348 dl 1.5
3349 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3350 jsr166 1.17 assertEquals(0, exec.count.get());
3351 dl 1.5 }
3352    
3353 dl 1.26 /**
3354 jsr166 1.152 * Test submissions to an executor that rejects all tasks.
3355     */
3356     public void testRejectingExecutor() {
3357 jsr166 1.161 for (Integer v : new Integer[] { 1, null })
3358     {
3359 jsr166 1.154 final CountingRejectingExecutor e = new CountingRejectingExecutor();
3360 jsr166 1.152
3361     final CompletableFuture<Integer> complete = CompletableFuture.completedFuture(v);
3362     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3363    
3364     List<CompletableFuture<?>> futures = new ArrayList<>();
3365    
3366     List<CompletableFuture<Integer>> srcs = new ArrayList<>();
3367     srcs.add(complete);
3368     srcs.add(incomplete);
3369    
3370     for (CompletableFuture<Integer> src : srcs) {
3371     List<CompletableFuture<?>> fs = new ArrayList<>();
3372     fs.add(src.thenRunAsync(() -> {}, e));
3373 jsr166 1.180 fs.add(src.thenAcceptAsync(z -> {}, e));
3374     fs.add(src.thenApplyAsync(z -> z, e));
3375 jsr166 1.152
3376     fs.add(src.thenCombineAsync(src, (x, y) -> x, e));
3377     fs.add(src.thenAcceptBothAsync(src, (x, y) -> {}, e));
3378     fs.add(src.runAfterBothAsync(src, () -> {}, e));
3379    
3380 jsr166 1.180 fs.add(src.applyToEitherAsync(src, z -> z, e));
3381     fs.add(src.acceptEitherAsync(src, z -> {}, e));
3382 jsr166 1.152 fs.add(src.runAfterEitherAsync(src, () -> {}, e));
3383    
3384 jsr166 1.180 fs.add(src.thenComposeAsync(z -> null, e));
3385 jsr166 1.152 fs.add(src.whenCompleteAsync((z, t) -> {}, e));
3386     fs.add(src.handleAsync((z, t) -> null, e));
3387    
3388     for (CompletableFuture<?> future : fs) {
3389     if (src.isDone())
3390 jsr166 1.154 checkCompletedWithWrappedException(future, e.ex);
3391 jsr166 1.152 else
3392     checkIncomplete(future);
3393     }
3394     futures.addAll(fs);
3395     }
3396    
3397     {
3398     List<CompletableFuture<?>> fs = new ArrayList<>();
3399    
3400     fs.add(complete.thenCombineAsync(incomplete, (x, y) -> x, e));
3401     fs.add(incomplete.thenCombineAsync(complete, (x, y) -> x, e));
3402    
3403     fs.add(complete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3404     fs.add(incomplete.thenAcceptBothAsync(complete, (x, y) -> {}, e));
3405    
3406     fs.add(complete.runAfterBothAsync(incomplete, () -> {}, e));
3407     fs.add(incomplete.runAfterBothAsync(complete, () -> {}, e));
3408    
3409     for (CompletableFuture<?> future : fs)
3410     checkIncomplete(future);
3411     futures.addAll(fs);
3412     }
3413    
3414     {
3415     List<CompletableFuture<?>> fs = new ArrayList<>();
3416    
3417 jsr166 1.180 fs.add(complete.applyToEitherAsync(incomplete, z -> z, e));
3418     fs.add(incomplete.applyToEitherAsync(complete, z -> z, e));
3419 jsr166 1.152
3420 jsr166 1.180 fs.add(complete.acceptEitherAsync(incomplete, z -> {}, e));
3421     fs.add(incomplete.acceptEitherAsync(complete, z -> {}, e));
3422 jsr166 1.152
3423     fs.add(complete.runAfterEitherAsync(incomplete, () -> {}, e));
3424     fs.add(incomplete.runAfterEitherAsync(complete, () -> {}, e));
3425    
3426     for (CompletableFuture<?> future : fs)
3427 jsr166 1.154 checkCompletedWithWrappedException(future, e.ex);
3428 jsr166 1.152 futures.addAll(fs);
3429     }
3430    
3431     incomplete.complete(v);
3432    
3433     for (CompletableFuture<?> future : futures)
3434 jsr166 1.154 checkCompletedWithWrappedException(future, e.ex);
3435    
3436     assertEquals(futures.size(), e.count.get());
3437 jsr166 1.161 }}
3438 jsr166 1.152
3439     /**
3440 jsr166 1.153 * Test submissions to an executor that rejects all tasks, but
3441     * should never be invoked because the dependent future is
3442     * explicitly completed.
3443     */
3444     public void testRejectingExecutorNeverInvoked() {
3445 jsr166 1.161 for (Integer v : new Integer[] { 1, null })
3446     {
3447 jsr166 1.153 final CountingRejectingExecutor e = new CountingRejectingExecutor();
3448    
3449     final CompletableFuture<Integer> complete = CompletableFuture.completedFuture(v);
3450     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3451    
3452     List<CompletableFuture<?>> futures = new ArrayList<>();
3453    
3454     List<CompletableFuture<Integer>> srcs = new ArrayList<>();
3455     srcs.add(complete);
3456     srcs.add(incomplete);
3457    
3458     List<CompletableFuture<?>> fs = new ArrayList<>();
3459     fs.add(incomplete.thenRunAsync(() -> {}, e));
3460 jsr166 1.180 fs.add(incomplete.thenAcceptAsync(z -> {}, e));
3461     fs.add(incomplete.thenApplyAsync(z -> z, e));
3462 jsr166 1.153
3463     fs.add(incomplete.thenCombineAsync(incomplete, (x, y) -> x, e));
3464     fs.add(incomplete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3465     fs.add(incomplete.runAfterBothAsync(incomplete, () -> {}, e));
3466    
3467 jsr166 1.180 fs.add(incomplete.applyToEitherAsync(incomplete, z -> z, e));
3468     fs.add(incomplete.acceptEitherAsync(incomplete, z -> {}, e));
3469 jsr166 1.153 fs.add(incomplete.runAfterEitherAsync(incomplete, () -> {}, e));
3470    
3471 jsr166 1.180 fs.add(incomplete.thenComposeAsync(z -> null, e));
3472 jsr166 1.153 fs.add(incomplete.whenCompleteAsync((z, t) -> {}, e));
3473     fs.add(incomplete.handleAsync((z, t) -> null, e));
3474    
3475     fs.add(complete.thenCombineAsync(incomplete, (x, y) -> x, e));
3476     fs.add(incomplete.thenCombineAsync(complete, (x, y) -> x, e));
3477    
3478     fs.add(complete.thenAcceptBothAsync(incomplete, (x, y) -> {}, e));
3479     fs.add(incomplete.thenAcceptBothAsync(complete, (x, y) -> {}, e));
3480    
3481     fs.add(complete.runAfterBothAsync(incomplete, () -> {}, e));
3482     fs.add(incomplete.runAfterBothAsync(complete, () -> {}, e));
3483    
3484     for (CompletableFuture<?> future : fs)
3485     checkIncomplete(future);
3486    
3487     for (CompletableFuture<?> future : fs)
3488     future.complete(null);
3489    
3490     incomplete.complete(v);
3491    
3492     for (CompletableFuture<?> future : fs)
3493     checkCompletedNormally(future, null);
3494    
3495     assertEquals(0, e.count.get());
3496 jsr166 1.161 }}
3497 jsr166 1.153
3498     /**
3499 dl 1.26 * toCompletableFuture returns this CompletableFuture.
3500     */
3501     public void testToCompletableFuture() {
3502     CompletableFuture<Integer> f = new CompletableFuture<>();
3503     assertSame(f, f.toCompletableFuture());
3504     }
3505    
3506 dl 1.103 // jdk9
3507 jsr166 1.104
3508 dl 1.103 /**
3509     * newIncompleteFuture returns an incomplete CompletableFuture
3510     */
3511     public void testNewIncompleteFuture() {
3512 jsr166 1.117 for (Integer v1 : new Integer[] { 1, null })
3513     {
3514 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3515     CompletableFuture<Integer> g = f.newIncompleteFuture();
3516     checkIncomplete(f);
3517     checkIncomplete(g);
3518 jsr166 1.117 f.complete(v1);
3519     checkCompletedNormally(f, v1);
3520     checkIncomplete(g);
3521     g.complete(v1);
3522     checkCompletedNormally(g, v1);
3523     assertSame(g.getClass(), CompletableFuture.class);
3524     }}
3525 dl 1.103
3526     /**
3527     * completedStage returns a completed CompletionStage
3528     */
3529     public void testCompletedStage() {
3530 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3531 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3532 dl 1.103 CompletionStage<Integer> f = CompletableFuture.completedStage(1);
3533     f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3534     assertEquals(x.get(), 1);
3535     assertNull(r.get());
3536     }
3537    
3538     /**
3539     * defaultExecutor by default returns the commonPool if
3540 dl 1.110 * it supports more than one thread.
3541 dl 1.103 */
3542     public void testDefaultExecutor() {
3543     CompletableFuture<Integer> f = new CompletableFuture<>();
3544     Executor e = f.defaultExecutor();
3545 jsr166 1.108 Executor c = ForkJoinPool.commonPool();
3546 dl 1.105 if (ForkJoinPool.getCommonPoolParallelism() > 1)
3547 dl 1.103 assertSame(e, c);
3548 jsr166 1.111 else
3549     assertNotSame(e, c);
3550 dl 1.103 }
3551    
3552     /**
3553     * failedFuture returns a CompletableFuture completed
3554     * exceptionally with the given Exception
3555     */
3556     public void testFailedFuture() {
3557     CFException ex = new CFException();
3558     CompletableFuture<Integer> f = CompletableFuture.failedFuture(ex);
3559 jsr166 1.119 checkCompletedExceptionally(f, ex);
3560 dl 1.103 }
3561    
3562     /**
3563     * failedFuture(null) throws NPE
3564     */
3565 jsr166 1.118 public void testFailedFuture_null() {
3566 dl 1.103 try {
3567     CompletableFuture<Integer> f = CompletableFuture.failedFuture(null);
3568 jsr166 1.104 shouldThrow();
3569     } catch (NullPointerException success) {}
3570 dl 1.103 }
3571    
3572     /**
3573     * copy returns a CompletableFuture that is completed normally,
3574     * with the same value, when source is.
3575     */
3576 jsr166 1.174 public void testCopy_normalCompletion() {
3577     for (boolean createIncomplete : new boolean[] { true, false })
3578     for (Integer v1 : new Integer[] { 1, null })
3579     {
3580 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3581 jsr166 1.174 if (!createIncomplete) assertTrue(f.complete(v1));
3582 dl 1.103 CompletableFuture<Integer> g = f.copy();
3583 jsr166 1.174 if (createIncomplete) {
3584     checkIncomplete(f);
3585     checkIncomplete(g);
3586     assertTrue(f.complete(v1));
3587     }
3588     checkCompletedNormally(f, v1);
3589     checkCompletedNormally(g, v1);
3590     }}
3591 dl 1.103
3592     /**
3593     * copy returns a CompletableFuture that is completed exceptionally
3594     * when source is.
3595     */
3596 jsr166 1.174 public void testCopy_exceptionalCompletion() {
3597     for (boolean createIncomplete : new boolean[] { true, false })
3598     {
3599     CFException ex = new CFException();
3600 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3601 jsr166 1.174 if (!createIncomplete) f.completeExceptionally(ex);
3602 dl 1.103 CompletableFuture<Integer> g = f.copy();
3603 jsr166 1.174 if (createIncomplete) {
3604     checkIncomplete(f);
3605     checkIncomplete(g);
3606     f.completeExceptionally(ex);
3607     }
3608 dl 1.103 checkCompletedExceptionally(f, ex);
3609 jsr166 1.121 checkCompletedWithWrappedException(g, ex);
3610 jsr166 1.174 }}
3611    
3612     /**
3613     * Completion of a copy does not complete its source.
3614     */
3615     public void testCopy_oneWayPropagation() {
3616     CompletableFuture<Integer> f = new CompletableFuture<>();
3617     assertTrue(f.copy().complete(1));
3618     assertTrue(f.copy().complete(null));
3619     assertTrue(f.copy().cancel(true));
3620     assertTrue(f.copy().cancel(false));
3621     assertTrue(f.copy().completeExceptionally(new CFException()));
3622     checkIncomplete(f);
3623 dl 1.103 }
3624    
3625     /**
3626     * minimalCompletionStage returns a CompletableFuture that is
3627     * completed normally, with the same value, when source is.
3628     */
3629     public void testMinimalCompletionStage() {
3630     CompletableFuture<Integer> f = new CompletableFuture<>();
3631     CompletionStage<Integer> g = f.minimalCompletionStage();
3632 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3633 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3634 dl 1.103 checkIncomplete(f);
3635     g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3636     f.complete(1);
3637     checkCompletedNormally(f, 1);
3638     assertEquals(x.get(), 1);
3639     assertNull(r.get());
3640     }
3641    
3642     /**
3643     * minimalCompletionStage returns a CompletableFuture that is
3644     * completed exceptionally when source is.
3645     */
3646     public void testMinimalCompletionStage2() {
3647     CompletableFuture<Integer> f = new CompletableFuture<>();
3648     CompletionStage<Integer> g = f.minimalCompletionStage();
3649 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3650 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3651 dl 1.103 g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3652     checkIncomplete(f);
3653     CFException ex = new CFException();
3654     f.completeExceptionally(ex);
3655     checkCompletedExceptionally(f, ex);
3656     assertEquals(x.get(), 0);
3657     assertEquals(r.get().getCause(), ex);
3658     }
3659    
3660     /**
3661 jsr166 1.109 * failedStage returns a CompletionStage completed
3662 dl 1.103 * exceptionally with the given Exception
3663     */
3664     public void testFailedStage() {
3665     CFException ex = new CFException();
3666     CompletionStage<Integer> f = CompletableFuture.failedStage(ex);
3667 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3668 jsr166 1.183 AtomicReference<Throwable> r = new AtomicReference<>();
3669 dl 1.103 f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3670     assertEquals(x.get(), 0);
3671 jsr166 1.119 assertEquals(r.get(), ex);
3672 dl 1.103 }
3673    
3674     /**
3675     * completeAsync completes with value of given supplier
3676     */
3677     public void testCompleteAsync() {
3678 jsr166 1.121 for (Integer v1 : new Integer[] { 1, null })
3679     {
3680 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3681 jsr166 1.121 f.completeAsync(() -> v1);
3682 dl 1.103 f.join();
3683 jsr166 1.121 checkCompletedNormally(f, v1);
3684     }}
3685 dl 1.103
3686     /**
3687     * completeAsync completes exceptionally if given supplier throws
3688     */
3689     public void testCompleteAsync2() {
3690     CompletableFuture<Integer> f = new CompletableFuture<>();
3691     CFException ex = new CFException();
3692 jsr166 1.181 f.completeAsync(() -> { throw ex; });
3693 dl 1.103 try {
3694     f.join();
3695     shouldThrow();
3696 jsr166 1.121 } catch (CompletionException success) {}
3697     checkCompletedWithWrappedException(f, ex);
3698 dl 1.103 }
3699    
3700     /**
3701     * completeAsync with given executor completes with value of given supplier
3702     */
3703     public void testCompleteAsync3() {
3704 jsr166 1.121 for (Integer v1 : new Integer[] { 1, null })
3705     {
3706 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3707 jsr166 1.121 ThreadExecutor executor = new ThreadExecutor();
3708     f.completeAsync(() -> v1, executor);
3709     assertSame(v1, f.join());
3710     checkCompletedNormally(f, v1);
3711     assertEquals(1, executor.count.get());
3712     }}
3713 dl 1.103
3714     /**
3715     * completeAsync with given executor completes exceptionally if
3716     * given supplier throws
3717     */
3718     public void testCompleteAsync4() {
3719     CompletableFuture<Integer> f = new CompletableFuture<>();
3720     CFException ex = new CFException();
3721 jsr166 1.121 ThreadExecutor executor = new ThreadExecutor();
3722 jsr166 1.181 f.completeAsync(() -> { throw ex; }, executor);
3723 dl 1.103 try {
3724     f.join();
3725     shouldThrow();
3726 jsr166 1.121 } catch (CompletionException success) {}
3727     checkCompletedWithWrappedException(f, ex);
3728     assertEquals(1, executor.count.get());
3729 dl 1.103 }
3730    
3731     /**
3732 jsr166 1.106 * orTimeout completes with TimeoutException if not complete
3733 dl 1.103 */
3734 jsr166 1.121 public void testOrTimeout_timesOut() {
3735     long timeoutMillis = timeoutMillis();
3736 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3737 jsr166 1.121 long startTime = System.nanoTime();
3738 jsr166 1.145 assertSame(f, f.orTimeout(timeoutMillis, MILLISECONDS));
3739 jsr166 1.121 checkCompletedWithTimeoutException(f);
3740     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3741 dl 1.103 }
3742    
3743     /**
3744 jsr166 1.106 * orTimeout completes normally if completed before timeout
3745 dl 1.103 */
3746 jsr166 1.121 public void testOrTimeout_completed() {
3747     for (Integer v1 : new Integer[] { 1, null })
3748     {
3749 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3750 jsr166 1.121 CompletableFuture<Integer> g = new CompletableFuture<>();
3751     long startTime = System.nanoTime();
3752     f.complete(v1);
3753 jsr166 1.145 assertSame(f, f.orTimeout(LONG_DELAY_MS, MILLISECONDS));
3754     assertSame(g, g.orTimeout(LONG_DELAY_MS, MILLISECONDS));
3755 jsr166 1.121 g.complete(v1);
3756     checkCompletedNormally(f, v1);
3757     checkCompletedNormally(g, v1);
3758     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3759     }}
3760 dl 1.103
3761     /**
3762 jsr166 1.106 * completeOnTimeout completes with given value if not complete
3763 dl 1.103 */
3764 jsr166 1.121 public void testCompleteOnTimeout_timesOut() {
3765     testInParallel(() -> testCompleteOnTimeout_timesOut(42),
3766     () -> testCompleteOnTimeout_timesOut(null));
3767     }
3768    
3769 jsr166 1.146 /**
3770     * completeOnTimeout completes with given value if not complete
3771     */
3772 jsr166 1.121 public void testCompleteOnTimeout_timesOut(Integer v) {
3773     long timeoutMillis = timeoutMillis();
3774 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3775 jsr166 1.121 long startTime = System.nanoTime();
3776 jsr166 1.145 assertSame(f, f.completeOnTimeout(v, timeoutMillis, MILLISECONDS));
3777 jsr166 1.121 assertSame(v, f.join());
3778     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3779     f.complete(99); // should have no effect
3780     checkCompletedNormally(f, v);
3781 dl 1.103 }
3782    
3783     /**
3784 jsr166 1.106 * completeOnTimeout has no effect if completed within timeout
3785 dl 1.103 */
3786 jsr166 1.121 public void testCompleteOnTimeout_completed() {
3787     for (Integer v1 : new Integer[] { 1, null })
3788     {
3789 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3790 jsr166 1.121 CompletableFuture<Integer> g = new CompletableFuture<>();
3791     long startTime = System.nanoTime();
3792     f.complete(v1);
3793 jsr166 1.145 assertSame(f, f.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
3794     assertSame(g, g.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
3795 jsr166 1.121 g.complete(v1);
3796     checkCompletedNormally(f, v1);
3797     checkCompletedNormally(g, v1);
3798     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3799     }}
3800 dl 1.103
3801     /**
3802     * delayedExecutor returns an executor that delays submission
3803     */
3804 jsr166 1.121 public void testDelayedExecutor() {
3805     testInParallel(() -> testDelayedExecutor(null, null),
3806     () -> testDelayedExecutor(null, 1),
3807     () -> testDelayedExecutor(new ThreadExecutor(), 1),
3808     () -> testDelayedExecutor(new ThreadExecutor(), 1));
3809 dl 1.103 }
3810    
3811 jsr166 1.121 public void testDelayedExecutor(Executor executor, Integer v) throws Exception {
3812     long timeoutMillis = timeoutMillis();
3813     // Use an "unreasonably long" long timeout to catch lingering threads
3814     long longTimeoutMillis = 1000 * 60 * 60 * 24;
3815     final Executor delayer, longDelayer;
3816     if (executor == null) {
3817     delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS);
3818     longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS);
3819     } else {
3820     delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS, executor);
3821     longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS, executor);
3822     }
3823 dl 1.103 long startTime = System.nanoTime();
3824 jsr166 1.121 CompletableFuture<Integer> f =
3825     CompletableFuture.supplyAsync(() -> v, delayer);
3826     CompletableFuture<Integer> g =
3827     CompletableFuture.supplyAsync(() -> v, longDelayer);
3828    
3829     assertNull(g.getNow(null));
3830    
3831     assertSame(v, f.get(LONG_DELAY_MS, MILLISECONDS));
3832     long millisElapsed = millisElapsedSince(startTime);
3833     assertTrue(millisElapsed >= timeoutMillis);
3834     assertTrue(millisElapsed < LONG_DELAY_MS / 2);
3835    
3836     checkCompletedNormally(f, v);
3837    
3838     checkIncomplete(g);
3839     assertTrue(g.cancel(true));
3840 dl 1.103 }
3841    
3842 jsr166 1.82 //--- tests of implementation details; not part of official tck ---
3843    
3844     Object resultOf(CompletableFuture<?> f) {
3845 jsr166 1.147 SecurityManager sm = System.getSecurityManager();
3846     if (sm != null) {
3847     try {
3848     System.setSecurityManager(null);
3849     } catch (SecurityException giveUp) {
3850     return "Reflection not available";
3851     }
3852     }
3853    
3854 jsr166 1.82 try {
3855     java.lang.reflect.Field resultField
3856     = CompletableFuture.class.getDeclaredField("result");
3857     resultField.setAccessible(true);
3858     return resultField.get(f);
3859 jsr166 1.147 } catch (Throwable t) {
3860     throw new AssertionError(t);
3861     } finally {
3862     if (sm != null) System.setSecurityManager(sm);
3863     }
3864 jsr166 1.82 }
3865    
3866     public void testExceptionPropagationReusesResultObject() {
3867     if (!testImplementationDetails) return;
3868     for (ExecutionMode m : ExecutionMode.values())
3869     {
3870 jsr166 1.83 final CFException ex = new CFException();
3871     final CompletableFuture<Integer> v42 = CompletableFuture.completedFuture(42);
3872     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3873    
3874 jsr166 1.164 final Runnable noopRunnable = new Noop(m);
3875     final Consumer<Integer> noopConsumer = new NoopConsumer(m);
3876     final Function<Integer, Integer> incFunction = new IncFunction(m);
3877    
3878 jsr166 1.89 List<Function<CompletableFuture<Integer>, CompletableFuture<?>>> funs
3879 jsr166 1.83 = new ArrayList<>();
3880    
3881 jsr166 1.180 funs.add(y -> m.thenRun(y, noopRunnable));
3882     funs.add(y -> m.thenAccept(y, noopConsumer));
3883     funs.add(y -> m.thenApply(y, incFunction));
3884    
3885     funs.add(y -> m.runAfterEither(y, incomplete, noopRunnable));
3886     funs.add(y -> m.acceptEither(y, incomplete, noopConsumer));
3887     funs.add(y -> m.applyToEither(y, incomplete, incFunction));
3888    
3889     funs.add(y -> m.runAfterBoth(y, v42, noopRunnable));
3890     funs.add(y -> m.runAfterBoth(v42, y, noopRunnable));
3891     funs.add(y -> m.thenAcceptBoth(y, v42, new SubtractAction(m)));
3892     funs.add(y -> m.thenAcceptBoth(v42, y, new SubtractAction(m)));
3893     funs.add(y -> m.thenCombine(y, v42, new SubtractFunction(m)));
3894     funs.add(y -> m.thenCombine(v42, y, new SubtractFunction(m)));
3895    
3896     funs.add(y -> m.whenComplete(y, (Integer r, Throwable t) -> {}));
3897    
3898     funs.add(y -> m.thenCompose(y, new CompletableFutureInc(m)));
3899    
3900     funs.add(y -> CompletableFuture.allOf(y));
3901     funs.add(y -> CompletableFuture.allOf(y, v42));
3902     funs.add(y -> CompletableFuture.allOf(v42, y));
3903     funs.add(y -> CompletableFuture.anyOf(y));
3904     funs.add(y -> CompletableFuture.anyOf(y, incomplete));
3905     funs.add(y -> CompletableFuture.anyOf(incomplete, y));
3906 jsr166 1.85
3907 jsr166 1.83 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3908 jsr166 1.89 fun : funs) {
3909 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3910     f.completeExceptionally(ex);
3911 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3912 jsr166 1.83 checkCompletedWithWrappedException(src, ex);
3913 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3914 jsr166 1.83 checkCompletedWithWrappedException(dep, ex);
3915     assertSame(resultOf(src), resultOf(dep));
3916     }
3917    
3918     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3919 jsr166 1.89 fun : funs) {
3920 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3921 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3922 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3923 jsr166 1.83 f.completeExceptionally(ex);
3924     checkCompletedWithWrappedException(src, ex);
3925     checkCompletedWithWrappedException(dep, ex);
3926     assertSame(resultOf(src), resultOf(dep));
3927     }
3928    
3929     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3930     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3931 jsr166 1.89 fun : funs) {
3932 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3933     f.cancel(mayInterruptIfRunning);
3934     checkCancelled(f);
3935 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3936 jsr166 1.83 checkCompletedWithWrappedCancellationException(src);
3937 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3938 jsr166 1.83 checkCompletedWithWrappedCancellationException(dep);
3939     assertSame(resultOf(src), resultOf(dep));
3940     }
3941    
3942     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3943     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3944 jsr166 1.89 fun : funs) {
3945 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3946 jsr166 1.164 CompletableFuture<Integer> src = m.thenApply(f, incFunction);
3947 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3948 jsr166 1.83 f.cancel(mayInterruptIfRunning);
3949     checkCancelled(f);
3950     checkCompletedWithWrappedCancellationException(src);
3951     checkCompletedWithWrappedCancellationException(dep);
3952     assertSame(resultOf(src), resultOf(dep));
3953     }
3954 jsr166 1.82 }}
3955    
3956 jsr166 1.123 /**
3957 jsr166 1.165 * Minimal completion stages throw UOE for most non-CompletionStage methods
3958 jsr166 1.123 */
3959     public void testMinimalCompletionStage_minimality() {
3960     if (!testImplementationDetails) return;
3961     Function<Method, String> toSignature =
3962 jsr166 1.180 method -> method.getName() + Arrays.toString(method.getParameterTypes());
3963 jsr166 1.124 Predicate<Method> isNotStatic =
3964 jsr166 1.180 method -> (method.getModifiers() & Modifier.STATIC) == 0;
3965 jsr166 1.123 List<Method> minimalMethods =
3966     Stream.of(Object.class, CompletionStage.class)
3967 jsr166 1.180 .flatMap(klazz -> Stream.of(klazz.getMethods()))
3968 jsr166 1.124 .filter(isNotStatic)
3969 jsr166 1.123 .collect(Collectors.toList());
3970     // Methods from CompletableFuture permitted NOT to throw UOE
3971     String[] signatureWhitelist = {
3972     "newIncompleteFuture[]",
3973     "defaultExecutor[]",
3974     "minimalCompletionStage[]",
3975     "copy[]",
3976     };
3977     Set<String> permittedMethodSignatures =
3978     Stream.concat(minimalMethods.stream().map(toSignature),
3979     Stream.of(signatureWhitelist))
3980     .collect(Collectors.toSet());
3981     List<Method> allMethods = Stream.of(CompletableFuture.class.getMethods())
3982 jsr166 1.124 .filter(isNotStatic)
3983 jsr166 1.180 .filter(method -> !permittedMethodSignatures.contains(toSignature.apply(method)))
3984 jsr166 1.123 .collect(Collectors.toList());
3985    
3986 jsr166 1.165 List<CompletionStage<Integer>> stages = new ArrayList<>();
3987 jsr166 1.173 CompletionStage<Integer> min =
3988     new CompletableFuture<Integer>().minimalCompletionStage();
3989     stages.add(min);
3990     stages.add(min.thenApply(x -> x));
3991 jsr166 1.165 stages.add(CompletableFuture.completedStage(1));
3992 jsr166 1.166 stages.add(CompletableFuture.failedStage(new CFException()));
3993 jsr166 1.123
3994     List<Method> bugs = new ArrayList<>();
3995     for (Method method : allMethods) {
3996     Class<?>[] parameterTypes = method.getParameterTypes();
3997     Object[] args = new Object[parameterTypes.length];
3998     // Manufacture boxed primitives for primitive params
3999     for (int i = 0; i < args.length; i++) {
4000     Class<?> type = parameterTypes[i];
4001     if (parameterTypes[i] == boolean.class)
4002     args[i] = false;
4003     else if (parameterTypes[i] == int.class)
4004     args[i] = 0;
4005     else if (parameterTypes[i] == long.class)
4006     args[i] = 0L;
4007     }
4008 jsr166 1.165 for (CompletionStage<Integer> stage : stages) {
4009     try {
4010     method.invoke(stage, args);
4011 jsr166 1.123 bugs.add(method);
4012     }
4013 jsr166 1.165 catch (java.lang.reflect.InvocationTargetException expected) {
4014     if (! (expected.getCause() instanceof UnsupportedOperationException)) {
4015     bugs.add(method);
4016     // expected.getCause().printStackTrace();
4017     }
4018     }
4019     catch (ReflectiveOperationException bad) { throw new Error(bad); }
4020 jsr166 1.123 }
4021     }
4022     if (!bugs.isEmpty())
4023 jsr166 1.165 throw new Error("Methods did not throw UOE: " + bugs);
4024 jsr166 1.123 }
4025    
4026 jsr166 1.173 /**
4027 jsr166 1.176 * minimalStage.toCompletableFuture() returns a CompletableFuture that
4028     * is completed normally, with the same value, when source is.
4029     */
4030     public void testMinimalCompletionStage_toCompletableFuture_normalCompletion() {
4031     for (boolean createIncomplete : new boolean[] { true, false })
4032     for (Integer v1 : new Integer[] { 1, null })
4033     {
4034     CompletableFuture<Integer> f = new CompletableFuture<>();
4035     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4036     if (!createIncomplete) assertTrue(f.complete(v1));
4037     CompletableFuture<Integer> g = minimal.toCompletableFuture();
4038     if (createIncomplete) {
4039     checkIncomplete(f);
4040     checkIncomplete(g);
4041     assertTrue(f.complete(v1));
4042     }
4043     checkCompletedNormally(f, v1);
4044     checkCompletedNormally(g, v1);
4045     }}
4046    
4047     /**
4048 jsr166 1.177 * minimalStage.toCompletableFuture() returns a CompletableFuture that
4049     * is completed exceptionally when source is.
4050     */
4051     public void testMinimalCompletionStage_toCompletableFuture_exceptionalCompletion() {
4052     for (boolean createIncomplete : new boolean[] { true, false })
4053     {
4054     CFException ex = new CFException();
4055     CompletableFuture<Integer> f = new CompletableFuture<>();
4056     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4057     if (!createIncomplete) f.completeExceptionally(ex);
4058     CompletableFuture<Integer> g = minimal.toCompletableFuture();
4059     if (createIncomplete) {
4060     checkIncomplete(f);
4061     checkIncomplete(g);
4062     f.completeExceptionally(ex);
4063     }
4064     checkCompletedExceptionally(f, ex);
4065     checkCompletedWithWrappedException(g, ex);
4066     }}
4067    
4068     /**
4069 jsr166 1.173 * minimalStage.toCompletableFuture() gives mutable CompletableFuture
4070     */
4071     public void testMinimalCompletionStage_toCompletableFuture_mutable() {
4072     for (Integer v1 : new Integer[] { 1, null })
4073     {
4074     CompletableFuture<Integer> f = new CompletableFuture<>();
4075     CompletionStage minimal = f.minimalCompletionStage();
4076     CompletableFuture<Integer> g = minimal.toCompletableFuture();
4077 jsr166 1.178 assertTrue(g.complete(v1));
4078 jsr166 1.173 checkCompletedNormally(g, v1);
4079     checkIncomplete(f);
4080     checkIncomplete(minimal.toCompletableFuture());
4081     }}
4082    
4083     /**
4084     * minimalStage.toCompletableFuture().join() awaits completion
4085     */
4086     public void testMinimalCompletionStage_toCompletableFuture_join() throws Exception {
4087     for (boolean createIncomplete : new boolean[] { true, false })
4088     for (Integer v1 : new Integer[] { 1, null })
4089     {
4090     CompletableFuture<Integer> f = new CompletableFuture<>();
4091     if (!createIncomplete) assertTrue(f.complete(v1));
4092     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4093     if (createIncomplete) assertTrue(f.complete(v1));
4094     assertEquals(v1, minimal.toCompletableFuture().join());
4095     assertEquals(v1, minimal.toCompletableFuture().get());
4096     checkCompletedNormally(minimal.toCompletableFuture(), v1);
4097     }}
4098    
4099 jsr166 1.175 /**
4100     * Completion of a toCompletableFuture copy of a minimal stage
4101     * does not complete its source.
4102     */
4103     public void testMinimalCompletionStage_toCompletableFuture_oneWayPropagation() {
4104     CompletableFuture<Integer> f = new CompletableFuture<>();
4105     CompletionStage<Integer> g = f.minimalCompletionStage();
4106     assertTrue(g.toCompletableFuture().complete(1));
4107     assertTrue(g.toCompletableFuture().complete(null));
4108     assertTrue(g.toCompletableFuture().cancel(true));
4109     assertTrue(g.toCompletableFuture().cancel(false));
4110     assertTrue(g.toCompletableFuture().completeExceptionally(new CFException()));
4111     checkIncomplete(g.toCompletableFuture());
4112     f.complete(1);
4113     checkCompletedNormally(g.toCompletableFuture(), 1);
4114     }
4115    
4116 jsr166 1.173 /** Demo utility method for external reliable toCompletableFuture */
4117     static <T> CompletableFuture<T> toCompletableFuture(CompletionStage<T> stage) {
4118     CompletableFuture<T> f = new CompletableFuture<>();
4119     stage.handle((T t, Throwable ex) -> {
4120     if (ex != null) f.completeExceptionally(ex);
4121     else f.complete(t);
4122     return null;
4123     });
4124     return f;
4125     }
4126    
4127     /** Demo utility method to join a CompletionStage */
4128     static <T> T join(CompletionStage<T> stage) {
4129     return toCompletableFuture(stage).join();
4130     }
4131    
4132     /**
4133     * Joining a minimal stage "by hand" works
4134     */
4135     public void testMinimalCompletionStage_join_by_hand() {
4136     for (boolean createIncomplete : new boolean[] { true, false })
4137     for (Integer v1 : new Integer[] { 1, null })
4138     {
4139     CompletableFuture<Integer> f = new CompletableFuture<>();
4140     CompletionStage<Integer> minimal = f.minimalCompletionStage();
4141     CompletableFuture<Integer> g = new CompletableFuture<>();
4142     if (!createIncomplete) assertTrue(f.complete(v1));
4143 jsr166 1.180 minimal.thenAccept(x -> g.complete(x));
4144 jsr166 1.173 if (createIncomplete) assertTrue(f.complete(v1));
4145     g.join();
4146     checkCompletedNormally(g, v1);
4147     checkCompletedNormally(f, v1);
4148     assertEquals(v1, join(minimal));
4149     }}
4150    
4151 jsr166 1.128 static class Monad {
4152 jsr166 1.131 static class ZeroException extends RuntimeException {
4153     public ZeroException() { super("monadic zero"); }
4154 jsr166 1.128 }
4155     // "return", "unit"
4156     static <T> CompletableFuture<T> unit(T value) {
4157     return completedFuture(value);
4158     }
4159     // monadic zero ?
4160 jsr166 1.129 static <T> CompletableFuture<T> zero() {
4161 jsr166 1.131 return failedFuture(new ZeroException());
4162 jsr166 1.128 }
4163     // >=>
4164     static <T,U,V> Function<T, CompletableFuture<V>> compose
4165     (Function<T, CompletableFuture<U>> f,
4166     Function<U, CompletableFuture<V>> g) {
4167 jsr166 1.180 return x -> f.apply(x).thenCompose(g);
4168 jsr166 1.128 }
4169    
4170     static void assertZero(CompletableFuture<?> f) {
4171     try {
4172     f.getNow(null);
4173     throw new AssertionFailedError("should throw");
4174     } catch (CompletionException success) {
4175 jsr166 1.131 assertTrue(success.getCause() instanceof ZeroException);
4176 jsr166 1.128 }
4177     }
4178    
4179     static <T> void assertFutureEquals(CompletableFuture<T> f,
4180     CompletableFuture<T> g) {
4181     T fval = null, gval = null;
4182     Throwable fex = null, gex = null;
4183    
4184     try { fval = f.get(); }
4185     catch (ExecutionException ex) { fex = ex.getCause(); }
4186     catch (Throwable ex) { fex = ex; }
4187    
4188     try { gval = g.get(); }
4189     catch (ExecutionException ex) { gex = ex.getCause(); }
4190     catch (Throwable ex) { gex = ex; }
4191    
4192     if (fex != null || gex != null)
4193     assertSame(fex.getClass(), gex.getClass());
4194     else
4195     assertEquals(fval, gval);
4196     }
4197    
4198     static class PlusFuture<T> extends CompletableFuture<T> {
4199     AtomicReference<Throwable> firstFailure = new AtomicReference<>(null);
4200     }
4201    
4202 jsr166 1.137 /** Implements "monadic plus". */
4203 jsr166 1.128 static <T> CompletableFuture<T> plus(CompletableFuture<? extends T> f,
4204     CompletableFuture<? extends T> g) {
4205     PlusFuture<T> plus = new PlusFuture<T>();
4206 jsr166 1.129 BiConsumer<T, Throwable> action = (T result, Throwable ex) -> {
4207 jsr166 1.137 try {
4208     if (ex == null) {
4209     if (plus.complete(result))
4210     if (plus.firstFailure.get() != null)
4211     plus.firstFailure.set(null);
4212     }
4213     else if (plus.firstFailure.compareAndSet(null, ex)) {
4214     if (plus.isDone())
4215 jsr166 1.128 plus.firstFailure.set(null);
4216 jsr166 1.137 }
4217     else {
4218     // first failure has precedence
4219     Throwable first = plus.firstFailure.getAndSet(null);
4220    
4221     // may fail with "Self-suppression not permitted"
4222     try { first.addSuppressed(ex); }
4223     catch (Exception ignored) {}
4224    
4225     plus.completeExceptionally(first);
4226     }
4227     } catch (Throwable unexpected) {
4228     plus.completeExceptionally(unexpected);
4229 jsr166 1.128 }
4230     };
4231     f.whenComplete(action);
4232     g.whenComplete(action);
4233     return plus;
4234     }
4235     }
4236    
4237     /**
4238     * CompletableFuture is an additive monad - sort of.
4239     * https://en.wikipedia.org/wiki/Monad_(functional_programming)#Additive_monads
4240     */
4241     public void testAdditiveMonad() throws Throwable {
4242 jsr166 1.129 Function<Long, CompletableFuture<Long>> unit = Monad::unit;
4243     CompletableFuture<Long> zero = Monad.zero();
4244    
4245 jsr166 1.128 // Some mutually non-commutative functions
4246     Function<Long, CompletableFuture<Long>> triple
4247 jsr166 1.180 = x -> Monad.unit(3 * x);
4248 jsr166 1.128 Function<Long, CompletableFuture<Long>> inc
4249 jsr166 1.180 = x -> Monad.unit(x + 1);
4250 jsr166 1.128
4251     // unit is a right identity: m >>= unit === m
4252 jsr166 1.129 Monad.assertFutureEquals(inc.apply(5L).thenCompose(unit),
4253     inc.apply(5L));
4254 jsr166 1.128 // unit is a left identity: (unit x) >>= f === f x
4255 jsr166 1.129 Monad.assertFutureEquals(unit.apply(5L).thenCompose(inc),
4256     inc.apply(5L));
4257    
4258 jsr166 1.128 // associativity: (m >>= f) >>= g === m >>= ( \x -> (f x >>= g) )
4259     Monad.assertFutureEquals(
4260     unit.apply(5L).thenCompose(inc).thenCompose(triple),
4261 jsr166 1.180 unit.apply(5L).thenCompose(x -> inc.apply(x).thenCompose(triple)));
4262 jsr166 1.128
4263 jsr166 1.129 // The case for CompletableFuture as an additive monad is weaker...
4264    
4265 jsr166 1.128 // zero is a monadic zero
4266 jsr166 1.129 Monad.assertZero(zero);
4267    
4268 jsr166 1.128 // left zero: zero >>= f === zero
4269 jsr166 1.129 Monad.assertZero(zero.thenCompose(inc));
4270     // right zero: f >>= (\x -> zero) === zero
4271 jsr166 1.180 Monad.assertZero(inc.apply(5L).thenCompose(x -> zero));
4272 jsr166 1.129
4273     // f plus zero === f
4274     Monad.assertFutureEquals(Monad.unit(5L),
4275     Monad.plus(Monad.unit(5L), zero));
4276     // zero plus f === f
4277     Monad.assertFutureEquals(Monad.unit(5L),
4278     Monad.plus(zero, Monad.unit(5L)));
4279 jsr166 1.128 // zero plus zero === zero
4280 jsr166 1.129 Monad.assertZero(Monad.plus(zero, zero));
4281 jsr166 1.128 {
4282 jsr166 1.129 CompletableFuture<Long> f = Monad.plus(Monad.unit(5L),
4283     Monad.unit(8L));
4284     // non-determinism
4285     assertTrue(f.get() == 5L || f.get() == 8L);
4286 jsr166 1.128 }
4287    
4288     CompletableFuture<Long> godot = new CompletableFuture<>();
4289 jsr166 1.129 // f plus godot === f (doesn't wait for godot)
4290     Monad.assertFutureEquals(Monad.unit(5L),
4291     Monad.plus(Monad.unit(5L), godot));
4292     // godot plus f === f (doesn't wait for godot)
4293     Monad.assertFutureEquals(Monad.unit(5L),
4294     Monad.plus(godot, Monad.unit(5L)));
4295 jsr166 1.128 }
4296    
4297 jsr166 1.163 /** Test long recursive chains of CompletableFutures with cascading completions */
4298     public void testRecursiveChains() throws Throwable {
4299     for (ExecutionMode m : ExecutionMode.values())
4300     for (boolean addDeadEnds : new boolean[] { true, false })
4301     {
4302     final int val = 42;
4303     final int n = expensiveTests ? 1_000 : 2;
4304     CompletableFuture<Integer> head = new CompletableFuture<>();
4305     CompletableFuture<Integer> tail = head;
4306     for (int i = 0; i < n; i++) {
4307     if (addDeadEnds) m.thenApply(tail, v -> v + 1);
4308     tail = m.thenApply(tail, v -> v + 1);
4309     if (addDeadEnds) m.applyToEither(tail, tail, v -> v + 1);
4310     tail = m.applyToEither(tail, tail, v -> v + 1);
4311     if (addDeadEnds) m.thenCombine(tail, tail, (v, w) -> v + 1);
4312     tail = m.thenCombine(tail, tail, (v, w) -> v + 1);
4313     }
4314     head.complete(val);
4315     assertEquals(val + 3 * n, (int) tail.join());
4316     }}
4317    
4318 jsr166 1.140 /**
4319     * A single CompletableFuture with many dependents.
4320 jsr166 1.141 * A demo of scalability - runtime is O(n).
4321 jsr166 1.140 */
4322     public void testManyDependents() throws Throwable {
4323 jsr166 1.159 final int n = expensiveTests ? 1_000_000 : 10;
4324 jsr166 1.140 final CompletableFuture<Void> head = new CompletableFuture<>();
4325     final CompletableFuture<Void> complete = CompletableFuture.completedFuture((Void)null);
4326     final AtomicInteger count = new AtomicInteger(0);
4327     for (int i = 0; i < n; i++) {
4328     head.thenRun(() -> count.getAndIncrement());
4329 jsr166 1.180 head.thenAccept(x -> count.getAndIncrement());
4330     head.thenApply(x -> count.getAndIncrement());
4331 jsr166 1.141
4332 jsr166 1.140 head.runAfterBoth(complete, () -> count.getAndIncrement());
4333     head.thenAcceptBoth(complete, (x, y) -> count.getAndIncrement());
4334     head.thenCombine(complete, (x, y) -> count.getAndIncrement());
4335 jsr166 1.141 complete.runAfterBoth(head, () -> count.getAndIncrement());
4336     complete.thenAcceptBoth(head, (x, y) -> count.getAndIncrement());
4337     complete.thenCombine(head, (x, y) -> count.getAndIncrement());
4338    
4339     head.runAfterEither(new CompletableFuture<Void>(), () -> count.getAndIncrement());
4340 jsr166 1.180 head.acceptEither(new CompletableFuture<Void>(), x -> count.getAndIncrement());
4341     head.applyToEither(new CompletableFuture<Void>(), x -> count.getAndIncrement());
4342 jsr166 1.141 new CompletableFuture<Void>().runAfterEither(head, () -> count.getAndIncrement());
4343 jsr166 1.180 new CompletableFuture<Void>().acceptEither(head, x -> count.getAndIncrement());
4344     new CompletableFuture<Void>().applyToEither(head, x -> count.getAndIncrement());
4345 jsr166 1.140 }
4346     head.complete(null);
4347 jsr166 1.141 assertEquals(5 * 3 * n, count.get());
4348 jsr166 1.140 }
4349    
4350 jsr166 1.160 /** ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest tck */
4351     public void testCoCompletionGarbageRetention() throws Throwable {
4352 jsr166 1.159 final int n = expensiveTests ? 1_000_000 : 10;
4353 jsr166 1.156 final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
4354     CompletableFuture<Integer> f;
4355     for (int i = 0; i < n; i++) {
4356     f = new CompletableFuture<>();
4357     f.runAfterEither(incomplete, () -> {});
4358     f.complete(null);
4359    
4360     f = new CompletableFuture<>();
4361 jsr166 1.180 f.acceptEither(incomplete, x -> {});
4362 jsr166 1.156 f.complete(null);
4363    
4364     f = new CompletableFuture<>();
4365 jsr166 1.180 f.applyToEither(incomplete, x -> x);
4366 jsr166 1.156 f.complete(null);
4367    
4368     f = new CompletableFuture<>();
4369     CompletableFuture.anyOf(new CompletableFuture<?>[] { f, incomplete });
4370     f.complete(null);
4371     }
4372    
4373     for (int i = 0; i < n; i++) {
4374     f = new CompletableFuture<>();
4375     incomplete.runAfterEither(f, () -> {});
4376     f.complete(null);
4377    
4378     f = new CompletableFuture<>();
4379 jsr166 1.180 incomplete.acceptEither(f, x -> {});
4380 jsr166 1.156 f.complete(null);
4381    
4382     f = new CompletableFuture<>();
4383 jsr166 1.180 incomplete.applyToEither(f, x -> x);
4384 jsr166 1.156 f.complete(null);
4385    
4386     f = new CompletableFuture<>();
4387     CompletableFuture.anyOf(new CompletableFuture<?>[] { incomplete, f });
4388     f.complete(null);
4389     }
4390     }
4391    
4392 jsr166 1.167 /**
4393 jsr166 1.170 * Reproduction recipe for:
4394     * 8160402: Garbage retention with CompletableFuture.anyOf
4395     * 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
4396 jsr166 1.158 */
4397     public void testAnyOfGarbageRetention() throws Throwable {
4398     for (Integer v : new Integer[] { 1, null })
4399     {
4400     final int n = expensiveTests ? 100_000 : 10;
4401     CompletableFuture<Integer>[] fs
4402     = (CompletableFuture<Integer>[]) new CompletableFuture<?>[100];
4403     for (int i = 0; i < fs.length; i++)
4404     fs[i] = new CompletableFuture<>();
4405     fs[fs.length - 1].complete(v);
4406     for (int i = 0; i < n; i++)
4407     checkCompletedNormally(CompletableFuture.anyOf(fs), v);
4408     }}
4409    
4410 jsr166 1.167 /**
4411     * Checks for garbage retention with allOf.
4412     *
4413     * As of 2016-07, fails with OOME:
4414     * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testCancelledAllOfGarbageRetention tck
4415     */
4416 jsr166 1.158 public void testCancelledAllOfGarbageRetention() throws Throwable {
4417     final int n = expensiveTests ? 100_000 : 10;
4418     CompletableFuture<Integer>[] fs
4419     = (CompletableFuture<Integer>[]) new CompletableFuture<?>[100];
4420     for (int i = 0; i < fs.length; i++)
4421     fs[i] = new CompletableFuture<>();
4422     for (int i = 0; i < n; i++)
4423     assertTrue(CompletableFuture.allOf(fs).cancel(false));
4424     }
4425    
4426 jsr166 1.168 /**
4427     * Checks for garbage retention when a dependent future is
4428     * cancelled and garbage-collected.
4429 jsr166 1.169 * 8161600: Garbage retention when source CompletableFutures are never completed
4430 jsr166 1.168 *
4431     * As of 2016-07, fails with OOME:
4432     * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testCancelledGarbageRetention tck
4433     */
4434     public void testCancelledGarbageRetention() throws Throwable {
4435     final int n = expensiveTests ? 100_000 : 10;
4436     CompletableFuture<Integer> neverCompleted = new CompletableFuture<>();
4437     for (int i = 0; i < n; i++)
4438     assertTrue(neverCompleted.thenRun(() -> {}).cancel(true));
4439     }
4440    
4441 jsr166 1.179 /**
4442     * Checks for garbage retention when MinimalStage.toCompletableFuture()
4443     * is invoked many times.
4444     * 8161600: Garbage retention when source CompletableFutures are never completed
4445     *
4446     * As of 2016-07, fails with OOME:
4447     * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testToCompletableFutureGarbageRetention tck
4448     */
4449     public void testToCompletableFutureGarbageRetention() throws Throwable {
4450     final int n = expensiveTests ? 900_000 : 10;
4451     CompletableFuture<Integer> neverCompleted = new CompletableFuture<>();
4452     CompletionStage minimal = neverCompleted.minimalCompletionStage();
4453     for (int i = 0; i < n; i++)
4454     assertTrue(minimal.toCompletableFuture().cancel(true));
4455     }
4456    
4457 jsr166 1.123 // static <U> U join(CompletionStage<U> stage) {
4458     // CompletableFuture<U> f = new CompletableFuture<>();
4459     // stage.whenComplete((v, ex) -> {
4460     // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
4461     // });
4462     // return f.join();
4463     // }
4464    
4465     // static <U> boolean isDone(CompletionStage<U> stage) {
4466     // CompletableFuture<U> f = new CompletableFuture<>();
4467     // stage.whenComplete((v, ex) -> {
4468     // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
4469     // });
4470     // return f.isDone();
4471     // }
4472    
4473     // static <U> U join2(CompletionStage<U> stage) {
4474     // return stage.toCompletableFuture().copy().join();
4475     // }
4476    
4477     // static <U> boolean isDone2(CompletionStage<U> stage) {
4478     // return stage.toCompletableFuture().copy().isDone();
4479     // }
4480    
4481 jsr166 1.1 }