ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/FutureTaskTest.java
(Generate patch)

Comparing jsr166/src/test/tck/FutureTaskTest.java (file contents):
Revision 1.14 by jsr166, Mon Nov 16 05:30:07 2009 UTC vs.
Revision 1.26 by jsr166, Tue May 31 16:16:23 2011 UTC

# Line 1 | Line 1
1   /*
2   * Written by Doug Lea with assistance from members of JCP JSR-166
3   * Expert Group and released to the public domain, as explained at
4 < * http://creativecommons.org/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
8  
9   import junit.framework.*;
10 < import java.util.concurrent.*;
10 > import java.util.concurrent.Callable;
11 > import java.util.concurrent.CancellationException;
12 > import java.util.concurrent.CountDownLatch;
13 > import java.util.concurrent.ExecutionException;
14 > import java.util.concurrent.Future;
15 > import java.util.concurrent.FutureTask;
16 > import java.util.concurrent.TimeoutException;
17 > import static java.util.concurrent.TimeUnit.MILLISECONDS;
18 > import static java.util.concurrent.TimeUnit.SECONDS;
19   import java.util.*;
20  
21   public class FutureTaskTest extends JSR166TestCase {
22  
23      public static void main(String[] args) {
24 <        junit.textui.TestRunner.run (suite());
24 >        junit.textui.TestRunner.run(suite());
25      }
26      public static Test suite() {
27 <        return new TestSuite(FutureTaskTest.class);
27 >        return new TestSuite(FutureTaskTest.class);
28 >    }
29 >
30 >    void checkNotDone(Future<?> f) {
31 >        assertFalse(f.isDone());
32 >        assertFalse(f.isCancelled());
33 >    }
34 >
35 >    <T> void checkCompletedNormally(Future<T> f, T expected) {
36 >        assertTrue(f.isDone());
37 >        assertFalse(f.isCancelled());
38 >
39 >        try {
40 >            assertSame(expected, f.get());
41 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
42 >        try {
43 >            assertSame(expected, f.get(5L, SECONDS));
44 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
45 >
46 >        assertFalse(f.cancel(false));
47 >        assertFalse(f.cancel(true));
48 >    }
49 >
50 >    void checkCancelled(Future<?> f) {
51 >        assertTrue(f.isDone());
52 >        assertTrue(f.isCancelled());
53 >
54 >        try {
55 >            f.get();
56 >            shouldThrow();
57 >        } catch (CancellationException success) {
58 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
59 >
60 >        try {
61 >            f.get(5L, SECONDS);
62 >            shouldThrow();
63 >        } catch (CancellationException success) {
64 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
65 >
66 >        assertFalse(f.cancel(false));
67 >        assertFalse(f.cancel(true));
68 >    }
69 >
70 >    void checkCompletedAbnormally(Future<?> f, Throwable t) {
71 >        assertTrue(f.isDone());
72 >        assertFalse(f.isCancelled());
73 >
74 >        try {
75 >            f.get();
76 >            shouldThrow();
77 >        } catch (ExecutionException success) {
78 >            assertSame(t, success.getCause());
79 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
80 >
81 >        try {
82 >            f.get(5L, SECONDS);
83 >            shouldThrow();
84 >        } catch (ExecutionException success) {
85 >            assertSame(t, success.getCause());
86 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
87 >
88 >        assertFalse(f.cancel(false));
89 >        assertFalse(f.cancel(true));
90      }
91  
92      /**
# Line 36 | Line 106 | public class FutureTaskTest extends JSR1
106          try {
107              FutureTask task = new FutureTask(null);
108              shouldThrow();
109 <        }
40 <        catch (NullPointerException success) {
41 <        }
109 >        } catch (NullPointerException success) {}
110      }
111  
112      /**
# Line 48 | Line 116 | public class FutureTaskTest extends JSR1
116          try {
117              FutureTask task = new FutureTask(null, Boolean.TRUE);
118              shouldThrow();
119 <        }
52 <        catch (NullPointerException success) {
53 <        }
119 >        } catch (NullPointerException success) {}
120      }
121  
122      /**
123       * isDone is true when a task completes
124       */
125      public void testIsDone() {
126 <        FutureTask task = new FutureTask( new NoOpCallable());
127 <        task.run();
128 <        assertTrue(task.isDone());
129 <        assertFalse(task.isCancelled());
126 >        FutureTask task = new FutureTask(new NoOpCallable());
127 >        task.run();
128 >        assertTrue(task.isDone());
129 >        checkCompletedNormally(task, Boolean.TRUE);
130      }
131  
132      /**
# Line 68 | Line 134 | public class FutureTaskTest extends JSR1
134       */
135      public void testRunAndReset() {
136          PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
137 <        assertTrue(task.runAndReset());
138 <        assertFalse(task.isDone());
137 >        assertTrue(task.runAndReset());
138 >        checkNotDone(task);
139      }
140  
141      /**
# Line 78 | Line 144 | public class FutureTaskTest extends JSR1
144      public void testResetAfterCancel() {
145          PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
146          assertTrue(task.cancel(false));
147 <        assertFalse(task.runAndReset());
148 <        assertTrue(task.isDone());
83 <        assertTrue(task.isCancelled());
147 >        assertFalse(task.runAndReset());
148 >        checkCancelled(task);
149      }
150  
151  
87
152      /**
153       * setting value causes get to return it
154       */
155 <    public void testSet() {
155 >    public void testSet() throws Exception {
156          PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
157          task.set(one);
158 <        try {
159 <            assertEquals(task.get(), one);
96 <        }
97 <        catch (Exception e) {
98 <            unexpectedException();
99 <        }
158 >        assertSame(task.get(), one);
159 >        checkCompletedNormally(task, one);
160      }
161  
162      /**
163       * setException causes get to throw ExecutionException
164       */
165 <    public void testSetException() {
165 >    public void testSetException() throws Exception {
166          Exception nse = new NoSuchElementException();
167          PublicFutureTask task = new PublicFutureTask(new NoOpCallable());
168          task.setException(nse);
169          try {
170              Object x = task.get();
171              shouldThrow();
172 <        }
173 <        catch (ExecutionException ee) {
174 <            Throwable cause = ee.getCause();
115 <            assertEquals(cause, nse);
116 <        }
117 <        catch (Exception e) {
118 <            unexpectedException();
172 >        } catch (ExecutionException success) {
173 >            assertSame(success.getCause(), nse);
174 >            checkCompletedAbnormally(task, nse);
175          }
176      }
177  
178      /**
179 <     *  Cancelling before running succeeds
179 >     * Cancelling before running succeeds
180       */
181      public void testCancelBeforeRun() {
182 <        FutureTask task = new FutureTask( new NoOpCallable());
182 >        FutureTask task = new FutureTask(new NoOpCallable());
183          assertTrue(task.cancel(false));
184 <        task.run();
185 <        assertTrue(task.isDone());
130 <        assertTrue(task.isCancelled());
184 >        task.run();
185 >        checkCancelled(task);
186      }
187  
188      /**
189       * Cancel(true) before run succeeds
190       */
191      public void testCancelBeforeRun2() {
192 <        FutureTask task = new FutureTask( new NoOpCallable());
192 >        FutureTask task = new FutureTask(new NoOpCallable());
193          assertTrue(task.cancel(true));
194 <        task.run();
195 <        assertTrue(task.isDone());
141 <        assertTrue(task.isCancelled());
194 >        task.run();
195 >        checkCancelled(task);
196      }
197  
198      /**
199       * cancel of a completed task fails
200       */
201      public void testCancelAfterRun() {
202 <        FutureTask task = new FutureTask( new NoOpCallable());
203 <        task.run();
202 >        FutureTask task = new FutureTask(new NoOpCallable());
203 >        task.run();
204          assertFalse(task.cancel(false));
205 <        assertTrue(task.isDone());
152 <        assertFalse(task.isCancelled());
205 >        checkCompletedNormally(task, Boolean.TRUE);
206      }
207  
208      /**
209       * cancel(true) interrupts a running task
210       */
211 <    public void testCancelInterrupt() {
212 <        FutureTask task = new FutureTask( new Callable() {
213 <                public Object call() {
214 <                    try {
215 <                        Thread.sleep(MEDIUM_DELAY_MS);
216 <                        threadShouldThrow();
211 >    public void testCancelInterrupt() throws InterruptedException {
212 >        final CountDownLatch threadStarted = new CountDownLatch(1);
213 >        final FutureTask task =
214 >            new FutureTask(new CheckedCallable<Object>() {
215 >                public Object realCall() {
216 >                    threadStarted.countDown();
217 >                    long t0 = System.nanoTime();
218 >                    for (;;) {
219 >                        if (Thread.interrupted())
220 >                            return Boolean.TRUE;
221 >                        if (millisElapsedSince(t0) > MEDIUM_DELAY_MS)
222 >                            fail("interrupt not delivered");
223 >                        Thread.yield();
224                      }
225 <                    catch (InterruptedException success) {}
166 <                    return Boolean.TRUE;
167 <                } });
168 <        Thread t = new  Thread(task);
169 <        t.start();
225 >                }});
226  
227 <        try {
228 <            Thread.sleep(SHORT_DELAY_MS);
229 <            assertTrue(task.cancel(true));
230 <            t.join();
231 <            assertTrue(task.isDone());
232 <            assertTrue(task.isCancelled());
177 <        } catch (InterruptedException e) {
178 <            unexpectedException();
179 <        }
227 >        Thread t = newStartedThread(task);
228 >        threadStarted.await();
229 >        assertTrue(task.cancel(true));
230 >        checkCancelled(task);
231 >        awaitTermination(t, MEDIUM_DELAY_MS);
232 >        checkCancelled(task);
233      }
234  
182
235      /**
236       * cancel(false) does not interrupt a running task
237       */
238 <    public void testCancelNoInterrupt() {
239 <        FutureTask task = new FutureTask( new Callable() {
240 <                public Object call() {
241 <                    try {
242 <                        Thread.sleep(MEDIUM_DELAY_MS);
243 <                    }
244 <                    catch (InterruptedException success) {
245 <                        threadFail("should not interrupt");
246 <                    }
238 >    public void testCancelNoInterrupt() throws InterruptedException {
239 >        final CountDownLatch threadStarted = new CountDownLatch(1);
240 >        final CountDownLatch cancelled = new CountDownLatch(1);
241 >        final FutureTask<Boolean> task =
242 >            new FutureTask<Boolean>(new CheckedCallable<Boolean>() {
243 >                public Boolean realCall() throws InterruptedException {
244 >                    threadStarted.countDown();
245 >                    cancelled.await(MEDIUM_DELAY_MS, MILLISECONDS);
246 >                    assertFalse(Thread.interrupted());
247                      return Boolean.TRUE;
248 <                } });
197 <        Thread t = new  Thread(task);
198 <        t.start();
248 >                }});
249  
250 <        try {
251 <            Thread.sleep(SHORT_DELAY_MS);
252 <            assertTrue(task.cancel(false));
253 <            t.join();
254 <            assertTrue(task.isDone());
255 <            assertTrue(task.isCancelled());
256 <        } catch (InterruptedException e) {
207 <            unexpectedException();
208 <        }
250 >        Thread t = newStartedThread(task);
251 >        threadStarted.await();
252 >        assertTrue(task.cancel(false));
253 >        checkCancelled(task);
254 >        cancelled.countDown();
255 >        awaitTermination(t, MEDIUM_DELAY_MS);
256 >        checkCancelled(task);
257      }
258  
259      /**
260 <     * set in one thread causes get in another thread to retrieve value
260 >     * run in one thread causes get in another thread to retrieve value
261       */
262 <    public void testGet1() {
263 <        final FutureTask ft = new FutureTask(new Callable() {
264 <                public Object call() {
265 <                    try {
266 <                        Thread.sleep(MEDIUM_DELAY_MS);
267 <                    } catch (InterruptedException e) {
220 <                        threadUnexpectedException();
221 <                    }
262 >    public void testGetRun() throws InterruptedException {
263 >        final CountDownLatch threadStarted = new CountDownLatch(1);
264 >
265 >        final FutureTask task =
266 >            new FutureTask(new CheckedCallable<Object>() {
267 >                public Object realCall() throws InterruptedException {
268                      return Boolean.TRUE;
269 <                }
224 <        });
225 <        Thread t = new Thread(new Runnable() {
226 <                public void run() {
227 <                    try {
228 <                        ft.get();
229 <                    } catch (Exception e) {
230 <                        threadUnexpectedException();
231 <                    }
232 <                }
233 <            });
234 <        try {
235 <            assertFalse(ft.isDone());
236 <            assertFalse(ft.isCancelled());
237 <            t.start();
238 <            Thread.sleep(SHORT_DELAY_MS);
239 <            ft.run();
240 <            t.join();
241 <            assertTrue(ft.isDone());
242 <            assertFalse(ft.isCancelled());
243 <        } catch (InterruptedException e) {
244 <            unexpectedException();
269 >                }});
270  
271 <        }
271 >        Thread t = newStartedThread(new CheckedRunnable() {
272 >            public void realRun() throws Exception {
273 >                threadStarted.countDown();
274 >                assertSame(Boolean.TRUE, task.get());
275 >            }});
276 >
277 >        threadStarted.await();
278 >        checkNotDone(task);
279 >        assertTrue(t.isAlive());
280 >        task.run();
281 >        checkCompletedNormally(task, Boolean.TRUE);
282 >        awaitTermination(t, MEDIUM_DELAY_MS);
283      }
284  
285      /**
286 <     * set in one thread causes timed get in another thread to retrieve value
286 >     * set in one thread causes get in another thread to retrieve value
287       */
288 <    public void testTimedGet1() {
289 <        final FutureTask ft = new FutureTask(new Callable() {
290 <                public Object call() {
291 <                    try {
292 <                        Thread.sleep(MEDIUM_DELAY_MS);
293 <                    } catch (InterruptedException e) {
258 <                        threadUnexpectedException();
259 <                    }
288 >    public void testGetSet() throws InterruptedException {
289 >        final CountDownLatch threadStarted = new CountDownLatch(1);
290 >
291 >        final PublicFutureTask task =
292 >            new PublicFutureTask(new CheckedCallable<Object>() {
293 >                public Object realCall() throws InterruptedException {
294                      return Boolean.TRUE;
295 <                }
262 <            });
263 <        Thread t = new Thread(new Runnable() {
264 <                public void run() {
265 <                    try {
266 <                        ft.get(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
267 <                    } catch (TimeoutException success) {
268 <                    } catch (Exception e) {
269 <                        threadUnexpectedException();
270 <                    }
271 <                }
272 <            });
273 <        try {
274 <            assertFalse(ft.isDone());
275 <            assertFalse(ft.isCancelled());
276 <            t.start();
277 <            ft.run();
278 <            t.join();
279 <            assertTrue(ft.isDone());
280 <            assertFalse(ft.isCancelled());
281 <        } catch (InterruptedException e) {
282 <            unexpectedException();
295 >                }});
296  
297 <        }
297 >        Thread t = newStartedThread(new CheckedRunnable() {
298 >            public void realRun() throws Exception {
299 >                threadStarted.countDown();
300 >                assertSame(Boolean.FALSE, task.get());
301 >            }});
302 >
303 >        threadStarted.await();
304 >        checkNotDone(task);
305 >        assertTrue(t.isAlive());
306 >        task.set(Boolean.FALSE);
307 >        checkCompletedNormally(task, Boolean.FALSE);
308 >        awaitTermination(t, MEDIUM_DELAY_MS);
309      }
310  
311      /**
312 <     *  Cancelling a task causes timed get in another thread to throw CancellationException
312 >     * run in one thread causes timed get in another thread to retrieve value
313       */
314 <    public void testTimedGet_Cancellation() {
315 <        final FutureTask ft = new FutureTask(new Callable() {
316 <                public Object call() {
317 <                    try {
318 <                        Thread.sleep(SMALL_DELAY_MS);
319 <                        threadShouldThrow();
320 <                    } catch (InterruptedException e) {
321 <                    }
322 <                    return Boolean.TRUE;
323 <                }
324 <            });
325 <        try {
326 <            Thread t1 = new Thread(new Runnable() {
327 <                    public void run() {
328 <                        try {
329 <                            ft.get(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
330 <                            threadShouldThrow();
331 <                        } catch (CancellationException success) {}
332 <                        catch (Exception e) {
333 <                            threadUnexpectedException();
334 <                        }
335 <                    }
312 <                });
313 <            Thread t2 = new Thread(ft);
314 <            t1.start();
315 <            t2.start();
316 <            Thread.sleep(SHORT_DELAY_MS);
317 <            ft.cancel(true);
318 <            t1.join();
319 <            t2.join();
320 <        } catch (InterruptedException ie) {
321 <            unexpectedException();
322 <        }
314 >    public void testTimedGetRun() throws InterruptedException {
315 >        final CountDownLatch threadStarted = new CountDownLatch(1);
316 >
317 >        final FutureTask task =
318 >            new FutureTask(new CheckedCallable<Object>() {
319 >                public Object realCall() throws InterruptedException {
320 >                    return Boolean.TRUE;
321 >                }});
322 >
323 >        Thread t = newStartedThread(new CheckedRunnable() {
324 >            public void realRun() throws Exception {
325 >                threadStarted.countDown();
326 >                assertSame(Boolean.TRUE,
327 >                           task.get(MEDIUM_DELAY_MS, MILLISECONDS));
328 >            }});
329 >
330 >        threadStarted.await();
331 >        checkNotDone(task);
332 >        assertTrue(t.isAlive());
333 >        task.run();
334 >        checkCompletedNormally(task, Boolean.TRUE);
335 >        awaitTermination(t, MEDIUM_DELAY_MS);
336      }
337  
338      /**
339 <     * Cancelling a task causes get in another thread to throw CancellationException
339 >     * set in one thread causes timed get in another thread to retrieve value
340       */
341 <    public void testGet_Cancellation() {
342 <        final FutureTask ft = new FutureTask(new Callable() {
343 <                public Object call() {
344 <                    try {
345 <                        Thread.sleep(MEDIUM_DELAY_MS);
346 <                        threadShouldThrow();
334 <                    } catch (InterruptedException e) {
335 <                    }
341 >    public void testTimedGetSet() throws InterruptedException {
342 >        final CountDownLatch threadStarted = new CountDownLatch(1);
343 >
344 >        final PublicFutureTask task =
345 >            new PublicFutureTask(new CheckedCallable<Object>() {
346 >                public Object realCall() throws InterruptedException {
347                      return Boolean.TRUE;
348 <                }
349 <            });
350 <        try {
351 <            Thread t1 = new Thread(new Runnable() {
352 <                    public void run() {
353 <                        try {
354 <                            ft.get();
355 <                            threadShouldThrow();
356 <                        } catch (CancellationException success) {
357 <                        }
358 <                        catch (Exception e) {
359 <                            threadUnexpectedException();
360 <                        }
361 <                    }
362 <                });
363 <            Thread t2 = new Thread(ft);
364 <            t1.start();
365 <            t2.start();
366 <            Thread.sleep(SHORT_DELAY_MS);
367 <            ft.cancel(true);
368 <            t1.join();
369 <            t2.join();
370 <        } catch (InterruptedException success) {
371 <            unexpectedException();
372 <        }
348 >                }});
349 >
350 >        Thread t = newStartedThread(new CheckedRunnable() {
351 >            public void realRun() throws Exception {
352 >                threadStarted.countDown();
353 >                assertSame(Boolean.FALSE,
354 >                           task.get(MEDIUM_DELAY_MS, MILLISECONDS));
355 >            }});
356 >
357 >        threadStarted.await();
358 >        checkNotDone(task);
359 >        assertTrue(t.isAlive());
360 >        task.set(Boolean.FALSE);
361 >        checkCompletedNormally(task, Boolean.FALSE);
362 >        awaitTermination(t, MEDIUM_DELAY_MS);
363 >    }
364 >
365 >    /**
366 >     * Cancelling a task causes timed get in another thread to throw
367 >     * CancellationException
368 >     */
369 >    public void testTimedGet_Cancellation() throws InterruptedException {
370 >        final CountDownLatch threadStarted = new CountDownLatch(2);
371 >        final FutureTask task =
372 >            new FutureTask(new CheckedInterruptedCallable<Object>() {
373 >                public Object realCall() throws InterruptedException {
374 >                    threadStarted.countDown();
375 >                    delay(LONG_DELAY_MS);
376 >                    return Boolean.TRUE;
377 >                }});
378 >
379 >        Thread t1 = new ThreadShouldThrow(CancellationException.class) {
380 >            public void realRun() throws Exception {
381 >                threadStarted.countDown();
382 >                task.get(MEDIUM_DELAY_MS, MILLISECONDS);
383 >            }};
384 >        Thread t2 = new Thread(task);
385 >        t1.start();
386 >        t2.start();
387 >        threadStarted.await();
388 >        task.cancel(true);
389 >        awaitTermination(t1, MEDIUM_DELAY_MS);
390 >        awaitTermination(t2, MEDIUM_DELAY_MS);
391 >        checkCancelled(task);
392 >    }
393 >
394 >    /**
395 >     * Cancelling a task causes get in another thread to throw
396 >     * CancellationException
397 >     */
398 >    public void testGet_Cancellation() throws InterruptedException {
399 >        final CountDownLatch threadStarted = new CountDownLatch(2);
400 >        final FutureTask task =
401 >            new FutureTask(new CheckedInterruptedCallable<Object>() {
402 >                public Object realCall() throws InterruptedException {
403 >                    threadStarted.countDown();
404 >                    delay(LONG_DELAY_MS);
405 >                    return Boolean.TRUE;
406 >                }});
407 >
408 >        Thread t1 = new ThreadShouldThrow(CancellationException.class) {
409 >            public void realRun() throws Exception {
410 >                threadStarted.countDown();
411 >                task.get();
412 >            }};
413 >        Thread t2 = new Thread(task);
414 >        t1.start();
415 >        t2.start();
416 >        threadStarted.await();
417 >        task.cancel(true);
418 >        awaitTermination(t1, MEDIUM_DELAY_MS);
419 >        awaitTermination(t2, MEDIUM_DELAY_MS);
420 >        checkCancelled(task);
421      }
422  
423  
424      /**
425       * A runtime exception in task causes get to throw ExecutionException
426       */
427 <    public void testGet_ExecutionException() {
428 <        final FutureTask ft = new FutureTask(new Callable() {
429 <                public Object call() {
430 <                    int i = 5/0;
431 <                    return Boolean.TRUE;
432 <                }
433 <            });
434 <        try {
435 <            ft.run();
436 <            ft.get();
437 <            shouldThrow();
438 <        } catch (ExecutionException success) {
427 >    public void testGet_ExecutionException() throws InterruptedException {
428 >        final FutureTask task = new FutureTask(new Callable() {
429 >            public Object call() {
430 >                return 5/0;
431 >            }});
432 >
433 >        task.run();
434 >        try {
435 >            task.get();
436 >            shouldThrow();
437 >        } catch (ExecutionException success) {
438 >            assertTrue(success.getCause() instanceof ArithmeticException);
439 >            checkCompletedAbnormally(task, success.getCause());
440          }
381        catch (Exception e) {
382            unexpectedException();
383        }
441      }
442  
443      /**
444 <     *  A runtime exception in task causes timed get to throw ExecutionException
445 <     */
446 <    public void testTimedGet_ExecutionException2() {
447 <        final FutureTask ft = new FutureTask(new Callable() {
448 <                public Object call() {
449 <                    int i = 5/0;
450 <                    return Boolean.TRUE;
451 <                }
452 <            });
453 <        try {
454 <            ft.run();
455 <            ft.get(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
456 <            shouldThrow();
457 <        } catch (ExecutionException success) {
458 <        } catch (TimeoutException success) { } // unlikely but OK
459 <        catch (Exception e) {
403 <            unexpectedException();
404 <        }
444 >     * A runtime exception in task causes timed get to throw ExecutionException
445 >     */
446 >    public void testTimedGet_ExecutionException2() throws Exception {
447 >        final FutureTask task = new FutureTask(new Callable() {
448 >            public Object call() {
449 >                return 5/0;
450 >            }});
451 >
452 >        task.run();
453 >        try {
454 >            task.get(SHORT_DELAY_MS, MILLISECONDS);
455 >            shouldThrow();
456 >        } catch (ExecutionException success) {
457 >            assertTrue(success.getCause() instanceof ArithmeticException);
458 >            checkCompletedAbnormally(task, success.getCause());
459 >        }
460      }
461  
462  
463      /**
464       * Interrupting a waiting get causes it to throw InterruptedException
465       */
466 <    public void testGet_InterruptedException() {
467 <        final FutureTask ft = new FutureTask(new NoOpCallable());
468 <        Thread t = new Thread(new Runnable() {
469 <                public void run() {
470 <                    try {
471 <                        ft.get();
472 <                        threadShouldThrow();
473 <                    } catch (InterruptedException success) {
474 <                    } catch (Exception e) {
475 <                        threadUnexpectedException();
476 <                    }
477 <                }
478 <            });
424 <        try {
425 <            t.start();
426 <            Thread.sleep(SHORT_DELAY_MS);
427 <            t.interrupt();
428 <            t.join();
429 <        } catch (Exception e) {
430 <            unexpectedException();
431 <        }
466 >    public void testGet_InterruptedException() throws InterruptedException {
467 >        final CountDownLatch threadStarted = new CountDownLatch(1);
468 >        final FutureTask task = new FutureTask(new NoOpCallable());
469 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
470 >            public void realRun() throws Exception {
471 >                threadStarted.countDown();
472 >                task.get();
473 >            }});
474 >
475 >        threadStarted.await();
476 >        t.interrupt();
477 >        awaitTermination(t, MEDIUM_DELAY_MS);
478 >        checkNotDone(task);
479      }
480  
481      /**
482 <     *  Interrupting a waiting timed get causes it to throw InterruptedException
483 <     */
484 <    public void testTimedGet_InterruptedException2() {
485 <        final FutureTask ft = new FutureTask(new NoOpCallable());
486 <        Thread t = new Thread(new Runnable() {
487 <                public void run() {
488 <                    try {
489 <                        ft.get(LONG_DELAY_MS,TimeUnit.MILLISECONDS);
490 <                        threadShouldThrow();
491 <                    } catch (InterruptedException success) {}
492 <                    catch (Exception e) {
493 <                        threadUnexpectedException();
494 <                    }
495 <                }
496 <            });
450 <        try {
451 <            t.start();
452 <            Thread.sleep(SHORT_DELAY_MS);
453 <            t.interrupt();
454 <            t.join();
455 <        } catch (Exception e) {
456 <            unexpectedException();
457 <        }
482 >     * Interrupting a waiting timed get causes it to throw InterruptedException
483 >     */
484 >    public void testTimedGet_InterruptedException2() throws InterruptedException {
485 >        final CountDownLatch threadStarted = new CountDownLatch(1);
486 >        final FutureTask task = new FutureTask(new NoOpCallable());
487 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
488 >            public void realRun() throws Exception {
489 >                threadStarted.countDown();
490 >                task.get(LONG_DELAY_MS, MILLISECONDS);
491 >            }});
492 >
493 >        threadStarted.await();
494 >        t.interrupt();
495 >        awaitTermination(t, MEDIUM_DELAY_MS);
496 >        checkNotDone(task);
497      }
498  
499      /**
500       * A timed out timed get throws TimeoutException
501       */
502 <    public void testGet_TimeoutException() {
503 <        try {
504 <            FutureTask ft = new FutureTask(new NoOpCallable());
505 <            ft.get(1,TimeUnit.MILLISECONDS);
506 <            shouldThrow();
507 <        } catch (TimeoutException success) {}
469 <        catch (Exception success) {
470 <            unexpectedException();
471 <        }
502 >    public void testGet_TimeoutException() throws Exception {
503 >        try {
504 >            FutureTask task = new FutureTask(new NoOpCallable());
505 >            task.get(1, MILLISECONDS);
506 >            shouldThrow();
507 >        } catch (TimeoutException success) {}
508      }
509  
510   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines