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