ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.188
Committed: Wed Aug 16 17:18:34 2017 UTC (6 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.187: +31 -14 lines
Log Message:
8186265: Make toString() methods of "task" objects more useful

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