ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.194
Committed: Tue May 29 03:42:37 2018 UTC (5 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.193: +2 -2 lines
Log Message:
use varargs

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