ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.32
Committed: Mon Oct 4 03:34:21 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.31: +3 -0 lines
Log Message:
Avoid classloader-related SecurityExceptions in swingui.TestRunner

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