ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.42
Committed: Sun May 29 13:45:35 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.41: +40 -29 lines
Log Message:
various test case improvements

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/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import junit.framework.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12 import static java.util.concurrent.TimeUnit.MILLISECONDS;
13 import java.security.*;
14
15 public class ExecutorsTest extends JSR166TestCase {
16 public static void main(String[] args) {
17 junit.textui.TestRunner.run(suite());
18 }
19 public static Test suite() {
20 return new TestSuite(ExecutorsTest.class);
21 }
22
23 /**
24 * A newCachedThreadPool can execute runnables
25 */
26 public void testNewCachedThreadPool1() {
27 ExecutorService e = Executors.newCachedThreadPool();
28 e.execute(new NoOpRunnable());
29 e.execute(new NoOpRunnable());
30 e.execute(new NoOpRunnable());
31 joinPool(e);
32 }
33
34 /**
35 * A newCachedThreadPool with given ThreadFactory can execute runnables
36 */
37 public void testNewCachedThreadPool2() {
38 ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
39 e.execute(new NoOpRunnable());
40 e.execute(new NoOpRunnable());
41 e.execute(new NoOpRunnable());
42 joinPool(e);
43 }
44
45 /**
46 * A newCachedThreadPool with null ThreadFactory throws NPE
47 */
48 public void testNewCachedThreadPool3() {
49 try {
50 ExecutorService e = Executors.newCachedThreadPool(null);
51 shouldThrow();
52 } catch (NullPointerException success) {}
53 }
54
55 /**
56 * A new SingleThreadExecutor can execute runnables
57 */
58 public void testNewSingleThreadExecutor1() {
59 ExecutorService e = Executors.newSingleThreadExecutor();
60 e.execute(new NoOpRunnable());
61 e.execute(new NoOpRunnable());
62 e.execute(new NoOpRunnable());
63 joinPool(e);
64 }
65
66 /**
67 * A new SingleThreadExecutor with given ThreadFactory can execute runnables
68 */
69 public void testNewSingleThreadExecutor2() {
70 ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
71 e.execute(new NoOpRunnable());
72 e.execute(new NoOpRunnable());
73 e.execute(new NoOpRunnable());
74 joinPool(e);
75 }
76
77 /**
78 * A new SingleThreadExecutor with null ThreadFactory throws NPE
79 */
80 public void testNewSingleThreadExecutor3() {
81 try {
82 ExecutorService e = Executors.newSingleThreadExecutor(null);
83 shouldThrow();
84 } catch (NullPointerException success) {}
85 }
86
87 /**
88 * A new SingleThreadExecutor cannot be casted to concrete implementation
89 */
90 public void testCastNewSingleThreadExecutor() {
91 ExecutorService e = Executors.newSingleThreadExecutor();
92 try {
93 ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
94 shouldThrow();
95 } catch (ClassCastException success) {
96 } finally {
97 joinPool(e);
98 }
99 }
100
101 /**
102 * A new newFixedThreadPool can execute runnables
103 */
104 public void testNewFixedThreadPool1() {
105 ExecutorService e = Executors.newFixedThreadPool(2);
106 e.execute(new NoOpRunnable());
107 e.execute(new NoOpRunnable());
108 e.execute(new NoOpRunnable());
109 joinPool(e);
110 }
111
112 /**
113 * A new newFixedThreadPool with given ThreadFactory can execute runnables
114 */
115 public void testNewFixedThreadPool2() {
116 ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
117 e.execute(new NoOpRunnable());
118 e.execute(new NoOpRunnable());
119 e.execute(new NoOpRunnable());
120 joinPool(e);
121 }
122
123 /**
124 * A new newFixedThreadPool with null ThreadFactory throws NPE
125 */
126 public void testNewFixedThreadPool3() {
127 try {
128 ExecutorService e = Executors.newFixedThreadPool(2, null);
129 shouldThrow();
130 } catch (NullPointerException success) {}
131 }
132
133 /**
134 * A new newFixedThreadPool with 0 threads throws IAE
135 */
136 public void testNewFixedThreadPool4() {
137 try {
138 ExecutorService e = Executors.newFixedThreadPool(0);
139 shouldThrow();
140 } catch (IllegalArgumentException success) {}
141 }
142
143 /**
144 * An unconfigurable newFixedThreadPool can execute runnables
145 */
146 public void testUnconfigurableExecutorService() {
147 ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
148 e.execute(new NoOpRunnable());
149 e.execute(new NoOpRunnable());
150 e.execute(new NoOpRunnable());
151 joinPool(e);
152 }
153
154 /**
155 * unconfigurableExecutorService(null) throws NPE
156 */
157 public void testUnconfigurableExecutorServiceNPE() {
158 try {
159 ExecutorService e = Executors.unconfigurableExecutorService(null);
160 shouldThrow();
161 } catch (NullPointerException success) {}
162 }
163
164 /**
165 * unconfigurableScheduledExecutorService(null) throws NPE
166 */
167 public void testUnconfigurableScheduledExecutorServiceNPE() {
168 try {
169 ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
170 shouldThrow();
171 } catch (NullPointerException success) {}
172 }
173
174 /**
175 * a newSingleThreadScheduledExecutor successfully runs delayed task
176 */
177 public void testNewSingleThreadScheduledExecutor() throws Exception {
178 ScheduledExecutorService p = Executors.newSingleThreadScheduledExecutor();
179 try {
180 final CountDownLatch proceed = new CountDownLatch(1);
181 final Runnable task = new CheckedRunnable() {
182 public void realRun() {
183 await(proceed);
184 }};
185 long startTime = System.nanoTime();
186 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
187 timeoutMillis(), MILLISECONDS);
188 assertFalse(f.isDone());
189 proceed.countDown();
190 assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
191 assertSame(Boolean.TRUE, f.get());
192 assertTrue(f.isDone());
193 assertFalse(f.isCancelled());
194 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
195 } finally {
196 joinPool(p);
197 }
198 }
199
200 /**
201 * a newScheduledThreadPool successfully runs delayed task
202 */
203 public void testNewScheduledThreadPool() throws Exception {
204 ScheduledExecutorService p = Executors.newScheduledThreadPool(2);
205 try {
206 final CountDownLatch proceed = new CountDownLatch(1);
207 final Runnable task = new CheckedRunnable() {
208 public void realRun() {
209 await(proceed);
210 }};
211 long startTime = System.nanoTime();
212 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
213 timeoutMillis(), MILLISECONDS);
214 assertFalse(f.isDone());
215 proceed.countDown();
216 assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
217 assertSame(Boolean.TRUE, f.get());
218 assertTrue(f.isDone());
219 assertFalse(f.isCancelled());
220 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
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 proceed = new CountDownLatch(1);
235 final Runnable task = new CheckedRunnable() {
236 public void realRun() {
237 await(proceed);
238 }};
239 long startTime = System.nanoTime();
240 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
241 timeoutMillis(), MILLISECONDS);
242 assertFalse(f.isDone());
243 proceed.countDown();
244 assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
245 assertSame(Boolean.TRUE, f.get());
246 assertTrue(f.isDone());
247 assertFalse(f.isCancelled());
248 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
249 } finally {
250 joinPool(p);
251 }
252 }
253
254 /**
255 * Future.get on submitted tasks will time out if they compute too long.
256 */
257 public void testTimedCallable() throws Exception {
258 final ExecutorService[] executors = {
259 Executors.newSingleThreadExecutor(),
260 Executors.newCachedThreadPool(),
261 Executors.newFixedThreadPool(2),
262 Executors.newScheduledThreadPool(2),
263 };
264
265 final Runnable sleeper = new CheckedInterruptedRunnable() {
266 public void realRun() throws InterruptedException {
267 delay(LONG_DELAY_MS);
268 }};
269
270 List<Thread> threads = new ArrayList<Thread>();
271 for (final ExecutorService executor : executors) {
272 threads.add(newStartedThread(new CheckedRunnable() {
273 public void realRun() {
274 long startTime = System.nanoTime();
275 Future future = executor.submit(sleeper);
276 assertFutureTimesOut(future);
277 }}));
278 }
279 for (Thread thread : threads)
280 awaitTermination(thread);
281 for (ExecutorService executor : executors)
282 joinPool(executor);
283 }
284
285 /**
286 * ThreadPoolExecutor using defaultThreadFactory has
287 * specified group, priority, daemon status, and name
288 */
289 public void testDefaultThreadFactory() throws Exception {
290 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
291 final CountDownLatch done = new CountDownLatch(1);
292 Runnable r = new CheckedRunnable() {
293 public void realRun() {
294 try {
295 Thread current = Thread.currentThread();
296 assertTrue(!current.isDaemon());
297 assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
298 ThreadGroup g = current.getThreadGroup();
299 SecurityManager s = System.getSecurityManager();
300 if (s != null)
301 assertTrue(g == s.getThreadGroup());
302 else
303 assertTrue(g == egroup);
304 String name = current.getName();
305 assertTrue(name.endsWith("thread-1"));
306 } catch (SecurityException ok) {
307 // Also pass if not allowed to change setting
308 }
309 done.countDown();
310 }};
311 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
312
313 e.execute(r);
314 await(done);
315
316 try {
317 e.shutdown();
318 } catch (SecurityException ok) {
319 }
320
321 joinPool(e);
322 }
323
324 /**
325 * ThreadPoolExecutor using privilegedThreadFactory has
326 * specified group, priority, daemon status, name,
327 * access control context and context class loader
328 */
329 public void testPrivilegedThreadFactory() throws Exception {
330 final CountDownLatch done = new CountDownLatch(1);
331 Runnable r = new CheckedRunnable() {
332 public void realRun() throws Exception {
333 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
334 final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
335 final AccessControlContext thisacc = AccessController.getContext();
336 Runnable r = new CheckedRunnable() {
337 public void realRun() {
338 Thread current = Thread.currentThread();
339 assertTrue(!current.isDaemon());
340 assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
341 ThreadGroup g = current.getThreadGroup();
342 SecurityManager s = System.getSecurityManager();
343 if (s != null)
344 assertTrue(g == s.getThreadGroup());
345 else
346 assertTrue(g == egroup);
347 String name = current.getName();
348 assertTrue(name.endsWith("thread-1"));
349 assertSame(thisccl, current.getContextClassLoader());
350 assertEquals(thisacc, AccessController.getContext());
351 done.countDown();
352 }};
353 ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
354 e.execute(r);
355 await(done);
356 e.shutdown();
357 joinPool(e);
358 }};
359
360 runWithPermissions(r,
361 new RuntimePermission("getClassLoader"),
362 new RuntimePermission("setContextClassLoader"),
363 new RuntimePermission("modifyThread"));
364 }
365
366 boolean haveCCLPermissions() {
367 SecurityManager sm = System.getSecurityManager();
368 if (sm != null) {
369 try {
370 sm.checkPermission(new RuntimePermission("setContextClassLoader"));
371 sm.checkPermission(new RuntimePermission("getClassLoader"));
372 } catch (AccessControlException e) {
373 return false;
374 }
375 }
376 return true;
377 }
378
379 void checkCCL() {
380 SecurityManager sm = System.getSecurityManager();
381 if (sm != null) {
382 sm.checkPermission(new RuntimePermission("setContextClassLoader"));
383 sm.checkPermission(new RuntimePermission("getClassLoader"));
384 }
385 }
386
387 class CheckCCL implements Callable<Object> {
388 public Object call() {
389 checkCCL();
390 return null;
391 }
392 }
393
394 /**
395 * Without class loader permissions, creating
396 * privilegedCallableUsingCurrentClassLoader throws ACE
397 */
398 public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
399 Runnable r = new CheckedRunnable() {
400 public void realRun() throws Exception {
401 if (System.getSecurityManager() == null)
402 return;
403 try {
404 Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
405 shouldThrow();
406 } catch (AccessControlException success) {}
407 }};
408
409 runWithoutPermissions(r);
410 }
411
412 /**
413 * With class loader permissions, calling
414 * privilegedCallableUsingCurrentClassLoader does not throw ACE
415 */
416 public void testPrivilegedCallableUsingCCLWithPrivs() throws Exception {
417 Runnable r = new CheckedRunnable() {
418 public void realRun() throws Exception {
419 Executors.privilegedCallableUsingCurrentClassLoader
420 (new NoOpCallable())
421 .call();
422 }};
423
424 runWithPermissions(r,
425 new RuntimePermission("getClassLoader"),
426 new RuntimePermission("setContextClassLoader"));
427 }
428
429 /**
430 * Without permissions, calling privilegedCallable throws ACE
431 */
432 public void testPrivilegedCallableWithNoPrivs() throws Exception {
433 // Avoid classloader-related SecurityExceptions in swingui.TestRunner
434 Executors.privilegedCallable(new CheckCCL());
435
436 Runnable r = new CheckedRunnable() {
437 public void realRun() throws Exception {
438 if (System.getSecurityManager() == null)
439 return;
440 Callable task = Executors.privilegedCallable(new CheckCCL());
441 try {
442 task.call();
443 shouldThrow();
444 } catch (AccessControlException success) {}
445 }};
446
447 runWithoutPermissions(r);
448
449 // It seems rather difficult to test that the
450 // AccessControlContext of the privilegedCallable is used
451 // instead of its caller. Below is a failed attempt to do
452 // that, which does not work because the AccessController
453 // cannot capture the internal state of the current Policy.
454 // It would be much more work to differentiate based on,
455 // e.g. CodeSource.
456
457 // final AccessControlContext[] noprivAcc = new AccessControlContext[1];
458 // final Callable[] task = new Callable[1];
459
460 // runWithPermissions
461 // (new CheckedRunnable() {
462 // public void realRun() {
463 // if (System.getSecurityManager() == null)
464 // return;
465 // noprivAcc[0] = AccessController.getContext();
466 // task[0] = Executors.privilegedCallable(new CheckCCL());
467 // try {
468 // AccessController.doPrivileged(new PrivilegedAction<Void>() {
469 // public Void run() {
470 // checkCCL();
471 // return null;
472 // }}, noprivAcc[0]);
473 // shouldThrow();
474 // } catch (AccessControlException success) {}
475 // }});
476
477 // runWithPermissions
478 // (new CheckedRunnable() {
479 // public void realRun() throws Exception {
480 // if (System.getSecurityManager() == null)
481 // return;
482 // // Verify that we have an underprivileged ACC
483 // try {
484 // AccessController.doPrivileged(new PrivilegedAction<Void>() {
485 // public Void run() {
486 // checkCCL();
487 // return null;
488 // }}, noprivAcc[0]);
489 // shouldThrow();
490 // } catch (AccessControlException success) {}
491
492 // try {
493 // task[0].call();
494 // shouldThrow();
495 // } catch (AccessControlException success) {}
496 // }},
497 // new RuntimePermission("getClassLoader"),
498 // new RuntimePermission("setContextClassLoader"));
499 }
500
501 /**
502 * With permissions, calling privilegedCallable succeeds
503 */
504 public void testPrivilegedCallableWithPrivs() throws Exception {
505 Runnable r = new CheckedRunnable() {
506 public void realRun() throws Exception {
507 Executors.privilegedCallable(new CheckCCL()).call();
508 }};
509
510 runWithPermissions(r,
511 new RuntimePermission("getClassLoader"),
512 new RuntimePermission("setContextClassLoader"));
513 }
514
515 /**
516 * callable(Runnable) returns null when called
517 */
518 public void testCallable1() throws Exception {
519 Callable c = Executors.callable(new NoOpRunnable());
520 assertNull(c.call());
521 }
522
523 /**
524 * callable(Runnable, result) returns result when called
525 */
526 public void testCallable2() throws Exception {
527 Callable c = Executors.callable(new NoOpRunnable(), one);
528 assertSame(one, c.call());
529 }
530
531 /**
532 * callable(PrivilegedAction) returns its result when called
533 */
534 public void testCallable3() throws Exception {
535 Callable c = Executors.callable(new PrivilegedAction() {
536 public Object run() { return one; }});
537 assertSame(one, c.call());
538 }
539
540 /**
541 * callable(PrivilegedExceptionAction) returns its result when called
542 */
543 public void testCallable4() throws Exception {
544 Callable c = Executors.callable(new PrivilegedExceptionAction() {
545 public Object run() { return one; }});
546 assertSame(one, c.call());
547 }
548
549 /**
550 * callable(null Runnable) throws NPE
551 */
552 public void testCallableNPE1() {
553 try {
554 Callable c = Executors.callable((Runnable) null);
555 shouldThrow();
556 } catch (NullPointerException success) {}
557 }
558
559 /**
560 * callable(null, result) throws NPE
561 */
562 public void testCallableNPE2() {
563 try {
564 Callable c = Executors.callable((Runnable) null, one);
565 shouldThrow();
566 } catch (NullPointerException success) {}
567 }
568
569 /**
570 * callable(null PrivilegedAction) throws NPE
571 */
572 public void testCallableNPE3() {
573 try {
574 Callable c = Executors.callable((PrivilegedAction) null);
575 shouldThrow();
576 } catch (NullPointerException success) {}
577 }
578
579 /**
580 * callable(null PrivilegedExceptionAction) throws NPE
581 */
582 public void testCallableNPE4() {
583 try {
584 Callable c = Executors.callable((PrivilegedExceptionAction) null);
585 shouldThrow();
586 } catch (NullPointerException success) {}
587 }
588
589 }