ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.13
Committed: Mon Jan 19 15:49:02 2004 UTC (20 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.12: +32 -25 lines
Log Message:
Javadoc fixes

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 dl 1.13 try {
341     Thread current = Thread.currentThread();
342     threadAssertTrue(!current.isDaemon());
343     threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
344     ThreadGroup g = current.getThreadGroup();
345     SecurityManager s = System.getSecurityManager();
346     if (s != null)
347     threadAssertTrue(g == s.getThreadGroup());
348     else
349     threadAssertTrue(g == egroup);
350     String name = current.getName();
351     threadAssertTrue(name.endsWith("thread-1"));
352     } catch (SecurityException ok) {
353     // Also pass if not allowed to change setting
354     }
355 tim 1.9 }
356     };
357     ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
358    
359     e.execute(r);
360     e.shutdown();
361     try {
362     Thread.sleep(SHORT_DELAY_MS);
363     } catch (Exception eX) {
364     unexpectedException();
365     } finally {
366     joinPool(e);
367     }
368 dl 1.8 }
369    
370     /**
371     * ThreadPoolExecutor using privilegedThreadFactory has
372     * specified group, priority, daemon status, name,
373     * access control context and context class loader
374     */
375     public void testPrivilegedThreadFactory() {
376 tim 1.9 Policy savedPolicy = Policy.getPolicy();
377 dl 1.8 AdjustablePolicy policy = new AdjustablePolicy();
378     policy.addPermission(new RuntimePermission("getContextClassLoader"));
379     policy.addPermission(new RuntimePermission("setContextClassLoader"));
380 tim 1.9 Policy.setPolicy(policy);
381     final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
382     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
383 dl 1.8 final AccessControlContext thisacc = AccessController.getContext();
384 tim 1.9 Runnable r = new Runnable() {
385     public void run() {
386 dl 1.13 try {
387     Thread current = Thread.currentThread();
388     threadAssertTrue(!current.isDaemon());
389     threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
390     ThreadGroup g = current.getThreadGroup();
391     SecurityManager s = System.getSecurityManager();
392     if (s != null)
393     threadAssertTrue(g == s.getThreadGroup());
394     else
395     threadAssertTrue(g == egroup);
396     String name = current.getName();
397     threadAssertTrue(name.endsWith("thread-1"));
398     threadAssertTrue(thisccl == current.getContextClassLoader());
399     threadAssertTrue(thisacc.equals(AccessController.getContext()));
400     } catch(SecurityException ok) {
401     // Also pass if not allowed to change settings
402     }
403 tim 1.9 };
404     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
405    
406     Policy.setPolicy(savedPolicy);
407     e.execute(r);
408     e.shutdown();
409     try {
410     Thread.sleep(SHORT_DELAY_MS);
411     } catch (Exception ex) {
412     unexpectedException();
413     } finally {
414     joinPool(e);
415     }
416 dl 1.1
417 dl 1.8 }
418 dl 1.11
419     static class CheckCCL implements Callable<Object> {
420     public Object call() {
421     AccessControlContext acc = AccessController.getContext();
422     acc.checkPermission(new RuntimePermission("getContextClassLoader"));
423     return null;
424     }
425     }
426    
427    
428     /**
429     * Without class loader permissions, creating
430     * privilegedCallableUsingCurrentClassLoader throws ACE
431     */
432     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
433     Policy savedPolicy = Policy.getPolicy();
434     AdjustablePolicy policy = new AdjustablePolicy();
435     Policy.setPolicy(policy);
436     try {
437     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
438     shouldThrow();
439     } catch(AccessControlException success) {
440     } catch(Exception ex) {
441     unexpectedException();
442     }
443     finally {
444     Policy.setPolicy(savedPolicy);
445     }
446     }
447    
448     /**
449     * Without class loader permissions, calling
450     * privilegedCallableUsingCurrentClassLoader throws ACE
451     */
452     public void testprivilegedCallableUsingCCLWithPrivs() {
453     Policy savedPolicy = Policy.getPolicy();
454     AdjustablePolicy policy = new AdjustablePolicy();
455     policy.addPermission(new RuntimePermission("getContextClassLoader"));
456     policy.addPermission(new RuntimePermission("setContextClassLoader"));
457     Policy.setPolicy(policy);
458     try {
459     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
460     task.call();
461     } catch(Exception ex) {
462     unexpectedException();
463     }
464     finally {
465     Policy.setPolicy(savedPolicy);
466     }
467     }
468    
469     /**
470     * Without permissions, calling privilegedCallable throws ACE
471     */
472     public void testprivilegedCallableWithNoPrivs() {
473     Policy savedPolicy = Policy.getPolicy();
474     AdjustablePolicy policy = new AdjustablePolicy();
475     Policy.setPolicy(policy);
476     Callable task = Executors.privilegedCallable(new CheckCCL());
477     Policy.setPolicy(savedPolicy);
478     try {
479     task.call();
480     shouldThrow();
481     } catch(AccessControlException success) {
482     } catch(Exception ex) {
483     unexpectedException();
484     } finally {
485     }
486     }
487    
488     /**
489     * With permissions, calling privilegedCallable succeeds
490     */
491     public void testprivilegedCallableWithPrivs() {
492     Policy savedPolicy = Policy.getPolicy();
493     AdjustablePolicy policy = new AdjustablePolicy();
494     policy.addPermission(new RuntimePermission("getContextClassLoader"));
495     policy.addPermission(new RuntimePermission("setContextClassLoader"));
496     Policy.setPolicy(policy);
497     Callable task = Executors.privilegedCallable(new CheckCCL());
498     try {
499     task.call();
500     } catch(Exception ex) {
501     unexpectedException();
502     } finally {
503     Policy.setPolicy(savedPolicy);
504     }
505     }
506    
507     /**
508     * callable(Runnable) returns null when called
509     */
510     public void testCallable1() {
511     try {
512     Callable c = Executors.callable(new NoOpRunnable());
513     assertNull(c.call());
514     } catch(Exception ex) {
515     unexpectedException();
516     }
517    
518     }
519    
520     /**
521     * callable(Runnable, result) returns result when called
522     */
523     public void testCallable2() {
524     try {
525     Callable c = Executors.callable(new NoOpRunnable(), one);
526     assertEquals(one, c.call());
527     } catch(Exception ex) {
528     unexpectedException();
529     }
530     }
531    
532     /**
533     * callable(PrivilegedAction) returns its result when called
534     */
535     public void testCallable3() {
536     try {
537     Callable c = Executors.callable(new PrivilegedAction() {
538     public Object run() { return one; }});
539     assertEquals(one, c.call());
540     } catch(Exception ex) {
541     unexpectedException();
542     }
543     }
544    
545     /**
546     * callable(PrivilegedExceptionAction) returns its result when called
547     */
548     public void testCallable4() {
549     try {
550     Callable c = Executors.callable(new PrivilegedExceptionAction() {
551     public Object run() { return one; }});
552     assertEquals(one, c.call());
553     } catch(Exception ex) {
554     unexpectedException();
555     }
556     }
557    
558    
559     /**
560     * callable(null Runnable) throws NPE
561     */
562     public void testCallableNPE1() {
563     try {
564     Runnable r = null;
565     Callable c = Executors.callable(r);
566     } catch (NullPointerException success) {
567     }
568     }
569    
570     /**
571     * callable(null, result) throws NPE
572     */
573     public void testCallableNPE2() {
574     try {
575     Runnable r = null;
576     Callable c = Executors.callable(r, one);
577     } catch (NullPointerException success) {
578     }
579     }
580    
581     /**
582     * callable(null PrivilegedAction) throws NPE
583     */
584     public void testCallableNPE3() {
585     try {
586     PrivilegedAction r = null;
587     Callable c = Executors.callable(r);
588     } catch (NullPointerException success) {
589     }
590     }
591    
592     /**
593     * callable(null PrivilegedExceptionAction) throws NPE
594     */
595     public void testCallableNPE4() {
596     try {
597     PrivilegedExceptionAction r = null;
598     Callable c = Executors.callable(r);
599     } catch (NullPointerException success) {
600     }
601     }
602    
603 dl 1.1
604     }