ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.36
Committed: Tue Nov 9 15:29:11 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.35: +9 -6 lines
Log Message:
fix rare test failures

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