ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.119
Committed: Sun Sep 6 16:31:46 2015 UTC (8 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.118: +2 -2 lines
Log Message:
fix testFailedFuture and testFailedStage

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    
11     import java.util.ArrayList;
12     import java.util.List;
13     import java.util.Objects;
14 jsr166 1.1 import java.util.concurrent.Callable;
15     import java.util.concurrent.CancellationException;
16     import java.util.concurrent.CompletableFuture;
17 dl 1.5 import java.util.concurrent.CompletionException;
18 jsr166 1.35 import java.util.concurrent.CompletionStage;
19 jsr166 1.98 import java.util.concurrent.ExecutionException;
20     import java.util.concurrent.Executor;
21 jsr166 1.48 import java.util.concurrent.ForkJoinPool;
22     import java.util.concurrent.ForkJoinTask;
23 jsr166 1.1 import java.util.concurrent.TimeoutException;
24 dl 1.103 import java.util.concurrent.TimeUnit;
25 jsr166 1.1 import java.util.concurrent.atomic.AtomicInteger;
26 dl 1.103 import java.util.concurrent.atomic.AtomicReference;
27 jsr166 1.98 import java.util.function.BiConsumer;
28     import java.util.function.BiFunction;
29 dl 1.5 import java.util.function.Consumer;
30     import java.util.function.Function;
31 jsr166 1.98 import java.util.function.Supplier;
32    
33     import junit.framework.Test;
34     import junit.framework.TestSuite;
35 jsr166 1.1
36     public class CompletableFutureTest extends JSR166TestCase {
37    
38     public static void main(String[] args) {
39 jsr166 1.102 main(suite(), args);
40 jsr166 1.1 }
41     public static Test suite() {
42     return new TestSuite(CompletableFutureTest.class);
43     }
44    
45 dl 1.5 static class CFException extends RuntimeException {}
46    
47 jsr166 1.4 void checkIncomplete(CompletableFuture<?> f) {
48     assertFalse(f.isDone());
49     assertFalse(f.isCancelled());
50 dl 1.103 assertTrue(f.toString().contains("Not completed"));
51 jsr166 1.4 try {
52     assertNull(f.getNow(null));
53     } catch (Throwable fail) { threadUnexpectedException(fail); }
54     try {
55     f.get(0L, SECONDS);
56     shouldThrow();
57     }
58     catch (TimeoutException success) {}
59     catch (Throwable fail) { threadUnexpectedException(fail); }
60     }
61    
62 jsr166 1.11 <T> void checkCompletedNormally(CompletableFuture<T> f, T value) {
63 jsr166 1.95 checkTimedGet(f, value);
64    
65 jsr166 1.20 try {
66 dl 1.5 assertEquals(value, f.join());
67 jsr166 1.4 } catch (Throwable fail) { threadUnexpectedException(fail); }
68     try {
69 dl 1.5 assertEquals(value, f.getNow(null));
70 jsr166 1.4 } catch (Throwable fail) { threadUnexpectedException(fail); }
71     try {
72 dl 1.5 assertEquals(value, f.get());
73 jsr166 1.4 } catch (Throwable fail) { threadUnexpectedException(fail); }
74 dl 1.5 assertTrue(f.isDone());
75     assertFalse(f.isCancelled());
76 dl 1.26 assertFalse(f.isCompletedExceptionally());
77 dl 1.5 assertTrue(f.toString().contains("[Completed normally]"));
78     }
79    
80     void checkCompletedWithWrappedCFException(CompletableFuture<?> f) {
81 jsr166 1.95 long startTime = System.nanoTime();
82     long timeoutMillis = LONG_DELAY_MS;
83 dl 1.5 try {
84 jsr166 1.95 f.get(timeoutMillis, MILLISECONDS);
85 jsr166 1.20 shouldThrow();
86     } catch (ExecutionException success) {
87     assertTrue(success.getCause() instanceof CFException);
88     } catch (Throwable fail) { threadUnexpectedException(fail); }
89 jsr166 1.95 assertTrue(millisElapsedSince(startTime) < timeoutMillis/2);
90    
91 jsr166 1.20 try {
92 dl 1.5 f.join();
93     shouldThrow();
94 jsr166 1.8 } catch (CompletionException success) {
95     assertTrue(success.getCause() instanceof CFException);
96 dl 1.5 }
97     try {
98     f.getNow(null);
99     shouldThrow();
100 jsr166 1.8 } catch (CompletionException success) {
101     assertTrue(success.getCause() instanceof CFException);
102 dl 1.5 }
103     try {
104     f.get();
105     shouldThrow();
106 jsr166 1.8 } catch (ExecutionException success) {
107     assertTrue(success.getCause() instanceof CFException);
108     } catch (Throwable fail) { threadUnexpectedException(fail); }
109 dl 1.5 assertTrue(f.isDone());
110     assertFalse(f.isCancelled());
111 jsr166 1.14 assertTrue(f.toString().contains("[Completed exceptionally]"));
112 dl 1.5 }
113    
114 jsr166 1.72 <U> void checkCompletedExceptionallyWithRootCause(CompletableFuture<U> f,
115     Throwable ex) {
116 jsr166 1.95 long startTime = System.nanoTime();
117     long timeoutMillis = LONG_DELAY_MS;
118 jsr166 1.33 try {
119 jsr166 1.95 f.get(timeoutMillis, MILLISECONDS);
120 jsr166 1.33 shouldThrow();
121     } catch (ExecutionException success) {
122     assertSame(ex, success.getCause());
123     } catch (Throwable fail) { threadUnexpectedException(fail); }
124 jsr166 1.95 assertTrue(millisElapsedSince(startTime) < timeoutMillis/2);
125    
126 jsr166 1.33 try {
127     f.join();
128     shouldThrow();
129     } catch (CompletionException success) {
130     assertSame(ex, success.getCause());
131     }
132     try {
133     f.getNow(null);
134     shouldThrow();
135     } catch (CompletionException success) {
136     assertSame(ex, success.getCause());
137     }
138     try {
139     f.get();
140     shouldThrow();
141     } catch (ExecutionException success) {
142     assertSame(ex, success.getCause());
143     } catch (Throwable fail) { threadUnexpectedException(fail); }
144 jsr166 1.73
145 jsr166 1.33 assertTrue(f.isDone());
146     assertFalse(f.isCancelled());
147     assertTrue(f.toString().contains("[Completed exceptionally]"));
148     }
149    
150 dl 1.103 <U> void checkCompletedExceptionallyWithTimeout(CompletableFuture<U> f) {
151     long startTime = System.nanoTime();
152     long timeoutMillis = LONG_DELAY_MS;
153     try {
154     f.get(timeoutMillis, MILLISECONDS);
155     shouldThrow();
156     } catch (ExecutionException ex) {
157     assertTrue(ex.getCause() instanceof TimeoutException);
158     } catch (Throwable fail) { threadUnexpectedException(fail); }
159     assertTrue(millisElapsedSince(startTime) < timeoutMillis/2);
160    
161     try {
162     f.join();
163     shouldThrow();
164     } catch (Throwable ex) {
165     assertTrue(ex.getCause() instanceof TimeoutException);
166     }
167    
168     try {
169     f.getNow(null);
170     shouldThrow();
171     } catch (Throwable ex) {
172     assertTrue(ex.getCause() instanceof TimeoutException);
173     }
174    
175     try {
176     f.get();
177     shouldThrow();
178     } catch (ExecutionException ex) {
179     assertTrue(ex.getCause() instanceof TimeoutException);
180     } catch (Throwable fail) { threadUnexpectedException(fail); }
181    
182     assertTrue(f.isDone());
183     assertFalse(f.isCancelled());
184     assertTrue(f.toString().contains("[Completed exceptionally]"));
185     }
186    
187 jsr166 1.72 <U> void checkCompletedWithWrappedException(CompletableFuture<U> f,
188     Throwable ex) {
189     checkCompletedExceptionallyWithRootCause(f, ex);
190     try {
191     CompletableFuture<Throwable> spy = f.handle
192     ((U u, Throwable t) -> t);
193     assertTrue(spy.join() instanceof CompletionException);
194     assertSame(ex, spy.join().getCause());
195     } catch (Throwable fail) { threadUnexpectedException(fail); }
196     }
197    
198     <U> void checkCompletedExceptionally(CompletableFuture<U> f, Throwable ex) {
199     checkCompletedExceptionallyWithRootCause(f, ex);
200     try {
201     CompletableFuture<Throwable> spy = f.handle
202     ((U u, Throwable t) -> t);
203     assertSame(ex, spy.join());
204     } catch (Throwable fail) { threadUnexpectedException(fail); }
205     }
206    
207 dl 1.5 void checkCancelled(CompletableFuture<?> f) {
208 jsr166 1.95 long startTime = System.nanoTime();
209     long timeoutMillis = LONG_DELAY_MS;
210 dl 1.5 try {
211 jsr166 1.95 f.get(timeoutMillis, MILLISECONDS);
212 jsr166 1.20 shouldThrow();
213     } catch (CancellationException success) {
214     } catch (Throwable fail) { threadUnexpectedException(fail); }
215 jsr166 1.95 assertTrue(millisElapsedSince(startTime) < timeoutMillis/2);
216    
217 jsr166 1.20 try {
218 dl 1.5 f.join();
219     shouldThrow();
220 jsr166 1.8 } catch (CancellationException success) {}
221 dl 1.5 try {
222     f.getNow(null);
223     shouldThrow();
224 jsr166 1.8 } catch (CancellationException success) {}
225 dl 1.5 try {
226     f.get();
227     shouldThrow();
228 jsr166 1.8 } catch (CancellationException success) {
229     } catch (Throwable fail) { threadUnexpectedException(fail); }
230 dl 1.5 assertTrue(f.isDone());
231 dl 1.26 assertTrue(f.isCompletedExceptionally());
232 dl 1.5 assertTrue(f.isCancelled());
233 jsr166 1.14 assertTrue(f.toString().contains("[Completed exceptionally]"));
234 dl 1.5 }
235    
236     void checkCompletedWithWrappedCancellationException(CompletableFuture<?> f) {
237 jsr166 1.95 long startTime = System.nanoTime();
238     long timeoutMillis = LONG_DELAY_MS;
239 dl 1.5 try {
240 jsr166 1.95 f.get(timeoutMillis, MILLISECONDS);
241 jsr166 1.20 shouldThrow();
242     } catch (ExecutionException success) {
243     assertTrue(success.getCause() instanceof CancellationException);
244     } catch (Throwable fail) { threadUnexpectedException(fail); }
245 jsr166 1.95 assertTrue(millisElapsedSince(startTime) < timeoutMillis/2);
246    
247 jsr166 1.20 try {
248 dl 1.5 f.join();
249     shouldThrow();
250 jsr166 1.8 } catch (CompletionException success) {
251     assertTrue(success.getCause() instanceof CancellationException);
252 dl 1.5 }
253     try {
254     f.getNow(null);
255     shouldThrow();
256 jsr166 1.8 } catch (CompletionException success) {
257     assertTrue(success.getCause() instanceof CancellationException);
258 dl 1.5 }
259     try {
260     f.get();
261     shouldThrow();
262 jsr166 1.8 } catch (ExecutionException success) {
263     assertTrue(success.getCause() instanceof CancellationException);
264     } catch (Throwable fail) { threadUnexpectedException(fail); }
265 dl 1.5 assertTrue(f.isDone());
266     assertFalse(f.isCancelled());
267 dl 1.26 assertTrue(f.isCompletedExceptionally());
268 jsr166 1.14 assertTrue(f.toString().contains("[Completed exceptionally]"));
269 dl 1.5 }
270    
271     /**
272     * A newly constructed CompletableFuture is incomplete, as indicated
273     * by methods isDone, isCancelled, and getNow
274     */
275     public void testConstructor() {
276 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
277 dl 1.5 checkIncomplete(f);
278     }
279    
280     /**
281     * complete completes normally, as indicated by methods isDone,
282     * isCancelled, join, get, and getNow
283     */
284     public void testComplete() {
285 jsr166 1.78 for (Integer v1 : new Integer[] { 1, null })
286     {
287 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
288 dl 1.5 checkIncomplete(f);
289 jsr166 1.78 assertTrue(f.complete(v1));
290     assertFalse(f.complete(v1));
291     checkCompletedNormally(f, v1);
292     }}
293 dl 1.5
294     /**
295     * completeExceptionally completes exceptionally, as indicated by
296     * methods isDone, isCancelled, join, get, and getNow
297     */
298     public void testCompleteExceptionally() {
299 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
300 jsr166 1.72 CFException ex = new CFException();
301 dl 1.5 checkIncomplete(f);
302 jsr166 1.72 f.completeExceptionally(ex);
303     checkCompletedExceptionally(f, ex);
304 dl 1.5 }
305    
306     /**
307     * cancel completes exceptionally and reports cancelled, as indicated by
308     * methods isDone, isCancelled, join, get, and getNow
309     */
310     public void testCancel() {
311 jsr166 1.78 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
312     {
313 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
314 dl 1.5 checkIncomplete(f);
315 jsr166 1.101 assertTrue(f.cancel(mayInterruptIfRunning));
316     assertTrue(f.cancel(mayInterruptIfRunning));
317     assertTrue(f.cancel(!mayInterruptIfRunning));
318 dl 1.5 checkCancelled(f);
319 jsr166 1.78 }}
320 dl 1.5
321     /**
322     * obtrudeValue forces completion with given value
323     */
324     public void testObtrudeValue() {
325 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
326 dl 1.5 checkIncomplete(f);
327 jsr166 1.78 assertTrue(f.complete(one));
328 dl 1.5 checkCompletedNormally(f, one);
329     f.obtrudeValue(three);
330     checkCompletedNormally(f, three);
331     f.obtrudeValue(two);
332     checkCompletedNormally(f, two);
333 jsr166 1.22 f = new CompletableFuture<>();
334 dl 1.5 f.obtrudeValue(three);
335     checkCompletedNormally(f, three);
336 jsr166 1.46 f.obtrudeValue(null);
337     checkCompletedNormally(f, null);
338 jsr166 1.22 f = new CompletableFuture<>();
339 dl 1.5 f.completeExceptionally(new CFException());
340     f.obtrudeValue(four);
341     checkCompletedNormally(f, four);
342 jsr166 1.4 }
343    
344 dl 1.5 /**
345     * obtrudeException forces completion with given exception
346     */
347     public void testObtrudeException() {
348 jsr166 1.72 for (Integer v1 : new Integer[] { 1, null })
349     {
350     CFException ex;
351     CompletableFuture<Integer> f;
352    
353     f = new CompletableFuture<>();
354 jsr166 1.78 assertTrue(f.complete(v1));
355 jsr166 1.72 for (int i = 0; i < 2; i++) {
356     f.obtrudeException(ex = new CFException());
357     checkCompletedExceptionally(f, ex);
358     }
359    
360 jsr166 1.22 f = new CompletableFuture<>();
361 jsr166 1.72 for (int i = 0; i < 2; i++) {
362     f.obtrudeException(ex = new CFException());
363     checkCompletedExceptionally(f, ex);
364     }
365    
366 jsr166 1.22 f = new CompletableFuture<>();
367 jsr166 1.72 f.completeExceptionally(ex = new CFException());
368     f.obtrudeValue(v1);
369     checkCompletedNormally(f, v1);
370     f.obtrudeException(ex = new CFException());
371     checkCompletedExceptionally(f, ex);
372 dl 1.5 f.completeExceptionally(new CFException());
373 jsr166 1.72 checkCompletedExceptionally(f, ex);
374 jsr166 1.78 assertFalse(f.complete(v1));
375 jsr166 1.72 checkCompletedExceptionally(f, ex);
376     }}
377 jsr166 1.6
378 dl 1.5 /**
379     * getNumberOfDependents returns number of dependent tasks
380     */
381     public void testGetNumberOfDependents() {
382 jsr166 1.76 for (ExecutionMode m : ExecutionMode.values())
383 jsr166 1.78 for (Integer v1 : new Integer[] { 1, null })
384 jsr166 1.76 {
385 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
386 jsr166 1.46 assertEquals(0, f.getNumberOfDependents());
387 jsr166 1.76 final CompletableFuture<Void> g = m.thenRun(f, new Noop(m));
388 jsr166 1.46 assertEquals(1, f.getNumberOfDependents());
389     assertEquals(0, g.getNumberOfDependents());
390 jsr166 1.76 final CompletableFuture<Void> h = m.thenRun(f, new Noop(m));
391 jsr166 1.46 assertEquals(2, f.getNumberOfDependents());
392 jsr166 1.76 assertEquals(0, h.getNumberOfDependents());
393 jsr166 1.78 assertTrue(f.complete(v1));
394 dl 1.5 checkCompletedNormally(g, null);
395 jsr166 1.76 checkCompletedNormally(h, null);
396 jsr166 1.46 assertEquals(0, f.getNumberOfDependents());
397     assertEquals(0, g.getNumberOfDependents());
398 jsr166 1.76 assertEquals(0, h.getNumberOfDependents());
399     }}
400 jsr166 1.3
401 dl 1.5 /**
402     * toString indicates current completion state
403     */
404 jsr166 1.1 public void testToString() {
405     CompletableFuture<String> f;
406 jsr166 1.2
407 jsr166 1.1 f = new CompletableFuture<String>();
408 jsr166 1.2 assertTrue(f.toString().contains("[Not completed]"));
409    
410 jsr166 1.78 assertTrue(f.complete("foo"));
411 jsr166 1.1 assertTrue(f.toString().contains("[Completed normally]"));
412 jsr166 1.2
413 jsr166 1.1 f = new CompletableFuture<String>();
414 jsr166 1.78 assertTrue(f.completeExceptionally(new IndexOutOfBoundsException()));
415 jsr166 1.1 assertTrue(f.toString().contains("[Completed exceptionally]"));
416 jsr166 1.74
417 jsr166 1.77 for (boolean mayInterruptIfRunning : new boolean[] { true, false }) {
418     f = new CompletableFuture<String>();
419 jsr166 1.78 assertTrue(f.cancel(mayInterruptIfRunning));
420 jsr166 1.77 assertTrue(f.toString().contains("[Completed exceptionally]"));
421     }
422 jsr166 1.1 }
423 jsr166 1.4
424 dl 1.9 /**
425 jsr166 1.10 * completedFuture returns a completed CompletableFuture with given value
426 dl 1.9 */
427     public void testCompletedFuture() {
428     CompletableFuture<String> f = CompletableFuture.completedFuture("test");
429     checkCompletedNormally(f, "test");
430     }
431    
432 jsr166 1.62 abstract class CheckedAction {
433     int invocationCount = 0;
434 jsr166 1.58 final ExecutionMode m;
435 jsr166 1.62 CheckedAction(ExecutionMode m) { this.m = m; }
436     void invoked() {
437     m.checkExecutionMode();
438     assertEquals(0, invocationCount++);
439     }
440     void assertNotInvoked() { assertEquals(0, invocationCount); }
441     void assertInvoked() { assertEquals(1, invocationCount); }
442     }
443    
444     abstract class CheckedIntegerAction extends CheckedAction {
445     Integer value;
446     CheckedIntegerAction(ExecutionMode m) { super(m); }
447     void assertValue(Integer expected) {
448     assertInvoked();
449     assertEquals(expected, value);
450     }
451     }
452    
453     class IntegerSupplier extends CheckedAction
454     implements Supplier<Integer>
455     {
456 jsr166 1.58 final Integer value;
457     IntegerSupplier(ExecutionMode m, Integer value) {
458 jsr166 1.62 super(m);
459 jsr166 1.58 this.value = value;
460     }
461     public Integer get() {
462 jsr166 1.62 invoked();
463 jsr166 1.58 return value;
464     }
465     }
466 jsr166 1.60
467     // A function that handles and produces null values as well.
468     static Integer inc(Integer x) {
469     return (x == null) ? null : x + 1;
470     }
471    
472 jsr166 1.64 class NoopConsumer extends CheckedIntegerAction
473 jsr166 1.62 implements Consumer<Integer>
474     {
475 jsr166 1.64 NoopConsumer(ExecutionMode m) { super(m); }
476 jsr166 1.38 public void accept(Integer x) {
477 jsr166 1.62 invoked();
478 jsr166 1.64 value = x;
479 jsr166 1.38 }
480     }
481 jsr166 1.62
482     class IncFunction extends CheckedIntegerAction
483     implements Function<Integer,Integer>
484     {
485     IncFunction(ExecutionMode m) { super(m); }
486 jsr166 1.38 public Integer apply(Integer x) {
487 jsr166 1.62 invoked();
488 jsr166 1.38 return value = inc(x);
489     }
490 dl 1.5 }
491 jsr166 1.60
492     // Choose non-commutative actions for better coverage
493     // A non-commutative function that handles and produces null values as well.
494     static Integer subtract(Integer x, Integer y) {
495     return (x == null && y == null) ? null :
496     ((x == null) ? 42 : x.intValue())
497     - ((y == null) ? 99 : y.intValue());
498     }
499    
500 jsr166 1.62 class SubtractAction extends CheckedIntegerAction
501     implements BiConsumer<Integer, Integer>
502     {
503     SubtractAction(ExecutionMode m) { super(m); }
504 jsr166 1.6 public void accept(Integer x, Integer y) {
505 jsr166 1.62 invoked();
506 jsr166 1.35 value = subtract(x, y);
507 dl 1.5 }
508     }
509 jsr166 1.62
510     class SubtractFunction extends CheckedIntegerAction
511     implements BiFunction<Integer, Integer, Integer>
512     {
513     SubtractFunction(ExecutionMode m) { super(m); }
514 jsr166 1.36 public Integer apply(Integer x, Integer y) {
515 jsr166 1.62 invoked();
516 jsr166 1.37 return value = subtract(x, y);
517 jsr166 1.36 }
518     }
519 jsr166 1.60
520 jsr166 1.62 class Noop extends CheckedAction implements Runnable {
521     Noop(ExecutionMode m) { super(m); }
522 jsr166 1.41 public void run() {
523 jsr166 1.62 invoked();
524 jsr166 1.41 }
525 dl 1.5 }
526    
527 jsr166 1.63 class FailingSupplier extends CheckedAction
528     implements Supplier<Integer>
529 jsr166 1.62 {
530     FailingSupplier(ExecutionMode m) { super(m); }
531 jsr166 1.44 public Integer get() {
532 jsr166 1.62 invoked();
533 jsr166 1.44 throw new CFException();
534     }
535 dl 1.5 }
536 jsr166 1.62
537 jsr166 1.63 class FailingConsumer extends CheckedIntegerAction
538     implements Consumer<Integer>
539     {
540 jsr166 1.62 FailingConsumer(ExecutionMode m) { super(m); }
541 jsr166 1.44 public void accept(Integer x) {
542 jsr166 1.62 invoked();
543 jsr166 1.63 value = x;
544 jsr166 1.44 throw new CFException();
545     }
546 dl 1.5 }
547 jsr166 1.62
548 jsr166 1.63 class FailingBiConsumer extends CheckedIntegerAction
549 jsr166 1.62 implements BiConsumer<Integer, Integer>
550     {
551     FailingBiConsumer(ExecutionMode m) { super(m); }
552 jsr166 1.44 public void accept(Integer x, Integer y) {
553 jsr166 1.62 invoked();
554 jsr166 1.63 value = subtract(x, y);
555 jsr166 1.44 throw new CFException();
556     }
557 dl 1.5 }
558 jsr166 1.62
559 jsr166 1.63 class FailingFunction extends CheckedIntegerAction
560 jsr166 1.62 implements Function<Integer, Integer>
561     {
562     FailingFunction(ExecutionMode m) { super(m); }
563 jsr166 1.44 public Integer apply(Integer x) {
564 jsr166 1.62 invoked();
565 jsr166 1.63 value = x;
566 jsr166 1.44 throw new CFException();
567     }
568 dl 1.5 }
569 jsr166 1.62
570 jsr166 1.63 class FailingBiFunction extends CheckedIntegerAction
571 jsr166 1.62 implements BiFunction<Integer, Integer, Integer>
572     {
573     FailingBiFunction(ExecutionMode m) { super(m); }
574 jsr166 1.44 public Integer apply(Integer x, Integer y) {
575 jsr166 1.62 invoked();
576 jsr166 1.63 value = subtract(x, y);
577 jsr166 1.44 throw new CFException();
578     }
579 dl 1.5 }
580 jsr166 1.62
581     class FailingRunnable extends CheckedAction implements Runnable {
582     FailingRunnable(ExecutionMode m) { super(m); }
583 jsr166 1.44 public void run() {
584 jsr166 1.62 invoked();
585 jsr166 1.44 throw new CFException();
586     }
587 dl 1.5 }
588    
589 jsr166 1.63 class CompletableFutureInc extends CheckedIntegerAction
590 jsr166 1.62 implements Function<Integer, CompletableFuture<Integer>>
591     {
592     CompletableFutureInc(ExecutionMode m) { super(m); }
593 dl 1.5 public CompletableFuture<Integer> apply(Integer x) {
594 jsr166 1.62 invoked();
595 jsr166 1.63 value = x;
596 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
597 jsr166 1.78 assertTrue(f.complete(inc(x)));
598 dl 1.5 return f;
599     }
600     }
601    
602 jsr166 1.63 class FailingCompletableFutureFunction extends CheckedIntegerAction
603 jsr166 1.62 implements Function<Integer, CompletableFuture<Integer>>
604     {
605     FailingCompletableFutureFunction(ExecutionMode m) { super(m); }
606 dl 1.5 public CompletableFuture<Integer> apply(Integer x) {
607 jsr166 1.62 invoked();
608 jsr166 1.63 value = x;
609 jsr166 1.44 throw new CFException();
610 dl 1.5 }
611     }
612 jsr166 1.6
613 dl 1.5 // Used for explicit executor tests
614     static final class ThreadExecutor implements Executor {
615 jsr166 1.56 final AtomicInteger count = new AtomicInteger(0);
616     static final ThreadGroup tg = new ThreadGroup("ThreadExecutor");
617     static boolean startedCurrentThread() {
618     return Thread.currentThread().getThreadGroup() == tg;
619     }
620 jsr166 1.17
621 dl 1.5 public void execute(Runnable r) {
622 jsr166 1.17 count.getAndIncrement();
623 jsr166 1.56 new Thread(tg, r).start();
624 dl 1.5 }
625     }
626    
627 jsr166 1.96 static final boolean defaultExecutorIsCommonPool
628     = ForkJoinPool.getCommonPoolParallelism() > 1;
629    
630 dl 1.5 /**
631 jsr166 1.35 * Permits the testing of parallel code for the 3 different
632 jsr166 1.60 * execution modes without copy/pasting all the test methods.
633 jsr166 1.35 */
634     enum ExecutionMode {
635 jsr166 1.95 SYNC {
636 jsr166 1.48 public void checkExecutionMode() {
637 jsr166 1.60 assertFalse(ThreadExecutor.startedCurrentThread());
638 jsr166 1.48 assertNull(ForkJoinTask.getPool());
639     }
640 jsr166 1.57 public CompletableFuture<Void> runAsync(Runnable a) {
641     throw new UnsupportedOperationException();
642     }
643 jsr166 1.58 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
644     throw new UnsupportedOperationException();
645     }
646 jsr166 1.46 public <T> CompletableFuture<Void> thenRun
647     (CompletableFuture<T> f, Runnable a) {
648     return f.thenRun(a);
649     }
650     public <T> CompletableFuture<Void> thenAccept
651     (CompletableFuture<T> f, Consumer<? super T> a) {
652     return f.thenAccept(a);
653     }
654     public <T,U> CompletableFuture<U> thenApply
655     (CompletableFuture<T> f, Function<? super T,U> a) {
656     return f.thenApply(a);
657     }
658     public <T,U> CompletableFuture<U> thenCompose
659     (CompletableFuture<T> f,
660     Function<? super T,? extends CompletionStage<U>> a) {
661     return f.thenCompose(a);
662     }
663     public <T,U> CompletableFuture<U> handle
664     (CompletableFuture<T> f,
665     BiFunction<? super T,Throwable,? extends U> a) {
666     return f.handle(a);
667     }
668     public <T> CompletableFuture<T> whenComplete
669     (CompletableFuture<T> f,
670     BiConsumer<? super T,? super Throwable> a) {
671     return f.whenComplete(a);
672     }
673 jsr166 1.35 public <T,U> CompletableFuture<Void> runAfterBoth
674     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
675     return f.runAfterBoth(g, a);
676     }
677     public <T,U> CompletableFuture<Void> thenAcceptBoth
678     (CompletableFuture<T> f,
679     CompletionStage<? extends U> g,
680     BiConsumer<? super T,? super U> a) {
681     return f.thenAcceptBoth(g, a);
682     }
683 jsr166 1.36 public <T,U,V> CompletableFuture<V> thenCombine
684     (CompletableFuture<T> f,
685     CompletionStage<? extends U> g,
686     BiFunction<? super T,? super U,? extends V> a) {
687     return f.thenCombine(g, a);
688     }
689 jsr166 1.46 public <T> CompletableFuture<Void> runAfterEither
690 jsr166 1.38 (CompletableFuture<T> f,
691 jsr166 1.46 CompletionStage<?> g,
692     java.lang.Runnable a) {
693     return f.runAfterEither(g, a);
694 jsr166 1.38 }
695     public <T> CompletableFuture<Void> acceptEither
696     (CompletableFuture<T> f,
697     CompletionStage<? extends T> g,
698     Consumer<? super T> a) {
699     return f.acceptEither(g, a);
700     }
701 jsr166 1.46 public <T,U> CompletableFuture<U> applyToEither
702 jsr166 1.38 (CompletableFuture<T> f,
703 jsr166 1.46 CompletionStage<? extends T> g,
704     Function<? super T,U> a) {
705     return f.applyToEither(g, a);
706     }
707     },
708    
709 jsr166 1.48 ASYNC {
710     public void checkExecutionMode() {
711 jsr166 1.96 assertEquals(defaultExecutorIsCommonPool,
712     (ForkJoinPool.commonPool() == ForkJoinTask.getPool()));
713 jsr166 1.48 }
714 jsr166 1.57 public CompletableFuture<Void> runAsync(Runnable a) {
715     return CompletableFuture.runAsync(a);
716     }
717 jsr166 1.58 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
718     return CompletableFuture.supplyAsync(a);
719     }
720 jsr166 1.46 public <T> CompletableFuture<Void> thenRun
721     (CompletableFuture<T> f, Runnable a) {
722     return f.thenRunAsync(a);
723     }
724     public <T> CompletableFuture<Void> thenAccept
725     (CompletableFuture<T> f, Consumer<? super T> a) {
726     return f.thenAcceptAsync(a);
727     }
728     public <T,U> CompletableFuture<U> thenApply
729     (CompletableFuture<T> f, Function<? super T,U> a) {
730     return f.thenApplyAsync(a);
731 jsr166 1.38 }
732     public <T,U> CompletableFuture<U> thenCompose
733     (CompletableFuture<T> f,
734     Function<? super T,? extends CompletionStage<U>> a) {
735 jsr166 1.46 return f.thenComposeAsync(a);
736     }
737     public <T,U> CompletableFuture<U> handle
738     (CompletableFuture<T> f,
739     BiFunction<? super T,Throwable,? extends U> a) {
740     return f.handleAsync(a);
741 jsr166 1.38 }
742     public <T> CompletableFuture<T> whenComplete
743     (CompletableFuture<T> f,
744     BiConsumer<? super T,? super Throwable> a) {
745 jsr166 1.46 return f.whenCompleteAsync(a);
746 jsr166 1.38 }
747 jsr166 1.35 public <T,U> CompletableFuture<Void> runAfterBoth
748     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
749     return f.runAfterBothAsync(g, a);
750     }
751     public <T,U> CompletableFuture<Void> thenAcceptBoth
752     (CompletableFuture<T> f,
753     CompletionStage<? extends U> g,
754     BiConsumer<? super T,? super U> a) {
755     return f.thenAcceptBothAsync(g, a);
756     }
757 jsr166 1.36 public <T,U,V> CompletableFuture<V> thenCombine
758     (CompletableFuture<T> f,
759     CompletionStage<? extends U> g,
760     BiFunction<? super T,? super U,? extends V> a) {
761     return f.thenCombineAsync(g, a);
762     }
763 jsr166 1.46 public <T> CompletableFuture<Void> runAfterEither
764 jsr166 1.38 (CompletableFuture<T> f,
765 jsr166 1.46 CompletionStage<?> g,
766     java.lang.Runnable a) {
767     return f.runAfterEitherAsync(g, a);
768 jsr166 1.38 }
769     public <T> CompletableFuture<Void> acceptEither
770     (CompletableFuture<T> f,
771     CompletionStage<? extends T> g,
772     Consumer<? super T> a) {
773     return f.acceptEitherAsync(g, a);
774     }
775 jsr166 1.46 public <T,U> CompletableFuture<U> applyToEither
776 jsr166 1.38 (CompletableFuture<T> f,
777 jsr166 1.46 CompletionStage<? extends T> g,
778     Function<? super T,U> a) {
779     return f.applyToEitherAsync(g, a);
780     }
781     },
782    
783     EXECUTOR {
784 jsr166 1.48 public void checkExecutionMode() {
785 jsr166 1.56 assertTrue(ThreadExecutor.startedCurrentThread());
786 jsr166 1.48 }
787 jsr166 1.57 public CompletableFuture<Void> runAsync(Runnable a) {
788     return CompletableFuture.runAsync(a, new ThreadExecutor());
789     }
790 jsr166 1.58 public <U> CompletableFuture<U> supplyAsync(Supplier<U> a) {
791     return CompletableFuture.supplyAsync(a, new ThreadExecutor());
792     }
793 jsr166 1.46 public <T> CompletableFuture<Void> thenRun
794     (CompletableFuture<T> f, Runnable a) {
795     return f.thenRunAsync(a, new ThreadExecutor());
796     }
797     public <T> CompletableFuture<Void> thenAccept
798     (CompletableFuture<T> f, Consumer<? super T> a) {
799     return f.thenAcceptAsync(a, new ThreadExecutor());
800     }
801     public <T,U> CompletableFuture<U> thenApply
802     (CompletableFuture<T> f, Function<? super T,U> a) {
803     return f.thenApplyAsync(a, new ThreadExecutor());
804 jsr166 1.38 }
805     public <T,U> CompletableFuture<U> thenCompose
806     (CompletableFuture<T> f,
807     Function<? super T,? extends CompletionStage<U>> a) {
808 jsr166 1.46 return f.thenComposeAsync(a, new ThreadExecutor());
809     }
810     public <T,U> CompletableFuture<U> handle
811     (CompletableFuture<T> f,
812     BiFunction<? super T,Throwable,? extends U> a) {
813     return f.handleAsync(a, new ThreadExecutor());
814 jsr166 1.38 }
815     public <T> CompletableFuture<T> whenComplete
816     (CompletableFuture<T> f,
817     BiConsumer<? super T,? super Throwable> a) {
818 jsr166 1.46 return f.whenCompleteAsync(a, new ThreadExecutor());
819 jsr166 1.38 }
820 jsr166 1.35 public <T,U> CompletableFuture<Void> runAfterBoth
821     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a) {
822     return f.runAfterBothAsync(g, a, new ThreadExecutor());
823     }
824     public <T,U> CompletableFuture<Void> thenAcceptBoth
825     (CompletableFuture<T> f,
826     CompletionStage<? extends U> g,
827     BiConsumer<? super T,? super U> a) {
828     return f.thenAcceptBothAsync(g, a, new ThreadExecutor());
829     }
830 jsr166 1.36 public <T,U,V> CompletableFuture<V> thenCombine
831     (CompletableFuture<T> f,
832     CompletionStage<? extends U> g,
833     BiFunction<? super T,? super U,? extends V> a) {
834     return f.thenCombineAsync(g, a, new ThreadExecutor());
835     }
836 jsr166 1.46 public <T> CompletableFuture<Void> runAfterEither
837 jsr166 1.38 (CompletableFuture<T> f,
838 jsr166 1.46 CompletionStage<?> g,
839     java.lang.Runnable a) {
840     return f.runAfterEitherAsync(g, a, new ThreadExecutor());
841 jsr166 1.38 }
842     public <T> CompletableFuture<Void> acceptEither
843     (CompletableFuture<T> f,
844     CompletionStage<? extends T> g,
845     Consumer<? super T> a) {
846     return f.acceptEitherAsync(g, a, new ThreadExecutor());
847     }
848 jsr166 1.46 public <T,U> CompletableFuture<U> applyToEither
849 jsr166 1.38 (CompletableFuture<T> f,
850 jsr166 1.46 CompletionStage<? extends T> g,
851     Function<? super T,U> a) {
852     return f.applyToEitherAsync(g, a, new ThreadExecutor());
853 jsr166 1.38 }
854 jsr166 1.35 };
855    
856 jsr166 1.48 public abstract void checkExecutionMode();
857 jsr166 1.57 public abstract CompletableFuture<Void> runAsync(Runnable a);
858 jsr166 1.58 public abstract <U> CompletableFuture<U> supplyAsync(Supplier<U> a);
859 jsr166 1.46 public abstract <T> CompletableFuture<Void> thenRun
860     (CompletableFuture<T> f, Runnable a);
861     public abstract <T> CompletableFuture<Void> thenAccept
862     (CompletableFuture<T> f, Consumer<? super T> a);
863     public abstract <T,U> CompletableFuture<U> thenApply
864     (CompletableFuture<T> f, Function<? super T,U> a);
865     public abstract <T,U> CompletableFuture<U> thenCompose
866     (CompletableFuture<T> f,
867     Function<? super T,? extends CompletionStage<U>> a);
868     public abstract <T,U> CompletableFuture<U> handle
869     (CompletableFuture<T> f,
870     BiFunction<? super T,Throwable,? extends U> a);
871     public abstract <T> CompletableFuture<T> whenComplete
872     (CompletableFuture<T> f,
873     BiConsumer<? super T,? super Throwable> a);
874 jsr166 1.35 public abstract <T,U> CompletableFuture<Void> runAfterBoth
875     (CompletableFuture<T> f, CompletableFuture<U> g, Runnable a);
876     public abstract <T,U> CompletableFuture<Void> thenAcceptBoth
877     (CompletableFuture<T> f,
878     CompletionStage<? extends U> g,
879     BiConsumer<? super T,? super U> a);
880 jsr166 1.36 public abstract <T,U,V> CompletableFuture<V> thenCombine
881     (CompletableFuture<T> f,
882     CompletionStage<? extends U> g,
883     BiFunction<? super T,? super U,? extends V> a);
884 jsr166 1.46 public abstract <T> CompletableFuture<Void> runAfterEither
885 jsr166 1.38 (CompletableFuture<T> f,
886 jsr166 1.46 CompletionStage<?> g,
887     java.lang.Runnable a);
888 jsr166 1.38 public abstract <T> CompletableFuture<Void> acceptEither
889     (CompletableFuture<T> f,
890     CompletionStage<? extends T> g,
891     Consumer<? super T> a);
892 jsr166 1.46 public abstract <T,U> CompletableFuture<U> applyToEither
893 jsr166 1.38 (CompletableFuture<T> f,
894 jsr166 1.46 CompletionStage<? extends T> g,
895     Function<? super T,U> a);
896     }
897    
898     /**
899     * exceptionally action is not invoked when source completes
900     * normally, and source result is propagated
901     */
902     public void testExceptionally_normalCompletion() {
903     for (boolean createIncomplete : new boolean[] { true, false })
904     for (Integer v1 : new Integer[] { 1, null })
905     {
906     final AtomicInteger a = new AtomicInteger(0);
907     final CompletableFuture<Integer> f = new CompletableFuture<>();
908 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
909 jsr166 1.46 final CompletableFuture<Integer> g = f.exceptionally
910     ((Throwable t) -> {
911     // Should not be called
912     a.getAndIncrement();
913     throw new AssertionError();
914     });
915 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
916 jsr166 1.38
917 jsr166 1.46 checkCompletedNormally(g, v1);
918     checkCompletedNormally(f, v1);
919     assertEquals(0, a.get());
920     }}
921 jsr166 1.38
922 jsr166 1.35 /**
923 dl 1.5 * exceptionally action completes with function value on source
924 jsr166 1.46 * exception
925     */
926     public void testExceptionally_exceptionalCompletion() {
927     for (boolean createIncomplete : new boolean[] { true, false })
928     for (Integer v1 : new Integer[] { 1, null })
929     {
930     final AtomicInteger a = new AtomicInteger(0);
931     final CFException ex = new CFException();
932     final CompletableFuture<Integer> f = new CompletableFuture<>();
933     if (!createIncomplete) f.completeExceptionally(ex);
934     final CompletableFuture<Integer> g = f.exceptionally
935     ((Throwable t) -> {
936 jsr166 1.95 ExecutionMode.SYNC.checkExecutionMode();
937 jsr166 1.46 threadAssertSame(t, ex);
938     a.getAndIncrement();
939     return v1;
940     });
941     if (createIncomplete) f.completeExceptionally(ex);
942    
943     checkCompletedNormally(g, v1);
944     assertEquals(1, a.get());
945     }}
946    
947     public void testExceptionally_exceptionalCompletionActionFailed() {
948     for (boolean createIncomplete : new boolean[] { true, false })
949     {
950     final AtomicInteger a = new AtomicInteger(0);
951     final CFException ex1 = new CFException();
952     final CFException ex2 = new CFException();
953     final CompletableFuture<Integer> f = new CompletableFuture<>();
954     if (!createIncomplete) f.completeExceptionally(ex1);
955     final CompletableFuture<Integer> g = f.exceptionally
956     ((Throwable t) -> {
957 jsr166 1.95 ExecutionMode.SYNC.checkExecutionMode();
958 jsr166 1.46 threadAssertSame(t, ex1);
959     a.getAndIncrement();
960     throw ex2;
961     });
962     if (createIncomplete) f.completeExceptionally(ex1);
963    
964 jsr166 1.72 checkCompletedWithWrappedException(g, ex2);
965 jsr166 1.46 assertEquals(1, a.get());
966     }}
967    
968     /**
969 jsr166 1.75 * whenComplete action executes on normal completion, propagating
970     * source result.
971     */
972     public void testWhenComplete_normalCompletion1() {
973     for (ExecutionMode m : ExecutionMode.values())
974     for (boolean createIncomplete : new boolean[] { true, false })
975     for (Integer v1 : new Integer[] { 1, null })
976     {
977     final AtomicInteger a = new AtomicInteger(0);
978     final CompletableFuture<Integer> f = new CompletableFuture<>();
979 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
980 jsr166 1.75 final CompletableFuture<Integer> g = m.whenComplete
981     (f,
982     (Integer x, Throwable t) -> {
983     m.checkExecutionMode();
984     threadAssertSame(x, v1);
985     threadAssertNull(t);
986     a.getAndIncrement();
987     });
988 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
989 jsr166 1.75
990     checkCompletedNormally(g, v1);
991     checkCompletedNormally(f, v1);
992     assertEquals(1, a.get());
993     }}
994    
995     /**
996     * whenComplete action executes on exceptional completion, propagating
997     * source result.
998     */
999     public void testWhenComplete_exceptionalCompletion() {
1000     for (ExecutionMode m : ExecutionMode.values())
1001     for (boolean createIncomplete : new boolean[] { true, false })
1002     {
1003     final AtomicInteger a = new AtomicInteger(0);
1004     final CFException ex = new CFException();
1005     final CompletableFuture<Integer> f = new CompletableFuture<>();
1006     if (!createIncomplete) f.completeExceptionally(ex);
1007     final CompletableFuture<Integer> g = m.whenComplete
1008     (f,
1009     (Integer x, Throwable t) -> {
1010     m.checkExecutionMode();
1011     threadAssertNull(x);
1012     threadAssertSame(t, ex);
1013     a.getAndIncrement();
1014     });
1015     if (createIncomplete) f.completeExceptionally(ex);
1016    
1017     checkCompletedWithWrappedException(g, ex);
1018     checkCompletedExceptionally(f, ex);
1019     assertEquals(1, a.get());
1020     }}
1021    
1022     /**
1023     * whenComplete action executes on cancelled source, propagating
1024     * CancellationException.
1025     */
1026     public void testWhenComplete_sourceCancelled() {
1027     for (ExecutionMode m : ExecutionMode.values())
1028     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1029     for (boolean createIncomplete : new boolean[] { true, false })
1030     {
1031     final AtomicInteger a = new AtomicInteger(0);
1032     final CompletableFuture<Integer> f = new CompletableFuture<>();
1033     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1034     final CompletableFuture<Integer> g = m.whenComplete
1035     (f,
1036     (Integer x, Throwable t) -> {
1037     m.checkExecutionMode();
1038     threadAssertNull(x);
1039     threadAssertTrue(t instanceof CancellationException);
1040     a.getAndIncrement();
1041     });
1042     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1043    
1044     checkCompletedWithWrappedCancellationException(g);
1045     checkCancelled(f);
1046     assertEquals(1, a.get());
1047     }}
1048    
1049     /**
1050     * If a whenComplete action throws an exception when triggered by
1051     * a normal completion, it completes exceptionally
1052     */
1053     public void testWhenComplete_actionFailed() {
1054     for (boolean createIncomplete : new boolean[] { true, false })
1055     for (ExecutionMode m : ExecutionMode.values())
1056     for (Integer v1 : new Integer[] { 1, null })
1057     {
1058     final AtomicInteger a = new AtomicInteger(0);
1059     final CFException ex = new CFException();
1060     final CompletableFuture<Integer> f = new CompletableFuture<>();
1061 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1062 jsr166 1.75 final CompletableFuture<Integer> g = m.whenComplete
1063     (f,
1064     (Integer x, Throwable t) -> {
1065     m.checkExecutionMode();
1066     threadAssertSame(x, v1);
1067     threadAssertNull(t);
1068     a.getAndIncrement();
1069     throw ex;
1070     });
1071 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
1072 jsr166 1.75
1073     checkCompletedWithWrappedException(g, ex);
1074     checkCompletedNormally(f, v1);
1075     assertEquals(1, a.get());
1076     }}
1077    
1078     /**
1079     * If a whenComplete action throws an exception when triggered by
1080     * a source completion that also throws an exception, the source
1081     * exception takes precedence.
1082     */
1083     public void testWhenComplete_actionFailedSourceFailed() {
1084     for (boolean createIncomplete : new boolean[] { true, false })
1085     for (ExecutionMode m : ExecutionMode.values())
1086     {
1087     final AtomicInteger a = new AtomicInteger(0);
1088     final CFException ex1 = new CFException();
1089     final CFException ex2 = new CFException();
1090     final CompletableFuture<Integer> f = new CompletableFuture<>();
1091    
1092     if (!createIncomplete) f.completeExceptionally(ex1);
1093     final CompletableFuture<Integer> g = m.whenComplete
1094     (f,
1095     (Integer x, Throwable t) -> {
1096     m.checkExecutionMode();
1097     threadAssertSame(t, ex1);
1098     threadAssertNull(x);
1099     a.getAndIncrement();
1100     throw ex2;
1101     });
1102     if (createIncomplete) f.completeExceptionally(ex1);
1103    
1104     checkCompletedWithWrappedException(g, ex1);
1105     checkCompletedExceptionally(f, ex1);
1106     assertEquals(1, a.get());
1107     }}
1108    
1109     /**
1110 jsr166 1.46 * handle action completes normally with function value on normal
1111     * completion of source
1112     */
1113     public void testHandle_normalCompletion() {
1114     for (ExecutionMode m : ExecutionMode.values())
1115     for (boolean createIncomplete : new boolean[] { true, false })
1116     for (Integer v1 : new Integer[] { 1, null })
1117     {
1118     final CompletableFuture<Integer> f = new CompletableFuture<>();
1119     final AtomicInteger a = new AtomicInteger(0);
1120 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1121 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1122     (f,
1123     (Integer x, Throwable t) -> {
1124 jsr166 1.57 m.checkExecutionMode();
1125 jsr166 1.46 threadAssertSame(x, v1);
1126     threadAssertNull(t);
1127     a.getAndIncrement();
1128     return inc(v1);
1129     });
1130 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
1131 jsr166 1.46
1132     checkCompletedNormally(g, inc(v1));
1133     checkCompletedNormally(f, v1);
1134     assertEquals(1, a.get());
1135     }}
1136    
1137     /**
1138     * handle action completes normally with function value on
1139     * exceptional completion of source
1140 dl 1.5 */
1141 jsr166 1.46 public void testHandle_exceptionalCompletion() {
1142     for (ExecutionMode m : ExecutionMode.values())
1143     for (boolean createIncomplete : new boolean[] { true, false })
1144     for (Integer v1 : new Integer[] { 1, null })
1145     {
1146     final CompletableFuture<Integer> f = new CompletableFuture<>();
1147     final AtomicInteger a = new AtomicInteger(0);
1148     final CFException ex = new CFException();
1149     if (!createIncomplete) f.completeExceptionally(ex);
1150     final CompletableFuture<Integer> g = m.handle
1151     (f,
1152     (Integer x, Throwable t) -> {
1153 jsr166 1.57 m.checkExecutionMode();
1154 jsr166 1.46 threadAssertNull(x);
1155     threadAssertSame(t, ex);
1156     a.getAndIncrement();
1157     return v1;
1158     });
1159     if (createIncomplete) f.completeExceptionally(ex);
1160 dl 1.5
1161 jsr166 1.46 checkCompletedNormally(g, v1);
1162 jsr166 1.72 checkCompletedExceptionally(f, ex);
1163 jsr166 1.46 assertEquals(1, a.get());
1164     }}
1165 dl 1.5
1166     /**
1167 jsr166 1.46 * handle action completes normally with function value on
1168     * cancelled source
1169 dl 1.5 */
1170 jsr166 1.46 public void testHandle_sourceCancelled() {
1171     for (ExecutionMode m : ExecutionMode.values())
1172     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1173     for (boolean createIncomplete : new boolean[] { true, false })
1174     for (Integer v1 : new Integer[] { 1, null })
1175     {
1176     final CompletableFuture<Integer> f = new CompletableFuture<>();
1177     final AtomicInteger a = new AtomicInteger(0);
1178     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1179     final CompletableFuture<Integer> g = m.handle
1180     (f,
1181     (Integer x, Throwable t) -> {
1182 jsr166 1.57 m.checkExecutionMode();
1183 jsr166 1.46 threadAssertNull(x);
1184     threadAssertTrue(t instanceof CancellationException);
1185     a.getAndIncrement();
1186     return v1;
1187     });
1188     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1189    
1190     checkCompletedNormally(g, v1);
1191     checkCancelled(f);
1192     assertEquals(1, a.get());
1193     }}
1194 jsr166 1.15
1195 jsr166 1.46 /**
1196     * handle result completes exceptionally if action does
1197     */
1198     public void testHandle_sourceFailedActionFailed() {
1199     for (ExecutionMode m : ExecutionMode.values())
1200     for (boolean createIncomplete : new boolean[] { true, false })
1201     {
1202     final CompletableFuture<Integer> f = new CompletableFuture<>();
1203     final AtomicInteger a = new AtomicInteger(0);
1204     final CFException ex1 = new CFException();
1205     final CFException ex2 = new CFException();
1206     if (!createIncomplete) f.completeExceptionally(ex1);
1207     final CompletableFuture<Integer> g = m.handle
1208     (f,
1209     (Integer x, Throwable t) -> {
1210 jsr166 1.57 m.checkExecutionMode();
1211 jsr166 1.46 threadAssertNull(x);
1212     threadAssertSame(ex1, t);
1213     a.getAndIncrement();
1214     throw ex2;
1215     });
1216     if (createIncomplete) f.completeExceptionally(ex1);
1217 dl 1.5
1218 jsr166 1.72 checkCompletedWithWrappedException(g, ex2);
1219     checkCompletedExceptionally(f, ex1);
1220 jsr166 1.46 assertEquals(1, a.get());
1221     }}
1222 jsr166 1.15
1223 jsr166 1.46 public void testHandle_sourceCompletedNormallyActionFailed() {
1224     for (ExecutionMode m : ExecutionMode.values())
1225     for (boolean createIncomplete : new boolean[] { true, false })
1226     for (Integer v1 : new Integer[] { 1, null })
1227     {
1228     final CompletableFuture<Integer> f = new CompletableFuture<>();
1229     final AtomicInteger a = new AtomicInteger(0);
1230     final CFException ex = new CFException();
1231 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1232 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1233     (f,
1234     (Integer x, Throwable t) -> {
1235 jsr166 1.57 m.checkExecutionMode();
1236 jsr166 1.46 threadAssertSame(x, v1);
1237     threadAssertNull(t);
1238     a.getAndIncrement();
1239     throw ex;
1240     });
1241 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
1242 jsr166 1.15
1243 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
1244 jsr166 1.46 checkCompletedNormally(f, v1);
1245     assertEquals(1, a.get());
1246     }}
1247 dl 1.5
1248     /**
1249     * runAsync completes after running Runnable
1250     */
1251 jsr166 1.57 public void testRunAsync_normalCompletion() {
1252     ExecutionMode[] executionModes = {
1253     ExecutionMode.ASYNC,
1254     ExecutionMode.EXECUTOR,
1255     };
1256     for (ExecutionMode m : executionModes)
1257     {
1258     final Noop r = new Noop(m);
1259     final CompletableFuture<Void> f = m.runAsync(r);
1260 dl 1.5 assertNull(f.join());
1261 jsr166 1.14 checkCompletedNormally(f, null);
1262 jsr166 1.62 r.assertInvoked();
1263 jsr166 1.57 }}
1264 dl 1.5
1265     /**
1266     * failing runAsync completes exceptionally after running Runnable
1267     */
1268 jsr166 1.57 public void testRunAsync_exceptionalCompletion() {
1269     ExecutionMode[] executionModes = {
1270     ExecutionMode.ASYNC,
1271     ExecutionMode.EXECUTOR,
1272     };
1273     for (ExecutionMode m : executionModes)
1274     {
1275     final FailingRunnable r = new FailingRunnable(m);
1276     final CompletableFuture<Void> f = m.runAsync(r);
1277 dl 1.5 checkCompletedWithWrappedCFException(f);
1278 jsr166 1.62 r.assertInvoked();
1279 jsr166 1.57 }}
1280 dl 1.5
1281     /**
1282     * supplyAsync completes with result of supplier
1283     */
1284 jsr166 1.58 public void testSupplyAsync_normalCompletion() {
1285     ExecutionMode[] executionModes = {
1286     ExecutionMode.ASYNC,
1287     ExecutionMode.EXECUTOR,
1288     };
1289     for (ExecutionMode m : executionModes)
1290     for (Integer v1 : new Integer[] { 1, null })
1291     {
1292     final IntegerSupplier r = new IntegerSupplier(m, v1);
1293     final CompletableFuture<Integer> f = m.supplyAsync(r);
1294     assertSame(v1, f.join());
1295     checkCompletedNormally(f, v1);
1296 jsr166 1.62 r.assertInvoked();
1297 jsr166 1.58 }}
1298 dl 1.5
1299     /**
1300     * Failing supplyAsync completes exceptionally
1301     */
1302 jsr166 1.58 public void testSupplyAsync_exceptionalCompletion() {
1303     ExecutionMode[] executionModes = {
1304     ExecutionMode.ASYNC,
1305     ExecutionMode.EXECUTOR,
1306     };
1307     for (ExecutionMode m : executionModes)
1308     {
1309     FailingSupplier r = new FailingSupplier(m);
1310     CompletableFuture<Integer> f = m.supplyAsync(r);
1311 dl 1.5 checkCompletedWithWrappedCFException(f);
1312 jsr166 1.62 r.assertInvoked();
1313 jsr166 1.58 }}
1314 dl 1.5
1315 jsr166 1.7 // seq completion methods
1316 jsr166 1.6
1317 dl 1.5 /**
1318     * thenRun result completes normally after normal completion of source
1319     */
1320 jsr166 1.48 public void testThenRun_normalCompletion() {
1321     for (ExecutionMode m : ExecutionMode.values())
1322     for (Integer v1 : new Integer[] { 1, null })
1323     {
1324     final CompletableFuture<Integer> f = new CompletableFuture<>();
1325 jsr166 1.90 final Noop[] rs = new Noop[6];
1326     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1327    
1328     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1329     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1330     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1331     checkIncomplete(h0);
1332     checkIncomplete(h1);
1333     checkIncomplete(h2);
1334     assertTrue(f.complete(v1));
1335     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1336     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1337     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1338 jsr166 1.23
1339 jsr166 1.90 checkCompletedNormally(h0, null);
1340     checkCompletedNormally(h1, null);
1341     checkCompletedNormally(h2, null);
1342     checkCompletedNormally(h3, null);
1343     checkCompletedNormally(h4, null);
1344     checkCompletedNormally(h5, null);
1345 jsr166 1.48 checkCompletedNormally(f, v1);
1346 jsr166 1.90 for (Noop r : rs) r.assertInvoked();
1347 jsr166 1.48 }}
1348 dl 1.5
1349     /**
1350     * thenRun result completes exceptionally after exceptional
1351     * completion of source
1352     */
1353 jsr166 1.48 public void testThenRun_exceptionalCompletion() {
1354     for (ExecutionMode m : ExecutionMode.values())
1355     {
1356     final CFException ex = new CFException();
1357     final CompletableFuture<Integer> f = new CompletableFuture<>();
1358 jsr166 1.90 final Noop[] rs = new Noop[6];
1359     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1360    
1361     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1362     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1363     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1364     checkIncomplete(h0);
1365     checkIncomplete(h1);
1366     checkIncomplete(h2);
1367     assertTrue(f.completeExceptionally(ex));
1368     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1369     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1370     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1371 jsr166 1.23
1372 jsr166 1.90 checkCompletedWithWrappedException(h0, ex);
1373     checkCompletedWithWrappedException(h1, ex);
1374     checkCompletedWithWrappedException(h2, ex);
1375     checkCompletedWithWrappedException(h3, ex);
1376     checkCompletedWithWrappedException(h4, ex);
1377     checkCompletedWithWrappedException(h5, ex);
1378 jsr166 1.72 checkCompletedExceptionally(f, ex);
1379 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1380 jsr166 1.48 }}
1381    
1382     /**
1383     * thenRun result completes exceptionally if source cancelled
1384     */
1385     public void testThenRun_sourceCancelled() {
1386     for (ExecutionMode m : ExecutionMode.values())
1387     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1388     {
1389     final CompletableFuture<Integer> f = new CompletableFuture<>();
1390 jsr166 1.90 final Noop[] rs = new Noop[6];
1391     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1392    
1393     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1394     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1395     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1396     checkIncomplete(h0);
1397     checkIncomplete(h1);
1398     checkIncomplete(h2);
1399     assertTrue(f.cancel(mayInterruptIfRunning));
1400     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1401     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1402     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1403 jsr166 1.23
1404 jsr166 1.90 checkCompletedWithWrappedCancellationException(h0);
1405     checkCompletedWithWrappedCancellationException(h1);
1406     checkCompletedWithWrappedCancellationException(h2);
1407     checkCompletedWithWrappedCancellationException(h3);
1408     checkCompletedWithWrappedCancellationException(h4);
1409     checkCompletedWithWrappedCancellationException(h5);
1410 jsr166 1.48 checkCancelled(f);
1411 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1412 jsr166 1.48 }}
1413 dl 1.5
1414     /**
1415     * thenRun result completes exceptionally if action does
1416     */
1417 jsr166 1.48 public void testThenRun_actionFailed() {
1418     for (ExecutionMode m : ExecutionMode.values())
1419     for (Integer v1 : new Integer[] { 1, null })
1420     {
1421     final CompletableFuture<Integer> f = new CompletableFuture<>();
1422 jsr166 1.90 final FailingRunnable[] rs = new FailingRunnable[6];
1423     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
1424    
1425     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1426     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1427     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1428     assertTrue(f.complete(v1));
1429     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1430     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1431     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1432 jsr166 1.23
1433 jsr166 1.90 checkCompletedWithWrappedCFException(h0);
1434     checkCompletedWithWrappedCFException(h1);
1435     checkCompletedWithWrappedCFException(h2);
1436     checkCompletedWithWrappedCFException(h3);
1437     checkCompletedWithWrappedCFException(h4);
1438     checkCompletedWithWrappedCFException(h5);
1439 jsr166 1.48 checkCompletedNormally(f, v1);
1440     }}
1441 dl 1.5
1442     /**
1443     * thenApply result completes normally after normal completion of source
1444     */
1445 jsr166 1.49 public void testThenApply_normalCompletion() {
1446     for (ExecutionMode m : ExecutionMode.values())
1447     for (Integer v1 : new Integer[] { 1, null })
1448     {
1449     final CompletableFuture<Integer> f = new CompletableFuture<>();
1450 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1451     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1452    
1453     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1454     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1455     checkIncomplete(h0);
1456     checkIncomplete(h1);
1457     assertTrue(f.complete(v1));
1458     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1459     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1460 jsr166 1.49
1461 jsr166 1.91 checkCompletedNormally(h0, inc(v1));
1462     checkCompletedNormally(h1, inc(v1));
1463     checkCompletedNormally(h2, inc(v1));
1464     checkCompletedNormally(h3, inc(v1));
1465 jsr166 1.49 checkCompletedNormally(f, v1);
1466 jsr166 1.91 for (IncFunction r : rs) r.assertValue(inc(v1));
1467 jsr166 1.49 }}
1468 dl 1.5
1469     /**
1470     * thenApply result completes exceptionally after exceptional
1471     * completion of source
1472     */
1473 jsr166 1.49 public void testThenApply_exceptionalCompletion() {
1474     for (ExecutionMode m : ExecutionMode.values())
1475     {
1476     final CFException ex = new CFException();
1477     final CompletableFuture<Integer> f = new CompletableFuture<>();
1478 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1479     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1480    
1481     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1482     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1483     assertTrue(f.completeExceptionally(ex));
1484     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1485     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1486 jsr166 1.49
1487 jsr166 1.91 checkCompletedWithWrappedException(h0, ex);
1488     checkCompletedWithWrappedException(h1, ex);
1489     checkCompletedWithWrappedException(h2, ex);
1490     checkCompletedWithWrappedException(h3, ex);
1491 jsr166 1.72 checkCompletedExceptionally(f, ex);
1492 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1493 jsr166 1.49 }}
1494 dl 1.5
1495     /**
1496 jsr166 1.49 * thenApply result completes exceptionally if source cancelled
1497 dl 1.5 */
1498 jsr166 1.49 public void testThenApply_sourceCancelled() {
1499     for (ExecutionMode m : ExecutionMode.values())
1500     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1501     {
1502     final CompletableFuture<Integer> f = new CompletableFuture<>();
1503 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1504     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1505    
1506     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1507     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1508     assertTrue(f.cancel(mayInterruptIfRunning));
1509     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1510     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1511 jsr166 1.49
1512 jsr166 1.91 checkCompletedWithWrappedCancellationException(h0);
1513     checkCompletedWithWrappedCancellationException(h1);
1514     checkCompletedWithWrappedCancellationException(h2);
1515     checkCompletedWithWrappedCancellationException(h3);
1516 jsr166 1.49 checkCancelled(f);
1517 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1518 jsr166 1.49 }}
1519 dl 1.5
1520     /**
1521 jsr166 1.49 * thenApply result completes exceptionally if action does
1522 dl 1.5 */
1523 jsr166 1.49 public void testThenApply_actionFailed() {
1524     for (ExecutionMode m : ExecutionMode.values())
1525     for (Integer v1 : new Integer[] { 1, null })
1526     {
1527     final CompletableFuture<Integer> f = new CompletableFuture<>();
1528 jsr166 1.91 final FailingFunction[] rs = new FailingFunction[4];
1529     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
1530    
1531     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1532     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1533     assertTrue(f.complete(v1));
1534     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1535     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1536 jsr166 1.49
1537 jsr166 1.91 checkCompletedWithWrappedCFException(h0);
1538     checkCompletedWithWrappedCFException(h1);
1539     checkCompletedWithWrappedCFException(h2);
1540     checkCompletedWithWrappedCFException(h3);
1541 jsr166 1.49 checkCompletedNormally(f, v1);
1542     }}
1543 dl 1.5
1544     /**
1545     * thenAccept result completes normally after normal completion of source
1546     */
1547 jsr166 1.50 public void testThenAccept_normalCompletion() {
1548     for (ExecutionMode m : ExecutionMode.values())
1549     for (Integer v1 : new Integer[] { 1, null })
1550     {
1551     final CompletableFuture<Integer> f = new CompletableFuture<>();
1552 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1553     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1554    
1555     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1556     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1557     checkIncomplete(h0);
1558     checkIncomplete(h1);
1559     assertTrue(f.complete(v1));
1560     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1561     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1562 jsr166 1.50
1563 jsr166 1.92 checkCompletedNormally(h0, null);
1564     checkCompletedNormally(h1, null);
1565     checkCompletedNormally(h2, null);
1566     checkCompletedNormally(h3, null);
1567 jsr166 1.50 checkCompletedNormally(f, v1);
1568 jsr166 1.92 for (NoopConsumer r : rs) r.assertValue(v1);
1569 jsr166 1.50 }}
1570 dl 1.5
1571     /**
1572     * thenAccept result completes exceptionally after exceptional
1573     * completion of source
1574     */
1575 jsr166 1.50 public void testThenAccept_exceptionalCompletion() {
1576     for (ExecutionMode m : ExecutionMode.values())
1577     {
1578     final CFException ex = new CFException();
1579     final CompletableFuture<Integer> f = new CompletableFuture<>();
1580 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1581     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1582    
1583     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1584     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1585     assertTrue(f.completeExceptionally(ex));
1586     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1587     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1588 jsr166 1.50
1589 jsr166 1.92 checkCompletedWithWrappedException(h0, ex);
1590     checkCompletedWithWrappedException(h1, ex);
1591     checkCompletedWithWrappedException(h2, ex);
1592     checkCompletedWithWrappedException(h3, ex);
1593 jsr166 1.72 checkCompletedExceptionally(f, ex);
1594 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1595 jsr166 1.50 }}
1596 dl 1.5
1597     /**
1598 jsr166 1.61 * thenAccept result completes exceptionally if source cancelled
1599 dl 1.5 */
1600 jsr166 1.61 public void testThenAccept_sourceCancelled() {
1601 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1602 jsr166 1.61 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1603 jsr166 1.50 {
1604     final CompletableFuture<Integer> f = new CompletableFuture<>();
1605 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1606     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1607    
1608     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1609     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1610     assertTrue(f.cancel(mayInterruptIfRunning));
1611     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1612     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1613 jsr166 1.50
1614 jsr166 1.92 checkCompletedWithWrappedCancellationException(h0);
1615     checkCompletedWithWrappedCancellationException(h1);
1616     checkCompletedWithWrappedCancellationException(h2);
1617     checkCompletedWithWrappedCancellationException(h3);
1618 jsr166 1.61 checkCancelled(f);
1619 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1620 jsr166 1.50 }}
1621 dl 1.5
1622     /**
1623 jsr166 1.61 * thenAccept result completes exceptionally if action does
1624 dl 1.5 */
1625 jsr166 1.61 public void testThenAccept_actionFailed() {
1626 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1627 jsr166 1.61 for (Integer v1 : new Integer[] { 1, null })
1628 jsr166 1.50 {
1629     final CompletableFuture<Integer> f = new CompletableFuture<>();
1630 jsr166 1.92 final FailingConsumer[] rs = new FailingConsumer[4];
1631     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
1632    
1633     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1634     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1635     assertTrue(f.complete(v1));
1636     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1637     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1638 jsr166 1.50
1639 jsr166 1.92 checkCompletedWithWrappedCFException(h0);
1640     checkCompletedWithWrappedCFException(h1);
1641     checkCompletedWithWrappedCFException(h2);
1642     checkCompletedWithWrappedCFException(h3);
1643 jsr166 1.61 checkCompletedNormally(f, v1);
1644 jsr166 1.50 }}
1645 dl 1.5
1646     /**
1647 jsr166 1.18 * thenCombine result completes normally after normal completion
1648     * of sources
1649 dl 1.5 */
1650 jsr166 1.51 public void testThenCombine_normalCompletion() {
1651     for (ExecutionMode m : ExecutionMode.values())
1652 jsr166 1.43 for (boolean fFirst : new boolean[] { true, false })
1653 jsr166 1.36 for (Integer v1 : new Integer[] { 1, null })
1654 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1655     {
1656 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1657     final CompletableFuture<Integer> g = new CompletableFuture<>();
1658 jsr166 1.93 final SubtractFunction[] rs = new SubtractFunction[6];
1659     for (int i = 0; i < rs.length; i++) rs[i] = new SubtractFunction(m);
1660 jsr166 1.79
1661     final CompletableFuture<Integer> fst = fFirst ? f : g;
1662     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1663     final Integer w1 = fFirst ? v1 : v2;
1664     final Integer w2 = !fFirst ? v1 : v2;
1665    
1666 jsr166 1.93 final CompletableFuture<Integer> h0 = m.thenCombine(f, g, rs[0]);
1667     final CompletableFuture<Integer> h1 = m.thenCombine(fst, fst, rs[1]);
1668 jsr166 1.79 assertTrue(fst.complete(w1));
1669 jsr166 1.93 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, rs[2]);
1670     final CompletableFuture<Integer> h3 = m.thenCombine(fst, fst, rs[3]);
1671     checkIncomplete(h0); rs[0].assertNotInvoked();
1672     checkIncomplete(h2); rs[2].assertNotInvoked();
1673     checkCompletedNormally(h1, subtract(w1, w1));
1674     checkCompletedNormally(h3, subtract(w1, w1));
1675     rs[1].assertValue(subtract(w1, w1));
1676     rs[3].assertValue(subtract(w1, w1));
1677 jsr166 1.79 assertTrue(snd.complete(w2));
1678 jsr166 1.93 final CompletableFuture<Integer> h4 = m.thenCombine(f, g, rs[4]);
1679 jsr166 1.79
1680 jsr166 1.93 checkCompletedNormally(h0, subtract(v1, v2));
1681 jsr166 1.79 checkCompletedNormally(h2, subtract(v1, v2));
1682 jsr166 1.93 checkCompletedNormally(h4, subtract(v1, v2));
1683     rs[0].assertValue(subtract(v1, v2));
1684     rs[2].assertValue(subtract(v1, v2));
1685     rs[4].assertValue(subtract(v1, v2));
1686 jsr166 1.94
1687 jsr166 1.36 checkCompletedNormally(f, v1);
1688     checkCompletedNormally(g, v2);
1689 jsr166 1.47 }}
1690 dl 1.5
1691     /**
1692     * thenCombine result completes exceptionally after exceptional
1693     * completion of either source
1694     */
1695 jsr166 1.79 public void testThenCombine_exceptionalCompletion() throws Throwable {
1696 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1697 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1698 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1699 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1700     {
1701 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1702     final CompletableFuture<Integer> g = new CompletableFuture<>();
1703     final CFException ex = new CFException();
1704 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1705     final SubtractFunction r2 = new SubtractFunction(m);
1706     final SubtractFunction r3 = new SubtractFunction(m);
1707    
1708     final CompletableFuture<Integer> fst = fFirst ? f : g;
1709     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1710     final Callable<Boolean> complete1 = failFirst ?
1711     () -> fst.completeExceptionally(ex) :
1712     () -> fst.complete(v1);
1713     final Callable<Boolean> complete2 = failFirst ?
1714     () -> snd.complete(v1) :
1715     () -> snd.completeExceptionally(ex);
1716    
1717     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1718     assertTrue(complete1.call());
1719     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1720     checkIncomplete(h1);
1721     checkIncomplete(h2);
1722     assertTrue(complete2.call());
1723     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1724 jsr166 1.18
1725 jsr166 1.79 checkCompletedWithWrappedException(h1, ex);
1726     checkCompletedWithWrappedException(h2, ex);
1727     checkCompletedWithWrappedException(h3, ex);
1728     r1.assertNotInvoked();
1729     r2.assertNotInvoked();
1730     r3.assertNotInvoked();
1731     checkCompletedNormally(failFirst ? snd : fst, v1);
1732     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1733 jsr166 1.47 }}
1734 dl 1.5
1735     /**
1736     * thenCombine result completes exceptionally if either source cancelled
1737     */
1738 jsr166 1.79 public void testThenCombine_sourceCancelled() throws Throwable {
1739 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1740     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1741 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1742 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1743 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1744     {
1745 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1746     final CompletableFuture<Integer> g = new CompletableFuture<>();
1747 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1748     final SubtractFunction r2 = new SubtractFunction(m);
1749     final SubtractFunction r3 = new SubtractFunction(m);
1750 jsr166 1.18
1751 jsr166 1.79 final CompletableFuture<Integer> fst = fFirst ? f : g;
1752     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1753     final Callable<Boolean> complete1 = failFirst ?
1754     () -> fst.cancel(mayInterruptIfRunning) :
1755     () -> fst.complete(v1);
1756     final Callable<Boolean> complete2 = failFirst ?
1757     () -> snd.complete(v1) :
1758     () -> snd.cancel(mayInterruptIfRunning);
1759    
1760     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1761     assertTrue(complete1.call());
1762     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1763     checkIncomplete(h1);
1764     checkIncomplete(h2);
1765     assertTrue(complete2.call());
1766     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1767 jsr166 1.36
1768 jsr166 1.79 checkCompletedWithWrappedCancellationException(h1);
1769     checkCompletedWithWrappedCancellationException(h2);
1770     checkCompletedWithWrappedCancellationException(h3);
1771     r1.assertNotInvoked();
1772     r2.assertNotInvoked();
1773     r3.assertNotInvoked();
1774     checkCompletedNormally(failFirst ? snd : fst, v1);
1775     checkCancelled(failFirst ? fst : snd);
1776 jsr166 1.47 }}
1777 dl 1.5
1778     /**
1779 jsr166 1.61 * thenCombine result completes exceptionally if action does
1780     */
1781     public void testThenCombine_actionFailed() {
1782     for (ExecutionMode m : ExecutionMode.values())
1783     for (boolean fFirst : new boolean[] { true, false })
1784     for (Integer v1 : new Integer[] { 1, null })
1785     for (Integer v2 : new Integer[] { 2, null })
1786     {
1787     final CompletableFuture<Integer> f = new CompletableFuture<>();
1788     final CompletableFuture<Integer> g = new CompletableFuture<>();
1789 jsr166 1.79 final FailingBiFunction r1 = new FailingBiFunction(m);
1790     final FailingBiFunction r2 = new FailingBiFunction(m);
1791     final FailingBiFunction r3 = new FailingBiFunction(m);
1792    
1793     final CompletableFuture<Integer> fst = fFirst ? f : g;
1794     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1795     final Integer w1 = fFirst ? v1 : v2;
1796     final Integer w2 = !fFirst ? v1 : v2;
1797    
1798     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1799     assertTrue(fst.complete(w1));
1800     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1801     assertTrue(snd.complete(w2));
1802     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1803 jsr166 1.61
1804 jsr166 1.79 checkCompletedWithWrappedCFException(h1);
1805     checkCompletedWithWrappedCFException(h2);
1806     checkCompletedWithWrappedCFException(h3);
1807 jsr166 1.81 r1.assertInvoked();
1808     r2.assertInvoked();
1809     r3.assertInvoked();
1810 jsr166 1.61 checkCompletedNormally(f, v1);
1811     checkCompletedNormally(g, v2);
1812     }}
1813    
1814     /**
1815 dl 1.5 * thenAcceptBoth result completes normally after normal
1816     * completion of sources
1817     */
1818 jsr166 1.53 public void testThenAcceptBoth_normalCompletion() {
1819 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1820 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1821 jsr166 1.35 for (Integer v1 : new Integer[] { 1, null })
1822 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1823     {
1824 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1825     final CompletableFuture<Integer> g = new CompletableFuture<>();
1826 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1827     final SubtractAction r2 = new SubtractAction(m);
1828     final SubtractAction r3 = new SubtractAction(m);
1829    
1830     final CompletableFuture<Integer> fst = fFirst ? f : g;
1831     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1832     final Integer w1 = fFirst ? v1 : v2;
1833     final Integer w2 = !fFirst ? v1 : v2;
1834    
1835     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1836     assertTrue(fst.complete(w1));
1837     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1838     checkIncomplete(h1);
1839     checkIncomplete(h2);
1840     r1.assertNotInvoked();
1841     r2.assertNotInvoked();
1842     assertTrue(snd.complete(w2));
1843     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1844 jsr166 1.35
1845 jsr166 1.80 checkCompletedNormally(h1, null);
1846     checkCompletedNormally(h2, null);
1847     checkCompletedNormally(h3, null);
1848     r1.assertValue(subtract(v1, v2));
1849     r2.assertValue(subtract(v1, v2));
1850     r3.assertValue(subtract(v1, v2));
1851 jsr166 1.35 checkCompletedNormally(f, v1);
1852     checkCompletedNormally(g, v2);
1853 jsr166 1.47 }}
1854 dl 1.5
1855     /**
1856     * thenAcceptBoth result completes exceptionally after exceptional
1857     * completion of either source
1858     */
1859 jsr166 1.80 public void testThenAcceptBoth_exceptionalCompletion() throws Throwable {
1860 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1861 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1862 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1863 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1864     {
1865 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1866     final CompletableFuture<Integer> g = new CompletableFuture<>();
1867     final CFException ex = new CFException();
1868 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1869     final SubtractAction r2 = new SubtractAction(m);
1870     final SubtractAction r3 = new SubtractAction(m);
1871    
1872     final CompletableFuture<Integer> fst = fFirst ? f : g;
1873     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1874     final Callable<Boolean> complete1 = failFirst ?
1875     () -> fst.completeExceptionally(ex) :
1876     () -> fst.complete(v1);
1877     final Callable<Boolean> complete2 = failFirst ?
1878     () -> snd.complete(v1) :
1879     () -> snd.completeExceptionally(ex);
1880    
1881     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1882     assertTrue(complete1.call());
1883     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1884     checkIncomplete(h1);
1885     checkIncomplete(h2);
1886     assertTrue(complete2.call());
1887     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1888 jsr166 1.35
1889 jsr166 1.80 checkCompletedWithWrappedException(h1, ex);
1890     checkCompletedWithWrappedException(h2, ex);
1891     checkCompletedWithWrappedException(h3, ex);
1892     r1.assertNotInvoked();
1893     r2.assertNotInvoked();
1894     r3.assertNotInvoked();
1895     checkCompletedNormally(failFirst ? snd : fst, v1);
1896     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1897 jsr166 1.47 }}
1898 dl 1.5
1899     /**
1900     * thenAcceptBoth result completes exceptionally if either source cancelled
1901     */
1902 jsr166 1.80 public void testThenAcceptBoth_sourceCancelled() throws Throwable {
1903 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1904     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1905 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1906 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1907 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1908     {
1909 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1910     final CompletableFuture<Integer> g = new CompletableFuture<>();
1911 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1912     final SubtractAction r2 = new SubtractAction(m);
1913     final SubtractAction r3 = new SubtractAction(m);
1914    
1915     final CompletableFuture<Integer> fst = fFirst ? f : g;
1916     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1917     final Callable<Boolean> complete1 = failFirst ?
1918     () -> fst.cancel(mayInterruptIfRunning) :
1919     () -> fst.complete(v1);
1920     final Callable<Boolean> complete2 = failFirst ?
1921     () -> snd.complete(v1) :
1922     () -> snd.cancel(mayInterruptIfRunning);
1923 jsr166 1.35
1924 jsr166 1.80 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1925     assertTrue(complete1.call());
1926     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1927     checkIncomplete(h1);
1928     checkIncomplete(h2);
1929     assertTrue(complete2.call());
1930     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1931 jsr166 1.22
1932 jsr166 1.80 checkCompletedWithWrappedCancellationException(h1);
1933     checkCompletedWithWrappedCancellationException(h2);
1934     checkCompletedWithWrappedCancellationException(h3);
1935     r1.assertNotInvoked();
1936     r2.assertNotInvoked();
1937     r3.assertNotInvoked();
1938     checkCompletedNormally(failFirst ? snd : fst, v1);
1939     checkCancelled(failFirst ? fst : snd);
1940 jsr166 1.47 }}
1941 jsr166 1.34
1942     /**
1943 jsr166 1.61 * thenAcceptBoth result completes exceptionally if action does
1944     */
1945     public void testThenAcceptBoth_actionFailed() {
1946     for (ExecutionMode m : ExecutionMode.values())
1947     for (boolean fFirst : new boolean[] { true, false })
1948     for (Integer v1 : new Integer[] { 1, null })
1949     for (Integer v2 : new Integer[] { 2, null })
1950     {
1951     final CompletableFuture<Integer> f = new CompletableFuture<>();
1952     final CompletableFuture<Integer> g = new CompletableFuture<>();
1953 jsr166 1.80 final FailingBiConsumer r1 = new FailingBiConsumer(m);
1954     final FailingBiConsumer r2 = new FailingBiConsumer(m);
1955     final FailingBiConsumer r3 = new FailingBiConsumer(m);
1956    
1957     final CompletableFuture<Integer> fst = fFirst ? f : g;
1958     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1959     final Integer w1 = fFirst ? v1 : v2;
1960     final Integer w2 = !fFirst ? v1 : v2;
1961    
1962     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1963     assertTrue(fst.complete(w1));
1964     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1965     assertTrue(snd.complete(w2));
1966     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1967 jsr166 1.61
1968 jsr166 1.80 checkCompletedWithWrappedCFException(h1);
1969     checkCompletedWithWrappedCFException(h2);
1970     checkCompletedWithWrappedCFException(h3);
1971 jsr166 1.81 r1.assertInvoked();
1972     r2.assertInvoked();
1973     r3.assertInvoked();
1974 jsr166 1.61 checkCompletedNormally(f, v1);
1975     checkCompletedNormally(g, v2);
1976     }}
1977    
1978     /**
1979 dl 1.5 * runAfterBoth result completes normally after normal
1980     * completion of sources
1981     */
1982 jsr166 1.54 public void testRunAfterBoth_normalCompletion() {
1983 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1984 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
1985 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1986 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1987     {
1988 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1989     final CompletableFuture<Integer> g = new CompletableFuture<>();
1990 jsr166 1.81 final Noop r1 = new Noop(m);
1991     final Noop r2 = new Noop(m);
1992     final Noop r3 = new Noop(m);
1993    
1994     final CompletableFuture<Integer> fst = fFirst ? f : g;
1995     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1996     final Integer w1 = fFirst ? v1 : v2;
1997     final Integer w2 = !fFirst ? v1 : v2;
1998 jsr166 1.33
1999 jsr166 1.81 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2000     assertTrue(fst.complete(w1));
2001     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2002     checkIncomplete(h1);
2003     checkIncomplete(h2);
2004     r1.assertNotInvoked();
2005     r2.assertNotInvoked();
2006     assertTrue(snd.complete(w2));
2007     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2008 dl 1.5
2009 jsr166 1.81 checkCompletedNormally(h1, null);
2010     checkCompletedNormally(h2, null);
2011     checkCompletedNormally(h3, null);
2012     r1.assertInvoked();
2013     r2.assertInvoked();
2014     r3.assertInvoked();
2015 jsr166 1.33 checkCompletedNormally(f, v1);
2016     checkCompletedNormally(g, v2);
2017 jsr166 1.47 }}
2018 dl 1.5
2019     /**
2020     * runAfterBoth result completes exceptionally after exceptional
2021     * completion of either source
2022     */
2023 jsr166 1.81 public void testRunAfterBoth_exceptionalCompletion() throws Throwable {
2024 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2025 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
2026 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
2027 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2028     {
2029 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2030     final CompletableFuture<Integer> g = new CompletableFuture<>();
2031     final CFException ex = new CFException();
2032 jsr166 1.81 final Noop r1 = new Noop(m);
2033     final Noop r2 = new Noop(m);
2034     final Noop r3 = new Noop(m);
2035 jsr166 1.33
2036 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2037     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2038     final Callable<Boolean> complete1 = failFirst ?
2039     () -> fst.completeExceptionally(ex) :
2040     () -> fst.complete(v1);
2041     final Callable<Boolean> complete2 = failFirst ?
2042     () -> snd.complete(v1) :
2043     () -> snd.completeExceptionally(ex);
2044    
2045     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2046     assertTrue(complete1.call());
2047     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2048     checkIncomplete(h1);
2049     checkIncomplete(h2);
2050     assertTrue(complete2.call());
2051     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2052 dl 1.5
2053 jsr166 1.81 checkCompletedWithWrappedException(h1, ex);
2054     checkCompletedWithWrappedException(h2, ex);
2055     checkCompletedWithWrappedException(h3, ex);
2056     r1.assertNotInvoked();
2057     r2.assertNotInvoked();
2058     r3.assertNotInvoked();
2059     checkCompletedNormally(failFirst ? snd : fst, v1);
2060     checkCompletedExceptionally(failFirst ? fst : snd, ex);
2061 jsr166 1.47 }}
2062 dl 1.5
2063 jsr166 1.4 /**
2064 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
2065 jsr166 1.4 */
2066 jsr166 1.81 public void testRunAfterBoth_sourceCancelled() throws Throwable {
2067 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2068 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2069 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
2070 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
2071 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2072     {
2073 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2074     final CompletableFuture<Integer> g = new CompletableFuture<>();
2075 jsr166 1.81 final Noop r1 = new Noop(m);
2076     final Noop r2 = new Noop(m);
2077     final Noop r3 = new Noop(m);
2078 jsr166 1.33
2079 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2080     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2081     final Callable<Boolean> complete1 = failFirst ?
2082     () -> fst.cancel(mayInterruptIfRunning) :
2083     () -> fst.complete(v1);
2084     final Callable<Boolean> complete2 = failFirst ?
2085     () -> snd.complete(v1) :
2086     () -> snd.cancel(mayInterruptIfRunning);
2087    
2088     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2089     assertTrue(complete1.call());
2090     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2091     checkIncomplete(h1);
2092     checkIncomplete(h2);
2093     assertTrue(complete2.call());
2094     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2095 jsr166 1.33
2096 jsr166 1.81 checkCompletedWithWrappedCancellationException(h1);
2097     checkCompletedWithWrappedCancellationException(h2);
2098     checkCompletedWithWrappedCancellationException(h3);
2099     r1.assertNotInvoked();
2100     r2.assertNotInvoked();
2101     r3.assertNotInvoked();
2102     checkCompletedNormally(failFirst ? snd : fst, v1);
2103     checkCancelled(failFirst ? fst : snd);
2104 jsr166 1.47 }}
2105 dl 1.5
2106     /**
2107 jsr166 1.61 * runAfterBoth result completes exceptionally if action does
2108     */
2109     public void testRunAfterBoth_actionFailed() {
2110     for (ExecutionMode m : ExecutionMode.values())
2111     for (boolean fFirst : new boolean[] { true, false })
2112     for (Integer v1 : new Integer[] { 1, null })
2113     for (Integer v2 : new Integer[] { 2, null })
2114     {
2115     final CompletableFuture<Integer> f = new CompletableFuture<>();
2116     final CompletableFuture<Integer> g = new CompletableFuture<>();
2117 jsr166 1.62 final FailingRunnable r1 = new FailingRunnable(m);
2118     final FailingRunnable r2 = new FailingRunnable(m);
2119 jsr166 1.81 final FailingRunnable r3 = new FailingRunnable(m);
2120 jsr166 1.61
2121 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2122     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2123     final Integer w1 = fFirst ? v1 : v2;
2124     final Integer w2 = !fFirst ? v1 : v2;
2125    
2126     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2127     assertTrue(fst.complete(w1));
2128     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2129     assertTrue(snd.complete(w2));
2130     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2131 jsr166 1.61
2132     checkCompletedWithWrappedCFException(h1);
2133     checkCompletedWithWrappedCFException(h2);
2134 jsr166 1.81 checkCompletedWithWrappedCFException(h3);
2135     r1.assertInvoked();
2136     r2.assertInvoked();
2137     r3.assertInvoked();
2138 jsr166 1.61 checkCompletedNormally(f, v1);
2139     checkCompletedNormally(g, v2);
2140     }}
2141    
2142     /**
2143 dl 1.5 * applyToEither result completes normally after normal completion
2144     * of either source
2145     */
2146 jsr166 1.54 public void testApplyToEither_normalCompletion() {
2147 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2148     for (Integer v1 : new Integer[] { 1, null })
2149 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2150     {
2151 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2152     final CompletableFuture<Integer> g = new CompletableFuture<>();
2153 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2154     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2155 jsr166 1.54
2156 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2157     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2158     checkIncomplete(h0);
2159     checkIncomplete(h1);
2160     rs[0].assertNotInvoked();
2161     rs[1].assertNotInvoked();
2162     f.complete(v1);
2163     checkCompletedNormally(h0, inc(v1));
2164     checkCompletedNormally(h1, inc(v1));
2165     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2166     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2167     checkCompletedNormally(h2, inc(v1));
2168     checkCompletedNormally(h3, inc(v1));
2169     g.complete(v2);
2170 jsr166 1.39
2171 jsr166 1.62 // unspecified behavior - both source completions available
2172     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2173     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2174     rs[4].assertValue(h4.join());
2175     rs[5].assertValue(h5.join());
2176     assertTrue(Objects.equals(inc(v1), h4.join()) ||
2177     Objects.equals(inc(v2), h4.join()));
2178     assertTrue(Objects.equals(inc(v1), h5.join()) ||
2179     Objects.equals(inc(v2), h5.join()));
2180 jsr166 1.39
2181     checkCompletedNormally(f, v1);
2182     checkCompletedNormally(g, v2);
2183 jsr166 1.62 checkCompletedNormally(h0, inc(v1));
2184     checkCompletedNormally(h1, inc(v1));
2185     checkCompletedNormally(h2, inc(v1));
2186     checkCompletedNormally(h3, inc(v1));
2187     for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
2188 jsr166 1.47 }}
2189 dl 1.5
2190     /**
2191     * applyToEither result completes exceptionally after exceptional
2192     * completion of either source
2193     */
2194 jsr166 1.62 public void testApplyToEither_exceptionalCompletion() {
2195 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2196 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2197     {
2198 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2199     final CompletableFuture<Integer> g = new CompletableFuture<>();
2200 jsr166 1.54 final CFException ex = new CFException();
2201 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2202     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2203    
2204     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2205     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2206     checkIncomplete(h0);
2207     checkIncomplete(h1);
2208     rs[0].assertNotInvoked();
2209     rs[1].assertNotInvoked();
2210     f.completeExceptionally(ex);
2211 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2212     checkCompletedWithWrappedException(h1, ex);
2213 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2214     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2215 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2216     checkCompletedWithWrappedException(h3, ex);
2217 jsr166 1.62 g.complete(v1);
2218 jsr166 1.54
2219 jsr166 1.62 // unspecified behavior - both source completions available
2220     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2221     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2222     try {
2223     assertEquals(inc(v1), h4.join());
2224 jsr166 1.66 rs[4].assertValue(inc(v1));
2225 jsr166 1.62 } catch (CompletionException ok) {
2226 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2227 jsr166 1.62 rs[4].assertNotInvoked();
2228     }
2229     try {
2230     assertEquals(inc(v1), h5.join());
2231 jsr166 1.66 rs[5].assertValue(inc(v1));
2232 jsr166 1.62 } catch (CompletionException ok) {
2233 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2234 jsr166 1.62 rs[5].assertNotInvoked();
2235 jsr166 1.54 }
2236 jsr166 1.39
2237 jsr166 1.72 checkCompletedExceptionally(f, ex);
2238 jsr166 1.62 checkCompletedNormally(g, v1);
2239 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2240     checkCompletedWithWrappedException(h1, ex);
2241     checkCompletedWithWrappedException(h2, ex);
2242     checkCompletedWithWrappedException(h3, ex);
2243     checkCompletedWithWrappedException(h4, ex);
2244 jsr166 1.62 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2245 jsr166 1.47 }}
2246 jsr166 1.39
2247 jsr166 1.66 public void testApplyToEither_exceptionalCompletion2() {
2248     for (ExecutionMode m : ExecutionMode.values())
2249     for (boolean fFirst : new boolean[] { true, false })
2250     for (Integer v1 : new Integer[] { 1, null })
2251     {
2252     final CompletableFuture<Integer> f = new CompletableFuture<>();
2253     final CompletableFuture<Integer> g = new CompletableFuture<>();
2254     final CFException ex = new CFException();
2255     final IncFunction[] rs = new IncFunction[6];
2256     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2257    
2258     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2259     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2260 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2261     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2262 jsr166 1.66 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2263     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2264    
2265     // unspecified behavior - both source completions available
2266     try {
2267     assertEquals(inc(v1), h0.join());
2268     rs[0].assertValue(inc(v1));
2269     } catch (CompletionException ok) {
2270 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2271 jsr166 1.66 rs[0].assertNotInvoked();
2272     }
2273     try {
2274     assertEquals(inc(v1), h1.join());
2275     rs[1].assertValue(inc(v1));
2276     } catch (CompletionException ok) {
2277 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2278 jsr166 1.66 rs[1].assertNotInvoked();
2279     }
2280     try {
2281     assertEquals(inc(v1), h2.join());
2282     rs[2].assertValue(inc(v1));
2283     } catch (CompletionException ok) {
2284 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2285 jsr166 1.66 rs[2].assertNotInvoked();
2286     }
2287     try {
2288     assertEquals(inc(v1), h3.join());
2289     rs[3].assertValue(inc(v1));
2290     } catch (CompletionException ok) {
2291 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2292 jsr166 1.66 rs[3].assertNotInvoked();
2293     }
2294    
2295     checkCompletedNormally(f, v1);
2296 jsr166 1.72 checkCompletedExceptionally(g, ex);
2297 jsr166 1.66 }}
2298    
2299 jsr166 1.62 /**
2300     * applyToEither result completes exceptionally if either source cancelled
2301     */
2302     public void testApplyToEither_sourceCancelled() {
2303 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2304 jsr166 1.62 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2305 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2306     {
2307 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2308     final CompletableFuture<Integer> g = new CompletableFuture<>();
2309 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2310     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2311    
2312     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2313     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2314     checkIncomplete(h0);
2315     checkIncomplete(h1);
2316     rs[0].assertNotInvoked();
2317     rs[1].assertNotInvoked();
2318     f.cancel(mayInterruptIfRunning);
2319     checkCompletedWithWrappedCancellationException(h0);
2320     checkCompletedWithWrappedCancellationException(h1);
2321     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2322     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2323     checkCompletedWithWrappedCancellationException(h2);
2324     checkCompletedWithWrappedCancellationException(h3);
2325     g.complete(v1);
2326 jsr166 1.39
2327 jsr166 1.62 // unspecified behavior - both source completions available
2328     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2329     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2330 jsr166 1.39 try {
2331 jsr166 1.62 assertEquals(inc(v1), h4.join());
2332 jsr166 1.66 rs[4].assertValue(inc(v1));
2333 jsr166 1.39 } catch (CompletionException ok) {
2334 jsr166 1.62 checkCompletedWithWrappedCancellationException(h4);
2335     rs[4].assertNotInvoked();
2336 jsr166 1.39 }
2337     try {
2338 jsr166 1.62 assertEquals(inc(v1), h5.join());
2339 jsr166 1.66 rs[5].assertValue(inc(v1));
2340 jsr166 1.39 } catch (CompletionException ok) {
2341 jsr166 1.62 checkCompletedWithWrappedCancellationException(h5);
2342     rs[5].assertNotInvoked();
2343 jsr166 1.39 }
2344 dl 1.5
2345 jsr166 1.62 checkCancelled(f);
2346     checkCompletedNormally(g, v1);
2347     checkCompletedWithWrappedCancellationException(h0);
2348     checkCompletedWithWrappedCancellationException(h1);
2349     checkCompletedWithWrappedCancellationException(h2);
2350     checkCompletedWithWrappedCancellationException(h3);
2351     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2352 jsr166 1.47 }}
2353 dl 1.5
2354 jsr166 1.67 public void testApplyToEither_sourceCancelled2() {
2355     for (ExecutionMode m : ExecutionMode.values())
2356     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2357     for (boolean fFirst : new boolean[] { true, false })
2358     for (Integer v1 : new Integer[] { 1, null })
2359     {
2360     final CompletableFuture<Integer> f = new CompletableFuture<>();
2361     final CompletableFuture<Integer> g = new CompletableFuture<>();
2362     final IncFunction[] rs = new IncFunction[6];
2363     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2364    
2365     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2366     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2367 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2368     assertTrue(!fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2369 jsr166 1.67 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2370     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2371    
2372     // unspecified behavior - both source completions available
2373     try {
2374     assertEquals(inc(v1), h0.join());
2375     rs[0].assertValue(inc(v1));
2376     } catch (CompletionException ok) {
2377     checkCompletedWithWrappedCancellationException(h0);
2378     rs[0].assertNotInvoked();
2379     }
2380     try {
2381     assertEquals(inc(v1), h1.join());
2382     rs[1].assertValue(inc(v1));
2383     } catch (CompletionException ok) {
2384     checkCompletedWithWrappedCancellationException(h1);
2385     rs[1].assertNotInvoked();
2386     }
2387     try {
2388     assertEquals(inc(v1), h2.join());
2389     rs[2].assertValue(inc(v1));
2390     } catch (CompletionException ok) {
2391     checkCompletedWithWrappedCancellationException(h2);
2392     rs[2].assertNotInvoked();
2393     }
2394     try {
2395     assertEquals(inc(v1), h3.join());
2396     rs[3].assertValue(inc(v1));
2397     } catch (CompletionException ok) {
2398     checkCompletedWithWrappedCancellationException(h3);
2399     rs[3].assertNotInvoked();
2400     }
2401    
2402     checkCompletedNormally(f, v1);
2403     checkCancelled(g);
2404     }}
2405    
2406 dl 1.5 /**
2407     * applyToEither result completes exceptionally if action does
2408     */
2409 jsr166 1.62 public void testApplyToEither_actionFailed() {
2410 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2411     for (Integer v1 : new Integer[] { 1, null })
2412 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2413     {
2414 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2415     final CompletableFuture<Integer> g = new CompletableFuture<>();
2416 jsr166 1.62 final FailingFunction[] rs = new FailingFunction[6];
2417     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2418 jsr166 1.39
2419 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2420     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2421 jsr166 1.39 f.complete(v1);
2422 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2423     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2424     checkCompletedWithWrappedCFException(h0);
2425     checkCompletedWithWrappedCFException(h1);
2426     checkCompletedWithWrappedCFException(h2);
2427     checkCompletedWithWrappedCFException(h3);
2428 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2429    
2430     g.complete(v2);
2431    
2432     // unspecified behavior - both source completions available
2433     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2434     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2435    
2436 jsr166 1.62 checkCompletedWithWrappedCFException(h4);
2437 jsr166 1.63 assertTrue(Objects.equals(v1, rs[4].value) ||
2438     Objects.equals(v2, rs[4].value));
2439 jsr166 1.62 checkCompletedWithWrappedCFException(h5);
2440 jsr166 1.63 assertTrue(Objects.equals(v1, rs[5].value) ||
2441     Objects.equals(v2, rs[5].value));
2442    
2443     checkCompletedNormally(f, v1);
2444     checkCompletedNormally(g, v2);
2445 jsr166 1.47 }}
2446 dl 1.5
2447     /**
2448     * acceptEither result completes normally after normal completion
2449     * of either source
2450     */
2451 jsr166 1.63 public void testAcceptEither_normalCompletion() {
2452 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2453     for (Integer v1 : new Integer[] { 1, null })
2454 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2455     {
2456 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2457     final CompletableFuture<Integer> g = new CompletableFuture<>();
2458 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2459     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2460 jsr166 1.40
2461 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2462     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2463     checkIncomplete(h0);
2464     checkIncomplete(h1);
2465     rs[0].assertNotInvoked();
2466     rs[1].assertNotInvoked();
2467 jsr166 1.40 f.complete(v1);
2468 jsr166 1.63 checkCompletedNormally(h0, null);
2469     checkCompletedNormally(h1, null);
2470 jsr166 1.64 rs[0].assertValue(v1);
2471     rs[1].assertValue(v1);
2472 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2473     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2474     checkCompletedNormally(h2, null);
2475     checkCompletedNormally(h3, null);
2476 jsr166 1.64 rs[2].assertValue(v1);
2477     rs[3].assertValue(v1);
2478 jsr166 1.40 g.complete(v2);
2479    
2480 jsr166 1.63 // unspecified behavior - both source completions available
2481     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2482     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2483     checkCompletedNormally(h4, null);
2484     checkCompletedNormally(h5, null);
2485 jsr166 1.64 assertTrue(Objects.equals(v1, rs[4].value) ||
2486     Objects.equals(v2, rs[4].value));
2487     assertTrue(Objects.equals(v1, rs[5].value) ||
2488     Objects.equals(v2, rs[5].value));
2489 jsr166 1.40
2490     checkCompletedNormally(f, v1);
2491     checkCompletedNormally(g, v2);
2492 jsr166 1.63 checkCompletedNormally(h0, null);
2493     checkCompletedNormally(h1, null);
2494     checkCompletedNormally(h2, null);
2495     checkCompletedNormally(h3, null);
2496 jsr166 1.64 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2497 jsr166 1.47 }}
2498 dl 1.5
2499     /**
2500     * acceptEither result completes exceptionally after exceptional
2501     * completion of either source
2502     */
2503 jsr166 1.63 public void testAcceptEither_exceptionalCompletion() {
2504 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2505 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2506     {
2507 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2508     final CompletableFuture<Integer> g = new CompletableFuture<>();
2509     final CFException ex = new CFException();
2510 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2511     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2512 jsr166 1.40
2513 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2514     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2515     checkIncomplete(h0);
2516     checkIncomplete(h1);
2517     rs[0].assertNotInvoked();
2518     rs[1].assertNotInvoked();
2519 jsr166 1.40 f.completeExceptionally(ex);
2520 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2521     checkCompletedWithWrappedException(h1, ex);
2522 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2523     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2524 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2525     checkCompletedWithWrappedException(h3, ex);
2526 jsr166 1.63
2527 jsr166 1.40 g.complete(v1);
2528    
2529 jsr166 1.63 // unspecified behavior - both source completions available
2530     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2531     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2532 jsr166 1.40 try {
2533 jsr166 1.63 assertNull(h4.join());
2534 jsr166 1.64 rs[4].assertValue(v1);
2535 jsr166 1.40 } catch (CompletionException ok) {
2536 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2537 jsr166 1.63 rs[4].assertNotInvoked();
2538 jsr166 1.40 }
2539     try {
2540 jsr166 1.63 assertNull(h5.join());
2541 jsr166 1.64 rs[5].assertValue(v1);
2542 jsr166 1.40 } catch (CompletionException ok) {
2543 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2544 jsr166 1.63 rs[5].assertNotInvoked();
2545 jsr166 1.40 }
2546 dl 1.5
2547 jsr166 1.72 checkCompletedExceptionally(f, ex);
2548 jsr166 1.40 checkCompletedNormally(g, v1);
2549 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2550     checkCompletedWithWrappedException(h1, ex);
2551     checkCompletedWithWrappedException(h2, ex);
2552     checkCompletedWithWrappedException(h3, ex);
2553     checkCompletedWithWrappedException(h4, ex);
2554 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2555 jsr166 1.47 }}
2556 dl 1.5
2557 jsr166 1.68 public void testAcceptEither_exceptionalCompletion2() {
2558     for (ExecutionMode m : ExecutionMode.values())
2559     for (boolean fFirst : new boolean[] { true, false })
2560     for (Integer v1 : new Integer[] { 1, null })
2561     {
2562     final CompletableFuture<Integer> f = new CompletableFuture<>();
2563     final CompletableFuture<Integer> g = new CompletableFuture<>();
2564     final CFException ex = new CFException();
2565     final NoopConsumer[] rs = new NoopConsumer[6];
2566     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2567    
2568     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2569     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2570 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2571     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2572 jsr166 1.68 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2573     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2574    
2575     // unspecified behavior - both source completions available
2576     try {
2577     assertEquals(null, h0.join());
2578     rs[0].assertValue(v1);
2579     } catch (CompletionException ok) {
2580 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2581 jsr166 1.68 rs[0].assertNotInvoked();
2582     }
2583     try {
2584     assertEquals(null, h1.join());
2585     rs[1].assertValue(v1);
2586     } catch (CompletionException ok) {
2587 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2588 jsr166 1.68 rs[1].assertNotInvoked();
2589     }
2590     try {
2591     assertEquals(null, h2.join());
2592     rs[2].assertValue(v1);
2593     } catch (CompletionException ok) {
2594 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2595 jsr166 1.68 rs[2].assertNotInvoked();
2596     }
2597     try {
2598     assertEquals(null, h3.join());
2599     rs[3].assertValue(v1);
2600     } catch (CompletionException ok) {
2601 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2602 jsr166 1.68 rs[3].assertNotInvoked();
2603     }
2604    
2605     checkCompletedNormally(f, v1);
2606 jsr166 1.72 checkCompletedExceptionally(g, ex);
2607 jsr166 1.68 }}
2608    
2609 dl 1.5 /**
2610     * acceptEither result completes exceptionally if either source cancelled
2611     */
2612 jsr166 1.63 public void testAcceptEither_sourceCancelled() {
2613 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2614     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2615 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2616     {
2617 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2618     final CompletableFuture<Integer> g = new CompletableFuture<>();
2619 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2620     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2621 jsr166 1.63
2622     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2623     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2624     checkIncomplete(h0);
2625     checkIncomplete(h1);
2626     rs[0].assertNotInvoked();
2627     rs[1].assertNotInvoked();
2628     f.cancel(mayInterruptIfRunning);
2629     checkCompletedWithWrappedCancellationException(h0);
2630     checkCompletedWithWrappedCancellationException(h1);
2631     final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2632     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2633     checkCompletedWithWrappedCancellationException(h2);
2634     checkCompletedWithWrappedCancellationException(h3);
2635 jsr166 1.40
2636     g.complete(v1);
2637    
2638 jsr166 1.63 // unspecified behavior - both source completions available
2639     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2640     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2641     try {
2642     assertNull(h4.join());
2643 jsr166 1.64 rs[4].assertValue(v1);
2644 jsr166 1.63 } catch (CompletionException ok) {
2645     checkCompletedWithWrappedCancellationException(h4);
2646     rs[4].assertNotInvoked();
2647     }
2648     try {
2649     assertNull(h5.join());
2650 jsr166 1.64 rs[5].assertValue(v1);
2651 jsr166 1.63 } catch (CompletionException ok) {
2652     checkCompletedWithWrappedCancellationException(h5);
2653     rs[5].assertNotInvoked();
2654     }
2655    
2656 jsr166 1.40 checkCancelled(f);
2657     checkCompletedNormally(g, v1);
2658 jsr166 1.63 checkCompletedWithWrappedCancellationException(h0);
2659     checkCompletedWithWrappedCancellationException(h1);
2660     checkCompletedWithWrappedCancellationException(h2);
2661     checkCompletedWithWrappedCancellationException(h3);
2662     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2663 jsr166 1.47 }}
2664 jsr166 1.40
2665 jsr166 1.63 /**
2666     * acceptEither result completes exceptionally if action does
2667     */
2668     public void testAcceptEither_actionFailed() {
2669 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2670 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2671 jsr166 1.63 for (Integer v2 : new Integer[] { 2, null })
2672 jsr166 1.47 {
2673 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2674     final CompletableFuture<Integer> g = new CompletableFuture<>();
2675 jsr166 1.63 final FailingConsumer[] rs = new FailingConsumer[6];
2676     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2677 jsr166 1.40
2678 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2679     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2680 jsr166 1.40 f.complete(v1);
2681 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2682     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2683     checkCompletedWithWrappedCFException(h0);
2684     checkCompletedWithWrappedCFException(h1);
2685     checkCompletedWithWrappedCFException(h2);
2686     checkCompletedWithWrappedCFException(h3);
2687     for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2688 jsr166 1.40
2689 jsr166 1.63 g.complete(v2);
2690 jsr166 1.40
2691 jsr166 1.63 // unspecified behavior - both source completions available
2692     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2693     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2694 jsr166 1.40
2695 jsr166 1.63 checkCompletedWithWrappedCFException(h4);
2696     assertTrue(Objects.equals(v1, rs[4].value) ||
2697     Objects.equals(v2, rs[4].value));
2698     checkCompletedWithWrappedCFException(h5);
2699     assertTrue(Objects.equals(v1, rs[5].value) ||
2700     Objects.equals(v2, rs[5].value));
2701 jsr166 1.40
2702     checkCompletedNormally(f, v1);
2703 jsr166 1.63 checkCompletedNormally(g, v2);
2704 jsr166 1.47 }}
2705 dl 1.5
2706     /**
2707     * runAfterEither result completes normally after normal completion
2708     * of either source
2709     */
2710 jsr166 1.65 public void testRunAfterEither_normalCompletion() {
2711 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2712     for (Integer v1 : new Integer[] { 1, null })
2713 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2714     {
2715 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2716     final CompletableFuture<Integer> g = new CompletableFuture<>();
2717 jsr166 1.65 final Noop[] rs = new Noop[6];
2718     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2719 jsr166 1.41
2720 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2721     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2722     checkIncomplete(h0);
2723     checkIncomplete(h1);
2724     rs[0].assertNotInvoked();
2725     rs[1].assertNotInvoked();
2726 jsr166 1.41 f.complete(v1);
2727 jsr166 1.65 checkCompletedNormally(h0, null);
2728     checkCompletedNormally(h1, null);
2729     rs[0].assertInvoked();
2730     rs[1].assertInvoked();
2731     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2732     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2733     checkCompletedNormally(h2, null);
2734     checkCompletedNormally(h3, null);
2735     rs[2].assertInvoked();
2736     rs[3].assertInvoked();
2737 jsr166 1.41
2738     g.complete(v2);
2739    
2740 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2741     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2742 jsr166 1.47
2743 jsr166 1.41 checkCompletedNormally(f, v1);
2744     checkCompletedNormally(g, v2);
2745 jsr166 1.65 checkCompletedNormally(h0, null);
2746     checkCompletedNormally(h1, null);
2747     checkCompletedNormally(h2, null);
2748     checkCompletedNormally(h3, null);
2749     checkCompletedNormally(h4, null);
2750     checkCompletedNormally(h5, null);
2751     for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2752 jsr166 1.47 }}
2753 dl 1.5
2754     /**
2755     * runAfterEither result completes exceptionally after exceptional
2756     * completion of either source
2757     */
2758 jsr166 1.65 public void testRunAfterEither_exceptionalCompletion() {
2759 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2760 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2761     {
2762 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2763     final CompletableFuture<Integer> g = new CompletableFuture<>();
2764     final CFException ex = new CFException();
2765 jsr166 1.65 final Noop[] rs = new Noop[6];
2766     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2767 jsr166 1.41
2768 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2769     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2770     checkIncomplete(h0);
2771     checkIncomplete(h1);
2772     rs[0].assertNotInvoked();
2773     rs[1].assertNotInvoked();
2774 jsr166 1.78 assertTrue(f.completeExceptionally(ex));
2775 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2776     checkCompletedWithWrappedException(h1, ex);
2777 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2778     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2779 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2780     checkCompletedWithWrappedException(h3, ex);
2781 jsr166 1.65
2782 jsr166 1.78 assertTrue(g.complete(v1));
2783 jsr166 1.41
2784 jsr166 1.65 // unspecified behavior - both source completions available
2785     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2786     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2787     try {
2788     assertNull(h4.join());
2789     rs[4].assertInvoked();
2790     } catch (CompletionException ok) {
2791 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2792 jsr166 1.65 rs[4].assertNotInvoked();
2793     }
2794     try {
2795     assertNull(h5.join());
2796     rs[5].assertInvoked();
2797     } catch (CompletionException ok) {
2798 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2799 jsr166 1.65 rs[5].assertNotInvoked();
2800     }
2801    
2802 jsr166 1.72 checkCompletedExceptionally(f, ex);
2803 jsr166 1.41 checkCompletedNormally(g, v1);
2804 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2805     checkCompletedWithWrappedException(h1, ex);
2806     checkCompletedWithWrappedException(h2, ex);
2807     checkCompletedWithWrappedException(h3, ex);
2808     checkCompletedWithWrappedException(h4, ex);
2809 jsr166 1.65 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2810 jsr166 1.47 }}
2811 jsr166 1.41
2812 jsr166 1.69 public void testRunAfterEither_exceptionalCompletion2() {
2813     for (ExecutionMode m : ExecutionMode.values())
2814     for (boolean fFirst : new boolean[] { true, false })
2815     for (Integer v1 : new Integer[] { 1, null })
2816     {
2817     final CompletableFuture<Integer> f = new CompletableFuture<>();
2818     final CompletableFuture<Integer> g = new CompletableFuture<>();
2819     final CFException ex = new CFException();
2820     final Noop[] rs = new Noop[6];
2821     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2822    
2823     final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2824     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2825 jsr166 1.78 assertTrue( fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2826     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2827 jsr166 1.69 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2828     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2829    
2830     // unspecified behavior - both source completions available
2831     try {
2832     assertEquals(null, h0.join());
2833     rs[0].assertInvoked();
2834     } catch (CompletionException ok) {
2835 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2836 jsr166 1.69 rs[0].assertNotInvoked();
2837     }
2838     try {
2839     assertEquals(null, h1.join());
2840     rs[1].assertInvoked();
2841     } catch (CompletionException ok) {
2842 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2843 jsr166 1.69 rs[1].assertNotInvoked();
2844     }
2845     try {
2846     assertEquals(null, h2.join());
2847     rs[2].assertInvoked();
2848     } catch (CompletionException ok) {
2849 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2850 jsr166 1.69 rs[2].assertNotInvoked();
2851     }
2852     try {
2853     assertEquals(null, h3.join());
2854     rs[3].assertInvoked();
2855     } catch (CompletionException ok) {
2856 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2857 jsr166 1.69 rs[3].assertNotInvoked();
2858     }
2859    
2860     checkCompletedNormally(f, v1);
2861 jsr166 1.72 checkCompletedExceptionally(g, ex);
2862 jsr166 1.69 }}
2863    
2864 jsr166 1.65 /**
2865     * runAfterEither result completes exceptionally if either source cancelled
2866     */
2867     public void testRunAfterEither_sourceCancelled() {
2868 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2869 jsr166 1.65 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2870 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2871     {
2872 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2873     final CompletableFuture<Integer> g = new CompletableFuture<>();
2874 jsr166 1.65 final Noop[] rs = new Noop[6];
2875     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2876 jsr166 1.41
2877 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2878     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2879     checkIncomplete(h0);
2880     checkIncomplete(h1);
2881     rs[0].assertNotInvoked();
2882     rs[1].assertNotInvoked();
2883     f.cancel(mayInterruptIfRunning);
2884     checkCompletedWithWrappedCancellationException(h0);
2885     checkCompletedWithWrappedCancellationException(h1);
2886     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2887     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2888     checkCompletedWithWrappedCancellationException(h2);
2889     checkCompletedWithWrappedCancellationException(h3);
2890 jsr166 1.41
2891 jsr166 1.78 assertTrue(g.complete(v1));
2892 jsr166 1.41
2893 jsr166 1.65 // unspecified behavior - both source completions available
2894     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2895     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2896 jsr166 1.41 try {
2897 jsr166 1.65 assertNull(h4.join());
2898     rs[4].assertInvoked();
2899 jsr166 1.41 } catch (CompletionException ok) {
2900 jsr166 1.65 checkCompletedWithWrappedCancellationException(h4);
2901     rs[4].assertNotInvoked();
2902 jsr166 1.41 }
2903     try {
2904 jsr166 1.65 assertNull(h5.join());
2905     rs[5].assertInvoked();
2906 jsr166 1.41 } catch (CompletionException ok) {
2907 jsr166 1.65 checkCompletedWithWrappedCancellationException(h5);
2908     rs[5].assertNotInvoked();
2909 jsr166 1.41 }
2910 dl 1.5
2911 jsr166 1.65 checkCancelled(f);
2912 jsr166 1.41 checkCompletedNormally(g, v1);
2913 jsr166 1.65 checkCompletedWithWrappedCancellationException(h0);
2914     checkCompletedWithWrappedCancellationException(h1);
2915     checkCompletedWithWrappedCancellationException(h2);
2916     checkCompletedWithWrappedCancellationException(h3);
2917     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2918 jsr166 1.47 }}
2919 dl 1.5
2920     /**
2921     * runAfterEither result completes exceptionally if action does
2922     */
2923 jsr166 1.65 public void testRunAfterEither_actionFailed() {
2924 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2925     for (Integer v1 : new Integer[] { 1, null })
2926 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2927     {
2928 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2929     final CompletableFuture<Integer> g = new CompletableFuture<>();
2930 jsr166 1.65 final FailingRunnable[] rs = new FailingRunnable[6];
2931     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2932 jsr166 1.41
2933 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2934     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2935 jsr166 1.78 assertTrue(f.complete(v1));
2936 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2937     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2938     checkCompletedWithWrappedCFException(h0);
2939     checkCompletedWithWrappedCFException(h1);
2940     checkCompletedWithWrappedCFException(h2);
2941     checkCompletedWithWrappedCFException(h3);
2942     for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2943 jsr166 1.78 assertTrue(g.complete(v2));
2944 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2945     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2946     checkCompletedWithWrappedCFException(h4);
2947     checkCompletedWithWrappedCFException(h5);
2948 jsr166 1.41
2949     checkCompletedNormally(f, v1);
2950     checkCompletedNormally(g, v2);
2951 jsr166 1.65 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2952 jsr166 1.47 }}
2953 dl 1.5
2954     /**
2955     * thenCompose result completes normally after normal completion of source
2956     */
2957 jsr166 1.48 public void testThenCompose_normalCompletion() {
2958 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2959 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2960 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2961     {
2962 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2963 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2964 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2965 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2966 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2967 jsr166 1.21
2968 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2969     checkCompletedNormally(f, v1);
2970 jsr166 1.70 r.assertValue(v1);
2971 jsr166 1.47 }}
2972 dl 1.5
2973     /**
2974     * thenCompose result completes exceptionally after exceptional
2975     * completion of source
2976     */
2977 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2978 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2979 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2980 jsr166 1.47 {
2981 jsr166 1.44 final CFException ex = new CFException();
2982 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2983 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2984 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2985 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2986 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2987 jsr166 1.21
2988 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
2989     checkCompletedExceptionally(f, ex);
2990 jsr166 1.62 r.assertNotInvoked();
2991 jsr166 1.47 }}
2992 dl 1.5
2993     /**
2994     * thenCompose result completes exceptionally if action does
2995     */
2996 jsr166 1.48 public void testThenCompose_actionFailed() {
2997 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2998 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2999 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
3000     {
3001 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
3002     final FailingCompletableFutureFunction r
3003 jsr166 1.56 = new FailingCompletableFutureFunction(m);
3004 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
3005 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
3006 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
3007 jsr166 1.44
3008 dl 1.5 checkCompletedWithWrappedCFException(g);
3009 jsr166 1.44 checkCompletedNormally(f, v1);
3010 jsr166 1.47 }}
3011 dl 1.5
3012     /**
3013     * thenCompose result completes exceptionally if source cancelled
3014     */
3015 jsr166 1.48 public void testThenCompose_sourceCancelled() {
3016 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
3017 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
3018 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3019     {
3020 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
3021 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
3022 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3023 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
3024 jsr166 1.50 if (createIncomplete) {
3025     checkIncomplete(g);
3026     assertTrue(f.cancel(mayInterruptIfRunning));
3027     }
3028 jsr166 1.44
3029 dl 1.5 checkCompletedWithWrappedCancellationException(g);
3030 jsr166 1.44 checkCancelled(f);
3031 jsr166 1.47 }}
3032 dl 1.5
3033 jsr166 1.99 /**
3034     * thenCompose result completes exceptionally if the result of the action does
3035     */
3036     public void testThenCompose_actionReturnsFailingFuture() {
3037     for (ExecutionMode m : ExecutionMode.values())
3038     for (int order = 0; order < 6; order++)
3039     for (Integer v1 : new Integer[] { 1, null })
3040     {
3041     final CFException ex = new CFException();
3042     final CompletableFuture<Integer> f = new CompletableFuture<>();
3043     final CompletableFuture<Integer> g = new CompletableFuture<>();
3044     final CompletableFuture<Integer> h;
3045     // Test all permutations of orders
3046     switch (order) {
3047     case 0:
3048     assertTrue(f.complete(v1));
3049     assertTrue(g.completeExceptionally(ex));
3050     h = m.thenCompose(f, (x -> g));
3051     break;
3052     case 1:
3053     assertTrue(f.complete(v1));
3054     h = m.thenCompose(f, (x -> g));
3055     assertTrue(g.completeExceptionally(ex));
3056     break;
3057     case 2:
3058     assertTrue(g.completeExceptionally(ex));
3059     assertTrue(f.complete(v1));
3060     h = m.thenCompose(f, (x -> g));
3061     break;
3062     case 3:
3063     assertTrue(g.completeExceptionally(ex));
3064     h = m.thenCompose(f, (x -> g));
3065     assertTrue(f.complete(v1));
3066     break;
3067     case 4:
3068     h = m.thenCompose(f, (x -> g));
3069     assertTrue(f.complete(v1));
3070     assertTrue(g.completeExceptionally(ex));
3071     break;
3072     case 5:
3073     h = m.thenCompose(f, (x -> g));
3074     assertTrue(f.complete(v1));
3075     assertTrue(g.completeExceptionally(ex));
3076     break;
3077     default: throw new AssertionError();
3078     }
3079    
3080     checkCompletedExceptionally(g, ex);
3081     checkCompletedWithWrappedException(h, ex);
3082     checkCompletedNormally(f, v1);
3083     }}
3084    
3085 jsr166 1.6 // other static methods
3086 dl 1.5
3087     /**
3088     * allOf(no component futures) returns a future completed normally
3089     * with the value null
3090     */
3091     public void testAllOf_empty() throws Exception {
3092 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
3093 dl 1.5 checkCompletedNormally(f, null);
3094     }
3095    
3096     /**
3097 jsr166 1.25 * allOf returns a future completed normally with the value null
3098     * when all components complete normally
3099 dl 1.5 */
3100 jsr166 1.25 public void testAllOf_normal() throws Exception {
3101 jsr166 1.88 for (int k = 1; k < 10; k++) {
3102 jsr166 1.59 CompletableFuture<Integer>[] fs
3103     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3104 jsr166 1.86 for (int i = 0; i < k; i++)
3105 jsr166 1.22 fs[i] = new CompletableFuture<>();
3106 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3107 jsr166 1.86 for (int i = 0; i < k; i++) {
3108 dl 1.5 checkIncomplete(f);
3109 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
3110 dl 1.5 fs[i].complete(one);
3111     }
3112 dl 1.9 checkCompletedNormally(f, null);
3113 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3114 dl 1.5 }
3115     }
3116    
3117 jsr166 1.59 public void testAllOf_backwards() throws Exception {
3118 jsr166 1.88 for (int k = 1; k < 10; k++) {
3119 jsr166 1.59 CompletableFuture<Integer>[] fs
3120     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3121 jsr166 1.86 for (int i = 0; i < k; i++)
3122 jsr166 1.59 fs[i] = new CompletableFuture<>();
3123     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3124     for (int i = k - 1; i >= 0; i--) {
3125     checkIncomplete(f);
3126     checkIncomplete(CompletableFuture.allOf(fs));
3127     fs[i].complete(one);
3128     }
3129     checkCompletedNormally(f, null);
3130     checkCompletedNormally(CompletableFuture.allOf(fs), null);
3131     }
3132     }
3133    
3134 jsr166 1.88 public void testAllOf_exceptional() throws Exception {
3135     for (int k = 1; k < 10; k++) {
3136     CompletableFuture<Integer>[] fs
3137     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3138     CFException ex = new CFException();
3139     for (int i = 0; i < k; i++)
3140     fs[i] = new CompletableFuture<>();
3141     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3142     for (int i = 0; i < k; i++) {
3143     checkIncomplete(f);
3144     checkIncomplete(CompletableFuture.allOf(fs));
3145     if (i != k/2) {
3146     fs[i].complete(i);
3147     checkCompletedNormally(fs[i], i);
3148     } else {
3149     fs[i].completeExceptionally(ex);
3150     checkCompletedExceptionally(fs[i], ex);
3151     }
3152     }
3153     checkCompletedWithWrappedException(f, ex);
3154     checkCompletedWithWrappedException(CompletableFuture.allOf(fs), ex);
3155     }
3156     }
3157    
3158 dl 1.5 /**
3159     * anyOf(no component futures) returns an incomplete future
3160     */
3161     public void testAnyOf_empty() throws Exception {
3162 jsr166 1.86 for (Integer v1 : new Integer[] { 1, null })
3163     {
3164 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
3165 dl 1.5 checkIncomplete(f);
3166 jsr166 1.86
3167     f.complete(v1);
3168     checkCompletedNormally(f, v1);
3169     }}
3170 dl 1.5
3171     /**
3172 jsr166 1.25 * anyOf returns a future completed normally with a value when
3173     * a component future does
3174 dl 1.5 */
3175 jsr166 1.24 public void testAnyOf_normal() throws Exception {
3176 jsr166 1.86 for (int k = 0; k < 10; k++) {
3177 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
3178 jsr166 1.86 for (int i = 0; i < k; i++)
3179 jsr166 1.22 fs[i] = new CompletableFuture<>();
3180 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3181 dl 1.5 checkIncomplete(f);
3182 jsr166 1.86 for (int i = 0; i < k; i++) {
3183     fs[i].complete(i);
3184     checkCompletedNormally(f, 0);
3185     int x = (int) CompletableFuture.anyOf(fs).join();
3186     assertTrue(0 <= x && x <= i);
3187     }
3188     }
3189     }
3190     public void testAnyOf_normal_backwards() throws Exception {
3191     for (int k = 0; k < 10; k++) {
3192     CompletableFuture[] fs = new CompletableFuture[k];
3193     for (int i = 0; i < k; i++)
3194     fs[i] = new CompletableFuture<>();
3195     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3196     checkIncomplete(f);
3197     for (int i = k - 1; i >= 0; i--) {
3198     fs[i].complete(i);
3199     checkCompletedNormally(f, k - 1);
3200     int x = (int) CompletableFuture.anyOf(fs).join();
3201     assertTrue(i <= x && x <= k - 1);
3202 jsr166 1.24 }
3203     }
3204     }
3205    
3206     /**
3207     * anyOf result completes exceptionally when any component does.
3208     */
3209     public void testAnyOf_exceptional() throws Exception {
3210 jsr166 1.86 for (int k = 0; k < 10; k++) {
3211 jsr166 1.24 CompletableFuture[] fs = new CompletableFuture[k];
3212 jsr166 1.87 CFException[] exs = new CFException[k];
3213     for (int i = 0; i < k; i++) {
3214 jsr166 1.24 fs[i] = new CompletableFuture<>();
3215 jsr166 1.87 exs[i] = new CFException();
3216     }
3217 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3218     checkIncomplete(f);
3219 jsr166 1.86 for (int i = 0; i < k; i++) {
3220 jsr166 1.87 fs[i].completeExceptionally(exs[i]);
3221     checkCompletedWithWrappedException(f, exs[0]);
3222     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3223     }
3224     }
3225     }
3226    
3227     public void testAnyOf_exceptional_backwards() throws Exception {
3228     for (int k = 0; k < 10; k++) {
3229     CompletableFuture[] fs = new CompletableFuture[k];
3230     CFException[] exs = new CFException[k];
3231     for (int i = 0; i < k; i++) {
3232     fs[i] = new CompletableFuture<>();
3233     exs[i] = new CFException();
3234     }
3235     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3236     checkIncomplete(f);
3237     for (int i = k - 1; i >= 0; i--) {
3238     fs[i].completeExceptionally(exs[i]);
3239     checkCompletedWithWrappedException(f, exs[k - 1]);
3240 jsr166 1.24 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3241 dl 1.5 }
3242     }
3243     }
3244    
3245     /**
3246     * Completion methods throw NullPointerException with null arguments
3247     */
3248     public void testNPE() {
3249 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3250     CompletableFuture<Integer> g = new CompletableFuture<>();
3251 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3252 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
3253 jsr166 1.14
3254     Runnable[] throwingActions = {
3255 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
3256     () -> CompletableFuture.supplyAsync(null, exec),
3257 jsr166 1.95 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.SYNC, 42), null),
3258 jsr166 1.31
3259     () -> CompletableFuture.runAsync(null),
3260     () -> CompletableFuture.runAsync(null, exec),
3261     () -> CompletableFuture.runAsync(() -> {}, null),
3262    
3263     () -> f.completeExceptionally(null),
3264    
3265     () -> f.thenApply(null),
3266     () -> f.thenApplyAsync(null),
3267     () -> f.thenApplyAsync((x) -> x, null),
3268     () -> f.thenApplyAsync(null, exec),
3269    
3270     () -> f.thenAccept(null),
3271     () -> f.thenAcceptAsync(null),
3272     () -> f.thenAcceptAsync((x) -> {} , null),
3273     () -> f.thenAcceptAsync(null, exec),
3274    
3275     () -> f.thenRun(null),
3276     () -> f.thenRunAsync(null),
3277     () -> f.thenRunAsync(() -> {} , null),
3278     () -> f.thenRunAsync(null, exec),
3279    
3280     () -> f.thenCombine(g, null),
3281     () -> f.thenCombineAsync(g, null),
3282     () -> f.thenCombineAsync(g, null, exec),
3283     () -> f.thenCombine(nullFuture, (x, y) -> x),
3284     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3285     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3286     () -> f.thenCombineAsync(g, (x, y) -> x, null),
3287    
3288     () -> f.thenAcceptBoth(g, null),
3289     () -> f.thenAcceptBothAsync(g, null),
3290     () -> f.thenAcceptBothAsync(g, null, exec),
3291     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3292     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3293     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3294     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3295    
3296     () -> f.runAfterBoth(g, null),
3297     () -> f.runAfterBothAsync(g, null),
3298     () -> f.runAfterBothAsync(g, null, exec),
3299     () -> f.runAfterBoth(nullFuture, () -> {}),
3300     () -> f.runAfterBothAsync(nullFuture, () -> {}),
3301     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3302     () -> f.runAfterBothAsync(g, () -> {}, null),
3303    
3304     () -> f.applyToEither(g, null),
3305     () -> f.applyToEitherAsync(g, null),
3306     () -> f.applyToEitherAsync(g, null, exec),
3307     () -> f.applyToEither(nullFuture, (x) -> x),
3308     () -> f.applyToEitherAsync(nullFuture, (x) -> x),
3309     () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
3310     () -> f.applyToEitherAsync(g, (x) -> x, null),
3311    
3312     () -> f.acceptEither(g, null),
3313     () -> f.acceptEitherAsync(g, null),
3314     () -> f.acceptEitherAsync(g, null, exec),
3315     () -> f.acceptEither(nullFuture, (x) -> {}),
3316     () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
3317     () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
3318     () -> f.acceptEitherAsync(g, (x) -> {}, null),
3319    
3320     () -> f.runAfterEither(g, null),
3321     () -> f.runAfterEitherAsync(g, null),
3322     () -> f.runAfterEitherAsync(g, null, exec),
3323     () -> f.runAfterEither(nullFuture, () -> {}),
3324     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3325     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3326     () -> f.runAfterEitherAsync(g, () -> {}, null),
3327    
3328     () -> f.thenCompose(null),
3329     () -> f.thenComposeAsync(null),
3330 jsr166 1.56 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
3331 jsr166 1.31 () -> f.thenComposeAsync(null, exec),
3332    
3333     () -> f.exceptionally(null),
3334    
3335     () -> f.handle(null),
3336 jsr166 1.107
3337 jsr166 1.31 () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3338     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3339     () -> CompletableFuture.allOf(f, null),
3340     () -> CompletableFuture.allOf(null, f),
3341    
3342     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3343     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3344     () -> CompletableFuture.anyOf(f, null),
3345     () -> CompletableFuture.anyOf(null, f),
3346 jsr166 1.32
3347     () -> f.obtrudeException(null),
3348 jsr166 1.115
3349     () -> CompletableFuture.delayedExecutor(1L, SECONDS, null),
3350     () -> CompletableFuture.delayedExecutor(1L, null, new ThreadExecutor()),
3351     () -> CompletableFuture.delayedExecutor(1L, null),
3352 jsr166 1.116
3353     () -> f.orTimeout(1L, null),
3354     () -> f.completeOnTimeout(42, 1L, null),
3355 jsr166 1.14 };
3356 dl 1.5
3357 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3358 jsr166 1.17 assertEquals(0, exec.count.get());
3359 dl 1.5 }
3360    
3361 dl 1.26 /**
3362     * toCompletableFuture returns this CompletableFuture.
3363     */
3364     public void testToCompletableFuture() {
3365     CompletableFuture<Integer> f = new CompletableFuture<>();
3366     assertSame(f, f.toCompletableFuture());
3367     }
3368    
3369 dl 1.103 // jdk9
3370 jsr166 1.104
3371 dl 1.103 /**
3372     * newIncompleteFuture returns an incomplete CompletableFuture
3373     */
3374     public void testNewIncompleteFuture() {
3375 jsr166 1.117 for (Integer v1 : new Integer[] { 1, null })
3376     {
3377 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3378     CompletableFuture<Integer> g = f.newIncompleteFuture();
3379     checkIncomplete(f);
3380     checkIncomplete(g);
3381 jsr166 1.117 f.complete(v1);
3382     checkCompletedNormally(f, v1);
3383     checkIncomplete(g);
3384     g.complete(v1);
3385     checkCompletedNormally(g, v1);
3386     assertSame(g.getClass(), CompletableFuture.class);
3387     }}
3388 dl 1.103
3389     /**
3390     * completedStage returns a completed CompletionStage
3391     */
3392     public void testCompletedStage() {
3393     AtomicInteger x = new AtomicInteger();
3394     AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3395     CompletionStage<Integer> f = CompletableFuture.completedStage(1);
3396     f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3397     assertEquals(x.get(), 1);
3398     assertNull(r.get());
3399     }
3400    
3401     /**
3402     * defaultExecutor by default returns the commonPool if
3403 dl 1.110 * it supports more than one thread.
3404 dl 1.103 */
3405     public void testDefaultExecutor() {
3406     CompletableFuture<Integer> f = new CompletableFuture<>();
3407     Executor e = f.defaultExecutor();
3408 jsr166 1.108 Executor c = ForkJoinPool.commonPool();
3409 dl 1.105 if (ForkJoinPool.getCommonPoolParallelism() > 1)
3410 dl 1.103 assertSame(e, c);
3411 jsr166 1.111 else
3412     assertNotSame(e, c);
3413 dl 1.103 }
3414    
3415     /**
3416     * failedFuture returns a CompletableFuture completed
3417     * exceptionally with the given Exception
3418     */
3419     public void testFailedFuture() {
3420     CFException ex = new CFException();
3421     CompletableFuture<Integer> f = CompletableFuture.failedFuture(ex);
3422 jsr166 1.119 checkCompletedExceptionally(f, ex);
3423 dl 1.103 }
3424    
3425     /**
3426     * failedFuture(null) throws NPE
3427     */
3428 jsr166 1.118 public void testFailedFuture_null() {
3429 dl 1.103 try {
3430     CompletableFuture<Integer> f = CompletableFuture.failedFuture(null);
3431 jsr166 1.104 shouldThrow();
3432     } catch (NullPointerException success) {}
3433 dl 1.103 }
3434    
3435     /**
3436     * copy returns a CompletableFuture that is completed normally,
3437     * with the same value, when source is.
3438     */
3439     public void testCopy() {
3440     CompletableFuture<Integer> f = new CompletableFuture<>();
3441     CompletableFuture<Integer> g = f.copy();
3442     checkIncomplete(f);
3443     checkIncomplete(g);
3444     f.complete(1);
3445     checkCompletedNormally(f, 1);
3446     checkCompletedNormally(g, 1);
3447     }
3448    
3449     /**
3450     * copy returns a CompletableFuture that is completed exceptionally
3451     * when source is.
3452     */
3453     public void testCopy2() {
3454     CompletableFuture<Integer> f = new CompletableFuture<>();
3455     CompletableFuture<Integer> g = f.copy();
3456     checkIncomplete(f);
3457     checkIncomplete(g);
3458     CFException ex = new CFException();
3459     f.completeExceptionally(ex);
3460     checkCompletedExceptionally(f, ex);
3461     checkCompletedWithWrappedCFException(g);
3462     }
3463    
3464     /**
3465     * minimalCompletionStage returns a CompletableFuture that is
3466     * completed normally, with the same value, when source is.
3467     */
3468     public void testMinimalCompletionStage() {
3469     CompletableFuture<Integer> f = new CompletableFuture<>();
3470     CompletionStage<Integer> g = f.minimalCompletionStage();
3471     AtomicInteger x = new AtomicInteger();
3472     AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3473     checkIncomplete(f);
3474     g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3475     f.complete(1);
3476     checkCompletedNormally(f, 1);
3477     assertEquals(x.get(), 1);
3478     assertNull(r.get());
3479     }
3480    
3481     /**
3482     * minimalCompletionStage returns a CompletableFuture that is
3483     * completed exceptionally when source is.
3484     */
3485     public void testMinimalCompletionStage2() {
3486     CompletableFuture<Integer> f = new CompletableFuture<>();
3487     CompletionStage<Integer> g = f.minimalCompletionStage();
3488     AtomicInteger x = new AtomicInteger();
3489     AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3490     g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3491     checkIncomplete(f);
3492     CFException ex = new CFException();
3493     f.completeExceptionally(ex);
3494     checkCompletedExceptionally(f, ex);
3495     assertEquals(x.get(), 0);
3496     assertEquals(r.get().getCause(), ex);
3497     }
3498    
3499     /**
3500 jsr166 1.109 * failedStage returns a CompletionStage completed
3501 dl 1.103 * exceptionally with the given Exception
3502     */
3503     public void testFailedStage() {
3504     CFException ex = new CFException();
3505     CompletionStage<Integer> f = CompletableFuture.failedStage(ex);
3506     AtomicInteger x = new AtomicInteger();
3507     AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3508     f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3509     assertEquals(x.get(), 0);
3510 jsr166 1.119 assertEquals(r.get(), ex);
3511 dl 1.103 }
3512    
3513     /**
3514     * completeAsync completes with value of given supplier
3515     */
3516     public void testCompleteAsync() {
3517     CompletableFuture<Integer> f = new CompletableFuture<>();
3518     f.completeAsync(() -> 1);
3519     f.join();
3520     checkCompletedNormally(f, 1);
3521     }
3522    
3523     /**
3524     * completeAsync completes exceptionally if given supplier throws
3525     */
3526     public void testCompleteAsync2() {
3527     CompletableFuture<Integer> f = new CompletableFuture<>();
3528     CFException ex = new CFException();
3529     f.completeAsync(() -> {if (true) throw ex; return 1;});
3530     try {
3531     f.join();
3532     shouldThrow();
3533 jsr166 1.104 } catch (Exception success) {}
3534 dl 1.103 checkCompletedWithWrappedCFException(f);
3535     }
3536    
3537     /**
3538     * completeAsync with given executor completes with value of given supplier
3539     */
3540     public void testCompleteAsync3() {
3541     CompletableFuture<Integer> f = new CompletableFuture<>();
3542     f.completeAsync(() -> 1, new ThreadExecutor());
3543     f.join();
3544     checkCompletedNormally(f, 1);
3545     }
3546    
3547     /**
3548     * completeAsync with given executor completes exceptionally if
3549     * given supplier throws
3550     */
3551     public void testCompleteAsync4() {
3552     CompletableFuture<Integer> f = new CompletableFuture<>();
3553     CFException ex = new CFException();
3554     f.completeAsync(() -> {if (true) throw ex; return 1;}, new ThreadExecutor());
3555     try {
3556     f.join();
3557     shouldThrow();
3558 jsr166 1.104 } catch (Exception success) {}
3559 dl 1.103 checkCompletedWithWrappedCFException(f);
3560     }
3561    
3562     /**
3563 jsr166 1.106 * orTimeout completes with TimeoutException if not complete
3564 dl 1.103 */
3565     public void testOrTimeout() {
3566     CompletableFuture<Integer> f = new CompletableFuture<>();
3567 jsr166 1.112 f.orTimeout(SHORT_DELAY_MS, MILLISECONDS);
3568 dl 1.103 checkCompletedExceptionallyWithTimeout(f);
3569     }
3570    
3571     /**
3572 jsr166 1.106 * orTimeout completes normally if completed before timeout
3573 dl 1.103 */
3574     public void testOrTimeout2() {
3575     CompletableFuture<Integer> f = new CompletableFuture<>();
3576     f.complete(1);
3577 jsr166 1.112 f.orTimeout(SHORT_DELAY_MS, MILLISECONDS);
3578 dl 1.103 checkCompletedNormally(f, 1);
3579     }
3580    
3581     /**
3582 jsr166 1.106 * completeOnTimeout completes with given value if not complete
3583 dl 1.103 */
3584     public void testCompleteOnTimeout() {
3585     CompletableFuture<Integer> f = new CompletableFuture<>();
3586 jsr166 1.112 f.completeOnTimeout(-1, SHORT_DELAY_MS, MILLISECONDS);
3587 dl 1.103 f.join();
3588     checkCompletedNormally(f, -1);
3589     }
3590    
3591     /**
3592 jsr166 1.106 * completeOnTimeout has no effect if completed within timeout
3593 dl 1.103 */
3594     public void testCompleteOnTimeout2() {
3595     CompletableFuture<Integer> f = new CompletableFuture<>();
3596     f.complete(1);
3597 jsr166 1.112 f.completeOnTimeout(-1, SHORT_DELAY_MS, MILLISECONDS);
3598 dl 1.103 checkCompletedNormally(f, 1);
3599     }
3600    
3601     /**
3602     * delayedExecutor returns an executor that delays submission
3603     */
3604 jsr166 1.114 public void testDelayedExecutor() throws Exception {
3605 dl 1.103 long timeoutMillis = SMALL_DELAY_MS;
3606     Executor d = CompletableFuture.delayedExecutor(timeoutMillis,
3607     MILLISECONDS);
3608     long startTime = System.nanoTime();
3609     CompletableFuture<Integer> f = CompletableFuture.supplyAsync(() -> 1, d);
3610     assertNull(f.getNow(null));
3611 jsr166 1.114 assertEquals(1, (int) f.get(LONG_DELAY_MS, MILLISECONDS));
3612 dl 1.103 assertTrue(millisElapsedSince(startTime) > timeoutMillis/2);
3613     checkCompletedNormally(f, 1);
3614     }
3615    
3616     /**
3617     * delayedExecutor for a given executor returns an executor that
3618     * delays submission
3619     */
3620 jsr166 1.114 public void testDelayedExecutor2() throws Exception {
3621 dl 1.103 long timeoutMillis = SMALL_DELAY_MS;
3622     Executor d = CompletableFuture.delayedExecutor(timeoutMillis,
3623     MILLISECONDS,
3624     new ThreadExecutor());
3625     long startTime = System.nanoTime();
3626     CompletableFuture<Integer> f = CompletableFuture.supplyAsync(() -> 1, d);
3627     assertNull(f.getNow(null));
3628 jsr166 1.114 assertEquals(1, (int) f.get(LONG_DELAY_MS, MILLISECONDS));
3629 dl 1.103 assertTrue(millisElapsedSince(startTime) > timeoutMillis/2);
3630     checkCompletedNormally(f, 1);
3631     }
3632    
3633 jsr166 1.82 //--- tests of implementation details; not part of official tck ---
3634    
3635     Object resultOf(CompletableFuture<?> f) {
3636     try {
3637     java.lang.reflect.Field resultField
3638     = CompletableFuture.class.getDeclaredField("result");
3639     resultField.setAccessible(true);
3640     return resultField.get(f);
3641     } catch (Throwable t) { throw new AssertionError(t); }
3642     }
3643    
3644     public void testExceptionPropagationReusesResultObject() {
3645     if (!testImplementationDetails) return;
3646     for (ExecutionMode m : ExecutionMode.values())
3647     {
3648 jsr166 1.83 final CFException ex = new CFException();
3649     final CompletableFuture<Integer> v42 = CompletableFuture.completedFuture(42);
3650     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3651    
3652 jsr166 1.89 List<Function<CompletableFuture<Integer>, CompletableFuture<?>>> funs
3653 jsr166 1.83 = new ArrayList<>();
3654    
3655 jsr166 1.89 funs.add((y) -> m.thenRun(y, new Noop(m)));
3656     funs.add((y) -> m.thenAccept(y, new NoopConsumer(m)));
3657     funs.add((y) -> m.thenApply(y, new IncFunction(m)));
3658 jsr166 1.83
3659 jsr166 1.89 funs.add((y) -> m.runAfterEither(y, incomplete, new Noop(m)));
3660     funs.add((y) -> m.acceptEither(y, incomplete, new NoopConsumer(m)));
3661     funs.add((y) -> m.applyToEither(y, incomplete, new IncFunction(m)));
3662 jsr166 1.83
3663 jsr166 1.89 funs.add((y) -> m.runAfterBoth(y, v42, new Noop(m)));
3664     funs.add((y) -> m.thenAcceptBoth(y, v42, new SubtractAction(m)));
3665     funs.add((y) -> m.thenCombine(y, v42, new SubtractFunction(m)));
3666 jsr166 1.83
3667 jsr166 1.89 funs.add((y) -> m.whenComplete(y, (Integer x, Throwable t) -> {}));
3668 jsr166 1.83
3669 jsr166 1.89 funs.add((y) -> m.thenCompose(y, new CompletableFutureInc(m)));
3670 jsr166 1.83
3671 jsr166 1.89 funs.add((y) -> CompletableFuture.allOf(new CompletableFuture<?>[] {y, v42}));
3672     funs.add((y) -> CompletableFuture.anyOf(new CompletableFuture<?>[] {y, incomplete}));
3673 jsr166 1.85
3674 jsr166 1.83 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3675 jsr166 1.89 fun : funs) {
3676 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3677     f.completeExceptionally(ex);
3678     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3679     checkCompletedWithWrappedException(src, ex);
3680 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3681 jsr166 1.83 checkCompletedWithWrappedException(dep, ex);
3682     assertSame(resultOf(src), resultOf(dep));
3683     }
3684    
3685     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3686 jsr166 1.89 fun : funs) {
3687 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3688     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3689 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3690 jsr166 1.83 f.completeExceptionally(ex);
3691     checkCompletedWithWrappedException(src, ex);
3692     checkCompletedWithWrappedException(dep, ex);
3693     assertSame(resultOf(src), resultOf(dep));
3694     }
3695    
3696     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3697     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3698 jsr166 1.89 fun : funs) {
3699 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3700     f.cancel(mayInterruptIfRunning);
3701     checkCancelled(f);
3702     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3703     checkCompletedWithWrappedCancellationException(src);
3704 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3705 jsr166 1.83 checkCompletedWithWrappedCancellationException(dep);
3706     assertSame(resultOf(src), resultOf(dep));
3707     }
3708    
3709     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3710     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3711 jsr166 1.89 fun : funs) {
3712 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3713     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3714 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3715 jsr166 1.83 f.cancel(mayInterruptIfRunning);
3716     checkCancelled(f);
3717     checkCompletedWithWrappedCancellationException(src);
3718     checkCompletedWithWrappedCancellationException(dep);
3719     assertSame(resultOf(src), resultOf(dep));
3720     }
3721 jsr166 1.82 }}
3722    
3723 jsr166 1.1 }