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.6 by dl, Fri Sep 26 15:33:13 2003 UTC vs.
Revision 1.11 by dl, Mon Dec 22 00:48:55 2003 UTC

# Line 10 | Line 10 | import junit.framework.*;
10   import java.util.*;
11   import java.util.concurrent.*;
12   import java.math.BigInteger;
13 + 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);
20 <    }
21 <
22 <    private static final String TEST_STRING = "a test string";
23 <
24 <    private static class StringTask implements Callable<String> {
25 <        public String call() { return TEST_STRING; }
26 <    }
27 <
28 <    static class DirectExecutor implements Executor {
29 <        public void execute(Runnable r) {
30 <            r.run();
31 <        }
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 141 | 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 186 | 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 <            TrackedRunnable task = new TrackedRunnable();
200 <            assertFalse(task.done);
201 <            Future<String> future = Executors.execute(e, task, TEST_STRING);
198 <            String result = future.get();
199 <            assertTrue(task.done);
200 <            assertSame(TEST_STRING, result);
201 <        }
202 <        catch (ExecutionException ex) {
203 <            unexpectedException();
204 <        }
205 <        catch (InterruptedException ex) {
206 <            unexpectedException();
207 <        }
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();
216 <            TrackedRunnable task = new TrackedRunnable();
217 <            assertFalse(task.done);
218 <            Executors.invoke(e, task);
219 <            assertTrue(task.done);
209 >            ExecutorService e = Executors.unconfigurableExecutorService(null);
210          }
211 <        catch (ExecutionException ex) {
222 <            unexpectedException();
223 <        }
224 <        catch (InterruptedException ex) {
225 <            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();
235 <            Future<String> future = Executors.execute(e, new StringTask());
236 <            String result = future.get();
237 <            assertSame(TEST_STRING, result);
220 >            ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
221          }
222 <        catch (ExecutionException ex) {
240 <            unexpectedException();
241 <        }
242 <        catch (InterruptedException ex) {
243 <            unexpectedException();
222 >        catch (NullPointerException success) {
223          }
224      }
225  
226 +
227      /**
228 <     * invoke of a collable runs it to completion
228 >     * a newSingleThreadScheduledExecutor successfully runs delayed task
229       */
230 <    public void testInvokeCallable () {
231 <        try {
232 <            Executor e = new DirectExecutor();
233 <            String result = Executors.invoke(e, new StringTask());
234 <
235 <            assertSame(TEST_STRING, result);
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          }
246 <        catch (ExecutionException ex) {
246 >    }
247 >
248 >    /**
249 >     * a newScheduledThreadPool successfully runs delayed task
250 >     */
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          }
267 <        catch (InterruptedException ex) {
267 >    }
268 >
269 >    /**
270 >     * an unconfigurable  newScheduledThreadPool successfully runs delayed task
271 >     */
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          }
288      }
289  
290      /**
291 <     * execute with null executor throws NPE
291 >     *  timeouts from execute will time out if they compute too long.
292       */
293 <    public void testNullExecuteRunnable () {
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 <            TrackedRunnable task = new TrackedRunnable();
299 <            assertFalse(task.done);
300 <            Future<String> future = Executors.execute(null, task, TEST_STRING);
301 <            shouldThrow();
302 <        }
303 <        catch (NullPointerException success) {
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 (Exception ex) {
326 <            unexpectedException();
325 >        finally {
326 >            joinPool(executor);
327          }
328      }
329  
330 +    
331      /**
332 <     * execute with a null runnable throws NPE
332 >     * ThreadPoolExecutor using defaultThreadFactory has
333 >     * specified group, priority, daemon status, and name
334       */
335 <    public void testExecuteNullRunnable() {
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 <            Executor e = new DirectExecutor();
358 <            TrackedRunnable task = null;
289 <            Future<String> future = Executors.execute(e, task, TEST_STRING);
290 <            shouldThrow();
291 <        }
292 <        catch (NullPointerException success) {
293 <        }
294 <        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 <     * invoke of 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 testInvokeNullRunnable () {
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 <            TrackedRunnable task = null;
306 <            Executors.invoke(e, task);
307 <            shouldThrow();
308 <        }
309 <        catch (NullPointerException success) {
310 <        }
311 <        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 <     * execute of a null callable throws NPE
421 >     * Without class loader permissions, creating
422 >     * privilegedCallableUsingCurrentClassLoader throws ACE
423       */
424 <    public void testExecuteNullCallable () {
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();
322 <            StringTask t = null;
323 <            Future<String> future = Executors.execute(e, t);
429 >            Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
430              shouldThrow();
431 <        }
432 <        catch (NullPointerException success) {
327 <        }
328 <        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 <     * invoke of a null callable throws NPE
441 >     * Without class loader permissions, calling
442 >     * privilegedCallableUsingCurrentClassLoader throws ACE
443       */
444 <    public void testInvokeNullCallable () {
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 <            String result = Executors.invoke(e, t);
341 <            shouldThrow();
342 <        }
343 <        catch (NullPointerException success) {
344 <        }
345 <        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 <     *  execute(Executor, Runnable) throws RejectedExecutionException
352 <     *  if saturated.
462 >     * Without permissions, calling privilegedCallable throws ACE
463       */
464 <    public void testExecute1() {
465 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
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 <            
358 <            for(int i = 0; i < 5; ++i){
359 <                Executors.execute(p, new MediumRunnable(), Boolean.TRUE);
360 <            }
471 >            task.call();
472              shouldThrow();
473 <        } catch(RejectedExecutionException success){}
474 <        joinPool(p);
473 >        } catch(AccessControlException success) {
474 >        } catch(Exception ex) {
475 >            unexpectedException();
476 >        } finally {
477 >        }
478      }
479  
480      /**
481 <     *  execute(Executor, Callable)throws RejectedExecutionException
368 <     *  if saturated.
481 >     * With permissions, calling privilegedCallable succeeds
482       */
483 <    public void testExecute2() {
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 <            for(int i = 0; i < 5; ++i) {
492 <                Executors.execute(p, new SmallCallable());
493 <            }
494 <            shouldThrow();
495 <        } catch(RejectedExecutionException e){}
496 <        joinPool(p);
491 >            task.call();
492 >        } catch(Exception ex) {
493 >            unexpectedException();
494 >        } finally {
495 >            Policy.setPolicy(savedPolicy);
496 >        }
497      }
498  
381
499      /**
500 <     *  invoke(Executor, Runnable) throws InterruptedException if
501 <     *  caller interrupted.
502 <     */
386 <    public void testInterruptedInvoke() {
387 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
388 <        Thread t = new Thread(new Runnable() {
389 <                public void run() {
390 <                    try {
391 <                        Executors.invoke(p,new Runnable() {
392 <                                public void run() {
393 <                                    try {
394 <                                        Thread.sleep(MEDIUM_DELAY_MS);
395 <                                        shouldThrow();
396 <                                    } catch(InterruptedException e){
397 <                                    }
398 <                                }
399 <                            });
400 <                    } catch(InterruptedException success){
401 <                    } catch(Exception e) {
402 <                        unexpectedException();
403 <                    }
404 <                    
405 <                }
406 <            });
500 >     * callable(Runnable) returns null when called
501 >     */
502 >    public void testCallable1() {
503          try {
504 <            t.start();
505 <            Thread.sleep(SHORT_DELAY_MS);
506 <            t.interrupt();
411 <        } catch(Exception e){
504 >            Callable c = Executors.callable(new NoOpRunnable());
505 >            assertNull(c.call());
506 >        } catch(Exception ex) {
507              unexpectedException();
508          }
509 <        joinPool(p);
509 >        
510      }
511  
512      /**
513 <     *  invoke(Executor, Runnable) throws ExecutionException if
514 <     *  runnable throws exception.
515 <     */
421 <    public void testInvoke3() {
422 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
513 >     * callable(Runnable, result) returns result when called
514 >     */
515 >    public void testCallable2() {
516          try {
517 <            Runnable r = new Runnable() {
518 <                    public void run() {
519 <                        int i = 5/0;
427 <                    }
428 <                };
429 <            
430 <            for(int i =0; i < 5; i++){
431 <                Executors.invoke(p,r);
432 <            }
433 <            
434 <            shouldThrow();
435 <        } catch(ExecutionException success){
436 <        } catch(Exception e){
517 >            Callable c = Executors.callable(new NoOpRunnable(), one);
518 >            assertEquals(one, c.call());
519 >        } catch(Exception ex) {
520              unexpectedException();
521          }
439        joinPool(p);
522      }
523  
442
443
524      /**
525 <     *  invoke(Executor, Callable) throws InterruptedException if
526 <     *  callable throws exception
527 <     */
448 <    public void testInvoke5() {
449 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
450 <        
451 <        final Callable c = new Callable() {
452 <                public Object call() {
453 <                    try {
454 <                        Executors.invoke(p, new SmallCallable());
455 <                        shouldThrow();
456 <                    } catch(InterruptedException e){}
457 <                    catch(RejectedExecutionException e2){}
458 <                    catch(ExecutionException e3){}
459 <                    return Boolean.TRUE;
460 <                }
461 <            };
462 <
463 <
464 <        
465 <        Thread t = new Thread(new Runnable() {
466 <                public void run() {
467 <                    try {
468 <                        c.call();
469 <                    } catch(Exception e){}
470 <                }
471 <          });
525 >     * callable(PrivilegedAction) returns its result when called
526 >     */
527 >    public void testCallable3() {
528          try {
529 <            t.start();
530 <            Thread.sleep(SHORT_DELAY_MS);
531 <            t.interrupt();
532 <            t.join();
477 <        } catch(InterruptedException 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          }
480        
481        joinPool(p);
535      }
536  
537      /**
538 <     *  invoke(Executor, Callable) will throw ExecutionException
539 <     *  if callable throws exception
540 <     */
488 <    public void testInvoke6() {
489 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
490 <
538 >     * callable(PrivilegedExceptionAction) returns its result when called
539 >     */
540 >    public void testCallable4() {
541          try {
542 <            Callable c = new Callable() {
543 <                    public Object call() {
544 <                        int i = 5/0;
545 <                        return Boolean.TRUE;
496 <                    }
497 <                };
498 <            
499 <            for(int i =0; i < 5; i++){
500 <                Executors.invoke(p,c);
501 <            }
502 <            
503 <            shouldThrow();
504 <        }
505 <        catch(ExecutionException success){
506 <        } catch(Exception 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          }
509        joinPool(p);
548      }
549  
550  
551 +    /**
552 +     * callable(null Runnable) throws NPE
553 +     */
554 +    public void testCallableNPE1() {
555 +        try {
556 +            Runnable r = null;
557 +            Callable c = Executors.callable(r);
558 +        } catch (NullPointerException success) {
559 +        }
560 +    }
561  
562      /**
563 <     *  timeouts from execute will time out if they compute too long.
564 <     */
565 <    public void testTimedCallable() {
518 <        int N = 10000;
519 <        ExecutorService executor = Executors.newSingleThreadExecutor();
520 <        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;
525 <            while (tasks.size() < N) {
526 <                tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
527 <                i += 10;
528 <            }
529 <            
530 <            int iters = 0;
531 <            BigInteger sum = BigInteger.ZERO;
532 <            for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
533 <                try {
534 <                    ++iters;
535 <                    sum = sum.add(it.next().call());
536 <                }
537 <                catch (TimeoutException success) {
538 <                    assertTrue(iters > 0);
539 <                    return;
540 <                }
541 <                catch (Exception e) {
542 <                    unexpectedException();
543 <                }
544 <            }
545 <            // if by chance we didn't ever time out, total time must be small
546 <            long elapsed = System.currentTimeMillis() - startTime;
547 <            assertTrue(elapsed < N);
567 >            Runnable r = null;
568 >            Callable c = Executors.callable(r, one);
569 >        } catch (NullPointerException success) {
570          }
571 <        finally {
572 <            joinPool(executor);
571 >    }
572 >
573 >    /**
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 <    
584 >    /**
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