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

# Content
1 /*
2 * 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 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9
10 import junit.framework.*;
11 import java.util.*;
12 import java.util.concurrent.*;
13 import static java.util.concurrent.TimeUnit.MILLISECONDS;
14 import java.math.BigInteger;
15 import java.security.*;
16
17 public class ExecutorsTest extends JSR166TestCase {
18 public static void main(String[] args) {
19 junit.textui.TestRunner.run(suite());
20 }
21 public static Test suite() {
22 return new TestSuite(ExecutorsTest.class);
23 }
24
25 /**
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 joinPool(e);
34 }
35
36 /**
37 * A newCachedThreadPool with given ThreadFactory can execute runnables
38 */
39 public void testNewCachedThreadPool2() {
40 ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
41 e.execute(new NoOpRunnable());
42 e.execute(new NoOpRunnable());
43 e.execute(new NoOpRunnable());
44 joinPool(e);
45 }
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 } catch (NullPointerException success) {}
55 }
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 joinPool(e);
67 }
68
69 /**
70 * A new SingleThreadExecutor with given ThreadFactory can execute runnables
71 */
72 public void testNewSingleThreadExecutor2() {
73 ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
74 e.execute(new NoOpRunnable());
75 e.execute(new NoOpRunnable());
76 e.execute(new NoOpRunnable());
77 joinPool(e);
78 }
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 } catch (NullPointerException success) {}
88 }
89
90 /**
91 * 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 shouldThrow();
98 } catch (ClassCastException success) {
99 } finally {
100 joinPool(e);
101 }
102 }
103
104
105 /**
106 * 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 joinPool(e);
114 }
115
116 /**
117 * A new newFixedThreadPool with given ThreadFactory can execute runnables
118 */
119 public void testNewFixedThreadPool2() {
120 ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
121 e.execute(new NoOpRunnable());
122 e.execute(new NoOpRunnable());
123 e.execute(new NoOpRunnable());
124 joinPool(e);
125 }
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 } catch (NullPointerException success) {}
135 }
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 } catch (IllegalArgumentException success) {}
145 }
146
147
148 /**
149 * 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 joinPool(e);
157 }
158
159 /**
160 * unconfigurableExecutorService(null) throws NPE
161 */
162 public void testunconfigurableExecutorServiceNPE() {
163 try {
164 ExecutorService e = Executors.unconfigurableExecutorService(null);
165 shouldThrow();
166 } catch (NullPointerException success) {}
167 }
168
169 /**
170 * unconfigurableScheduledExecutorService(null) throws NPE
171 */
172 public void testunconfigurableScheduledExecutorServiceNPE() {
173 try {
174 ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
175 shouldThrow();
176 } catch (NullPointerException success) {}
177 }
178
179
180 /**
181 * a newSingleThreadScheduledExecutor successfully runs delayed task
182 */
183 public void testNewSingleThreadScheduledExecutor() throws Exception {
184 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 }
201
202 /**
203 * a newScheduledThreadPool successfully runs delayed task
204 */
205 public void testnewScheduledThreadPool() throws Exception {
206 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 }
223
224 /**
225 * an unconfigurable newScheduledThreadPool successfully runs delayed task
226 */
227 public void testunconfigurableScheduledExecutorService() throws Exception {
228 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 }
247
248 /**
249 * Future.get on submitted tasks will time out if they compute too long.
250 */
251 public void testTimedCallable() throws Exception {
252 final Runnable sleeper = new CheckedInterruptedRunnable() {
253 public void realRun() throws InterruptedException {
254 Thread.sleep(LONG_DELAY_MS);
255 }};
256 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 try {
266 future.get(SHORT_DELAY_MS, MILLISECONDS);
267 shouldThrow();
268 } catch (TimeoutException success) {
269 } finally {
270 future.cancel(true);
271 }
272 }
273 finally {
274 joinPool(executor);
275 }
276 }
277 }
278
279
280 /**
281 * ThreadPoolExecutor using defaultThreadFactory has
282 * specified group, priority, daemon status, and name
283 */
284 public void testDefaultThreadFactory() throws Exception {
285 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
286 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 }
303 }};
304 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
305
306 e.execute(r);
307 try {
308 e.shutdown();
309 } catch (SecurityException ok) {
310 }
311
312 try {
313 Thread.sleep(SHORT_DELAY_MS);
314 } finally {
315 joinPool(e);
316 }
317 }
318
319 /**
320 * ThreadPoolExecutor using privilegedThreadFactory has
321 * specified group, priority, daemon status, name,
322 * access control context and context class loader
323 */
324 public void testPrivilegedThreadFactory() throws Exception {
325 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 Thread current = Thread.currentThread();
333 assertTrue(!current.isDaemon());
334 assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
335 ThreadGroup g = current.getThreadGroup();
336 SecurityManager s = System.getSecurityManager();
337 if (s != null)
338 assertTrue(g == s.getThreadGroup());
339 else
340 assertTrue(g == egroup);
341 String name = current.getName();
342 assertTrue(name.endsWith("thread-1"));
343 assertSame(thisccl, current.getContextClassLoader());
344 assertEquals(thisacc, AccessController.getContext());
345 }};
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
359 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 }
369 return true;
370 }
371
372 void checkCCL() {
373 SecurityManager sm = System.getSecurityManager();
374 if (sm != null) {
375 sm.checkPermission(new RuntimePermission("setContextClassLoader"));
376 sm.checkPermission(new RuntimePermission("getClassLoader"));
377 }
378 }
379
380 class CheckCCL implements Callable<Object> {
381 public Object call() {
382 checkCCL();
383 return null;
384 }
385 }
386
387
388 /**
389 * Without class loader permissions, creating
390 * privilegedCallableUsingCurrentClassLoader throws ACE
391 */
392 public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
393 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
403 runWithoutPermissions(r);
404 }
405
406 /**
407 * With class loader permissions, calling
408 * privilegedCallableUsingCurrentClassLoader does not throw ACE
409 */
410 public void testprivilegedCallableUsingCCLWithPrivs() throws Exception {
411 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 }
422
423 /**
424 * Without permissions, calling privilegedCallable throws ACE
425 */
426 public void testprivilegedCallableWithNoPrivs() throws Exception {
427 // Avoid classloader-related SecurityExceptions in swingui.TestRunner
428 Executors.privilegedCallable(new CheckCCL());
429
430 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 }
494
495 /**
496 * With permissions, calling privilegedCallable succeeds
497 */
498 public void testprivilegedCallableWithPrivs() throws Exception {
499 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 }
508
509 /**
510 * callable(Runnable) returns null when called
511 */
512 public void testCallable1() throws Exception {
513 Callable c = Executors.callable(new NoOpRunnable());
514 assertNull(c.call());
515 }
516
517 /**
518 * callable(Runnable, result) returns result when called
519 */
520 public void testCallable2() throws Exception {
521 Callable c = Executors.callable(new NoOpRunnable(), one);
522 assertSame(one, c.call());
523 }
524
525 /**
526 * callable(PrivilegedAction) returns its result when called
527 */
528 public void testCallable3() throws Exception {
529 Callable c = Executors.callable(new PrivilegedAction() {
530 public Object run() { return one; }});
531 assertSame(one, c.call());
532 }
533
534 /**
535 * callable(PrivilegedExceptionAction) returns its result when called
536 */
537 public void testCallable4() throws Exception {
538 Callable c = Executors.callable(new PrivilegedExceptionAction() {
539 public Object run() { return one; }});
540 assertSame(one, c.call());
541 }
542
543
544 /**
545 * callable(null Runnable) throws NPE
546 */
547 public void testCallableNPE1() {
548 try {
549 Callable c = Executors.callable((Runnable) null);
550 shouldThrow();
551 } catch (NullPointerException success) {}
552 }
553
554 /**
555 * callable(null, result) throws NPE
556 */
557 public void testCallableNPE2() {
558 try {
559 Callable c = Executors.callable((Runnable) null, one);
560 shouldThrow();
561 } catch (NullPointerException success) {}
562 }
563
564 /**
565 * callable(null PrivilegedAction) throws NPE
566 */
567 public void testCallableNPE3() {
568 try {
569 Callable c = Executors.callable((PrivilegedAction) null);
570 shouldThrow();
571 } catch (NullPointerException success) {}
572 }
573
574 /**
575 * callable(null PrivilegedExceptionAction) throws NPE
576 */
577 public void testCallableNPE4() {
578 try {
579 Callable c = Executors.callable((PrivilegedExceptionAction) null);
580 shouldThrow();
581 } catch (NullPointerException success) {}
582 }
583
584
585 }