ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.28
Committed: Wed Dec 2 19:17:01 2009 UTC (14 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.27: +23 -68 lines
Log Message:
Make testTimedCallable pass even on systems with adverserial thread schedulers

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 Policy savedPolicy = null;
302 try {
303 savedPolicy = Policy.getPolicy();
304 AdjustablePolicy policy = new AdjustablePolicy();
305 policy.addPermission(new RuntimePermission("getContextClassLoader"));
306 policy.addPermission(new RuntimePermission("setContextClassLoader"));
307 Policy.setPolicy(policy);
308 } catch (AccessControlException ok) {
309 return;
310 }
311 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
312 final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
313 final AccessControlContext thisacc = AccessController.getContext();
314 Runnable r = new Runnable() {
315 public void run() {
316 try {
317 Thread current = Thread.currentThread();
318 threadAssertTrue(!current.isDaemon());
319 threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
320 ThreadGroup g = current.getThreadGroup();
321 SecurityManager s = System.getSecurityManager();
322 if (s != null)
323 threadAssertTrue(g == s.getThreadGroup());
324 else
325 threadAssertTrue(g == egroup);
326 String name = current.getName();
327 threadAssertTrue(name.endsWith("thread-1"));
328 threadAssertTrue(thisccl == current.getContextClassLoader());
329 threadAssertTrue(thisacc.equals(AccessController.getContext()));
330 } catch (SecurityException ok) {
331 // Also pass if not allowed to change settings
332 }
333 }
334 };
335 ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
336
337 Policy.setPolicy(savedPolicy);
338 e.execute(r);
339 try {
340 e.shutdown();
341 } catch (SecurityException ok) {
342 }
343 try {
344 Thread.sleep(SHORT_DELAY_MS);
345 } finally {
346 joinPool(e);
347 }
348 }
349
350 void checkCCL() {
351 SecurityManager sm = System.getSecurityManager();
352 if (sm != null) {
353 sm.checkPermission(new RuntimePermission("setContextClassLoader"));
354 sm.checkPermission(new RuntimePermission("getClassLoader"));
355 }
356 }
357
358 class CheckCCL implements Callable<Object> {
359 public Object call() {
360 checkCCL();
361 return null;
362 }
363 }
364
365
366 /**
367 * Without class loader permissions, creating
368 * privilegedCallableUsingCurrentClassLoader throws ACE
369 */
370 public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
371 Policy savedPolicy = null;
372 try {
373 savedPolicy = Policy.getPolicy();
374 AdjustablePolicy policy = new AdjustablePolicy();
375 Policy.setPolicy(policy);
376 } catch (AccessControlException ok) {
377 return;
378 }
379
380 // Check if program still has too many permissions to run test
381 try {
382 checkCCL();
383 // too many privileges to test; so return
384 Policy.setPolicy(savedPolicy);
385 return;
386 } catch (AccessControlException ok) {
387 }
388
389 try {
390 Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
391 shouldThrow();
392 } catch (AccessControlException success) {
393 } finally {
394 Policy.setPolicy(savedPolicy);
395 }
396 }
397
398 /**
399 * With class loader permissions, calling
400 * privilegedCallableUsingCurrentClassLoader does not throw ACE
401 */
402 public void testprivilegedCallableUsingCCLWithPrivs() throws Exception {
403 Policy savedPolicy = null;
404 try {
405 savedPolicy = Policy.getPolicy();
406 AdjustablePolicy policy = new AdjustablePolicy();
407 policy.addPermission(new RuntimePermission("getContextClassLoader"));
408 policy.addPermission(new RuntimePermission("setContextClassLoader"));
409 Policy.setPolicy(policy);
410 } catch (AccessControlException ok) {
411 return;
412 }
413
414 try {
415 Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
416 task.call();
417 }
418 finally {
419 Policy.setPolicy(savedPolicy);
420 }
421 }
422
423 /**
424 * Without permissions, calling privilegedCallable throws ACE
425 */
426 public void testprivilegedCallableWithNoPrivs() throws Exception {
427 Callable task;
428 Policy savedPolicy = null;
429 AdjustablePolicy policy = null;
430 AccessControlContext noprivAcc = null;
431 try {
432 savedPolicy = Policy.getPolicy();
433 policy = new AdjustablePolicy();
434 Policy.setPolicy(policy);
435 noprivAcc = AccessController.getContext();
436 task = Executors.privilegedCallable(new CheckCCL());
437 Policy.setPolicy(savedPolicy);
438 } catch (AccessControlException ok) {
439 return; // program has too few permissions to set up test
440 }
441
442 // Make sure that program doesn't have too many permissions
443 try {
444 AccessController.doPrivileged(new PrivilegedAction() {
445 public Object run() {
446 checkCCL();
447 return null;
448 }}, noprivAcc);
449 // too many permssions; skip test
450 return;
451 } catch (AccessControlException ok) {
452 }
453
454 try {
455 task.call();
456 shouldThrow();
457 } catch (AccessControlException success) {}
458 }
459
460 /**
461 * With permissions, calling privilegedCallable succeeds
462 */
463 public void testprivilegedCallableWithPrivs() throws Exception {
464 Policy savedPolicy = null;
465 try {
466 savedPolicy = Policy.getPolicy();
467 AdjustablePolicy policy = new AdjustablePolicy();
468 policy.addPermission(new RuntimePermission("getContextClassLoader"));
469 policy.addPermission(new RuntimePermission("setContextClassLoader"));
470 Policy.setPolicy(policy);
471 } catch (AccessControlException ok) {
472 return;
473 }
474
475 Callable task = Executors.privilegedCallable(new CheckCCL());
476 try {
477 task.call();
478 } finally {
479 Policy.setPolicy(savedPolicy);
480 }
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 }