ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.40
Committed: Fri May 27 19:28:38 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.39: +20 -29 lines
Log Message:
improve testTimedCallable

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