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

Comparing jsr166/src/test/tck/AbstractExecutorServiceTest.java (file contents):
Revision 1.2 by tim, Wed Dec 10 02:24:00 2003 UTC vs.
Revision 1.25 by jsr166, Thu Sep 16 02:54:10 2010 UTC

# Line 1 | Line 1
1   /*
2 < * Written by members of JCP JSR-166 Expert Group and released to the
3 < * public domain. Use, modify, and redistribute this code in any way
4 < * without acknowledgement. Other contributors include Andrew Wright,
5 < * Jeffrey Hayes, Pat Fischer, Mike Judd.
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
5 > * Other contributors include Andrew Wright, Jeffrey Hayes,
6 > * Pat Fisher, Mike Judd.
7   */
8  
9  
10   import junit.framework.*;
11   import java.util.*;
12   import java.util.concurrent.*;
13 + import static java.util.concurrent.TimeUnit.MILLISECONDS;
14   import java.math.BigInteger;
15   import java.security.*;
16  
17 < public class AbstractExecutorServiceTest extends JSR166TestCase{
17 > public class AbstractExecutorServiceTest extends JSR166TestCase {
18      public static void main(String[] args) {
19 <        junit.textui.TestRunner.run (suite());
19 >        junit.textui.TestRunner.run(suite());
20      }
21      public static Test suite() {
22 <        return new TestSuite(ExecutorsTest.class);
22 >        return new TestSuite(AbstractExecutorServiceTest.class);
23      }
24  
25 <    /**
25 >    /**
26       * A no-frills implementation of AbstractExecutorService, designed
27 <     * to test the submit/invoke methods only.
27 >     * to test the submit methods only.
28       */
29      static class DirectExecutorService extends AbstractExecutorService {
30          public void execute(Runnable r) { r.run(); }
# Line 34 | Line 36 | public class AbstractExecutorServiceTest
36          private volatile boolean shutdown = false;
37      }
38  
39 <    private static final String TEST_STRING = "a test string";
40 <
41 <    private static class StringTask implements Callable<String> {
42 <        public String call() { return TEST_STRING; }
39 >    /**
40 >     * execute(runnable) runs it to completion
41 >     */
42 >    public void testExecuteRunnable() throws Exception {
43 >        ExecutorService e = new DirectExecutorService();
44 >        TrackedShortRunnable task = new TrackedShortRunnable();
45 >        assertFalse(task.done);
46 >        Future<?> future = e.submit(task);
47 >        future.get();
48 >        assertTrue(task.done);
49      }
50  
51 +
52      /**
53 <     * execute of runnable runs it to completion
53 >     * Completed submit(callable) returns result
54       */
55 <    public void testExecuteRunnable() {
56 <        try {
57 <            ExecutorService e = new DirectExecutorService();
58 <            TrackedShortRunnable task = new TrackedShortRunnable();
59 <            assertFalse(task.done);
51 <            Future<?> future = e.submit(task);
52 <            future.get();
53 <            assertTrue(task.done);
54 <        }
55 <        catch (ExecutionException ex) {
56 <            unexpectedException();
57 <        }
58 <        catch (InterruptedException ex) {
59 <            unexpectedException();
60 <        }
55 >    public void testSubmitCallable() throws Exception {
56 >        ExecutorService e = new DirectExecutorService();
57 >        Future<String> future = e.submit(new StringTask());
58 >        String result = future.get();
59 >        assertSame(TEST_STRING, result);
60      }
61  
62      /**
63 <     * invoke of a runnable runs it to completion
63 >     * Completed submit(runnable) returns successfully
64       */
65 <    public void testInvokeRunnable() {
66 <        try {
67 <            ExecutorService e = new DirectExecutorService();
68 <            TrackedShortRunnable task = new TrackedShortRunnable();
69 <            assertFalse(task.done);
71 <            e.invoke(task);
72 <            assertTrue(task.done);
73 <        }
74 <        catch (ExecutionException ex) {
75 <            unexpectedException();
76 <        }
77 <        catch (InterruptedException ex) {
78 <            unexpectedException();
79 <        }
65 >    public void testSubmitRunnable() throws Exception {
66 >        ExecutorService e = new DirectExecutorService();
67 >        Future<?> future = e.submit(new NoOpRunnable());
68 >        future.get();
69 >        assertTrue(future.isDone());
70      }
71  
72      /**
73 <     * execute of a callable runs it to completion
73 >     * Completed submit(runnable, result) returns result
74       */
75 <    public void testExecuteCallable() {
76 <        try {
77 <            ExecutorService e = new DirectExecutorService();
78 <            Future<String> future = e.submit(new StringTask());
79 <            String result = future.get();
90 <            assertSame(TEST_STRING, result);
91 <        }
92 <        catch (ExecutionException ex) {
93 <            unexpectedException();
94 <        }
95 <        catch (InterruptedException ex) {
96 <            unexpectedException();
97 <        }
75 >    public void testSubmitRunnable2() throws Exception {
76 >        ExecutorService e = new DirectExecutorService();
77 >        Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
78 >        String result = future.get();
79 >        assertSame(TEST_STRING, result);
80      }
81  
82  
83      /**
84 <     * execute of a privileged action runs it to completion
84 >     * A submitted privileged action runs to completion
85       */
86 <    public void testExecutePrivilegedAction() {
87 <        Policy savedPolicy = Policy.getPolicy();
88 <        AdjustablePolicy policy = new AdjustablePolicy();
89 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
90 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
109 <        Policy.setPolicy(policy);
110 <        try {
111 <            ExecutorService e = new DirectExecutorService();
112 <            Future future = e.submit(new PrivilegedAction() {
86 >    public void testSubmitPrivilegedAction() throws Exception {
87 >        Runnable r = new CheckedRunnable() {
88 >            public void realRun() throws Exception {
89 >                ExecutorService e = new DirectExecutorService();
90 >                Future future = e.submit(Executors.callable(new PrivilegedAction() {
91                      public Object run() {
92                          return TEST_STRING;
93 <                    }});
93 >                    }}));
94  
95 <            Object result = future.get();
96 <            assertSame(TEST_STRING, result);
97 <        }
98 <        catch (ExecutionException ex) {
99 <            unexpectedException();
100 <        }
101 <        catch (InterruptedException ex) {
124 <            unexpectedException();
125 <        }
126 <        finally {
127 <            Policy.setPolicy(savedPolicy);
128 <        }
95 >                assertSame(TEST_STRING, future.get());
96 >            }};
97 >
98 >        runWithPermissions(r,
99 >                           new RuntimePermission("getClassLoader"),
100 >                           new RuntimePermission("setContextClassLoader"),
101 >                           new RuntimePermission("modifyThread"));
102      }
103  
104      /**
105 <     * execute of a privileged exception action runs it to completion
105 >     * A submitted privileged exception action runs to completion
106       */
107 <    public void testExecutePrivilegedExceptionAction() {
108 <        Policy savedPolicy = Policy.getPolicy();
109 <        AdjustablePolicy policy = new AdjustablePolicy();
110 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
111 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
139 <        Policy.setPolicy(policy);
140 <        try {
141 <            ExecutorService e = new DirectExecutorService();
142 <            Future future = e.submit(new PrivilegedExceptionAction() {
107 >    public void testSubmitPrivilegedExceptionAction() throws Exception {
108 >        Runnable r = new CheckedRunnable() {
109 >            public void realRun() throws Exception {
110 >                ExecutorService e = new DirectExecutorService();
111 >                Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
112                      public Object run() {
113                          return TEST_STRING;
114 <                    }});
114 >                    }}));
115  
116 <            Object result = future.get();
117 <            assertSame(TEST_STRING, result);
118 <        }
119 <        catch (ExecutionException ex) {
151 <            unexpectedException();
152 <        }
153 <        catch (InterruptedException ex) {
154 <            unexpectedException();
155 <        }
156 <        finally {
157 <            Policy.setPolicy(savedPolicy);
158 <        }
116 >                assertSame(TEST_STRING, future.get());
117 >            }};
118 >
119 >        runWithPermissions(r);
120      }
121  
122      /**
123 <     * execute of a failed privileged exception action reports exception
123 >     * A submitted failed privileged exception action reports exception
124       */
125 <    public void testExecuteFailedPrivilegedExceptionAction() {
126 <        Policy savedPolicy = Policy.getPolicy();
127 <        AdjustablePolicy policy = new AdjustablePolicy();
128 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
129 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
169 <        Policy.setPolicy(policy);
170 <        try {
171 <            ExecutorService e = new DirectExecutorService();
172 <            Future future = e.submit(new PrivilegedExceptionAction() {
125 >    public void testSubmitFailedPrivilegedExceptionAction() throws Exception {
126 >        Runnable r = new CheckedRunnable() {
127 >            public void realRun() throws Exception {
128 >                ExecutorService e = new DirectExecutorService();
129 >                Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
130                      public Object run() throws Exception {
131                          throw new IndexOutOfBoundsException();
132 <                    }});
132 >                    }}));
133  
134 <            Object result = future.get();
134 >                try {
135 >                    future.get();
136 >                    shouldThrow();
137 >                } catch (ExecutionException success) {
138 >                    assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
139 >                }}};
140 >
141 >        runWithPermissions(r);
142 >    }
143 >
144 >    /**
145 >     * execute(null runnable) throws NPE
146 >     */
147 >    public void testExecuteNullRunnable() {
148 >        try {
149 >            ExecutorService e = new DirectExecutorService();
150 >            e.submit((Runnable) null);
151              shouldThrow();
152 <        }
180 <        catch (ExecutionException success) {
181 <        }
182 <        catch (InterruptedException ex) {
183 <            unexpectedException();
184 <        }
185 <        finally {
186 <            Policy.setPolicy(savedPolicy);
187 <        }
152 >        } catch (NullPointerException success) {}
153      }
154  
155 +
156      /**
157 <     * invoke of a collable runs it to completion
157 >     * submit(null callable) throws NPE
158       */
159 <    public void testInvokeCallable() {
159 >    public void testSubmitNullCallable() {
160          try {
161              ExecutorService e = new DirectExecutorService();
162 <            String result = e.invoke(new StringTask());
162 >            e.submit((Callable) null);
163 >            shouldThrow();
164 >        } catch (NullPointerException success) {}
165 >    }
166  
167 <            assertSame(TEST_STRING, result);
167 >    /**
168 >     * submit(runnable) throws RejectedExecutionException if
169 >     * executor is saturated.
170 >     */
171 >    public void testExecute1() {
172 >        ThreadPoolExecutor p =
173 >            new ThreadPoolExecutor(1, 1,
174 >                                   60, TimeUnit.SECONDS,
175 >                                   new ArrayBlockingQueue<Runnable>(1));
176 >        try {
177 >            for (int i = 0; i < 2; ++i)
178 >                p.submit(new MediumRunnable());
179 >            for (int i = 0; i < 2; ++i) {
180 >                try {
181 >                    p.submit(new MediumRunnable());
182 >                    shouldThrow();
183 >                } catch (RejectedExecutionException success) {}
184 >            }
185 >        } finally {
186 >            joinPool(p);
187          }
188 <        catch (ExecutionException ex) {
189 <            unexpectedException();
188 >    }
189 >
190 >    /**
191 >     * submit(callable) throws RejectedExecutionException
192 >     * if executor is saturated.
193 >     */
194 >    public void testExecute2() {
195 >        ThreadPoolExecutor p =
196 >            new ThreadPoolExecutor(1, 1,
197 >                                   60, TimeUnit.SECONDS,
198 >                                   new ArrayBlockingQueue<Runnable>(1));
199 >        try {
200 >            for (int i = 0; i < 2; ++i)
201 >                p.submit(new MediumRunnable());
202 >            for (int i = 0; i < 2; ++i) {
203 >                try {
204 >                    p.submit(new SmallCallable());
205 >                    shouldThrow();
206 >                } catch (RejectedExecutionException success) {}
207 >            }
208 >        } finally {
209 >            joinPool(p);
210          }
211 <        catch (InterruptedException ex) {
212 <            unexpectedException();
211 >    }
212 >
213 >
214 >    /**
215 >     * submit(callable).get() throws InterruptedException if interrupted
216 >     */
217 >    public void testInterruptedSubmit() throws InterruptedException {
218 >        final CountDownLatch submitted    = new CountDownLatch(1);
219 >        final CountDownLatch quittingTime = new CountDownLatch(1);
220 >        final ExecutorService p
221 >            = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS,
222 >                                     new ArrayBlockingQueue<Runnable>(10));
223 >        final Callable<Void> awaiter = new CheckedCallable<Void>() {
224 >            public Void realCall() throws InterruptedException {
225 >                quittingTime.await();
226 >                return null;
227 >            }};
228 >        try {
229 >            Thread t = new Thread(new CheckedInterruptedRunnable() {
230 >                public void realRun() throws Exception {
231 >                    Future<Void> future = p.submit(awaiter);
232 >                    submitted.countDown();
233 >                    future.get();
234 >                }});
235 >            t.start();
236 >            submitted.await();
237 >            t.interrupt();
238 >            t.join();
239 >        } finally {
240 >            quittingTime.countDown();
241 >            joinPool(p);
242          }
243      }
244  
245      /**
246 <     * execute with a null runnable throws NPE
246 >     *  get of submitted callable throws InterruptedException if callable
247 >     *  interrupted
248       */
249 <    public void testExecuteNullRunnable() {
249 >    public void testSubmitIE() throws InterruptedException {
250 >        final ThreadPoolExecutor p =
251 >            new ThreadPoolExecutor(1, 1,
252 >                                   60, TimeUnit.SECONDS,
253 >                                   new ArrayBlockingQueue<Runnable>(10));
254 >
255 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
256 >            public void realRun() throws Exception {
257 >                p.submit(new SmallCallable()).get();
258 >            }});
259 >
260 >        t.start();
261 >        Thread.sleep(SHORT_DELAY_MS);
262 >        t.interrupt();
263 >        t.join();
264 >        joinPool(p);
265 >    }
266 >
267 >    /**
268 >     *  get of submit(callable) throws ExecutionException if callable
269 >     *  throws exception
270 >     */
271 >    public void testSubmitEE() throws InterruptedException {
272 >        ThreadPoolExecutor p =
273 >            new ThreadPoolExecutor(1, 1,
274 >                                   60, TimeUnit.SECONDS,
275 >                                   new ArrayBlockingQueue<Runnable>(10));
276 >
277 >        Callable c = new Callable() {
278 >            public Object call() { return 5/0; }};
279 >
280          try {
281 <            ExecutorService e = new DirectExecutorService();
214 <            TrackedShortRunnable task = null;
215 <            Future<?> future = e.submit(task);
281 >            p.submit(c).get();
282              shouldThrow();
283 +        } catch (ExecutionException success) {
284 +            assertTrue(success.getCause() instanceof ArithmeticException);
285          }
286 <        catch (NullPointerException success) {
219 <        }
220 <        catch (Exception ex) {
221 <            unexpectedException();
222 <        }
286 >        joinPool(p);
287      }
288  
289      /**
290 <     * invoke of a null runnable throws NPE
290 >     * invokeAny(null) throws NPE
291       */
292 <    public void testInvokeNullRunnable() {
292 >    public void testInvokeAny1()
293 >        throws InterruptedException, ExecutionException {
294 >        ExecutorService e = new DirectExecutorService();
295          try {
296 <            ExecutorService e = new DirectExecutorService();
231 <            TrackedShortRunnable task = null;
232 <            e.invoke(task);
296 >            e.invokeAny(null);
297              shouldThrow();
298 <        }
299 <        catch (NullPointerException success) {
300 <        }
237 <        catch (Exception ex) {
238 <            unexpectedException();
298 >        } catch (NullPointerException success) {
299 >        } finally {
300 >            joinPool(e);
301          }
302      }
303  
304      /**
305 <     * execute of a null callable throws NPE
305 >     * invokeAny(empty collection) throws IAE
306       */
307 <    public void testExecuteNullCallable() {
307 >    public void testInvokeAny2()
308 >        throws InterruptedException, ExecutionException {
309 >        ExecutorService e = new DirectExecutorService();
310          try {
311 <            ExecutorService e = new DirectExecutorService();
248 <            StringTask t = null;
249 <            Future<String> future = e.submit(t);
311 >            e.invokeAny(new ArrayList<Callable<String>>());
312              shouldThrow();
313 <        }
314 <        catch (NullPointerException success) {
315 <        }
254 <        catch (Exception ex) {
255 <            unexpectedException();
313 >        } catch (IllegalArgumentException success) {
314 >        } finally {
315 >            joinPool(e);
316          }
317      }
318  
319      /**
320 <     * invoke of a null callable throws NPE
320 >     * invokeAny(c) throws NPE if c has null elements
321       */
322 <    public void testInvokeNullCallable() {
322 >    public void testInvokeAny3() throws Exception {
323 >        ExecutorService e = new DirectExecutorService();
324 >        List<Callable<Integer>> l = new ArrayList<Callable<Integer>>();
325 >        l.add(new Callable<Integer>() {
326 >                  public Integer call() { return 5/0; }});
327 >        l.add(null);
328          try {
329 <            ExecutorService e = new DirectExecutorService();
265 <            StringTask t = null;
266 <            String result = e.invoke(t);
329 >            e.invokeAny(l);
330              shouldThrow();
331 <        }
332 <        catch (NullPointerException success) {
333 <        }
271 <        catch (Exception ex) {
272 <            unexpectedException();
331 >        } catch (NullPointerException success) {
332 >        } finally {
333 >            joinPool(e);
334          }
335      }
336  
337      /**
338 <     *  execute(Executor, Runnable) throws RejectedExecutionException
278 <     *  if saturated.
338 >     * invokeAny(c) throws ExecutionException if no task in c completes
339       */
340 <    public void testExecute1() {
341 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
340 >    public void testInvokeAny4() throws InterruptedException {
341 >        ExecutorService e = new DirectExecutorService();
342 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
343 >        l.add(new NPETask());
344          try {
345 <
284 <            for(int i = 0; i < 5; ++i){
285 <                p.submit(new MediumRunnable());
286 <            }
345 >            e.invokeAny(l);
346              shouldThrow();
347 <        } catch(RejectedExecutionException success){}
348 <        joinPool(p);
347 >        } catch (ExecutionException success) {
348 >            assertTrue(success.getCause() instanceof NullPointerException);
349 >        } finally {
350 >            joinPool(e);
351 >        }
352      }
353  
354      /**
355 <     *  execute(Executor, Callable)throws RejectedExecutionException
294 <     *  if saturated.
355 >     * invokeAny(c) returns result of some task in c if at least one completes
356       */
357 <    public void testExecute2() {
358 <         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
357 >    public void testInvokeAny5() throws Exception {
358 >        ExecutorService e = new DirectExecutorService();
359          try {
360 <            for(int i = 0; i < 5; ++i) {
361 <                p.submit(new SmallCallable());
362 <            }
360 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
361 >            l.add(new StringTask());
362 >            l.add(new StringTask());
363 >            String result = e.invokeAny(l);
364 >            assertSame(TEST_STRING, result);
365 >        } finally {
366 >            joinPool(e);
367 >        }
368 >    }
369 >
370 >    /**
371 >     * invokeAll(null) throws NPE
372 >     */
373 >    public void testInvokeAll1() throws InterruptedException {
374 >        ExecutorService e = new DirectExecutorService();
375 >        try {
376 >            e.invokeAll(null);
377              shouldThrow();
378 <        } catch(RejectedExecutionException e){}
379 <        joinPool(p);
378 >        } catch (NullPointerException success) {
379 >        } finally {
380 >            joinPool(e);
381 >        }
382      }
383  
384 +    /**
385 +     * invokeAll(empty collection) returns empty collection
386 +     */
387 +    public void testInvokeAll2() throws InterruptedException {
388 +        ExecutorService e = new DirectExecutorService();
389 +        try {
390 +            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
391 +            assertTrue(r.isEmpty());
392 +        } finally {
393 +            joinPool(e);
394 +        }
395 +    }
396  
397      /**
398 <     *  invoke(Executor, Runnable) throws InterruptedException if
310 <     *  caller interrupted.
398 >     * invokeAll(c) throws NPE if c has null elements
399       */
400 <    public void testInterruptedInvoke() {
401 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
402 <        Thread t = new Thread(new Runnable() {
403 <                public void run() {
404 <                    try {
405 <                        p.invoke(new Runnable() {
406 <                                public void run() {
407 <                                    try {
408 <                                        Thread.sleep(MEDIUM_DELAY_MS);
409 <                                        shouldThrow();
410 <                                    } catch(InterruptedException e){
411 <                                    }
412 <                                }
325 <                            });
326 <                    } catch(InterruptedException success){
327 <                    } catch(Exception e) {
328 <                        unexpectedException();
329 <                    }
400 >    public void testInvokeAll3() throws InterruptedException {
401 >        ExecutorService e = new DirectExecutorService();
402 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
403 >        l.add(new StringTask());
404 >        l.add(null);
405 >        try {
406 >            e.invokeAll(l);
407 >            shouldThrow();
408 >        } catch (NullPointerException success) {
409 >        } finally {
410 >            joinPool(e);
411 >        }
412 >    }
413  
414 <                }
415 <            });
414 >    /**
415 >     * get of returned element of invokeAll(c) throws exception on failed task
416 >     */
417 >    public void testInvokeAll4() throws Exception {
418 >        ExecutorService e = new DirectExecutorService();
419          try {
420 <            t.start();
421 <            Thread.sleep(SHORT_DELAY_MS);
422 <            t.interrupt();
423 <        } catch(Exception e){
424 <            unexpectedException();
420 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
421 >            l.add(new NPETask());
422 >            List<Future<String>> futures = e.invokeAll(l);
423 >            assertEquals(1, futures.size());
424 >            try {
425 >                futures.get(0).get();
426 >                shouldThrow();
427 >            } catch (ExecutionException success) {
428 >                assertTrue(success.getCause() instanceof NullPointerException);
429 >            }
430 >        } finally {
431 >            joinPool(e);
432          }
340        joinPool(p);
433      }
434  
435      /**
436 <     *  invoke(Executor, Runnable) throws ExecutionException if
345 <     *  runnable throws exception.
436 >     * invokeAll(c) returns results of all completed tasks in c
437       */
438 <    public void testInvoke3() {
439 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
438 >    public void testInvokeAll5() throws Exception {
439 >        ExecutorService e = new DirectExecutorService();
440          try {
441 <            Runnable r = new Runnable() {
442 <                    public void run() {
443 <                        int i = 5/0;
444 <                    }
445 <                };
441 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
442 >            l.add(new StringTask());
443 >            l.add(new StringTask());
444 >            List<Future<String>> futures = e.invokeAll(l);
445 >            assertEquals(2, futures.size());
446 >            for (Future<String> future : futures)
447 >                assertSame(TEST_STRING, future.get());
448 >        } finally {
449 >            joinPool(e);
450 >        }
451 >    }
452  
356            for(int i =0; i < 5; i++){
357                p.invoke(r);
358            }
453  
454 +    /**
455 +     * timed invokeAny(null) throws NPE
456 +     */
457 +    public void testTimedInvokeAny1() throws Exception {
458 +        ExecutorService e = new DirectExecutorService();
459 +        try {
460 +            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
461              shouldThrow();
462 <        } catch(ExecutionException success){
463 <        } catch(Exception e){
464 <            unexpectedException();
462 >        } catch (NullPointerException success) {
463 >        } finally {
464 >            joinPool(e);
465          }
365        joinPool(p);
466      }
467  
468 <
468 >    /**
469 >     * timed invokeAny(null time unit) throws NPE
470 >     */
471 >    public void testTimedInvokeAnyNullTimeUnit() throws Exception {
472 >        ExecutorService e = new DirectExecutorService();
473 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
474 >        l.add(new StringTask());
475 >        try {
476 >            e.invokeAny(l, MEDIUM_DELAY_MS, null);
477 >            shouldThrow();
478 >        } catch (NullPointerException success) {
479 >        } finally {
480 >            joinPool(e);
481 >        }
482 >    }
483  
484      /**
485 <     *  invoke(Executor, Callable) throws InterruptedException if
372 <     *  callable throws exception
485 >     * timed invokeAny(empty collection) throws IAE
486       */
487 <    public void testInvoke5() {
488 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
487 >    public void testTimedInvokeAny2() throws Exception {
488 >        ExecutorService e = new DirectExecutorService();
489 >        try {
490 >            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
491 >            shouldThrow();
492 >        } catch (IllegalArgumentException success) {
493 >        } finally {
494 >            joinPool(e);
495 >        }
496 >    }
497  
498 <        final Callable c = new Callable() {
499 <                public Object call() {
500 <                    try {
501 <                        p.invoke(new SmallCallable());
502 <                        shouldThrow();
503 <                    } catch(InterruptedException e){}
504 <                    catch(RejectedExecutionException e2){}
505 <                    catch(ExecutionException e3){}
506 <                    return Boolean.TRUE;
507 <                }
508 <            };
498 >    /**
499 >     * timed invokeAny(c) throws NPE if c has null elements
500 >     */
501 >    public void testTimedInvokeAny3() throws Exception {
502 >        ExecutorService e = new DirectExecutorService();
503 >        List<Callable<Integer>> l = new ArrayList<Callable<Integer>>();
504 >        l.add(new Callable<Integer>() {
505 >                  public Integer call() { return 5/0; }});
506 >        l.add(null);
507 >        try {
508 >            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
509 >            shouldThrow();
510 >        } catch (NullPointerException success) {
511 >        } finally {
512 >            joinPool(e);
513 >        }
514 >    }
515  
516 +    /**
517 +     * timed invokeAny(c) throws ExecutionException if no task completes
518 +     */
519 +    public void testTimedInvokeAny4() throws Exception {
520 +        ExecutorService e = new DirectExecutorService();
521 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
522 +        l.add(new NPETask());
523 +        try {
524 +            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
525 +            shouldThrow();
526 +        } catch (ExecutionException success) {
527 +            assertTrue(success.getCause() instanceof NullPointerException);
528 +        } finally {
529 +            joinPool(e);
530 +        }
531 +    }
532  
533 +    /**
534 +     * timed invokeAny(c) returns result of some task in c
535 +     */
536 +    public void testTimedInvokeAny5() throws Exception {
537 +        ExecutorService e = new DirectExecutorService();
538 +        try {
539 +            List<Callable<String>> l = new ArrayList<Callable<String>>();
540 +            l.add(new StringTask());
541 +            l.add(new StringTask());
542 +            String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
543 +            assertSame(TEST_STRING, result);
544 +        } finally {
545 +            joinPool(e);
546 +        }
547 +    }
548  
549 <        Thread t = new Thread(new Runnable() {
550 <                public void run() {
551 <                    try {
552 <                        c.call();
553 <                    } catch(Exception e){}
396 <                }
397 <          });
549 >    /**
550 >     * timed invokeAll(null) throws NPE
551 >     */
552 >    public void testTimedInvokeAll1() throws InterruptedException {
553 >        ExecutorService e = new DirectExecutorService();
554          try {
555 <            t.start();
556 <            Thread.sleep(SHORT_DELAY_MS);
557 <            t.interrupt();
558 <            t.join();
559 <        } catch(InterruptedException e){
404 <            unexpectedException();
555 >            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
556 >            shouldThrow();
557 >        } catch (NullPointerException success) {
558 >        } finally {
559 >            joinPool(e);
560          }
561 +    }
562  
563 <        joinPool(p);
563 >    /**
564 >     * timed invokeAll(null time unit) throws NPE
565 >     */
566 >    public void testTimedInvokeAllNullTimeUnit() throws InterruptedException {
567 >        ExecutorService e = new DirectExecutorService();
568 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
569 >        l.add(new StringTask());
570 >        try {
571 >            e.invokeAll(l, MEDIUM_DELAY_MS, null);
572 >            shouldThrow();
573 >        } catch (NullPointerException success) {
574 >        } finally {
575 >            joinPool(e);
576 >        }
577      }
578  
579      /**
580 <     *  invoke(Executor, Callable) will throw ExecutionException
412 <     *  if callable throws exception
580 >     * timed invokeAll(empty collection) returns empty collection
581       */
582 <    public void testInvoke6() {
583 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
582 >    public void testTimedInvokeAll2() throws InterruptedException {
583 >        ExecutorService e = new DirectExecutorService();
584 >        try {
585 >            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
586 >            assertTrue(r.isEmpty());
587 >        } finally {
588 >            joinPool(e);
589 >        }
590 >    }
591  
592 +    /**
593 +     * timed invokeAll(c) throws NPE if c has null elements
594 +     */
595 +    public void testTimedInvokeAll3() throws InterruptedException {
596 +        ExecutorService e = new DirectExecutorService();
597 +        List<Callable<String>> l = new ArrayList<Callable<String>>();
598 +        l.add(new StringTask());
599 +        l.add(null);
600          try {
601 <            Callable c = new Callable() {
602 <                    public Object call() {
603 <                        int i = 5/0;
604 <                        return Boolean.TRUE;
605 <                    }
606 <                };
601 >            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
602 >            shouldThrow();
603 >        } catch (NullPointerException success) {
604 >        } finally {
605 >            joinPool(e);
606 >        }
607 >    }
608  
609 <            for(int i =0; i < 5; i++){
610 <                p.invoke(c);
609 >    /**
610 >     * get of returned element of invokeAll(c) throws exception on failed task
611 >     */
612 >    public void testTimedInvokeAll4() throws Exception {
613 >        ExecutorService e = new DirectExecutorService();
614 >        try {
615 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
616 >            l.add(new NPETask());
617 >            List<Future<String>> futures =
618 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
619 >            assertEquals(1, futures.size());
620 >            try {
621 >                futures.get(0).get();
622 >                shouldThrow();
623 >            } catch (ExecutionException success) {
624 >                assertTrue(success.getCause() instanceof NullPointerException);
625              }
626 +        } finally {
627 +            joinPool(e);
628 +        }
629 +    }
630  
631 <            shouldThrow();
631 >    /**
632 >     * timed invokeAll(c) returns results of all completed tasks in c
633 >     */
634 >    public void testTimedInvokeAll5() throws Exception {
635 >        ExecutorService e = new DirectExecutorService();
636 >        try {
637 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
638 >            l.add(new StringTask());
639 >            l.add(new StringTask());
640 >            List<Future<String>> futures =
641 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
642 >            assertEquals(2, futures.size());
643 >            for (Future<String> future : futures)
644 >                assertSame(TEST_STRING, future.get());
645 >        } finally {
646 >            joinPool(e);
647          }
648 <        catch(ExecutionException success){
649 <        } catch(Exception e) {
650 <            unexpectedException();
648 >    }
649 >
650 >    /**
651 >     * timed invokeAll cancels tasks not completed by timeout
652 >     */
653 >    public void testTimedInvokeAll6() throws InterruptedException {
654 >        ExecutorService e = new DirectExecutorService();
655 >        try {
656 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
657 >            l.add(new StringTask());
658 >            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
659 >            l.add(new StringTask());
660 >            List<Future<String>> futures =
661 >                e.invokeAll(l, SMALL_DELAY_MS, MILLISECONDS);
662 >            assertEquals(3, futures.size());
663 >            Iterator<Future<String>> it = futures.iterator();
664 >            Future<String> f1 = it.next();
665 >            Future<String> f2 = it.next();
666 >            Future<String> f3 = it.next();
667 >            assertTrue(f1.isDone());
668 >            assertFalse(f1.isCancelled());
669 >            assertTrue(f2.isDone());
670 >            assertTrue(f3.isDone());
671 >            assertTrue(f3.isCancelled());
672 >        } finally {
673 >            joinPool(e);
674          }
435        joinPool(p);
675      }
676  
677 < }
677 > }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines