ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.35
Committed: Mon Oct 11 08:47:04 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.34: +50 -24 lines
Log Message:
optimize runtime

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