ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.38
Committed: Thu Apr 14 22:55:08 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.37: +1 -1 lines
Log Message:
whitespace

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