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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines