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

Comparing jsr166/src/test/tck/ExecutorsTest.java (file contents):
Revision 1.8 by dl, Sat Nov 1 18:37:02 2003 UTC vs.
Revision 1.11 by dl, Mon Dec 22 00:48:55 2003 UTC

# Line 14 | Line 14 | import java.security.*;
14  
15   public class ExecutorsTest extends JSR166TestCase{
16      public static void main(String[] args) {
17 <        junit.textui.TestRunner.run (suite());  
17 >        junit.textui.TestRunner.run (suite());  
18      }
19      public static Test suite() {
20 <        return new TestSuite(ExecutorsTest.class);
21 <    }
22 <
23 <    private static final String TEST_STRING = "a test string";
24 <
25 <    private static class StringTask implements Callable<String> {
26 <        public String call() { return TEST_STRING; }
27 <    }
28 <
29 <    static class DirectExecutor implements Executor {
30 <        public void execute(Runnable r) {
31 <            r.run();
32 <        }
20 >        return new TestSuite(ExecutorsTest.class);
21      }
22  
23      static class TimedCallable<T> implements Callable<T> {
24 <        private final Executor exec;
24 >        private final ExecutorService exec;
25          private final Callable<T> func;
26          private final long msecs;
27          
28 <        TimedCallable(Executor exec, Callable<T> func, long msecs) {
28 >        TimedCallable(ExecutorService exec, Callable<T> func, long msecs) {
29              this.exec = exec;
30              this.func = func;
31              this.msecs = msecs;
32          }
33          
34          public T call() throws Exception {
35 <            Future<T> ftask = Executors.execute(exec, func);
35 >            Future<T> ftask = exec.submit(func);
36              try {
37                  return ftask.get(msecs, TimeUnit.MILLISECONDS);
38              } finally {
# Line 142 | Line 130 | public class ExecutorsTest extends JSR16
130      }
131  
132      /**
133 +     * A new SingleThreadExecutor cannot be casted to concrete implementation
134 +     */
135 +    public void testCastNewSingleThreadExecutor() {
136 +        ExecutorService e = Executors.newSingleThreadExecutor();
137 +        try {
138 +            ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
139 +        } catch (ClassCastException success) {
140 +        } finally {
141 +            joinPool(e);
142 +        }
143 +    }
144 +
145 +
146 +    /**
147       * A new newFixedThreadPool can execute runnables
148       */
149      public void testNewFixedThreadPool1() {
# Line 187 | Line 189 | public class ExecutorsTest extends JSR16
189          }
190      }
191  
192 +
193      /**
194 <     * execute of runnable runs it to completion
194 >     * An unconfigurable newFixedThreadPool can execute runnables
195       */
196 <    public void testExecuteRunnable() {
197 <        try {
198 <            Executor e = new DirectExecutor();
199 <            TrackedShortRunnable task = new TrackedShortRunnable();
200 <            assertFalse(task.done);
201 <            Future<String> future = Executors.execute(e, task, TEST_STRING);
199 <            String result = future.get();
200 <            assertTrue(task.done);
201 <            assertSame(TEST_STRING, result);
202 <        }
203 <        catch (ExecutionException ex) {
204 <            unexpectedException();
205 <        }
206 <        catch (InterruptedException ex) {
207 <            unexpectedException();
208 <        }
196 >    public void testunconfigurableExecutorService() {
197 >        ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
198 >        e.execute(new NoOpRunnable());
199 >        e.execute(new NoOpRunnable());
200 >        e.execute(new NoOpRunnable());
201 >        e.shutdown();
202      }
203  
204      /**
205 <     * invoke of a runnable runs it to completion
205 >     * unconfigurableExecutorService(null) throws NPE
206       */
207 <    public void testInvokeRunnable() {
207 >    public void testunconfigurableExecutorServiceNPE() {
208          try {
209 <            Executor e = new DirectExecutor();
217 <            TrackedShortRunnable task = new TrackedShortRunnable();
218 <            assertFalse(task.done);
219 <            Executors.invoke(e, task);
220 <            assertTrue(task.done);
209 >            ExecutorService e = Executors.unconfigurableExecutorService(null);
210          }
211 <        catch (ExecutionException ex) {
223 <            unexpectedException();
224 <        }
225 <        catch (InterruptedException ex) {
226 <            unexpectedException();
211 >        catch (NullPointerException success) {
212          }
213      }
214  
215      /**
216 <     * execute of a callable runs it to completion
216 >     * unconfigurableScheduledExecutorService(null) throws NPE
217       */
218 <    public void testExecuteCallable() {
218 >    public void testunconfigurableScheduledExecutorServiceNPE() {
219          try {
220 <            Executor e = new DirectExecutor();
236 <            Future<String> future = Executors.execute(e, new StringTask());
237 <            String result = future.get();
238 <            assertSame(TEST_STRING, result);
239 <        }
240 <        catch (ExecutionException ex) {
241 <            unexpectedException();
220 >            ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
221          }
222 <        catch (InterruptedException ex) {
244 <            unexpectedException();
222 >        catch (NullPointerException success) {
223          }
224      }
225  
226  
227      /**
228 <     * execute of a privileged action runs it to completion
228 >     * a newSingleThreadScheduledExecutor successfully runs delayed task
229       */
230 <    public void testExecutePrivilegedAction() {
231 <        Policy savedPolicy = Policy.getPolicy();
232 <        AdjustablePolicy policy = new AdjustablePolicy();
233 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
234 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
235 <        Policy.setPolicy(policy);
236 <        try {
237 <            Executor e = new DirectExecutor();
238 <            Future future = Executors.execute(e, new PrivilegedAction() {
239 <                    public Object run() {
240 <                        return TEST_STRING;
241 <                    }});
242 <
243 <            Object result = future.get();
266 <            assertSame(TEST_STRING, result);
267 <        }
268 <        catch (ExecutionException ex) {
269 <            unexpectedException();
270 <        }
271 <        catch (InterruptedException ex) {
230 >    public void testNewSingleThreadScheduledExecutor() {
231 >        try {
232 >            TrackedCallable callable = new TrackedCallable();
233 >            ScheduledExecutorService p1 = Executors.newSingleThreadScheduledExecutor();
234 >            Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
235 >            assertFalse(callable.done);
236 >            Thread.sleep(MEDIUM_DELAY_MS);
237 >            assertTrue(callable.done);
238 >            assertEquals(Boolean.TRUE, f.get());
239 >            p1.shutdown();
240 >            joinPool(p1);
241 >        } catch(RejectedExecutionException e){}
242 >        catch(Exception e){
243 >            e.printStackTrace();
244              unexpectedException();
245          }
274        finally {
275            Policy.setPolicy(savedPolicy);
276        }
246      }
247  
248      /**
249 <     * execute of a privileged exception action runs it to completion
249 >     * a newScheduledThreadPool successfully runs delayed task
250       */
251 <    public void testExecutePrivilegedExceptionAction() {
252 <        Policy savedPolicy = Policy.getPolicy();
253 <        AdjustablePolicy policy = new AdjustablePolicy();
254 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
255 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
256 <        Policy.setPolicy(policy);
257 <        try {
258 <            Executor e = new DirectExecutor();
259 <            Future future = Executors.execute(e, new PrivilegedExceptionAction() {
260 <                    public Object run() {
261 <                        return TEST_STRING;
262 <                    }});
263 <
264 <            Object result = future.get();
296 <            assertSame(TEST_STRING, result);
297 <        }
298 <        catch (ExecutionException ex) {
299 <            unexpectedException();
300 <        }
301 <        catch (InterruptedException ex) {
251 >    public void testnewScheduledThreadPool() {
252 >        try {
253 >            TrackedCallable callable = new TrackedCallable();
254 >            ScheduledExecutorService p1 = Executors.newScheduledThreadPool(2);
255 >            Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
256 >            assertFalse(callable.done);
257 >            Thread.sleep(MEDIUM_DELAY_MS);
258 >            assertTrue(callable.done);
259 >            assertEquals(Boolean.TRUE, f.get());
260 >            p1.shutdown();
261 >            joinPool(p1);
262 >        } catch(RejectedExecutionException e){}
263 >        catch(Exception e){
264 >            e.printStackTrace();
265              unexpectedException();
266          }
304        finally {
305            Policy.setPolicy(savedPolicy);
306        }
267      }
268  
269      /**
270 <     * execute of a failed privileged exception action reports exception
270 >     * an unconfigurable  newScheduledThreadPool successfully runs delayed task
271       */
272 <    public void testExecuteFailedPrivilegedExceptionAction() {
273 <        Policy savedPolicy = Policy.getPolicy();
274 <        AdjustablePolicy policy = new AdjustablePolicy();
275 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
276 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
277 <        Policy.setPolicy(policy);
278 <        try {
279 <            Executor e = new DirectExecutor();
280 <            Future future = Executors.execute(e, new PrivilegedExceptionAction() {
281 <                    public Object run() throws Exception {
282 <                        throw new IndexOutOfBoundsException();
283 <                    }});
284 <
285 <            Object result = future.get();
326 <            shouldThrow();
327 <        }
328 <        catch (ExecutionException success) {
329 <        }
330 <        catch (InterruptedException ex) {
272 >    public void testunconfigurableScheduledExecutorService() {
273 >        try {
274 >            TrackedCallable callable = new TrackedCallable();
275 >            ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
276 >            Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
277 >            assertFalse(callable.done);
278 >            Thread.sleep(MEDIUM_DELAY_MS);
279 >            assertTrue(callable.done);
280 >            assertEquals(Boolean.TRUE, f.get());
281 >            p1.shutdown();
282 >            joinPool(p1);
283 >        } catch(RejectedExecutionException e){}
284 >        catch(Exception e){
285 >            e.printStackTrace();
286              unexpectedException();
287          }
333        finally {
334            Policy.setPolicy(savedPolicy);
335        }
288      }
289  
290      /**
291 <     * invoke of a collable runs it to completion
291 >     *  timeouts from execute will time out if they compute too long.
292       */
293 <    public void testInvokeCallable() {
293 >    public void testTimedCallable() {
294 >        int N = 10000;
295 >        ExecutorService executor = Executors.newSingleThreadExecutor();
296 >        List<Callable<BigInteger>> tasks = new ArrayList<Callable<BigInteger>>(N);
297          try {
298 <            Executor e = new DirectExecutor();
299 <            String result = Executors.invoke(e, new StringTask());
300 <
301 <            assertSame(TEST_STRING, result);
302 <        }
303 <        catch (ExecutionException ex) {
304 <            unexpectedException();
298 >            long startTime = System.currentTimeMillis();
299 >            
300 >            long i = 0;
301 >            while (tasks.size() < N) {
302 >                tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
303 >                i += 10;
304 >            }
305 >            
306 >            int iters = 0;
307 >            BigInteger sum = BigInteger.ZERO;
308 >            for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
309 >                try {
310 >                    ++iters;
311 >                    sum = sum.add(it.next().call());
312 >                }
313 >                catch (TimeoutException success) {
314 >                    assertTrue(iters > 0);
315 >                    return;
316 >                }
317 >                catch (Exception e) {
318 >                    unexpectedException();
319 >                }
320 >            }
321 >            // if by chance we didn't ever time out, total time must be small
322 >            long elapsed = System.currentTimeMillis() - startTime;
323 >            assertTrue(elapsed < N);
324          }
325 <        catch (InterruptedException ex) {
326 <            unexpectedException();
325 >        finally {
326 >            joinPool(executor);
327          }
328      }
329  
330 +    
331      /**
332 <     * execute with null executor throws NPE
332 >     * ThreadPoolExecutor using defaultThreadFactory has
333 >     * specified group, priority, daemon status, and name
334       */
335 <    public void testNullExecuteRunnable() {
335 >    public void testDefaultThreadFactory() {
336 >        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
337 >        Runnable r = new Runnable() {
338 >                public void run() {
339 >                    Thread current = Thread.currentThread();
340 >                    threadAssertTrue(!current.isDaemon());
341 >                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
342 >                    ThreadGroup g = current.getThreadGroup();
343 >                    SecurityManager s = System.getSecurityManager();
344 >                    if (s != null)
345 >                        threadAssertTrue(g == s.getThreadGroup());
346 >                    else
347 >                        threadAssertTrue(g == egroup);
348 >                    String name = current.getName();
349 >                    threadAssertTrue(name.endsWith("thread-1"));
350 >                }
351 >            };
352 >        ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
353 >        
354 >        e.execute(r);
355 >        e.shutdown();
356          try {
357 <            TrackedShortRunnable task = new TrackedShortRunnable();
358 <            assertFalse(task.done);
363 <            Future<String> future = Executors.execute(null, task, TEST_STRING);
364 <            shouldThrow();
365 <        }
366 <        catch (NullPointerException success) {
367 <        }
368 <        catch (Exception ex) {
357 >            Thread.sleep(SHORT_DELAY_MS);
358 >        } catch (Exception eX) {
359              unexpectedException();
360 +        } finally {
361 +            joinPool(e);
362          }
363      }
364  
365      /**
366 <     * execute with a null runnable throws NPE
366 >     * ThreadPoolExecutor using privilegedThreadFactory has
367 >     * specified group, priority, daemon status, name,
368 >     * access control context and context class loader
369       */
370 <    public void testExecuteNullRunnable() {
370 >    public void testPrivilegedThreadFactory() {
371 >        Policy savedPolicy = Policy.getPolicy();
372 >        AdjustablePolicy policy = new AdjustablePolicy();
373 >        policy.addPermission(new RuntimePermission("getContextClassLoader"));
374 >        policy.addPermission(new RuntimePermission("setContextClassLoader"));
375 >        Policy.setPolicy(policy);
376 >        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
377 >        final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
378 >        final AccessControlContext thisacc = AccessController.getContext();
379 >        Runnable r = new Runnable() {
380 >                public void run() {
381 >                    Thread current = Thread.currentThread();
382 >                    threadAssertTrue(!current.isDaemon());
383 >                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
384 >                    ThreadGroup g = current.getThreadGroup();
385 >                    SecurityManager s = System.getSecurityManager();
386 >                    if (s != null)
387 >                        threadAssertTrue(g == s.getThreadGroup());
388 >                    else
389 >                        threadAssertTrue(g == egroup);
390 >                    String name = current.getName();
391 >                    threadAssertTrue(name.endsWith("thread-1"));
392 >                    threadAssertTrue(thisccl == current.getContextClassLoader());
393 >                    threadAssertTrue(thisacc.equals(AccessController.getContext()));
394 >                }
395 >            };
396 >        ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
397 >        
398 >        Policy.setPolicy(savedPolicy);
399 >        e.execute(r);
400 >        e.shutdown();
401          try {
402 <            Executor e = new DirectExecutor();
403 <            TrackedShortRunnable task = null;
380 <            Future<String> future = Executors.execute(e, task, TEST_STRING);
381 <            shouldThrow();
382 <        }
383 <        catch (NullPointerException success) {
384 <        }
385 <        catch (Exception ex) {
402 >            Thread.sleep(SHORT_DELAY_MS);
403 >        } catch (Exception ex) {
404              unexpectedException();
405 +        } finally {
406 +            joinPool(e);
407 +        }
408 +
409 +    }
410 +
411 +    static class CheckCCL implements Callable<Object> {
412 +        public Object call() {
413 +            AccessControlContext acc = AccessController.getContext();
414 +            acc.checkPermission(new RuntimePermission("getContextClassLoader"));
415 +            return null;
416          }
417      }
418  
419 +
420      /**
421 <     * invoke of a null runnable throws NPE
421 >     * Without class loader permissions, creating
422 >     * privilegedCallableUsingCurrentClassLoader throws ACE
423       */
424 <    public void testInvokeNullRunnable() {
424 >    public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
425 >        Policy savedPolicy = Policy.getPolicy();
426 >        AdjustablePolicy policy = new AdjustablePolicy();
427 >        Policy.setPolicy(policy);
428          try {
429 <            Executor e = new DirectExecutor();
396 <            TrackedShortRunnable task = null;
397 <            Executors.invoke(e, task);
429 >            Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
430              shouldThrow();
431 <        }
432 <        catch (NullPointerException success) {
401 <        }
402 <        catch (Exception ex) {
431 >        } catch(AccessControlException success) {
432 >        } catch(Exception ex) {
433              unexpectedException();
434 +        }
435 +        finally {
436 +            Policy.setPolicy(savedPolicy);
437          }
438      }
439  
440      /**
441 <     * execute of a null callable throws NPE
441 >     * Without class loader permissions, calling
442 >     * privilegedCallableUsingCurrentClassLoader throws ACE
443       */
444 <    public void testExecuteNullCallable() {
444 >    public void testprivilegedCallableUsingCCLWithPrivs() {
445 >        Policy savedPolicy = Policy.getPolicy();
446 >        AdjustablePolicy policy = new AdjustablePolicy();
447 >        policy.addPermission(new RuntimePermission("getContextClassLoader"));
448 >        policy.addPermission(new RuntimePermission("setContextClassLoader"));
449 >        Policy.setPolicy(policy);
450          try {
451 <            Executor e = new DirectExecutor();
452 <            StringTask t = null;
453 <            Future<String> future = Executors.execute(e, t);
415 <            shouldThrow();
416 <        }
417 <        catch (NullPointerException success) {
418 <        }
419 <        catch (Exception ex) {
451 >            Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
452 >            task.call();
453 >        } catch(Exception ex) {
454              unexpectedException();
455 +        }
456 +        finally {
457 +            Policy.setPolicy(savedPolicy);
458          }
459      }
460  
461      /**
462 <     * invoke of a null callable throws NPE
462 >     * Without permissions, calling privilegedCallable throws ACE
463       */
464 <    public void testInvokeNullCallable() {
464 >    public void testprivilegedCallableWithNoPrivs() {
465 >        Policy savedPolicy = Policy.getPolicy();
466 >        AdjustablePolicy policy = new AdjustablePolicy();
467 >        Policy.setPolicy(policy);
468 >        Callable task = Executors.privilegedCallable(new CheckCCL());
469 >        Policy.setPolicy(savedPolicy);
470          try {
471 <            Executor e = new DirectExecutor();
430 <            StringTask t = null;
431 <            String result = Executors.invoke(e, t);
471 >            task.call();
472              shouldThrow();
473 <        }
474 <        catch (NullPointerException success) {
435 <        }
436 <        catch (Exception ex) {
473 >        } catch(AccessControlException success) {
474 >        } catch(Exception ex) {
475              unexpectedException();
476 +        } finally {
477          }
478      }
479  
480      /**
481 <     *  execute(Executor, Runnable) throws RejectedExecutionException
443 <     *  if saturated.
481 >     * With permissions, calling privilegedCallable succeeds
482       */
483 <    public void testExecute1() {
484 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
483 >    public void testprivilegedCallableWithPrivs() {
484 >        Policy savedPolicy = Policy.getPolicy();
485 >        AdjustablePolicy policy = new AdjustablePolicy();
486 >        policy.addPermission(new RuntimePermission("getContextClassLoader"));
487 >        policy.addPermission(new RuntimePermission("setContextClassLoader"));
488 >        Policy.setPolicy(policy);
489 >        Callable task = Executors.privilegedCallable(new CheckCCL());
490          try {
491 <            
492 <            for(int i = 0; i < 5; ++i){
493 <                Executors.execute(p, new MediumRunnable(), Boolean.TRUE);
494 <            }
495 <            shouldThrow();
496 <        } catch(RejectedExecutionException success){}
454 <        joinPool(p);
491 >            task.call();
492 >        } catch(Exception ex) {
493 >            unexpectedException();
494 >        } finally {
495 >            Policy.setPolicy(savedPolicy);
496 >        }
497      }
498  
499      /**
500 <     *  execute(Executor, Callable)throws RejectedExecutionException
501 <     *  if saturated.
502 <     */
461 <    public void testExecute2() {
462 <         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
500 >     * callable(Runnable) returns null when called
501 >     */
502 >    public void testCallable1() {
503          try {
504 <            for(int i = 0; i < 5; ++i) {
505 <                Executors.execute(p, new SmallCallable());
506 <            }
507 <            shouldThrow();
508 <        } catch(RejectedExecutionException e){}
509 <        joinPool(p);
504 >            Callable c = Executors.callable(new NoOpRunnable());
505 >            assertNull(c.call());
506 >        } catch(Exception ex) {
507 >            unexpectedException();
508 >        }
509 >        
510      }
511  
472
512      /**
513 <     *  invoke(Executor, Runnable) throws InterruptedException if
514 <     *  caller interrupted.
515 <     */
477 <    public void testInterruptedInvoke() {
478 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
479 <        Thread t = new Thread(new Runnable() {
480 <                public void run() {
481 <                    try {
482 <                        Executors.invoke(p,new Runnable() {
483 <                                public void run() {
484 <                                    try {
485 <                                        Thread.sleep(MEDIUM_DELAY_MS);
486 <                                        shouldThrow();
487 <                                    } catch(InterruptedException e){
488 <                                    }
489 <                                }
490 <                            });
491 <                    } catch(InterruptedException success){
492 <                    } catch(Exception e) {
493 <                        unexpectedException();
494 <                    }
495 <                    
496 <                }
497 <            });
513 >     * callable(Runnable, result) returns result when called
514 >     */
515 >    public void testCallable2() {
516          try {
517 <            t.start();
518 <            Thread.sleep(SHORT_DELAY_MS);
519 <            t.interrupt();
502 <        } catch(Exception e){
517 >            Callable c = Executors.callable(new NoOpRunnable(), one);
518 >            assertEquals(one, c.call());
519 >        } catch(Exception ex) {
520              unexpectedException();
521          }
505        joinPool(p);
522      }
523  
524      /**
525 <     *  invoke(Executor, Runnable) throws ExecutionException if
526 <     *  runnable throws exception.
527 <     */
512 <    public void testInvoke3() {
513 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
525 >     * callable(PrivilegedAction) returns its result when called
526 >     */
527 >    public void testCallable3() {
528          try {
529 <            Runnable r = new Runnable() {
530 <                    public void run() {
531 <                        int i = 5/0;
532 <                    }
519 <                };
520 <            
521 <            for(int i =0; i < 5; i++){
522 <                Executors.invoke(p,r);
523 <            }
524 <            
525 <            shouldThrow();
526 <        } catch(ExecutionException success){
527 <        } catch(Exception e){
529 >            Callable c = Executors.callable(new PrivilegedAction() {
530 >                    public Object run() { return one; }});
531 >        assertEquals(one, c.call());
532 >        } catch(Exception ex) {
533              unexpectedException();
534          }
530        joinPool(p);
535      }
536  
533
534
537      /**
538 <     *  invoke(Executor, Callable) throws InterruptedException if
539 <     *  callable throws exception
540 <     */
539 <    public void testInvoke5() {
540 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
541 <        
542 <        final Callable c = new Callable() {
543 <                public Object call() {
544 <                    try {
545 <                        Executors.invoke(p, new SmallCallable());
546 <                        shouldThrow();
547 <                    } catch(InterruptedException e){}
548 <                    catch(RejectedExecutionException e2){}
549 <                    catch(ExecutionException e3){}
550 <                    return Boolean.TRUE;
551 <                }
552 <            };
553 <
554 <
555 <        
556 <        Thread t = new Thread(new Runnable() {
557 <                public void run() {
558 <                    try {
559 <                        c.call();
560 <                    } catch(Exception e){}
561 <                }
562 <          });
538 >     * callable(PrivilegedExceptionAction) returns its result when called
539 >     */
540 >    public void testCallable4() {
541          try {
542 <            t.start();
543 <            Thread.sleep(SHORT_DELAY_MS);
544 <            t.interrupt();
545 <            t.join();
568 <        } catch(InterruptedException e){
542 >            Callable c = Executors.callable(new PrivilegedExceptionAction() {
543 >                    public Object run() { return one; }});
544 >            assertEquals(one, c.call());
545 >        } catch(Exception ex) {
546              unexpectedException();
547          }
571        
572        joinPool(p);
548      }
549  
575    /**
576     *  invoke(Executor, Callable) will throw ExecutionException
577     *  if callable throws exception
578     */
579    public void testInvoke6() {
580        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
550  
551 +    /**
552 +     * callable(null Runnable) throws NPE
553 +     */
554 +    public void testCallableNPE1() {
555          try {
556 <            Callable c = new Callable() {
557 <                    public Object call() {
558 <                        int i = 5/0;
586 <                        return Boolean.TRUE;
587 <                    }
588 <                };
589 <            
590 <            for(int i =0; i < 5; i++){
591 <                Executors.invoke(p,c);
592 <            }
593 <            
594 <            shouldThrow();
595 <        }
596 <        catch(ExecutionException success){
597 <        } catch(Exception e) {
598 <            unexpectedException();
556 >            Runnable r = null;
557 >            Callable c = Executors.callable(r);
558 >        } catch (NullPointerException success) {
559          }
600        joinPool(p);
560      }
561  
603
604
562      /**
563 <     *  timeouts from execute will time out if they compute too long.
564 <     */
565 <    public void testTimedCallable() {
609 <        int N = 10000;
610 <        ExecutorService executor = Executors.newSingleThreadExecutor();
611 <        List<Callable<BigInteger>> tasks = new ArrayList<Callable<BigInteger>>(N);
563 >     * callable(null, result) throws NPE
564 >     */
565 >    public void testCallableNPE2() {
566          try {
567 <            long startTime = System.currentTimeMillis();
568 <            
569 <            long i = 0;
616 <            while (tasks.size() < N) {
617 <                tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
618 <                i += 10;
619 <            }
620 <            
621 <            int iters = 0;
622 <            BigInteger sum = BigInteger.ZERO;
623 <            for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
624 <                try {
625 <                    ++iters;
626 <                    sum = sum.add(it.next().call());
627 <                }
628 <                catch (TimeoutException success) {
629 <                    assertTrue(iters > 0);
630 <                    return;
631 <                }
632 <                catch (Exception e) {
633 <                    unexpectedException();
634 <                }
635 <            }
636 <            // if by chance we didn't ever time out, total time must be small
637 <            long elapsed = System.currentTimeMillis() - startTime;
638 <            assertTrue(elapsed < N);
639 <        }
640 <        finally {
641 <            joinPool(executor);
567 >            Runnable r = null;
568 >            Callable c = Executors.callable(r, one);
569 >        } catch (NullPointerException success) {
570          }
571      }
572  
645    
573      /**
574 <     * ThreadPoolExecutor using defaultThreadFactory has
575 <     * specified group, priority, daemon status, and name
576 <     */
577 <    public void testDefaultThreadFactory() {
578 <        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
579 <        Runnable r = new Runnable() {
580 <                public void run() {
581 <                    Thread current = Thread.currentThread();
655 <                    threadAssertTrue(!current.isDaemon());
656 <                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
657 <                    ThreadGroup g = current.getThreadGroup();
658 <                    SecurityManager s = System.getSecurityManager();
659 <                    if (s != null)
660 <                        threadAssertTrue(g == s.getThreadGroup());
661 <                    else
662 <                        threadAssertTrue(g == egroup);
663 <                    String name = current.getName();
664 <                    threadAssertTrue(name.endsWith("thread-1"));
665 <                }
666 <            };
667 <        ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
668 <        
669 <        e.execute(r);
670 <        e.shutdown();
671 <        try {
672 <            Thread.sleep(SHORT_DELAY_MS);
673 <        } catch (Exception eX) {
674 <            unexpectedException();
675 <        } finally {
676 <            joinPool(e);
677 <        }
574 >     * callable(null PrivilegedAction) throws NPE
575 >     */
576 >    public void testCallableNPE3() {
577 >        try {
578 >            PrivilegedAction r = null;
579 >            Callable c = Executors.callable(r);
580 >        } catch (NullPointerException success) {
581 >        }
582      }
583  
584      /**
585 <     * ThreadPoolExecutor using privilegedThreadFactory has
586 <     * specified group, priority, daemon status, name,
587 <     * access control context and context class loader
588 <     */
589 <    public void testPrivilegedThreadFactory() {
590 <        Policy savedPolicy = Policy.getPolicy();
591 <        AdjustablePolicy policy = new AdjustablePolicy();
592 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
689 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
690 <        Policy.setPolicy(policy);
691 <        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
692 <        final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
693 <        final AccessControlContext thisacc = AccessController.getContext();
694 <        Runnable r = new Runnable() {
695 <                public void run() {
696 <                    Thread current = Thread.currentThread();
697 <                    threadAssertTrue(!current.isDaemon());
698 <                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
699 <                    ThreadGroup g = current.getThreadGroup();
700 <                    SecurityManager s = System.getSecurityManager();
701 <                    if (s != null)
702 <                        threadAssertTrue(g == s.getThreadGroup());
703 <                    else
704 <                        threadAssertTrue(g == egroup);
705 <                    String name = current.getName();
706 <                    threadAssertTrue(name.endsWith("thread-1"));
707 <                    threadAssertTrue(thisccl == current.getContextClassLoader());
708 <                    threadAssertTrue(thisacc.equals(AccessController.getContext()));
709 <                }
710 <            };
711 <        ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
712 <        
713 <        Policy.setPolicy(savedPolicy);
714 <        e.execute(r);
715 <        e.shutdown();
716 <        try {
717 <            Thread.sleep(SHORT_DELAY_MS);
718 <        } catch (Exception ex) {
719 <            unexpectedException();
720 <        } finally {
721 <            joinPool(e);
722 <        }
723 <
585 >     * callable(null PrivilegedExceptionAction) throws NPE
586 >     */
587 >    public void testCallableNPE4() {
588 >        try {
589 >            PrivilegedExceptionAction r = null;
590 >            Callable c = Executors.callable(r);
591 >        } catch (NullPointerException success) {
592 >        }
593      }
594  
595 +
596   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines