ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.196
Committed: Sun Jul 22 20:17:46 2018 UTC (5 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.195: +7 -3 lines
Log Message:
Fix errorprone warning [AssertionFailureIgnored]

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