ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.43
Committed: Wed Dec 31 19:05:42 2014 UTC (9 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.42: +18 -4 lines
Log Message:
no wildcard imports

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