ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.16
Committed: Tue Jan 27 11:37:00 2004 UTC (20 years, 3 months ago) by dl
Branch: MAIN
CVS Tags: JSR166_PFD
Changes since 1.15: +40 -26 lines
Log Message:
Don't fail if program has too many permissions

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     * 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 dl 1.3 public class ExecutorsTest extends JSR166TestCase{
17 dl 1.1 public static void main(String[] args) {
18 tim 1.9 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    
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    
35     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     catch(NullPointerException success) {
95     }
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     catch(NullPointerException success) {
130     }
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     catch(NullPointerException success) {
178     }
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     catch(IllegalArgumentException success) {
190     }
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     } 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 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    
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    
304     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    
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     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 tim 1.9 }
353     };
354     ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
355    
356     e.execute(r);
357 dl 1.14 try {
358     e.shutdown();
359     } catch(SecurityException ok) {
360     }
361    
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     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 dl 1.14 }
410 tim 1.9 };
411     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
412    
413     Policy.setPolicy(savedPolicy);
414     e.execute(r);
415 dl 1.14 try {
416     e.shutdown();
417     } catch(SecurityException ok) {
418     }
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     AccessController.getContext().checkPermission(new RuntimePermission("getContextClassLoader"));
431     }
432    
433     class CheckCCL implements Callable<Object> {
434 dl 1.11 public Object call() {
435 dl 1.16 checkCCL();
436 dl 1.11 return null;
437     }
438     }
439    
440    
441     /**
442     * Without class loader permissions, creating
443     * privilegedCallableUsingCurrentClassLoader throws ACE
444     */
445     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
446 dl 1.14 Policy savedPolicy = null;
447     try {
448     savedPolicy = Policy.getPolicy();
449     AdjustablePolicy policy = new AdjustablePolicy();
450     Policy.setPolicy(policy);
451     } catch (AccessControlException ok) {
452     return;
453     }
454    
455 dl 1.16 // Check if program still has too many permissions to run test
456     try {
457     checkCCL();
458     // too many privileges to test; so return
459     Policy.setPolicy(savedPolicy);
460     return;
461     } catch(AccessControlException ok) {
462     }
463    
464 dl 1.11 try {
465     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
466     shouldThrow();
467     } catch(AccessControlException success) {
468     } catch(Exception ex) {
469     unexpectedException();
470     }
471     finally {
472     Policy.setPolicy(savedPolicy);
473     }
474     }
475    
476     /**
477 dl 1.16 * With class loader permissions, calling
478     * privilegedCallableUsingCurrentClassLoader does not throw ACE
479 dl 1.11 */
480     public void testprivilegedCallableUsingCCLWithPrivs() {
481 dl 1.14 Policy savedPolicy = null;
482     try {
483     savedPolicy = Policy.getPolicy();
484     AdjustablePolicy policy = new AdjustablePolicy();
485     policy.addPermission(new RuntimePermission("getContextClassLoader"));
486     policy.addPermission(new RuntimePermission("setContextClassLoader"));
487     Policy.setPolicy(policy);
488     } catch (AccessControlException ok) {
489     return;
490     }
491    
492 dl 1.11 try {
493     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
494     task.call();
495     } catch(Exception ex) {
496     unexpectedException();
497     }
498     finally {
499     Policy.setPolicy(savedPolicy);
500     }
501     }
502    
503     /**
504     * Without permissions, calling privilegedCallable throws ACE
505     */
506     public void testprivilegedCallableWithNoPrivs() {
507 dl 1.16 Callable task;
508     Policy savedPolicy = null;
509     AdjustablePolicy policy = null;
510     AccessControlContext noprivAcc = null;
511 dl 1.14 try {
512 dl 1.16 savedPolicy = Policy.getPolicy();
513     policy = new AdjustablePolicy();
514 dl 1.14 Policy.setPolicy(policy);
515 dl 1.16 noprivAcc = AccessController.getContext();
516     task = Executors.privilegedCallable(new CheckCCL());
517 dl 1.15 Policy.setPolicy(savedPolicy);
518 dl 1.14 } catch (AccessControlException ok) {
519 dl 1.16 return; // program has too few permissions to set up test
520     }
521    
522     // Make sure that program doesn't have too many permissions
523     try {
524     AccessController.doPrivileged(new PrivilegedAction() {
525     public Object run() {
526     checkCCL();
527     return null;
528     }}, noprivAcc);
529     // too many permssions; skip test
530 dl 1.14 return;
531 dl 1.16 } catch(AccessControlException ok) {
532 dl 1.14 }
533    
534 dl 1.11 try {
535 dl 1.16 task.call();
536     shouldThrow();
537     } catch(AccessControlException success) {
538 dl 1.11 } catch(Exception ex) {
539     unexpectedException();
540 dl 1.15 }
541 dl 1.11 }
542    
543     /**
544     * With permissions, calling privilegedCallable succeeds
545     */
546     public void testprivilegedCallableWithPrivs() {
547 dl 1.14 Policy savedPolicy = null;
548     try {
549     savedPolicy = Policy.getPolicy();
550     AdjustablePolicy policy = new AdjustablePolicy();
551     policy.addPermission(new RuntimePermission("getContextClassLoader"));
552     policy.addPermission(new RuntimePermission("setContextClassLoader"));
553     Policy.setPolicy(policy);
554     } catch (AccessControlException ok) {
555     return;
556     }
557    
558 dl 1.11 Callable task = Executors.privilegedCallable(new CheckCCL());
559     try {
560     task.call();
561     } catch(Exception ex) {
562     unexpectedException();
563     } finally {
564     Policy.setPolicy(savedPolicy);
565     }
566     }
567    
568     /**
569     * callable(Runnable) returns null when called
570     */
571     public void testCallable1() {
572     try {
573     Callable c = Executors.callable(new NoOpRunnable());
574     assertNull(c.call());
575     } catch(Exception ex) {
576     unexpectedException();
577     }
578    
579     }
580    
581     /**
582     * callable(Runnable, result) returns result when called
583     */
584     public void testCallable2() {
585     try {
586     Callable c = Executors.callable(new NoOpRunnable(), one);
587     assertEquals(one, c.call());
588     } catch(Exception ex) {
589     unexpectedException();
590     }
591     }
592    
593     /**
594     * callable(PrivilegedAction) returns its result when called
595     */
596     public void testCallable3() {
597     try {
598     Callable c = Executors.callable(new PrivilegedAction() {
599     public Object run() { return one; }});
600     assertEquals(one, c.call());
601     } catch(Exception ex) {
602     unexpectedException();
603     }
604     }
605    
606     /**
607     * callable(PrivilegedExceptionAction) returns its result when called
608     */
609     public void testCallable4() {
610     try {
611     Callable c = Executors.callable(new PrivilegedExceptionAction() {
612     public Object run() { return one; }});
613     assertEquals(one, c.call());
614     } catch(Exception ex) {
615     unexpectedException();
616     }
617     }
618    
619    
620     /**
621     * callable(null Runnable) throws NPE
622     */
623     public void testCallableNPE1() {
624     try {
625     Runnable r = null;
626     Callable c = Executors.callable(r);
627     } catch (NullPointerException success) {
628     }
629     }
630    
631     /**
632     * callable(null, result) throws NPE
633     */
634     public void testCallableNPE2() {
635     try {
636     Runnable r = null;
637     Callable c = Executors.callable(r, one);
638     } catch (NullPointerException success) {
639     }
640     }
641    
642     /**
643     * callable(null PrivilegedAction) throws NPE
644     */
645     public void testCallableNPE3() {
646     try {
647     PrivilegedAction r = null;
648     Callable c = Executors.callable(r);
649     } catch (NullPointerException success) {
650     }
651     }
652    
653     /**
654     * callable(null PrivilegedExceptionAction) throws NPE
655     */
656     public void testCallableNPE4() {
657     try {
658     PrivilegedExceptionAction r = null;
659     Callable c = Executors.callable(r);
660     } catch (NullPointerException success) {
661     }
662     }
663    
664 dl 1.1
665     }