ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.33
Committed: Mon Oct 4 05:45:44 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.32: +4 -5 lines
Log Message:
small simplification

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 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.24 TrackedCallable callable = new TrackedCallable();
185     ScheduledExecutorService p1 = Executors.newSingleThreadScheduledExecutor();
186 jsr166 1.26 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
187 jsr166 1.24 assertFalse(callable.done);
188     Thread.sleep(MEDIUM_DELAY_MS);
189     assertTrue(callable.done);
190     assertEquals(Boolean.TRUE, f.get());
191     joinPool(p1);
192 dl 1.11 }
193    
194     /**
195     * a newScheduledThreadPool successfully runs delayed task
196     */
197 jsr166 1.23 public void testnewScheduledThreadPool() throws Exception {
198 jsr166 1.24 TrackedCallable callable = new TrackedCallable();
199     ScheduledExecutorService p1 = Executors.newScheduledThreadPool(2);
200 jsr166 1.26 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
201 jsr166 1.24 assertFalse(callable.done);
202     Thread.sleep(MEDIUM_DELAY_MS);
203     assertTrue(callable.done);
204     assertEquals(Boolean.TRUE, f.get());
205     joinPool(p1);
206 dl 1.11 }
207    
208     /**
209 jsr166 1.24 * an unconfigurable newScheduledThreadPool successfully runs delayed task
210 dl 1.11 */
211 jsr166 1.23 public void testunconfigurableScheduledExecutorService() throws Exception {
212 jsr166 1.24 TrackedCallable callable = new TrackedCallable();
213     ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
214 jsr166 1.26 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
215 jsr166 1.24 assertFalse(callable.done);
216     Thread.sleep(MEDIUM_DELAY_MS);
217     assertTrue(callable.done);
218     assertEquals(Boolean.TRUE, f.get());
219     joinPool(p1);
220 dl 1.11 }
221    
222     /**
223 jsr166 1.28 * Future.get on submitted tasks will time out if they compute too long.
224 dl 1.2 */
225 jsr166 1.23 public void testTimedCallable() throws Exception {
226 jsr166 1.33 final Runnable sleeper = new CheckedInterruptedRunnable() {
227     public void realRun() throws InterruptedException {
228     Thread.sleep(LONG_DELAY_MS);
229     }};
230 jsr166 1.28 for (ExecutorService executor :
231     new ExecutorService[] {
232     Executors.newSingleThreadExecutor(),
233     Executors.newCachedThreadPool(),
234     Executors.newFixedThreadPool(2),
235     Executors.newScheduledThreadPool(2),
236     }) {
237     try {
238     Future future = executor.submit(sleeper);
239 dl 1.2 try {
240 jsr166 1.28 future.get(SHORT_DELAY_MS, MILLISECONDS);
241     shouldThrow();
242     } catch (TimeoutException success) {
243     } finally {
244     future.cancel(true);
245 dl 1.2 }
246     }
247 jsr166 1.28 finally {
248     joinPool(executor);
249     }
250 dl 1.2 }
251     }
252    
253 jsr166 1.20
254 dl 1.8 /**
255     * ThreadPoolExecutor using defaultThreadFactory has
256     * specified group, priority, daemon status, and name
257     */
258 jsr166 1.23 public void testDefaultThreadFactory() throws Exception {
259 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
260 jsr166 1.31 Runnable r = new CheckedRunnable() {
261     public void realRun() {
262     try {
263     Thread current = Thread.currentThread();
264     assertTrue(!current.isDaemon());
265     assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
266     ThreadGroup g = current.getThreadGroup();
267     SecurityManager s = System.getSecurityManager();
268     if (s != null)
269     assertTrue(g == s.getThreadGroup());
270     else
271     assertTrue(g == egroup);
272     String name = current.getName();
273     assertTrue(name.endsWith("thread-1"));
274     } catch (SecurityException ok) {
275     // Also pass if not allowed to change setting
276 tim 1.9 }
277 jsr166 1.31 }};
278 tim 1.9 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
279 jsr166 1.20
280 tim 1.9 e.execute(r);
281 dl 1.14 try {
282     e.shutdown();
283 jsr166 1.21 } catch (SecurityException ok) {
284 dl 1.14 }
285 jsr166 1.20
286 tim 1.9 try {
287     Thread.sleep(SHORT_DELAY_MS);
288     } finally {
289     joinPool(e);
290     }
291 dl 1.8 }
292    
293     /**
294     * ThreadPoolExecutor using privilegedThreadFactory has
295     * specified group, priority, daemon status, name,
296     * access control context and context class loader
297     */
298 jsr166 1.23 public void testPrivilegedThreadFactory() throws Exception {
299 jsr166 1.29 Runnable r = new CheckedRunnable() {
300     public void realRun() throws Exception {
301     final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
302     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
303     final AccessControlContext thisacc = AccessController.getContext();
304     Runnable r = new CheckedRunnable() {
305     public void realRun() {
306 jsr166 1.25 Thread current = Thread.currentThread();
307 jsr166 1.29 assertTrue(!current.isDaemon());
308     assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
309 jsr166 1.25 ThreadGroup g = current.getThreadGroup();
310     SecurityManager s = System.getSecurityManager();
311     if (s != null)
312 jsr166 1.29 assertTrue(g == s.getThreadGroup());
313 jsr166 1.25 else
314 jsr166 1.29 assertTrue(g == egroup);
315 jsr166 1.25 String name = current.getName();
316 jsr166 1.29 assertTrue(name.endsWith("thread-1"));
317 jsr166 1.31 assertSame(thisccl, current.getContextClassLoader());
318     assertEquals(thisacc, AccessController.getContext());
319 jsr166 1.29 }};
320     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
321     e.execute(r);
322     e.shutdown();
323     Thread.sleep(SHORT_DELAY_MS);
324     joinPool(e);
325     }};
326    
327     runWithPermissions(r,
328     new RuntimePermission("getClassLoader"),
329     new RuntimePermission("setContextClassLoader"),
330     new RuntimePermission("modifyThread"));
331     }
332 jsr166 1.20
333 jsr166 1.29 boolean haveCCLPermissions() {
334     SecurityManager sm = System.getSecurityManager();
335     if (sm != null) {
336     try {
337     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
338     sm.checkPermission(new RuntimePermission("getClassLoader"));
339     } catch (AccessControlException e) {
340     return false;
341     }
342 tim 1.9 }
343 jsr166 1.29 return true;
344 dl 1.8 }
345 dl 1.11
346 dl 1.16 void checkCCL() {
347 dl 1.18 SecurityManager sm = System.getSecurityManager();
348     if (sm != null) {
349     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
350 jsr166 1.19 sm.checkPermission(new RuntimePermission("getClassLoader"));
351 dl 1.18 }
352 dl 1.16 }
353    
354     class CheckCCL implements Callable<Object> {
355 dl 1.11 public Object call() {
356 dl 1.16 checkCCL();
357 dl 1.11 return null;
358     }
359     }
360    
361    
362     /**
363     * Without class loader permissions, creating
364     * privilegedCallableUsingCurrentClassLoader throws ACE
365     */
366     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
367 jsr166 1.29 Runnable r = new CheckedRunnable() {
368     public void realRun() throws Exception {
369     if (System.getSecurityManager() == null)
370     return;
371     try {
372     Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
373     shouldThrow();
374     } catch (AccessControlException success) {}
375     }};
376 dl 1.16
377 jsr166 1.29 runWithoutPermissions(r);
378 dl 1.11 }
379    
380     /**
381 dl 1.16 * With class loader permissions, calling
382     * privilegedCallableUsingCurrentClassLoader does not throw ACE
383 dl 1.11 */
384 jsr166 1.23 public void testprivilegedCallableUsingCCLWithPrivs() throws Exception {
385 jsr166 1.29 Runnable r = new CheckedRunnable() {
386     public void realRun() throws Exception {
387     Executors.privilegedCallableUsingCurrentClassLoader
388     (new NoOpCallable())
389     .call();
390     }};
391    
392     runWithPermissions(r,
393     new RuntimePermission("getClassLoader"),
394     new RuntimePermission("setContextClassLoader"));
395 dl 1.11 }
396    
397     /**
398     * Without permissions, calling privilegedCallable throws ACE
399     */
400 jsr166 1.23 public void testprivilegedCallableWithNoPrivs() throws Exception {
401 jsr166 1.32 // Avoid classloader-related SecurityExceptions in swingui.TestRunner
402     Executors.privilegedCallable(new CheckCCL());
403    
404 jsr166 1.29 Runnable r = new CheckedRunnable() {
405     public void realRun() throws Exception {
406     if (System.getSecurityManager() == null)
407     return;
408     Callable task = Executors.privilegedCallable(new CheckCCL());
409     try {
410     task.call();
411     shouldThrow();
412     } catch (AccessControlException success) {}
413     }};
414    
415     runWithoutPermissions(r);
416    
417     // It seems rather difficult to test that the
418     // AccessControlContext of the privilegedCallable is used
419     // instead of its caller. Below is a failed attempt to do
420     // that, which does not work because the AccessController
421     // cannot capture the internal state of the current Policy.
422     // It would be much more work to differentiate based on,
423     // e.g. CodeSource.
424    
425     // final AccessControlContext[] noprivAcc = new AccessControlContext[1];
426     // final Callable[] task = new Callable[1];
427    
428     // runWithPermissions
429     // (new CheckedRunnable() {
430     // public void realRun() {
431     // if (System.getSecurityManager() == null)
432     // return;
433     // noprivAcc[0] = AccessController.getContext();
434     // task[0] = Executors.privilegedCallable(new CheckCCL());
435     // try {
436     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
437     // public Void run() {
438     // checkCCL();
439     // return null;
440     // }}, noprivAcc[0]);
441     // shouldThrow();
442     // } catch (AccessControlException success) {}
443     // }});
444    
445     // runWithPermissions
446     // (new CheckedRunnable() {
447     // public void realRun() throws Exception {
448     // if (System.getSecurityManager() == null)
449     // return;
450     // // Verify that we have an underprivileged ACC
451     // try {
452     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
453     // public Void run() {
454     // checkCCL();
455     // return null;
456     // }}, noprivAcc[0]);
457     // shouldThrow();
458     // } catch (AccessControlException success) {}
459    
460     // try {
461     // task[0].call();
462     // shouldThrow();
463     // } catch (AccessControlException success) {}
464     // }},
465     // new RuntimePermission("getClassLoader"),
466     // new RuntimePermission("setContextClassLoader"));
467 dl 1.11 }
468    
469     /**
470     * With permissions, calling privilegedCallable succeeds
471     */
472 jsr166 1.23 public void testprivilegedCallableWithPrivs() throws Exception {
473 jsr166 1.29 Runnable r = new CheckedRunnable() {
474     public void realRun() throws Exception {
475     Executors.privilegedCallable(new CheckCCL()).call();
476     }};
477    
478     runWithPermissions(r,
479     new RuntimePermission("getClassLoader"),
480     new RuntimePermission("setContextClassLoader"));
481 dl 1.11 }
482    
483     /**
484     * callable(Runnable) returns null when called
485 jsr166 1.20 */
486 jsr166 1.23 public void testCallable1() throws Exception {
487     Callable c = Executors.callable(new NoOpRunnable());
488     assertNull(c.call());
489 dl 1.11 }
490    
491     /**
492     * callable(Runnable, result) returns result when called
493 jsr166 1.20 */
494 jsr166 1.23 public void testCallable2() throws Exception {
495     Callable c = Executors.callable(new NoOpRunnable(), one);
496 jsr166 1.27 assertSame(one, c.call());
497 dl 1.11 }
498    
499     /**
500     * callable(PrivilegedAction) returns its result when called
501 jsr166 1.20 */
502 jsr166 1.23 public void testCallable3() throws Exception {
503     Callable c = Executors.callable(new PrivilegedAction() {
504     public Object run() { return one; }});
505 jsr166 1.27 assertSame(one, c.call());
506 dl 1.11 }
507    
508     /**
509     * callable(PrivilegedExceptionAction) returns its result when called
510 jsr166 1.20 */
511 jsr166 1.23 public void testCallable4() throws Exception {
512     Callable c = Executors.callable(new PrivilegedExceptionAction() {
513     public Object run() { return one; }});
514 jsr166 1.27 assertSame(one, c.call());
515 dl 1.11 }
516    
517    
518     /**
519     * callable(null Runnable) throws NPE
520 jsr166 1.20 */
521 dl 1.11 public void testCallableNPE1() {
522     try {
523 jsr166 1.23 Callable c = Executors.callable((Runnable) null);
524     shouldThrow();
525     } catch (NullPointerException success) {}
526 dl 1.11 }
527    
528     /**
529     * callable(null, result) throws NPE
530 jsr166 1.20 */
531 dl 1.11 public void testCallableNPE2() {
532     try {
533 jsr166 1.23 Callable c = Executors.callable((Runnable) null, one);
534     shouldThrow();
535     } catch (NullPointerException success) {}
536 dl 1.11 }
537    
538     /**
539     * callable(null PrivilegedAction) throws NPE
540 jsr166 1.20 */
541 dl 1.11 public void testCallableNPE3() {
542     try {
543 jsr166 1.23 Callable c = Executors.callable((PrivilegedAction) null);
544     shouldThrow();
545     } catch (NullPointerException success) {}
546 dl 1.11 }
547    
548     /**
549     * callable(null PrivilegedExceptionAction) throws NPE
550 jsr166 1.20 */
551 dl 1.11 public void testCallableNPE4() {
552     try {
553 jsr166 1.23 Callable c = Executors.callable((PrivilegedExceptionAction) null);
554     shouldThrow();
555     } catch (NullPointerException success) {}
556 dl 1.11 }
557    
558 dl 1.1
559     }