ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.22
Committed: Mon Nov 16 05:30:07 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +7 -7 lines
Log Message:
whitespace

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.12 * 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 jsr166 1.20 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9    
10     import junit.framework.*;
11     import java.util.*;
12     import java.util.concurrent.*;
13 dl 1.2 import java.math.BigInteger;
14 dl 1.8 import java.security.*;
15 dl 1.1
16 jsr166 1.22 public class ExecutorsTest extends JSR166TestCase {
17 dl 1.1 public static void main(String[] args) {
18 jsr166 1.20 junit.textui.TestRunner.run (suite());
19 dl 1.1 }
20     public static Test suite() {
21 tim 1.9 return new TestSuite(ExecutorsTest.class);
22 dl 1.1 }
23    
24 dl 1.4 static class TimedCallable<T> implements Callable<T> {
25 tim 1.10 private final ExecutorService exec;
26 dl 1.4 private final Callable<T> func;
27     private final long msecs;
28 jsr166 1.20
29 tim 1.10 TimedCallable(ExecutorService exec, Callable<T> func, long msecs) {
30 dl 1.4 this.exec = exec;
31     this.func = func;
32     this.msecs = msecs;
33     }
34 jsr166 1.20
35 dl 1.4 public T call() throws Exception {
36 tim 1.10 Future<T> ftask = exec.submit(func);
37 dl 1.4 try {
38     return ftask.get(msecs, TimeUnit.MILLISECONDS);
39     } finally {
40     ftask.cancel(true);
41     }
42     }
43     }
44    
45    
46     private static class Fib implements Callable<BigInteger> {
47     private final BigInteger n;
48     Fib(long n) {
49     if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
50     this.n = BigInteger.valueOf(n);
51     }
52     public BigInteger call() {
53     BigInteger f1 = BigInteger.ONE;
54     BigInteger f2 = f1;
55     for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
56     BigInteger t = f1.add(f2);
57     f1 = f2;
58     f2 = t;
59     }
60     return f1;
61     }
62     };
63    
64 dl 1.5 /**
65     * A newCachedThreadPool can execute runnables
66     */
67     public void testNewCachedThreadPool1() {
68     ExecutorService e = Executors.newCachedThreadPool();
69     e.execute(new NoOpRunnable());
70     e.execute(new NoOpRunnable());
71     e.execute(new NoOpRunnable());
72 dl 1.14 joinPool(e);
73 dl 1.5 }
74    
75     /**
76     * A newCachedThreadPool with given ThreadFactory can execute runnables
77     */
78     public void testNewCachedThreadPool2() {
79 dl 1.6 ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
80 dl 1.5 e.execute(new NoOpRunnable());
81     e.execute(new NoOpRunnable());
82     e.execute(new NoOpRunnable());
83 dl 1.14 joinPool(e);
84 dl 1.5 }
85    
86     /**
87     * A newCachedThreadPool with null ThreadFactory throws NPE
88     */
89     public void testNewCachedThreadPool3() {
90     try {
91     ExecutorService e = Executors.newCachedThreadPool(null);
92     shouldThrow();
93     }
94 jsr166 1.21 catch (NullPointerException success) {
95 dl 1.5 }
96     }
97    
98    
99     /**
100     * A new SingleThreadExecutor can execute runnables
101     */
102     public void testNewSingleThreadExecutor1() {
103     ExecutorService e = Executors.newSingleThreadExecutor();
104     e.execute(new NoOpRunnable());
105     e.execute(new NoOpRunnable());
106     e.execute(new NoOpRunnable());
107 dl 1.14 joinPool(e);
108 dl 1.5 }
109    
110     /**
111     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
112     */
113     public void testNewSingleThreadExecutor2() {
114 dl 1.6 ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
115 dl 1.5 e.execute(new NoOpRunnable());
116     e.execute(new NoOpRunnable());
117     e.execute(new NoOpRunnable());
118 dl 1.14 joinPool(e);
119 dl 1.5 }
120    
121     /**
122     * A new SingleThreadExecutor with null ThreadFactory throws NPE
123     */
124     public void testNewSingleThreadExecutor3() {
125     try {
126     ExecutorService e = Executors.newSingleThreadExecutor(null);
127     shouldThrow();
128     }
129 jsr166 1.21 catch (NullPointerException success) {
130 dl 1.5 }
131     }
132    
133     /**
134 dl 1.11 * 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 dl 1.5 * A new newFixedThreadPool can execute runnables
149     */
150     public void testNewFixedThreadPool1() {
151     ExecutorService e = Executors.newFixedThreadPool(2);
152     e.execute(new NoOpRunnable());
153     e.execute(new NoOpRunnable());
154     e.execute(new NoOpRunnable());
155 dl 1.14 joinPool(e);
156 dl 1.5 }
157    
158     /**
159     * A new newFixedThreadPool with given ThreadFactory can execute runnables
160     */
161     public void testNewFixedThreadPool2() {
162 dl 1.6 ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
163 dl 1.5 e.execute(new NoOpRunnable());
164     e.execute(new NoOpRunnable());
165     e.execute(new NoOpRunnable());
166 dl 1.14 joinPool(e);
167 dl 1.5 }
168    
169     /**
170     * A new newFixedThreadPool with null ThreadFactory throws NPE
171     */
172     public void testNewFixedThreadPool3() {
173     try {
174     ExecutorService e = Executors.newFixedThreadPool(2, null);
175     shouldThrow();
176     }
177 jsr166 1.21 catch (NullPointerException success) {
178 dl 1.5 }
179     }
180    
181     /**
182     * A new newFixedThreadPool with 0 threads throws IAE
183     */
184     public void testNewFixedThreadPool4() {
185     try {
186     ExecutorService e = Executors.newFixedThreadPool(0);
187     shouldThrow();
188     }
189 jsr166 1.21 catch (IllegalArgumentException success) {
190 dl 1.5 }
191     }
192 dl 1.1
193 dl 1.2
194     /**
195 dl 1.11 * 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 dl 1.14 joinPool(e);
203 dl 1.11 }
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 jsr166 1.22 } catch (RejectedExecutionException e) {}
242     catch (Exception e) {
243 dl 1.11 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 jsr166 1.22 } catch (RejectedExecutionException e) {}
262     catch (Exception e) {
263 dl 1.11 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 jsr166 1.22 } catch (RejectedExecutionException e) {}
282     catch (Exception e) {
283 dl 1.11 e.printStackTrace();
284     unexpectedException();
285     }
286     }
287    
288     /**
289 dl 1.4 * timeouts from execute will time out if they compute too long.
290 dl 1.2 */
291     public void testTimedCallable() {
292     int N = 10000;
293     ExecutorService executor = Executors.newSingleThreadExecutor();
294     List<Callable<BigInteger>> tasks = new ArrayList<Callable<BigInteger>>(N);
295     try {
296     long startTime = System.currentTimeMillis();
297 jsr166 1.20
298 dl 1.2 long i = 0;
299     while (tasks.size() < N) {
300     tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
301     i += 10;
302     }
303 jsr166 1.20
304 dl 1.2 int iters = 0;
305     BigInteger sum = BigInteger.ZERO;
306     for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
307     try {
308     ++iters;
309     sum = sum.add(it.next().call());
310     }
311     catch (TimeoutException success) {
312     assertTrue(iters > 0);
313     return;
314     }
315     catch (Exception e) {
316 dl 1.4 unexpectedException();
317 dl 1.2 }
318     }
319     // if by chance we didn't ever time out, total time must be small
320     long elapsed = System.currentTimeMillis() - startTime;
321     assertTrue(elapsed < N);
322     }
323     finally {
324 dl 1.3 joinPool(executor);
325 dl 1.2 }
326     }
327    
328 jsr166 1.20
329 dl 1.8 /**
330     * ThreadPoolExecutor using defaultThreadFactory has
331     * specified group, priority, daemon status, and name
332     */
333     public void testDefaultThreadFactory() {
334 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
335     Runnable r = new Runnable() {
336     public void run() {
337 dl 1.13 try {
338     Thread current = Thread.currentThread();
339     threadAssertTrue(!current.isDaemon());
340 dl 1.17 threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
341 dl 1.13 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 tim 1.9 }
353     };
354     ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
355 jsr166 1.20
356 tim 1.9 e.execute(r);
357 dl 1.14 try {
358     e.shutdown();
359 jsr166 1.21 } catch (SecurityException ok) {
360 dl 1.14 }
361 jsr166 1.20
362 tim 1.9 try {
363     Thread.sleep(SHORT_DELAY_MS);
364     } catch (Exception eX) {
365     unexpectedException();
366     } finally {
367     joinPool(e);
368     }
369 dl 1.8 }
370    
371     /**
372     * ThreadPoolExecutor using privilegedThreadFactory has
373     * specified group, priority, daemon status, name,
374     * access control context and context class loader
375     */
376     public void testPrivilegedThreadFactory() {
377 dl 1.14 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 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
388     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
389 dl 1.8 final AccessControlContext thisacc = AccessController.getContext();
390 tim 1.9 Runnable r = new Runnable() {
391     public void run() {
392 dl 1.13 try {
393     Thread current = Thread.currentThread();
394     threadAssertTrue(!current.isDaemon());
395 dl 1.17 threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
396 dl 1.13 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 jsr166 1.21 } catch (SecurityException ok) {
407 dl 1.13 // Also pass if not allowed to change settings
408     }
409 dl 1.14 }
410 tim 1.9 };
411     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
412 jsr166 1.20
413 tim 1.9 Policy.setPolicy(savedPolicy);
414     e.execute(r);
415 dl 1.14 try {
416     e.shutdown();
417 jsr166 1.21 } catch (SecurityException ok) {
418 dl 1.14 }
419 tim 1.9 try {
420     Thread.sleep(SHORT_DELAY_MS);
421     } catch (Exception ex) {
422     unexpectedException();
423     } finally {
424     joinPool(e);
425     }
426 dl 1.1
427 dl 1.8 }
428 dl 1.11
429 dl 1.16 void checkCCL() {
430 dl 1.18 SecurityManager sm = System.getSecurityManager();
431     if (sm != null) {
432     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
433 jsr166 1.19 sm.checkPermission(new RuntimePermission("getClassLoader"));
434 dl 1.18 }
435 dl 1.16 }
436    
437     class CheckCCL implements Callable<Object> {
438 dl 1.11 public Object call() {
439 dl 1.16 checkCCL();
440 dl 1.11 return null;
441     }
442     }
443    
444    
445     /**
446     * Without class loader permissions, creating
447     * privilegedCallableUsingCurrentClassLoader throws ACE
448     */
449     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
450 dl 1.14 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 dl 1.16 // 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 jsr166 1.21 } catch (AccessControlException ok) {
466 jsr166 1.20 }
467 dl 1.16
468 dl 1.11 try {
469     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
470     shouldThrow();
471 jsr166 1.21 } catch (AccessControlException success) {
472     } catch (Exception ex) {
473 dl 1.11 unexpectedException();
474 jsr166 1.20 }
475 dl 1.11 finally {
476     Policy.setPolicy(savedPolicy);
477     }
478     }
479    
480     /**
481 dl 1.16 * With class loader permissions, calling
482     * privilegedCallableUsingCurrentClassLoader does not throw ACE
483 dl 1.11 */
484     public void testprivilegedCallableUsingCCLWithPrivs() {
485 dl 1.14 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 jsr166 1.20
496 dl 1.11 try {
497     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
498     task.call();
499 jsr166 1.21 } catch (Exception ex) {
500 dl 1.11 unexpectedException();
501 jsr166 1.20 }
502 dl 1.11 finally {
503     Policy.setPolicy(savedPolicy);
504     }
505     }
506    
507     /**
508     * Without permissions, calling privilegedCallable throws ACE
509     */
510     public void testprivilegedCallableWithNoPrivs() {
511 dl 1.16 Callable task;
512     Policy savedPolicy = null;
513     AdjustablePolicy policy = null;
514     AccessControlContext noprivAcc = null;
515 dl 1.14 try {
516 dl 1.16 savedPolicy = Policy.getPolicy();
517     policy = new AdjustablePolicy();
518 dl 1.14 Policy.setPolicy(policy);
519 dl 1.16 noprivAcc = AccessController.getContext();
520     task = Executors.privilegedCallable(new CheckCCL());
521 dl 1.15 Policy.setPolicy(savedPolicy);
522 dl 1.14 } catch (AccessControlException ok) {
523 dl 1.16 return; // program has too few permissions to set up test
524     }
525    
526 jsr166 1.20 // Make sure that program doesn't have too many permissions
527 dl 1.16 try {
528     AccessController.doPrivileged(new PrivilegedAction() {
529     public Object run() {
530     checkCCL();
531     return null;
532     }}, noprivAcc);
533     // too many permssions; skip test
534 dl 1.14 return;
535 jsr166 1.21 } catch (AccessControlException ok) {
536 dl 1.14 }
537    
538 dl 1.11 try {
539 dl 1.16 task.call();
540     shouldThrow();
541 jsr166 1.21 } catch (AccessControlException success) {
542     } catch (Exception ex) {
543 dl 1.11 unexpectedException();
544 jsr166 1.20 }
545 dl 1.11 }
546    
547     /**
548     * With permissions, calling privilegedCallable succeeds
549     */
550     public void testprivilegedCallableWithPrivs() {
551 dl 1.14 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 jsr166 1.20
562 dl 1.11 Callable task = Executors.privilegedCallable(new CheckCCL());
563     try {
564     task.call();
565 jsr166 1.21 } catch (Exception ex) {
566 dl 1.11 unexpectedException();
567     } finally {
568     Policy.setPolicy(savedPolicy);
569     }
570     }
571    
572     /**
573     * callable(Runnable) returns null when called
574 jsr166 1.20 */
575 dl 1.11 public void testCallable1() {
576     try {
577     Callable c = Executors.callable(new NoOpRunnable());
578     assertNull(c.call());
579 jsr166 1.21 } catch (Exception ex) {
580 dl 1.11 unexpectedException();
581     }
582 jsr166 1.20
583 dl 1.11 }
584    
585     /**
586     * callable(Runnable, result) returns result when called
587 jsr166 1.20 */
588 dl 1.11 public void testCallable2() {
589     try {
590     Callable c = Executors.callable(new NoOpRunnable(), one);
591     assertEquals(one, c.call());
592 jsr166 1.21 } catch (Exception ex) {
593 dl 1.11 unexpectedException();
594     }
595     }
596    
597     /**
598     * callable(PrivilegedAction) returns its result when called
599 jsr166 1.20 */
600 dl 1.11 public void testCallable3() {
601     try {
602     Callable c = Executors.callable(new PrivilegedAction() {
603     public Object run() { return one; }});
604     assertEquals(one, c.call());
605 jsr166 1.21 } catch (Exception ex) {
606 dl 1.11 unexpectedException();
607     }
608     }
609    
610     /**
611     * callable(PrivilegedExceptionAction) returns its result when called
612 jsr166 1.20 */
613 dl 1.11 public void testCallable4() {
614     try {
615     Callable c = Executors.callable(new PrivilegedExceptionAction() {
616     public Object run() { return one; }});
617     assertEquals(one, c.call());
618 jsr166 1.21 } catch (Exception ex) {
619 dl 1.11 unexpectedException();
620     }
621     }
622    
623    
624     /**
625     * callable(null Runnable) throws NPE
626 jsr166 1.20 */
627 dl 1.11 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 jsr166 1.20 */
638 dl 1.11 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 jsr166 1.20 */
649 dl 1.11 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 jsr166 1.20 */
660 dl 1.11 public void testCallableNPE4() {
661     try {
662     PrivilegedExceptionAction r = null;
663     Callable c = Executors.callable(r);
664     } catch (NullPointerException success) {
665     }
666     }
667    
668 dl 1.1
669     }