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.10 by tim, Wed Dec 10 01:51:12 2003 UTC vs.
Revision 1.21 by jsr166, Mon Nov 16 04:57:10 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  
# Line 14 | Line 15 | import java.security.*;
15  
16   public class ExecutorsTest extends JSR166TestCase{
17      public static void main(String[] args) {
18 <        junit.textui.TestRunner.run (suite());  
18 >        junit.textui.TestRunner.run (suite());
19      }
20      public static Test suite() {
21          return new TestSuite(ExecutorsTest.class);
# Line 24 | Line 25 | public class ExecutorsTest extends JSR16
25          private final ExecutorService exec;
26          private final Callable<T> func;
27          private final long msecs;
28 <        
28 >
29          TimedCallable(ExecutorService exec, Callable<T> func, long msecs) {
30              this.exec = exec;
31              this.func = func;
32              this.msecs = msecs;
33          }
34 <        
34 >
35          public T call() throws Exception {
36              Future<T> ftask = exec.submit(func);
37              try {
# Line 68 | Line 69 | public class ExecutorsTest extends JSR16
69          e.execute(new NoOpRunnable());
70          e.execute(new NoOpRunnable());
71          e.execute(new NoOpRunnable());
72 <        e.shutdown();
72 >        joinPool(e);
73      }
74  
75      /**
# Line 79 | Line 80 | public class ExecutorsTest extends JSR16
80          e.execute(new NoOpRunnable());
81          e.execute(new NoOpRunnable());
82          e.execute(new NoOpRunnable());
83 <        e.shutdown();
83 >        joinPool(e);
84      }
85  
86      /**
# Line 90 | Line 91 | public class ExecutorsTest extends JSR16
91              ExecutorService e = Executors.newCachedThreadPool(null);
92              shouldThrow();
93          }
94 <        catch(NullPointerException success) {
94 >        catch (NullPointerException success) {
95          }
96      }
97  
# Line 103 | Line 104 | public class ExecutorsTest extends JSR16
104          e.execute(new NoOpRunnable());
105          e.execute(new NoOpRunnable());
106          e.execute(new NoOpRunnable());
107 <        e.shutdown();
107 >        joinPool(e);
108      }
109  
110      /**
# Line 114 | Line 115 | public class ExecutorsTest extends JSR16
115          e.execute(new NoOpRunnable());
116          e.execute(new NoOpRunnable());
117          e.execute(new NoOpRunnable());
118 <        e.shutdown();
118 >        joinPool(e);
119      }
120  
121      /**
# Line 125 | Line 126 | public class ExecutorsTest extends JSR16
126              ExecutorService e = Executors.newSingleThreadExecutor(null);
127              shouldThrow();
128          }
129 <        catch(NullPointerException success) {
129 >        catch (NullPointerException success) {
130 >        }
131 >    }
132 >
133 >    /**
134 >     * A new SingleThreadExecutor cannot be casted to concrete implementation
135 >     */
136 >    public void testCastNewSingleThreadExecutor() {
137 >        ExecutorService e = Executors.newSingleThreadExecutor();
138 >        try {
139 >            ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
140 >        } catch (ClassCastException success) {
141 >        } finally {
142 >            joinPool(e);
143          }
144      }
145  
146 +
147      /**
148       * A new newFixedThreadPool can execute runnables
149       */
# Line 137 | Line 152 | public class ExecutorsTest extends JSR16
152          e.execute(new NoOpRunnable());
153          e.execute(new NoOpRunnable());
154          e.execute(new NoOpRunnable());
155 <        e.shutdown();
155 >        joinPool(e);
156      }
157  
158      /**
# Line 148 | Line 163 | public class ExecutorsTest extends JSR16
163          e.execute(new NoOpRunnable());
164          e.execute(new NoOpRunnable());
165          e.execute(new NoOpRunnable());
166 <        e.shutdown();
166 >        joinPool(e);
167      }
168  
169      /**
# Line 159 | Line 174 | public class ExecutorsTest extends JSR16
174              ExecutorService e = Executors.newFixedThreadPool(2, null);
175              shouldThrow();
176          }
177 <        catch(NullPointerException success) {
177 >        catch (NullPointerException success) {
178          }
179      }
180  
# Line 171 | Line 186 | public class ExecutorsTest extends JSR16
186              ExecutorService e = Executors.newFixedThreadPool(0);
187              shouldThrow();
188          }
189 <        catch(IllegalArgumentException success) {
189 >        catch (IllegalArgumentException success) {
190 >        }
191 >    }
192 >
193 >
194 >    /**
195 >     * An unconfigurable newFixedThreadPool can execute runnables
196 >     */
197 >    public void testunconfigurableExecutorService() {
198 >        ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
199 >        e.execute(new NoOpRunnable());
200 >        e.execute(new NoOpRunnable());
201 >        e.execute(new NoOpRunnable());
202 >        joinPool(e);
203 >    }
204 >
205 >    /**
206 >     * unconfigurableExecutorService(null) throws NPE
207 >     */
208 >    public void testunconfigurableExecutorServiceNPE() {
209 >        try {
210 >            ExecutorService e = Executors.unconfigurableExecutorService(null);
211 >        }
212 >        catch (NullPointerException success) {
213 >        }
214 >    }
215 >
216 >    /**
217 >     * unconfigurableScheduledExecutorService(null) throws NPE
218 >     */
219 >    public void testunconfigurableScheduledExecutorServiceNPE() {
220 >        try {
221 >            ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
222 >        }
223 >        catch (NullPointerException success) {
224 >        }
225 >    }
226 >
227 >
228 >    /**
229 >     * a newSingleThreadScheduledExecutor successfully runs delayed task
230 >     */
231 >    public void testNewSingleThreadScheduledExecutor() {
232 >        try {
233 >            TrackedCallable callable = new TrackedCallable();
234 >            ScheduledExecutorService p1 = Executors.newSingleThreadScheduledExecutor();
235 >            Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
236 >            assertFalse(callable.done);
237 >            Thread.sleep(MEDIUM_DELAY_MS);
238 >            assertTrue(callable.done);
239 >            assertEquals(Boolean.TRUE, f.get());
240 >            joinPool(p1);
241 >        } catch (RejectedExecutionException e){}
242 >        catch (Exception e){
243 >            e.printStackTrace();
244 >            unexpectedException();
245 >        }
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 >            joinPool(p1);
261 >        } catch (RejectedExecutionException e){}
262 >        catch (Exception e){
263 >            e.printStackTrace();
264 >            unexpectedException();
265          }
266      }
267  
268 +    /**
269 +     * an unconfigurable  newScheduledThreadPool successfully runs delayed task
270 +     */
271 +    public void testunconfigurableScheduledExecutorService() {
272 +        try {
273 +            TrackedCallable callable = new TrackedCallable();
274 +            ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
275 +            Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
276 +            assertFalse(callable.done);
277 +            Thread.sleep(MEDIUM_DELAY_MS);
278 +            assertTrue(callable.done);
279 +            assertEquals(Boolean.TRUE, f.get());
280 +            joinPool(p1);
281 +        } catch (RejectedExecutionException e){}
282 +        catch (Exception e){
283 +            e.printStackTrace();
284 +            unexpectedException();
285 +        }
286 +    }
287  
288      /**
289       *  timeouts from execute will time out if they compute too long.
# Line 185 | Line 294 | public class ExecutorsTest extends JSR16
294          List<Callable<BigInteger>> tasks = new ArrayList<Callable<BigInteger>>(N);
295          try {
296              long startTime = System.currentTimeMillis();
297 <            
297 >
298              long i = 0;
299              while (tasks.size() < N) {
300                  tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
301                  i += 10;
302              }
303 <            
303 >
304              int iters = 0;
305              BigInteger sum = BigInteger.ZERO;
306              for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
# Line 216 | Line 325 | public class ExecutorsTest extends JSR16
325          }
326      }
327  
328 <    
328 >
329      /**
330       * ThreadPoolExecutor using defaultThreadFactory has
331       * specified group, priority, daemon status, and name
# Line 225 | Line 334 | public class ExecutorsTest extends JSR16
334          final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
335          Runnable r = new Runnable() {
336                  public void run() {
337 <                    Thread current = Thread.currentThread();
338 <                    threadAssertTrue(!current.isDaemon());
339 <                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
340 <                    ThreadGroup g = current.getThreadGroup();
341 <                    SecurityManager s = System.getSecurityManager();
342 <                    if (s != null)
343 <                        threadAssertTrue(g == s.getThreadGroup());
344 <                    else
345 <                        threadAssertTrue(g == egroup);
346 <                    String name = current.getName();
347 <                    threadAssertTrue(name.endsWith("thread-1"));
337 >                    try {
338 >                        Thread current = Thread.currentThread();
339 >                        threadAssertTrue(!current.isDaemon());
340 >                        threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
341 >                        ThreadGroup g = current.getThreadGroup();
342 >                        SecurityManager s = System.getSecurityManager();
343 >                        if (s != null)
344 >                            threadAssertTrue(g == s.getThreadGroup());
345 >                        else
346 >                            threadAssertTrue(g == egroup);
347 >                        String name = current.getName();
348 >                        threadAssertTrue(name.endsWith("thread-1"));
349 >                    } catch (SecurityException ok) {
350 >                        // Also pass if not allowed to change setting
351 >                    }
352                  }
353              };
354          ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
355 <        
355 >
356          e.execute(r);
357 <        e.shutdown();
357 >        try {
358 >            e.shutdown();
359 >        } catch (SecurityException ok) {
360 >        }
361 >
362          try {
363              Thread.sleep(SHORT_DELAY_MS);
364          } catch (Exception eX) {
# Line 257 | Line 374 | public class ExecutorsTest extends JSR16
374       * access control context and context class loader
375       */
376      public void testPrivilegedThreadFactory() {
377 <        Policy savedPolicy = Policy.getPolicy();
378 <        AdjustablePolicy policy = new AdjustablePolicy();
379 <        policy.addPermission(new RuntimePermission("getContextClassLoader"));
380 <        policy.addPermission(new RuntimePermission("setContextClassLoader"));
381 <        Policy.setPolicy(policy);
377 >        Policy savedPolicy = null;
378 >        try {
379 >            savedPolicy = Policy.getPolicy();
380 >            AdjustablePolicy policy = new AdjustablePolicy();
381 >            policy.addPermission(new RuntimePermission("getContextClassLoader"));
382 >            policy.addPermission(new RuntimePermission("setContextClassLoader"));
383 >            Policy.setPolicy(policy);
384 >        } catch (AccessControlException ok) {
385 >            return;
386 >        }
387          final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
388          final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
389          final AccessControlContext thisacc = AccessController.getContext();
390          Runnable r = new Runnable() {
391                  public void run() {
392 <                    Thread current = Thread.currentThread();
393 <                    threadAssertTrue(!current.isDaemon());
394 <                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
395 <                    ThreadGroup g = current.getThreadGroup();
396 <                    SecurityManager s = System.getSecurityManager();
397 <                    if (s != null)
398 <                        threadAssertTrue(g == s.getThreadGroup());
399 <                    else
400 <                        threadAssertTrue(g == egroup);
401 <                    String name = current.getName();
402 <                    threadAssertTrue(name.endsWith("thread-1"));
403 <                    threadAssertTrue(thisccl == current.getContextClassLoader());
404 <                    threadAssertTrue(thisacc.equals(AccessController.getContext()));
392 >                    try {
393 >                        Thread current = Thread.currentThread();
394 >                        threadAssertTrue(!current.isDaemon());
395 >                        threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
396 >                        ThreadGroup g = current.getThreadGroup();
397 >                        SecurityManager s = System.getSecurityManager();
398 >                        if (s != null)
399 >                            threadAssertTrue(g == s.getThreadGroup());
400 >                        else
401 >                            threadAssertTrue(g == egroup);
402 >                        String name = current.getName();
403 >                        threadAssertTrue(name.endsWith("thread-1"));
404 >                        threadAssertTrue(thisccl == current.getContextClassLoader());
405 >                        threadAssertTrue(thisacc.equals(AccessController.getContext()));
406 >                    } catch (SecurityException ok) {
407 >                        // Also pass if not allowed to change settings
408 >                    }
409                  }
410              };
411          ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
412 <        
412 >
413          Policy.setPolicy(savedPolicy);
414          e.execute(r);
415 <        e.shutdown();
415 >        try {
416 >            e.shutdown();
417 >        } catch (SecurityException ok) {
418 >        }
419          try {
420              Thread.sleep(SHORT_DELAY_MS);
421          } catch (Exception ex) {
# Line 297 | Line 426 | public class ExecutorsTest extends JSR16
426  
427      }
428  
429 +    void checkCCL() {
430 +        SecurityManager sm = System.getSecurityManager();
431 +        if (sm != null) {
432 +            sm.checkPermission(new RuntimePermission("setContextClassLoader"));
433 +            sm.checkPermission(new RuntimePermission("getClassLoader"));
434 +        }
435 +    }
436 +
437 +    class CheckCCL implements Callable<Object> {
438 +        public Object call() {
439 +            checkCCL();
440 +            return null;
441 +        }
442 +    }
443 +
444 +
445 +    /**
446 +     * Without class loader permissions, creating
447 +     * privilegedCallableUsingCurrentClassLoader throws ACE
448 +     */
449 +    public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
450 +        Policy savedPolicy = null;
451 +        try {
452 +            savedPolicy = Policy.getPolicy();
453 +            AdjustablePolicy policy = new AdjustablePolicy();
454 +            Policy.setPolicy(policy);
455 +        } catch (AccessControlException ok) {
456 +            return;
457 +        }
458 +
459 +        // Check if program still has too many permissions to run test
460 +        try {
461 +            checkCCL();
462 +            // too many privileges to test; so return
463 +            Policy.setPolicy(savedPolicy);
464 +            return;
465 +        } catch (AccessControlException ok) {
466 +        }
467 +
468 +        try {
469 +            Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
470 +            shouldThrow();
471 +        } catch (AccessControlException success) {
472 +        } catch (Exception ex) {
473 +            unexpectedException();
474 +        }
475 +        finally {
476 +            Policy.setPolicy(savedPolicy);
477 +        }
478 +    }
479 +
480 +    /**
481 +     * With class loader permissions, calling
482 +     * privilegedCallableUsingCurrentClassLoader does not throw ACE
483 +     */
484 +    public void testprivilegedCallableUsingCCLWithPrivs() {
485 +        Policy savedPolicy = null;
486 +        try {
487 +            savedPolicy = Policy.getPolicy();
488 +            AdjustablePolicy policy = new AdjustablePolicy();
489 +            policy.addPermission(new RuntimePermission("getContextClassLoader"));
490 +            policy.addPermission(new RuntimePermission("setContextClassLoader"));
491 +            Policy.setPolicy(policy);
492 +        } catch (AccessControlException ok) {
493 +            return;
494 +        }
495 +
496 +        try {
497 +            Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
498 +            task.call();
499 +        } catch (Exception ex) {
500 +            unexpectedException();
501 +        }
502 +        finally {
503 +            Policy.setPolicy(savedPolicy);
504 +        }
505 +    }
506 +
507 +    /**
508 +     * Without permissions, calling privilegedCallable throws ACE
509 +     */
510 +    public void testprivilegedCallableWithNoPrivs() {
511 +        Callable task;
512 +        Policy savedPolicy = null;
513 +        AdjustablePolicy policy = null;
514 +        AccessControlContext noprivAcc = null;
515 +        try {
516 +            savedPolicy = Policy.getPolicy();
517 +            policy = new AdjustablePolicy();
518 +            Policy.setPolicy(policy);
519 +            noprivAcc = AccessController.getContext();
520 +            task = Executors.privilegedCallable(new CheckCCL());
521 +            Policy.setPolicy(savedPolicy);
522 +        } catch (AccessControlException ok) {
523 +            return; // program has too few permissions to set up test
524 +        }
525 +
526 +        // Make sure that program doesn't have too many permissions
527 +        try {
528 +            AccessController.doPrivileged(new PrivilegedAction() {
529 +                    public Object run() {
530 +                        checkCCL();
531 +                        return null;
532 +                    }}, noprivAcc);
533 +            // too many permssions; skip test
534 +            return;
535 +        } catch (AccessControlException ok) {
536 +        }
537 +
538 +        try {
539 +            task.call();
540 +            shouldThrow();
541 +        } catch (AccessControlException success) {
542 +        } catch (Exception ex) {
543 +            unexpectedException();
544 +        }
545 +    }
546 +
547 +    /**
548 +     * With permissions, calling privilegedCallable succeeds
549 +     */
550 +    public void testprivilegedCallableWithPrivs() {
551 +        Policy savedPolicy = null;
552 +        try {
553 +            savedPolicy = Policy.getPolicy();
554 +            AdjustablePolicy policy = new AdjustablePolicy();
555 +            policy.addPermission(new RuntimePermission("getContextClassLoader"));
556 +            policy.addPermission(new RuntimePermission("setContextClassLoader"));
557 +            Policy.setPolicy(policy);
558 +        } catch (AccessControlException ok) {
559 +            return;
560 +        }
561 +
562 +        Callable task = Executors.privilegedCallable(new CheckCCL());
563 +        try {
564 +            task.call();
565 +        } catch (Exception ex) {
566 +            unexpectedException();
567 +        } finally {
568 +            Policy.setPolicy(savedPolicy);
569 +        }
570 +    }
571 +
572 +    /**
573 +     * callable(Runnable) returns null when called
574 +     */
575 +    public void testCallable1() {
576 +        try {
577 +            Callable c = Executors.callable(new NoOpRunnable());
578 +            assertNull(c.call());
579 +        } catch (Exception ex) {
580 +            unexpectedException();
581 +        }
582 +
583 +    }
584 +
585 +    /**
586 +     * callable(Runnable, result) returns result when called
587 +     */
588 +    public void testCallable2() {
589 +        try {
590 +            Callable c = Executors.callable(new NoOpRunnable(), one);
591 +            assertEquals(one, c.call());
592 +        } catch (Exception ex) {
593 +            unexpectedException();
594 +        }
595 +    }
596 +
597 +    /**
598 +     * callable(PrivilegedAction) returns its result when called
599 +     */
600 +    public void testCallable3() {
601 +        try {
602 +            Callable c = Executors.callable(new PrivilegedAction() {
603 +                    public Object run() { return one; }});
604 +        assertEquals(one, c.call());
605 +        } catch (Exception ex) {
606 +            unexpectedException();
607 +        }
608 +    }
609 +
610 +    /**
611 +     * callable(PrivilegedExceptionAction) returns its result when called
612 +     */
613 +    public void testCallable4() {
614 +        try {
615 +            Callable c = Executors.callable(new PrivilegedExceptionAction() {
616 +                    public Object run() { return one; }});
617 +            assertEquals(one, c.call());
618 +        } catch (Exception ex) {
619 +            unexpectedException();
620 +        }
621 +    }
622 +
623 +
624 +    /**
625 +     * callable(null Runnable) throws NPE
626 +     */
627 +    public void testCallableNPE1() {
628 +        try {
629 +            Runnable r = null;
630 +            Callable c = Executors.callable(r);
631 +        } catch (NullPointerException success) {
632 +        }
633 +    }
634 +
635 +    /**
636 +     * callable(null, result) throws NPE
637 +     */
638 +    public void testCallableNPE2() {
639 +        try {
640 +            Runnable r = null;
641 +            Callable c = Executors.callable(r, one);
642 +        } catch (NullPointerException success) {
643 +        }
644 +    }
645 +
646 +    /**
647 +     * callable(null PrivilegedAction) throws NPE
648 +     */
649 +    public void testCallableNPE3() {
650 +        try {
651 +            PrivilegedAction r = null;
652 +            Callable c = Executors.callable(r);
653 +        } catch (NullPointerException success) {
654 +        }
655 +    }
656 +
657 +    /**
658 +     * callable(null PrivilegedExceptionAction) throws NPE
659 +     */
660 +    public void testCallableNPE4() {
661 +        try {
662 +            PrivilegedExceptionAction r = null;
663 +            Callable c = Executors.callable(r);
664 +        } catch (NullPointerException success) {
665 +        }
666 +    }
667 +
668 +
669   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines