ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.34
Committed: Sat Oct 9 19:30:35 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.33: +1 -1 lines
Log Message:
whitespace

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