ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.42
Committed: Sun May 29 13:45:35 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.41: +40 -29 lines
Log Message:
various test case improvements

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 jsr166 1.37 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.20 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     import junit.framework.*;
10     import java.util.*;
11     import java.util.concurrent.*;
12 jsr166 1.26 import static java.util.concurrent.TimeUnit.MILLISECONDS;
13 dl 1.8 import java.security.*;
14 dl 1.1
15 jsr166 1.22 public class ExecutorsTest extends JSR166TestCase {
16 dl 1.1 public static void main(String[] args) {
17 jsr166 1.30 junit.textui.TestRunner.run(suite());
18 dl 1.1 }
19     public static Test suite() {
20 tim 1.9 return new TestSuite(ExecutorsTest.class);
21 dl 1.1 }
22    
23 dl 1.5 /**
24     * A newCachedThreadPool can execute runnables
25     */
26     public void testNewCachedThreadPool1() {
27     ExecutorService e = Executors.newCachedThreadPool();
28     e.execute(new NoOpRunnable());
29     e.execute(new NoOpRunnable());
30     e.execute(new NoOpRunnable());
31 dl 1.14 joinPool(e);
32 dl 1.5 }
33    
34     /**
35     * A newCachedThreadPool with given ThreadFactory can execute runnables
36     */
37     public void testNewCachedThreadPool2() {
38 dl 1.6 ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
39 dl 1.5 e.execute(new NoOpRunnable());
40     e.execute(new NoOpRunnable());
41     e.execute(new NoOpRunnable());
42 dl 1.14 joinPool(e);
43 dl 1.5 }
44    
45     /**
46     * A newCachedThreadPool with null ThreadFactory throws NPE
47     */
48     public void testNewCachedThreadPool3() {
49     try {
50     ExecutorService e = Executors.newCachedThreadPool(null);
51     shouldThrow();
52 jsr166 1.23 } catch (NullPointerException success) {}
53 dl 1.5 }
54    
55     /**
56     * A new SingleThreadExecutor can execute runnables
57     */
58     public void testNewSingleThreadExecutor1() {
59     ExecutorService e = Executors.newSingleThreadExecutor();
60     e.execute(new NoOpRunnable());
61     e.execute(new NoOpRunnable());
62     e.execute(new NoOpRunnable());
63 dl 1.14 joinPool(e);
64 dl 1.5 }
65    
66     /**
67     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
68     */
69     public void testNewSingleThreadExecutor2() {
70 dl 1.6 ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
71 dl 1.5 e.execute(new NoOpRunnable());
72     e.execute(new NoOpRunnable());
73     e.execute(new NoOpRunnable());
74 dl 1.14 joinPool(e);
75 dl 1.5 }
76    
77     /**
78     * A new SingleThreadExecutor with null ThreadFactory throws NPE
79     */
80     public void testNewSingleThreadExecutor3() {
81     try {
82     ExecutorService e = Executors.newSingleThreadExecutor(null);
83     shouldThrow();
84 jsr166 1.23 } catch (NullPointerException success) {}
85 dl 1.5 }
86    
87     /**
88 dl 1.11 * A new SingleThreadExecutor cannot be casted to concrete implementation
89     */
90     public void testCastNewSingleThreadExecutor() {
91     ExecutorService e = Executors.newSingleThreadExecutor();
92     try {
93     ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
94 jsr166 1.23 shouldThrow();
95 dl 1.11 } catch (ClassCastException success) {
96     } finally {
97     joinPool(e);
98     }
99     }
100    
101     /**
102 dl 1.5 * A new newFixedThreadPool can execute runnables
103     */
104     public void testNewFixedThreadPool1() {
105     ExecutorService e = Executors.newFixedThreadPool(2);
106     e.execute(new NoOpRunnable());
107     e.execute(new NoOpRunnable());
108     e.execute(new NoOpRunnable());
109 dl 1.14 joinPool(e);
110 dl 1.5 }
111    
112     /**
113     * A new newFixedThreadPool with given ThreadFactory can execute runnables
114     */
115     public void testNewFixedThreadPool2() {
116 dl 1.6 ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
117 dl 1.5 e.execute(new NoOpRunnable());
118     e.execute(new NoOpRunnable());
119     e.execute(new NoOpRunnable());
120 dl 1.14 joinPool(e);
121 dl 1.5 }
122    
123     /**
124     * A new newFixedThreadPool with null ThreadFactory throws NPE
125     */
126     public void testNewFixedThreadPool3() {
127     try {
128     ExecutorService e = Executors.newFixedThreadPool(2, null);
129     shouldThrow();
130 jsr166 1.23 } catch (NullPointerException success) {}
131 dl 1.5 }
132    
133     /**
134     * A new newFixedThreadPool with 0 threads throws IAE
135     */
136     public void testNewFixedThreadPool4() {
137     try {
138     ExecutorService e = Executors.newFixedThreadPool(0);
139     shouldThrow();
140 jsr166 1.23 } catch (IllegalArgumentException success) {}
141 dl 1.5 }
142 dl 1.1
143 dl 1.2 /**
144 dl 1.11 * An unconfigurable newFixedThreadPool can execute runnables
145     */
146 jsr166 1.42 public void testUnconfigurableExecutorService() {
147 dl 1.11 ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
148     e.execute(new NoOpRunnable());
149     e.execute(new NoOpRunnable());
150     e.execute(new NoOpRunnable());
151 dl 1.14 joinPool(e);
152 dl 1.11 }
153    
154     /**
155     * unconfigurableExecutorService(null) throws NPE
156     */
157 jsr166 1.42 public void testUnconfigurableExecutorServiceNPE() {
158 dl 1.11 try {
159     ExecutorService e = Executors.unconfigurableExecutorService(null);
160 jsr166 1.23 shouldThrow();
161     } catch (NullPointerException success) {}
162 dl 1.11 }
163    
164     /**
165     * unconfigurableScheduledExecutorService(null) throws NPE
166     */
167 jsr166 1.42 public void testUnconfigurableScheduledExecutorServiceNPE() {
168 dl 1.11 try {
169     ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
170 jsr166 1.23 shouldThrow();
171     } catch (NullPointerException success) {}
172 dl 1.11 }
173    
174     /**
175     * a newSingleThreadScheduledExecutor successfully runs delayed task
176     */
177 jsr166 1.23 public void testNewSingleThreadScheduledExecutor() throws Exception {
178 jsr166 1.35 ScheduledExecutorService p = Executors.newSingleThreadScheduledExecutor();
179     try {
180 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
181 jsr166 1.35 final Runnable task = new CheckedRunnable() {
182     public void realRun() {
183 jsr166 1.42 await(proceed);
184 jsr166 1.35 }};
185 jsr166 1.42 long startTime = System.nanoTime();
186 jsr166 1.35 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
187 jsr166 1.42 timeoutMillis(), MILLISECONDS);
188 jsr166 1.35 assertFalse(f.isDone());
189 jsr166 1.42 proceed.countDown();
190     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
191 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
192 jsr166 1.35 assertTrue(f.isDone());
193 jsr166 1.42 assertFalse(f.isCancelled());
194     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
195 jsr166 1.35 } finally {
196     joinPool(p);
197     }
198 dl 1.11 }
199    
200     /**
201     * a newScheduledThreadPool successfully runs delayed task
202     */
203 jsr166 1.42 public void testNewScheduledThreadPool() throws Exception {
204 jsr166 1.35 ScheduledExecutorService p = Executors.newScheduledThreadPool(2);
205     try {
206 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
207 jsr166 1.35 final Runnable task = new CheckedRunnable() {
208     public void realRun() {
209 jsr166 1.42 await(proceed);
210 jsr166 1.35 }};
211 jsr166 1.42 long startTime = System.nanoTime();
212 jsr166 1.35 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
213 jsr166 1.42 timeoutMillis(), MILLISECONDS);
214 jsr166 1.35 assertFalse(f.isDone());
215 jsr166 1.42 proceed.countDown();
216     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
217 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
218 jsr166 1.35 assertTrue(f.isDone());
219 jsr166 1.42 assertFalse(f.isCancelled());
220     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
221 jsr166 1.35 } finally {
222     joinPool(p);
223     }
224 dl 1.11 }
225    
226     /**
227 jsr166 1.24 * an unconfigurable newScheduledThreadPool successfully runs delayed task
228 dl 1.11 */
229 jsr166 1.42 public void testUnconfigurableScheduledExecutorService() throws Exception {
230 jsr166 1.35 ScheduledExecutorService p =
231     Executors.unconfigurableScheduledExecutorService
232     (Executors.newScheduledThreadPool(2));
233     try {
234 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
235 jsr166 1.35 final Runnable task = new CheckedRunnable() {
236     public void realRun() {
237 jsr166 1.42 await(proceed);
238 jsr166 1.35 }};
239 jsr166 1.42 long startTime = System.nanoTime();
240 jsr166 1.35 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
241 jsr166 1.42 timeoutMillis(), MILLISECONDS);
242 jsr166 1.35 assertFalse(f.isDone());
243 jsr166 1.42 proceed.countDown();
244     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
245 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
246 jsr166 1.35 assertTrue(f.isDone());
247 jsr166 1.42 assertFalse(f.isCancelled());
248     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
249 jsr166 1.35 } finally {
250     joinPool(p);
251     }
252 dl 1.11 }
253    
254     /**
255 jsr166 1.34 * Future.get on submitted tasks will time out if they compute too long.
256 dl 1.2 */
257 jsr166 1.23 public void testTimedCallable() throws Exception {
258 jsr166 1.40 final ExecutorService[] executors = {
259     Executors.newSingleThreadExecutor(),
260     Executors.newCachedThreadPool(),
261     Executors.newFixedThreadPool(2),
262     Executors.newScheduledThreadPool(2),
263     };
264    
265 jsr166 1.33 final Runnable sleeper = new CheckedInterruptedRunnable() {
266     public void realRun() throws InterruptedException {
267 dl 1.39 delay(LONG_DELAY_MS);
268 jsr166 1.33 }};
269 jsr166 1.40
270     List<Thread> threads = new ArrayList<Thread>();
271     for (final ExecutorService executor : executors) {
272     threads.add(newStartedThread(new CheckedRunnable() {
273     public void realRun() {
274     long startTime = System.nanoTime();
275     Future future = executor.submit(sleeper);
276     assertFutureTimesOut(future);
277     }}));
278 dl 1.2 }
279 jsr166 1.40 for (Thread thread : threads)
280     awaitTermination(thread);
281     for (ExecutorService executor : executors)
282     joinPool(executor);
283 dl 1.2 }
284    
285 dl 1.8 /**
286     * ThreadPoolExecutor using defaultThreadFactory has
287     * specified group, priority, daemon status, and name
288     */
289 jsr166 1.23 public void testDefaultThreadFactory() throws Exception {
290 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
291 jsr166 1.42 final CountDownLatch done = new CountDownLatch(1);
292 jsr166 1.31 Runnable r = new CheckedRunnable() {
293     public void realRun() {
294     try {
295     Thread current = Thread.currentThread();
296     assertTrue(!current.isDaemon());
297     assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
298     ThreadGroup g = current.getThreadGroup();
299     SecurityManager s = System.getSecurityManager();
300     if (s != null)
301     assertTrue(g == s.getThreadGroup());
302     else
303     assertTrue(g == egroup);
304     String name = current.getName();
305     assertTrue(name.endsWith("thread-1"));
306     } catch (SecurityException ok) {
307     // Also pass if not allowed to change setting
308 tim 1.9 }
309 jsr166 1.42 done.countDown();
310 jsr166 1.31 }};
311 tim 1.9 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
312 jsr166 1.20
313 tim 1.9 e.execute(r);
314 jsr166 1.42 await(done);
315    
316 dl 1.14 try {
317     e.shutdown();
318 jsr166 1.21 } catch (SecurityException ok) {
319 dl 1.14 }
320 jsr166 1.20
321 jsr166 1.42 joinPool(e);
322 dl 1.8 }
323    
324     /**
325     * ThreadPoolExecutor using privilegedThreadFactory has
326     * specified group, priority, daemon status, name,
327     * access control context and context class loader
328     */
329 jsr166 1.23 public void testPrivilegedThreadFactory() throws Exception {
330 jsr166 1.42 final CountDownLatch done = new CountDownLatch(1);
331 jsr166 1.29 Runnable r = new CheckedRunnable() {
332     public void realRun() throws Exception {
333     final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
334     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
335     final AccessControlContext thisacc = AccessController.getContext();
336     Runnable r = new CheckedRunnable() {
337     public void realRun() {
338 jsr166 1.25 Thread current = Thread.currentThread();
339 jsr166 1.29 assertTrue(!current.isDaemon());
340     assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
341 jsr166 1.25 ThreadGroup g = current.getThreadGroup();
342     SecurityManager s = System.getSecurityManager();
343     if (s != null)
344 jsr166 1.29 assertTrue(g == s.getThreadGroup());
345 jsr166 1.25 else
346 jsr166 1.29 assertTrue(g == egroup);
347 jsr166 1.25 String name = current.getName();
348 jsr166 1.29 assertTrue(name.endsWith("thread-1"));
349 jsr166 1.31 assertSame(thisccl, current.getContextClassLoader());
350     assertEquals(thisacc, AccessController.getContext());
351 jsr166 1.42 done.countDown();
352 jsr166 1.29 }};
353     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
354     e.execute(r);
355 jsr166 1.42 await(done);
356 jsr166 1.29 e.shutdown();
357     joinPool(e);
358     }};
359    
360     runWithPermissions(r,
361     new RuntimePermission("getClassLoader"),
362     new RuntimePermission("setContextClassLoader"),
363     new RuntimePermission("modifyThread"));
364     }
365 jsr166 1.20
366 jsr166 1.29 boolean haveCCLPermissions() {
367     SecurityManager sm = System.getSecurityManager();
368     if (sm != null) {
369     try {
370     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
371     sm.checkPermission(new RuntimePermission("getClassLoader"));
372     } catch (AccessControlException e) {
373     return false;
374     }
375 tim 1.9 }
376 jsr166 1.29 return true;
377 dl 1.8 }
378 dl 1.11
379 dl 1.16 void checkCCL() {
380 dl 1.18 SecurityManager sm = System.getSecurityManager();
381     if (sm != null) {
382     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
383 jsr166 1.19 sm.checkPermission(new RuntimePermission("getClassLoader"));
384 dl 1.18 }
385 dl 1.16 }
386    
387     class CheckCCL implements Callable<Object> {
388 dl 1.11 public Object call() {
389 dl 1.16 checkCCL();
390 dl 1.11 return null;
391     }
392     }
393    
394     /**
395     * Without class loader permissions, creating
396     * privilegedCallableUsingCurrentClassLoader throws ACE
397     */
398     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
399 jsr166 1.29 Runnable r = new CheckedRunnable() {
400     public void realRun() throws Exception {
401     if (System.getSecurityManager() == null)
402     return;
403     try {
404     Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
405     shouldThrow();
406     } catch (AccessControlException success) {}
407     }};
408 dl 1.16
409 jsr166 1.29 runWithoutPermissions(r);
410 dl 1.11 }
411    
412     /**
413 dl 1.16 * With class loader permissions, calling
414     * privilegedCallableUsingCurrentClassLoader does not throw ACE
415 dl 1.11 */
416 jsr166 1.42 public void testPrivilegedCallableUsingCCLWithPrivs() throws Exception {
417 jsr166 1.29 Runnable r = new CheckedRunnable() {
418     public void realRun() throws Exception {
419     Executors.privilegedCallableUsingCurrentClassLoader
420     (new NoOpCallable())
421     .call();
422     }};
423    
424     runWithPermissions(r,
425     new RuntimePermission("getClassLoader"),
426     new RuntimePermission("setContextClassLoader"));
427 dl 1.11 }
428    
429     /**
430     * Without permissions, calling privilegedCallable throws ACE
431     */
432 jsr166 1.42 public void testPrivilegedCallableWithNoPrivs() throws Exception {
433 jsr166 1.32 // Avoid classloader-related SecurityExceptions in swingui.TestRunner
434     Executors.privilegedCallable(new CheckCCL());
435    
436 jsr166 1.29 Runnable r = new CheckedRunnable() {
437     public void realRun() throws Exception {
438     if (System.getSecurityManager() == null)
439     return;
440     Callable task = Executors.privilegedCallable(new CheckCCL());
441     try {
442     task.call();
443     shouldThrow();
444     } catch (AccessControlException success) {}
445     }};
446    
447     runWithoutPermissions(r);
448    
449     // It seems rather difficult to test that the
450     // AccessControlContext of the privilegedCallable is used
451     // instead of its caller. Below is a failed attempt to do
452     // that, which does not work because the AccessController
453     // cannot capture the internal state of the current Policy.
454     // It would be much more work to differentiate based on,
455     // e.g. CodeSource.
456    
457     // final AccessControlContext[] noprivAcc = new AccessControlContext[1];
458     // final Callable[] task = new Callable[1];
459    
460     // runWithPermissions
461     // (new CheckedRunnable() {
462     // public void realRun() {
463     // if (System.getSecurityManager() == null)
464     // return;
465     // noprivAcc[0] = AccessController.getContext();
466     // task[0] = Executors.privilegedCallable(new CheckCCL());
467     // try {
468     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
469     // public Void run() {
470     // checkCCL();
471     // return null;
472     // }}, noprivAcc[0]);
473     // shouldThrow();
474     // } catch (AccessControlException success) {}
475     // }});
476    
477     // runWithPermissions
478     // (new CheckedRunnable() {
479     // public void realRun() throws Exception {
480     // if (System.getSecurityManager() == null)
481     // return;
482     // // Verify that we have an underprivileged ACC
483     // try {
484     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
485     // public Void run() {
486     // checkCCL();
487     // return null;
488     // }}, noprivAcc[0]);
489     // shouldThrow();
490     // } catch (AccessControlException success) {}
491    
492     // try {
493     // task[0].call();
494     // shouldThrow();
495     // } catch (AccessControlException success) {}
496     // }},
497     // new RuntimePermission("getClassLoader"),
498     // new RuntimePermission("setContextClassLoader"));
499 dl 1.11 }
500    
501     /**
502     * With permissions, calling privilegedCallable succeeds
503     */
504 jsr166 1.42 public void testPrivilegedCallableWithPrivs() throws Exception {
505 jsr166 1.29 Runnable r = new CheckedRunnable() {
506     public void realRun() throws Exception {
507     Executors.privilegedCallable(new CheckCCL()).call();
508     }};
509    
510 jsr166 1.38 runWithPermissions(r,
511 jsr166 1.29 new RuntimePermission("getClassLoader"),
512     new RuntimePermission("setContextClassLoader"));
513 dl 1.11 }
514    
515     /**
516     * callable(Runnable) returns null when called
517 jsr166 1.20 */
518 jsr166 1.23 public void testCallable1() throws Exception {
519     Callable c = Executors.callable(new NoOpRunnable());
520     assertNull(c.call());
521 dl 1.11 }
522    
523     /**
524     * callable(Runnable, result) returns result when called
525 jsr166 1.20 */
526 jsr166 1.23 public void testCallable2() throws Exception {
527     Callable c = Executors.callable(new NoOpRunnable(), one);
528 jsr166 1.27 assertSame(one, c.call());
529 dl 1.11 }
530    
531     /**
532     * callable(PrivilegedAction) returns its result when called
533 jsr166 1.20 */
534 jsr166 1.23 public void testCallable3() throws Exception {
535     Callable c = Executors.callable(new PrivilegedAction() {
536     public Object run() { return one; }});
537 jsr166 1.27 assertSame(one, c.call());
538 dl 1.11 }
539    
540     /**
541     * callable(PrivilegedExceptionAction) returns its result when called
542 jsr166 1.20 */
543 jsr166 1.23 public void testCallable4() throws Exception {
544     Callable c = Executors.callable(new PrivilegedExceptionAction() {
545     public Object run() { return one; }});
546 jsr166 1.27 assertSame(one, c.call());
547 dl 1.11 }
548    
549     /**
550     * callable(null Runnable) throws NPE
551 jsr166 1.20 */
552 dl 1.11 public void testCallableNPE1() {
553     try {
554 jsr166 1.23 Callable c = Executors.callable((Runnable) null);
555     shouldThrow();
556     } catch (NullPointerException success) {}
557 dl 1.11 }
558    
559     /**
560     * callable(null, result) throws NPE
561 jsr166 1.20 */
562 dl 1.11 public void testCallableNPE2() {
563     try {
564 jsr166 1.23 Callable c = Executors.callable((Runnable) null, one);
565     shouldThrow();
566     } catch (NullPointerException success) {}
567 dl 1.11 }
568    
569     /**
570     * callable(null PrivilegedAction) throws NPE
571 jsr166 1.20 */
572 dl 1.11 public void testCallableNPE3() {
573     try {
574 jsr166 1.23 Callable c = Executors.callable((PrivilegedAction) null);
575     shouldThrow();
576     } catch (NullPointerException success) {}
577 dl 1.11 }
578    
579     /**
580     * callable(null PrivilegedExceptionAction) throws NPE
581 jsr166 1.20 */
582 dl 1.11 public void testCallableNPE4() {
583     try {
584 jsr166 1.23 Callable c = Executors.callable((PrivilegedExceptionAction) null);
585     shouldThrow();
586     } catch (NullPointerException success) {}
587 dl 1.11 }
588    
589 dl 1.1 }