ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.225
Committed: Wed Jan 27 01:57:24 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.224: +12 -12 lines
Log Message:
use diamond <> pervasively

File Contents

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