ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.14
Committed: Tue Jan 20 20:20:56 2004 UTC (20 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.13: +67 -33 lines
Log Message:
Don't fail if test harness doesn't have sufficient 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     static class CheckCCL implements Callable<Object> {
430     public Object call() {
431     AccessControlContext acc = AccessController.getContext();
432     acc.checkPermission(new RuntimePermission("getContextClassLoader"));
433     return null;
434     }
435     }
436    
437    
438     /**
439     * Without class loader permissions, creating
440     * privilegedCallableUsingCurrentClassLoader throws ACE
441     */
442     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
443 dl 1.14 Policy savedPolicy = null;
444     try {
445     savedPolicy = Policy.getPolicy();
446     AdjustablePolicy policy = new AdjustablePolicy();
447     Policy.setPolicy(policy);
448     } catch (AccessControlException ok) {
449     return;
450     }
451    
452 dl 1.11 try {
453     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
454     shouldThrow();
455     } catch(AccessControlException success) {
456     } catch(Exception ex) {
457     unexpectedException();
458     }
459     finally {
460     Policy.setPolicy(savedPolicy);
461     }
462     }
463    
464     /**
465     * Without class loader permissions, calling
466     * privilegedCallableUsingCurrentClassLoader throws ACE
467     */
468     public void testprivilegedCallableUsingCCLWithPrivs() {
469 dl 1.14 Policy savedPolicy = null;
470     try {
471     savedPolicy = Policy.getPolicy();
472     AdjustablePolicy policy = new AdjustablePolicy();
473     policy.addPermission(new RuntimePermission("getContextClassLoader"));
474     policy.addPermission(new RuntimePermission("setContextClassLoader"));
475     Policy.setPolicy(policy);
476     } catch (AccessControlException ok) {
477     return;
478     }
479    
480 dl 1.11 try {
481     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
482     task.call();
483     } catch(Exception ex) {
484     unexpectedException();
485     }
486     finally {
487     Policy.setPolicy(savedPolicy);
488     }
489     }
490    
491     /**
492     * Without permissions, calling privilegedCallable throws ACE
493     */
494     public void testprivilegedCallableWithNoPrivs() {
495 dl 1.14 Policy savedPolicy = null;
496     try {
497     savedPolicy = Policy.getPolicy();
498     AdjustablePolicy policy = new AdjustablePolicy();
499     Policy.setPolicy(policy);
500     } catch (AccessControlException ok) {
501     return;
502     }
503    
504 dl 1.11 Callable task = Executors.privilegedCallable(new CheckCCL());
505     Policy.setPolicy(savedPolicy);
506     try {
507     task.call();
508     shouldThrow();
509     } catch(AccessControlException success) {
510     } catch(Exception ex) {
511     unexpectedException();
512     } finally {
513     }
514     }
515    
516     /**
517     * With permissions, calling privilegedCallable succeeds
518     */
519     public void testprivilegedCallableWithPrivs() {
520 dl 1.14 Policy savedPolicy = null;
521     try {
522     savedPolicy = Policy.getPolicy();
523     AdjustablePolicy policy = new AdjustablePolicy();
524     policy.addPermission(new RuntimePermission("getContextClassLoader"));
525     policy.addPermission(new RuntimePermission("setContextClassLoader"));
526     Policy.setPolicy(policy);
527     } catch (AccessControlException ok) {
528     return;
529     }
530    
531 dl 1.11 Callable task = Executors.privilegedCallable(new CheckCCL());
532     try {
533     task.call();
534     } catch(Exception ex) {
535     unexpectedException();
536     } finally {
537     Policy.setPolicy(savedPolicy);
538     }
539     }
540    
541     /**
542     * callable(Runnable) returns null when called
543     */
544     public void testCallable1() {
545     try {
546     Callable c = Executors.callable(new NoOpRunnable());
547     assertNull(c.call());
548     } catch(Exception ex) {
549     unexpectedException();
550     }
551    
552     }
553    
554     /**
555     * callable(Runnable, result) returns result when called
556     */
557     public void testCallable2() {
558     try {
559     Callable c = Executors.callable(new NoOpRunnable(), one);
560     assertEquals(one, c.call());
561     } catch(Exception ex) {
562     unexpectedException();
563     }
564     }
565    
566     /**
567     * callable(PrivilegedAction) returns its result when called
568     */
569     public void testCallable3() {
570     try {
571     Callable c = Executors.callable(new PrivilegedAction() {
572     public Object run() { return one; }});
573     assertEquals(one, c.call());
574     } catch(Exception ex) {
575     unexpectedException();
576     }
577     }
578    
579     /**
580     * callable(PrivilegedExceptionAction) returns its result when called
581     */
582     public void testCallable4() {
583     try {
584     Callable c = Executors.callable(new PrivilegedExceptionAction() {
585     public Object run() { return one; }});
586     assertEquals(one, c.call());
587     } catch(Exception ex) {
588     unexpectedException();
589     }
590     }
591    
592    
593     /**
594     * callable(null Runnable) throws NPE
595     */
596     public void testCallableNPE1() {
597     try {
598     Runnable r = null;
599     Callable c = Executors.callable(r);
600     } catch (NullPointerException success) {
601     }
602     }
603    
604     /**
605     * callable(null, result) throws NPE
606     */
607     public void testCallableNPE2() {
608     try {
609     Runnable r = null;
610     Callable c = Executors.callable(r, one);
611     } catch (NullPointerException success) {
612     }
613     }
614    
615     /**
616     * callable(null PrivilegedAction) throws NPE
617     */
618     public void testCallableNPE3() {
619     try {
620     PrivilegedAction r = null;
621     Callable c = Executors.callable(r);
622     } catch (NullPointerException success) {
623     }
624     }
625    
626     /**
627     * callable(null PrivilegedExceptionAction) throws NPE
628     */
629     public void testCallableNPE4() {
630     try {
631     PrivilegedExceptionAction r = null;
632     Callable c = Executors.callable(r);
633     } catch (NullPointerException success) {
634     }
635     }
636    
637 dl 1.1
638     }