ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.12
Committed: Sat Dec 27 19:26:43 2003 UTC (20 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.11: +5 -4 lines
Log Message:
Headers reference Creative Commons

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     e.shutdown();
73     }
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     e.shutdown();
84     }
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     e.shutdown();
108     }
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     e.shutdown();
119     }
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     e.shutdown();
156     }
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     e.shutdown();
167     }
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     e.shutdown();
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     p1.shutdown();
241     joinPool(p1);
242     } catch(RejectedExecutionException e){}
243     catch(Exception e){
244     e.printStackTrace();
245     unexpectedException();
246     }
247     }
248    
249     /**
250     * a newScheduledThreadPool successfully runs delayed task
251     */
252     public void testnewScheduledThreadPool() {
253     try {
254     TrackedCallable callable = new TrackedCallable();
255     ScheduledExecutorService p1 = Executors.newScheduledThreadPool(2);
256     Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
257     assertFalse(callable.done);
258     Thread.sleep(MEDIUM_DELAY_MS);
259     assertTrue(callable.done);
260     assertEquals(Boolean.TRUE, f.get());
261     p1.shutdown();
262     joinPool(p1);
263     } catch(RejectedExecutionException e){}
264     catch(Exception e){
265     e.printStackTrace();
266     unexpectedException();
267     }
268     }
269    
270     /**
271     * an unconfigurable newScheduledThreadPool successfully runs delayed task
272     */
273     public void testunconfigurableScheduledExecutorService() {
274     try {
275     TrackedCallable callable = new TrackedCallable();
276     ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
277     Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
278     assertFalse(callable.done);
279     Thread.sleep(MEDIUM_DELAY_MS);
280     assertTrue(callable.done);
281     assertEquals(Boolean.TRUE, f.get());
282     p1.shutdown();
283     joinPool(p1);
284     } catch(RejectedExecutionException e){}
285     catch(Exception e){
286     e.printStackTrace();
287     unexpectedException();
288     }
289     }
290    
291     /**
292 dl 1.4 * timeouts from execute will time out if they compute too long.
293 dl 1.2 */
294     public void testTimedCallable() {
295     int N = 10000;
296     ExecutorService executor = Executors.newSingleThreadExecutor();
297     List<Callable<BigInteger>> tasks = new ArrayList<Callable<BigInteger>>(N);
298     try {
299     long startTime = System.currentTimeMillis();
300    
301     long i = 0;
302     while (tasks.size() < N) {
303     tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
304     i += 10;
305     }
306    
307     int iters = 0;
308     BigInteger sum = BigInteger.ZERO;
309     for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
310     try {
311     ++iters;
312     sum = sum.add(it.next().call());
313     }
314     catch (TimeoutException success) {
315     assertTrue(iters > 0);
316     return;
317     }
318     catch (Exception e) {
319 dl 1.4 unexpectedException();
320 dl 1.2 }
321     }
322     // if by chance we didn't ever time out, total time must be small
323     long elapsed = System.currentTimeMillis() - startTime;
324     assertTrue(elapsed < N);
325     }
326     finally {
327 dl 1.3 joinPool(executor);
328 dl 1.2 }
329     }
330    
331    
332 dl 1.8 /**
333     * ThreadPoolExecutor using defaultThreadFactory has
334     * specified group, priority, daemon status, and name
335     */
336     public void testDefaultThreadFactory() {
337 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
338     Runnable r = new Runnable() {
339     public void run() {
340     Thread current = Thread.currentThread();
341     threadAssertTrue(!current.isDaemon());
342     threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
343     ThreadGroup g = current.getThreadGroup();
344     SecurityManager s = System.getSecurityManager();
345     if (s != null)
346     threadAssertTrue(g == s.getThreadGroup());
347     else
348     threadAssertTrue(g == egroup);
349     String name = current.getName();
350     threadAssertTrue(name.endsWith("thread-1"));
351     }
352     };
353     ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
354    
355     e.execute(r);
356     e.shutdown();
357     try {
358     Thread.sleep(SHORT_DELAY_MS);
359     } catch (Exception eX) {
360     unexpectedException();
361     } finally {
362     joinPool(e);
363     }
364 dl 1.8 }
365    
366     /**
367     * ThreadPoolExecutor using privilegedThreadFactory has
368     * specified group, priority, daemon status, name,
369     * access control context and context class loader
370     */
371     public void testPrivilegedThreadFactory() {
372 tim 1.9 Policy savedPolicy = Policy.getPolicy();
373 dl 1.8 AdjustablePolicy policy = new AdjustablePolicy();
374     policy.addPermission(new RuntimePermission("getContextClassLoader"));
375     policy.addPermission(new RuntimePermission("setContextClassLoader"));
376 tim 1.9 Policy.setPolicy(policy);
377     final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
378     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
379 dl 1.8 final AccessControlContext thisacc = AccessController.getContext();
380 tim 1.9 Runnable r = new Runnable() {
381     public void run() {
382     Thread current = Thread.currentThread();
383     threadAssertTrue(!current.isDaemon());
384     threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
385     ThreadGroup g = current.getThreadGroup();
386     SecurityManager s = System.getSecurityManager();
387     if (s != null)
388     threadAssertTrue(g == s.getThreadGroup());
389     else
390     threadAssertTrue(g == egroup);
391     String name = current.getName();
392     threadAssertTrue(name.endsWith("thread-1"));
393     threadAssertTrue(thisccl == current.getContextClassLoader());
394     threadAssertTrue(thisacc.equals(AccessController.getContext()));
395     }
396     };
397     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
398    
399     Policy.setPolicy(savedPolicy);
400     e.execute(r);
401     e.shutdown();
402     try {
403     Thread.sleep(SHORT_DELAY_MS);
404     } catch (Exception ex) {
405     unexpectedException();
406     } finally {
407     joinPool(e);
408     }
409 dl 1.1
410 dl 1.8 }
411 dl 1.11
412     static class CheckCCL implements Callable<Object> {
413     public Object call() {
414     AccessControlContext acc = AccessController.getContext();
415     acc.checkPermission(new RuntimePermission("getContextClassLoader"));
416     return null;
417     }
418     }
419    
420    
421     /**
422     * Without class loader permissions, creating
423     * privilegedCallableUsingCurrentClassLoader throws ACE
424     */
425     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
426     Policy savedPolicy = Policy.getPolicy();
427     AdjustablePolicy policy = new AdjustablePolicy();
428     Policy.setPolicy(policy);
429     try {
430     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
431     shouldThrow();
432     } catch(AccessControlException success) {
433     } catch(Exception ex) {
434     unexpectedException();
435     }
436     finally {
437     Policy.setPolicy(savedPolicy);
438     }
439     }
440    
441     /**
442     * Without class loader permissions, calling
443     * privilegedCallableUsingCurrentClassLoader throws ACE
444     */
445     public void testprivilegedCallableUsingCCLWithPrivs() {
446     Policy savedPolicy = Policy.getPolicy();
447     AdjustablePolicy policy = new AdjustablePolicy();
448     policy.addPermission(new RuntimePermission("getContextClassLoader"));
449     policy.addPermission(new RuntimePermission("setContextClassLoader"));
450     Policy.setPolicy(policy);
451     try {
452     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
453     task.call();
454     } catch(Exception ex) {
455     unexpectedException();
456     }
457     finally {
458     Policy.setPolicy(savedPolicy);
459     }
460     }
461    
462     /**
463     * Without permissions, calling privilegedCallable throws ACE
464     */
465     public void testprivilegedCallableWithNoPrivs() {
466     Policy savedPolicy = Policy.getPolicy();
467     AdjustablePolicy policy = new AdjustablePolicy();
468     Policy.setPolicy(policy);
469     Callable task = Executors.privilegedCallable(new CheckCCL());
470     Policy.setPolicy(savedPolicy);
471     try {
472     task.call();
473     shouldThrow();
474     } catch(AccessControlException success) {
475     } catch(Exception ex) {
476     unexpectedException();
477     } finally {
478     }
479     }
480    
481     /**
482     * With permissions, calling privilegedCallable succeeds
483     */
484     public void testprivilegedCallableWithPrivs() {
485     Policy savedPolicy = Policy.getPolicy();
486     AdjustablePolicy policy = new AdjustablePolicy();
487     policy.addPermission(new RuntimePermission("getContextClassLoader"));
488     policy.addPermission(new RuntimePermission("setContextClassLoader"));
489     Policy.setPolicy(policy);
490     Callable task = Executors.privilegedCallable(new CheckCCL());
491     try {
492     task.call();
493     } catch(Exception ex) {
494     unexpectedException();
495     } finally {
496     Policy.setPolicy(savedPolicy);
497     }
498     }
499    
500     /**
501     * callable(Runnable) returns null when called
502     */
503     public void testCallable1() {
504     try {
505     Callable c = Executors.callable(new NoOpRunnable());
506     assertNull(c.call());
507     } catch(Exception ex) {
508     unexpectedException();
509     }
510    
511     }
512    
513     /**
514     * callable(Runnable, result) returns result when called
515     */
516     public void testCallable2() {
517     try {
518     Callable c = Executors.callable(new NoOpRunnable(), one);
519     assertEquals(one, c.call());
520     } catch(Exception ex) {
521     unexpectedException();
522     }
523     }
524    
525     /**
526     * callable(PrivilegedAction) returns its result when called
527     */
528     public void testCallable3() {
529     try {
530     Callable c = Executors.callable(new PrivilegedAction() {
531     public Object run() { return one; }});
532     assertEquals(one, c.call());
533     } catch(Exception ex) {
534     unexpectedException();
535     }
536     }
537    
538     /**
539     * callable(PrivilegedExceptionAction) returns its result when called
540     */
541     public void testCallable4() {
542     try {
543     Callable c = Executors.callable(new PrivilegedExceptionAction() {
544     public Object run() { return one; }});
545     assertEquals(one, c.call());
546     } catch(Exception ex) {
547     unexpectedException();
548     }
549     }
550    
551    
552     /**
553     * callable(null Runnable) throws NPE
554     */
555     public void testCallableNPE1() {
556     try {
557     Runnable r = null;
558     Callable c = Executors.callable(r);
559     } catch (NullPointerException success) {
560     }
561     }
562    
563     /**
564     * callable(null, result) throws NPE
565     */
566     public void testCallableNPE2() {
567     try {
568     Runnable r = null;
569     Callable c = Executors.callable(r, one);
570     } catch (NullPointerException success) {
571     }
572     }
573    
574     /**
575     * callable(null PrivilegedAction) throws NPE
576     */
577     public void testCallableNPE3() {
578     try {
579     PrivilegedAction r = null;
580     Callable c = Executors.callable(r);
581     } catch (NullPointerException success) {
582     }
583     }
584    
585     /**
586     * callable(null PrivilegedExceptionAction) throws NPE
587     */
588     public void testCallableNPE4() {
589     try {
590     PrivilegedExceptionAction r = null;
591     Callable c = Executors.callable(r);
592     } catch (NullPointerException success) {
593     }
594     }
595    
596 dl 1.1
597     }