ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.200
Committed: Thu Sep 20 20:17:13 2018 UTC (5 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.199: +0 -1 lines
Log Message:
whitespace

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