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