ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.26
Committed: Sat Nov 21 02:33:20 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.25: +5 -4 lines
Log Message:
import static TimeUnit.MILLISECONDS

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 static class TimedCallable<T> implements Callable<T> {
26 private final ExecutorService exec;
27 private final Callable<T> func;
28 private final long msecs;
29
30 TimedCallable(ExecutorService exec, Callable<T> func, long msecs) {
31 this.exec = exec;
32 this.func = func;
33 this.msecs = msecs;
34 }
35
36 public T call() throws Exception {
37 Future<T> ftask = exec.submit(func);
38 try {
39 return ftask.get(msecs, MILLISECONDS);
40 } finally {
41 ftask.cancel(true);
42 }
43 }
44 }
45
46
47 private static class Fib implements Callable<BigInteger> {
48 private final BigInteger n;
49 Fib(long n) {
50 if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
51 this.n = BigInteger.valueOf(n);
52 }
53 public BigInteger call() {
54 BigInteger f1 = BigInteger.ONE;
55 BigInteger f2 = f1;
56 for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
57 BigInteger t = f1.add(f2);
58 f1 = f2;
59 f2 = t;
60 }
61 return f1;
62 }
63 };
64
65 /**
66 * A newCachedThreadPool can execute runnables
67 */
68 public void testNewCachedThreadPool1() {
69 ExecutorService e = Executors.newCachedThreadPool();
70 e.execute(new NoOpRunnable());
71 e.execute(new NoOpRunnable());
72 e.execute(new NoOpRunnable());
73 joinPool(e);
74 }
75
76 /**
77 * A newCachedThreadPool with given ThreadFactory can execute runnables
78 */
79 public void testNewCachedThreadPool2() {
80 ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
81 e.execute(new NoOpRunnable());
82 e.execute(new NoOpRunnable());
83 e.execute(new NoOpRunnable());
84 joinPool(e);
85 }
86
87 /**
88 * A newCachedThreadPool with null ThreadFactory throws NPE
89 */
90 public void testNewCachedThreadPool3() {
91 try {
92 ExecutorService e = Executors.newCachedThreadPool(null);
93 shouldThrow();
94 } catch (NullPointerException success) {}
95 }
96
97
98 /**
99 * A new SingleThreadExecutor can execute runnables
100 */
101 public void testNewSingleThreadExecutor1() {
102 ExecutorService e = Executors.newSingleThreadExecutor();
103 e.execute(new NoOpRunnable());
104 e.execute(new NoOpRunnable());
105 e.execute(new NoOpRunnable());
106 joinPool(e);
107 }
108
109 /**
110 * A new SingleThreadExecutor with given ThreadFactory can execute runnables
111 */
112 public void testNewSingleThreadExecutor2() {
113 ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
114 e.execute(new NoOpRunnable());
115 e.execute(new NoOpRunnable());
116 e.execute(new NoOpRunnable());
117 joinPool(e);
118 }
119
120 /**
121 * A new SingleThreadExecutor with null ThreadFactory throws NPE
122 */
123 public void testNewSingleThreadExecutor3() {
124 try {
125 ExecutorService e = Executors.newSingleThreadExecutor(null);
126 shouldThrow();
127 } catch (NullPointerException success) {}
128 }
129
130 /**
131 * A new SingleThreadExecutor cannot be casted to concrete implementation
132 */
133 public void testCastNewSingleThreadExecutor() {
134 ExecutorService e = Executors.newSingleThreadExecutor();
135 try {
136 ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
137 shouldThrow();
138 } catch (ClassCastException success) {
139 } finally {
140 joinPool(e);
141 }
142 }
143
144
145 /**
146 * A new newFixedThreadPool can execute runnables
147 */
148 public void testNewFixedThreadPool1() {
149 ExecutorService e = Executors.newFixedThreadPool(2);
150 e.execute(new NoOpRunnable());
151 e.execute(new NoOpRunnable());
152 e.execute(new NoOpRunnable());
153 joinPool(e);
154 }
155
156 /**
157 * A new newFixedThreadPool with given ThreadFactory can execute runnables
158 */
159 public void testNewFixedThreadPool2() {
160 ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
161 e.execute(new NoOpRunnable());
162 e.execute(new NoOpRunnable());
163 e.execute(new NoOpRunnable());
164 joinPool(e);
165 }
166
167 /**
168 * A new newFixedThreadPool with null ThreadFactory throws NPE
169 */
170 public void testNewFixedThreadPool3() {
171 try {
172 ExecutorService e = Executors.newFixedThreadPool(2, null);
173 shouldThrow();
174 } catch (NullPointerException success) {}
175 }
176
177 /**
178 * A new newFixedThreadPool with 0 threads throws IAE
179 */
180 public void testNewFixedThreadPool4() {
181 try {
182 ExecutorService e = Executors.newFixedThreadPool(0);
183 shouldThrow();
184 } catch (IllegalArgumentException success) {}
185 }
186
187
188 /**
189 * An unconfigurable newFixedThreadPool can execute runnables
190 */
191 public void testunconfigurableExecutorService() {
192 ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
193 e.execute(new NoOpRunnable());
194 e.execute(new NoOpRunnable());
195 e.execute(new NoOpRunnable());
196 joinPool(e);
197 }
198
199 /**
200 * unconfigurableExecutorService(null) throws NPE
201 */
202 public void testunconfigurableExecutorServiceNPE() {
203 try {
204 ExecutorService e = Executors.unconfigurableExecutorService(null);
205 shouldThrow();
206 } catch (NullPointerException success) {}
207 }
208
209 /**
210 * unconfigurableScheduledExecutorService(null) throws NPE
211 */
212 public void testunconfigurableScheduledExecutorServiceNPE() {
213 try {
214 ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
215 shouldThrow();
216 } catch (NullPointerException success) {}
217 }
218
219
220 /**
221 * a newSingleThreadScheduledExecutor successfully runs delayed task
222 */
223 public void testNewSingleThreadScheduledExecutor() throws Exception {
224 TrackedCallable callable = new TrackedCallable();
225 ScheduledExecutorService p1 = Executors.newSingleThreadScheduledExecutor();
226 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
227 assertFalse(callable.done);
228 Thread.sleep(MEDIUM_DELAY_MS);
229 assertTrue(callable.done);
230 assertEquals(Boolean.TRUE, f.get());
231 joinPool(p1);
232 }
233
234 /**
235 * a newScheduledThreadPool successfully runs delayed task
236 */
237 public void testnewScheduledThreadPool() throws Exception {
238 TrackedCallable callable = new TrackedCallable();
239 ScheduledExecutorService p1 = Executors.newScheduledThreadPool(2);
240 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
241 assertFalse(callable.done);
242 Thread.sleep(MEDIUM_DELAY_MS);
243 assertTrue(callable.done);
244 assertEquals(Boolean.TRUE, f.get());
245 joinPool(p1);
246 }
247
248 /**
249 * an unconfigurable newScheduledThreadPool successfully runs delayed task
250 */
251 public void testunconfigurableScheduledExecutorService() throws Exception {
252 TrackedCallable callable = new TrackedCallable();
253 ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
254 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
255 assertFalse(callable.done);
256 Thread.sleep(MEDIUM_DELAY_MS);
257 assertTrue(callable.done);
258 assertEquals(Boolean.TRUE, f.get());
259 joinPool(p1);
260 }
261
262 /**
263 * timeouts from execute will time out if they compute too long.
264 */
265 public void testTimedCallable() throws Exception {
266 int N = 10000;
267 ExecutorService executor = Executors.newSingleThreadExecutor();
268 List<Callable<BigInteger>> tasks = new ArrayList<Callable<BigInteger>>(N);
269 try {
270 long startTime = System.currentTimeMillis();
271
272 long i = 0;
273 while (tasks.size() < N) {
274 tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
275 i += 10;
276 }
277
278 int iters = 0;
279 BigInteger sum = BigInteger.ZERO;
280 for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
281 try {
282 ++iters;
283 sum = sum.add(it.next().call());
284 }
285 catch (TimeoutException success) {
286 assertTrue(iters > 0);
287 return;
288 }
289 }
290 // if by chance we didn't ever time out, total time must be small
291 long elapsed = System.currentTimeMillis() - startTime;
292 assertTrue(elapsed < N);
293 }
294 finally {
295 joinPool(executor);
296 }
297 }
298
299
300 /**
301 * ThreadPoolExecutor using defaultThreadFactory has
302 * specified group, priority, daemon status, and name
303 */
304 public void testDefaultThreadFactory() throws Exception {
305 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
306 Runnable r = new Runnable() {
307 public void run() {
308 try {
309 Thread current = Thread.currentThread();
310 threadAssertTrue(!current.isDaemon());
311 threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
312 ThreadGroup g = current.getThreadGroup();
313 SecurityManager s = System.getSecurityManager();
314 if (s != null)
315 threadAssertTrue(g == s.getThreadGroup());
316 else
317 threadAssertTrue(g == egroup);
318 String name = current.getName();
319 threadAssertTrue(name.endsWith("thread-1"));
320 } catch (SecurityException ok) {
321 // Also pass if not allowed to change setting
322 }
323 }
324 };
325 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
326
327 e.execute(r);
328 try {
329 e.shutdown();
330 } catch (SecurityException ok) {
331 }
332
333 try {
334 Thread.sleep(SHORT_DELAY_MS);
335 } finally {
336 joinPool(e);
337 }
338 }
339
340 /**
341 * ThreadPoolExecutor using privilegedThreadFactory has
342 * specified group, priority, daemon status, name,
343 * access control context and context class loader
344 */
345 public void testPrivilegedThreadFactory() throws Exception {
346 Policy savedPolicy = null;
347 try {
348 savedPolicy = Policy.getPolicy();
349 AdjustablePolicy policy = new AdjustablePolicy();
350 policy.addPermission(new RuntimePermission("getContextClassLoader"));
351 policy.addPermission(new RuntimePermission("setContextClassLoader"));
352 Policy.setPolicy(policy);
353 } catch (AccessControlException ok) {
354 return;
355 }
356 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
357 final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
358 final AccessControlContext thisacc = AccessController.getContext();
359 Runnable r = new Runnable() {
360 public void run() {
361 try {
362 Thread current = Thread.currentThread();
363 threadAssertTrue(!current.isDaemon());
364 threadAssertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
365 ThreadGroup g = current.getThreadGroup();
366 SecurityManager s = System.getSecurityManager();
367 if (s != null)
368 threadAssertTrue(g == s.getThreadGroup());
369 else
370 threadAssertTrue(g == egroup);
371 String name = current.getName();
372 threadAssertTrue(name.endsWith("thread-1"));
373 threadAssertTrue(thisccl == current.getContextClassLoader());
374 threadAssertTrue(thisacc.equals(AccessController.getContext()));
375 } catch (SecurityException ok) {
376 // Also pass if not allowed to change settings
377 }
378 }
379 };
380 ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
381
382 Policy.setPolicy(savedPolicy);
383 e.execute(r);
384 try {
385 e.shutdown();
386 } catch (SecurityException ok) {
387 }
388 try {
389 Thread.sleep(SHORT_DELAY_MS);
390 } finally {
391 joinPool(e);
392 }
393
394 }
395
396 void checkCCL() {
397 SecurityManager sm = System.getSecurityManager();
398 if (sm != null) {
399 sm.checkPermission(new RuntimePermission("setContextClassLoader"));
400 sm.checkPermission(new RuntimePermission("getClassLoader"));
401 }
402 }
403
404 class CheckCCL implements Callable<Object> {
405 public Object call() {
406 checkCCL();
407 return null;
408 }
409 }
410
411
412 /**
413 * Without class loader permissions, creating
414 * privilegedCallableUsingCurrentClassLoader throws ACE
415 */
416 public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
417 Policy savedPolicy = null;
418 try {
419 savedPolicy = Policy.getPolicy();
420 AdjustablePolicy policy = new AdjustablePolicy();
421 Policy.setPolicy(policy);
422 } catch (AccessControlException ok) {
423 return;
424 }
425
426 // Check if program still has too many permissions to run test
427 try {
428 checkCCL();
429 // too many privileges to test; so return
430 Policy.setPolicy(savedPolicy);
431 return;
432 } catch (AccessControlException ok) {
433 }
434
435 try {
436 Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
437 shouldThrow();
438 } catch (AccessControlException success) {
439 } finally {
440 Policy.setPolicy(savedPolicy);
441 }
442 }
443
444 /**
445 * With class loader permissions, calling
446 * privilegedCallableUsingCurrentClassLoader does not throw ACE
447 */
448 public void testprivilegedCallableUsingCCLWithPrivs() throws Exception {
449 Policy savedPolicy = null;
450 try {
451 savedPolicy = Policy.getPolicy();
452 AdjustablePolicy policy = new AdjustablePolicy();
453 policy.addPermission(new RuntimePermission("getContextClassLoader"));
454 policy.addPermission(new RuntimePermission("setContextClassLoader"));
455 Policy.setPolicy(policy);
456 } catch (AccessControlException ok) {
457 return;
458 }
459
460 try {
461 Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
462 task.call();
463 }
464 finally {
465 Policy.setPolicy(savedPolicy);
466 }
467 }
468
469 /**
470 * Without permissions, calling privilegedCallable throws ACE
471 */
472 public void testprivilegedCallableWithNoPrivs() throws Exception {
473 Callable task;
474 Policy savedPolicy = null;
475 AdjustablePolicy policy = null;
476 AccessControlContext noprivAcc = null;
477 try {
478 savedPolicy = Policy.getPolicy();
479 policy = new AdjustablePolicy();
480 Policy.setPolicy(policy);
481 noprivAcc = AccessController.getContext();
482 task = Executors.privilegedCallable(new CheckCCL());
483 Policy.setPolicy(savedPolicy);
484 } catch (AccessControlException ok) {
485 return; // program has too few permissions to set up test
486 }
487
488 // Make sure that program doesn't have too many permissions
489 try {
490 AccessController.doPrivileged(new PrivilegedAction() {
491 public Object run() {
492 checkCCL();
493 return null;
494 }}, noprivAcc);
495 // too many permssions; skip test
496 return;
497 } catch (AccessControlException ok) {
498 }
499
500 try {
501 task.call();
502 shouldThrow();
503 } catch (AccessControlException success) {}
504 }
505
506 /**
507 * With permissions, calling privilegedCallable succeeds
508 */
509 public void testprivilegedCallableWithPrivs() throws Exception {
510 Policy savedPolicy = null;
511 try {
512 savedPolicy = Policy.getPolicy();
513 AdjustablePolicy policy = new AdjustablePolicy();
514 policy.addPermission(new RuntimePermission("getContextClassLoader"));
515 policy.addPermission(new RuntimePermission("setContextClassLoader"));
516 Policy.setPolicy(policy);
517 } catch (AccessControlException ok) {
518 return;
519 }
520
521 Callable task = Executors.privilegedCallable(new CheckCCL());
522 try {
523 task.call();
524 } finally {
525 Policy.setPolicy(savedPolicy);
526 }
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 assertEquals(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 assertEquals(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 assertEquals(one, c.call());
561 }
562
563
564 /**
565 * callable(null Runnable) throws NPE
566 */
567 public void testCallableNPE1() {
568 try {
569 Callable c = Executors.callable((Runnable) null);
570 shouldThrow();
571 } catch (NullPointerException success) {}
572 }
573
574 /**
575 * callable(null, result) throws NPE
576 */
577 public void testCallableNPE2() {
578 try {
579 Callable c = Executors.callable((Runnable) null, one);
580 shouldThrow();
581 } catch (NullPointerException success) {}
582 }
583
584 /**
585 * callable(null PrivilegedAction) throws NPE
586 */
587 public void testCallableNPE3() {
588 try {
589 Callable c = Executors.callable((PrivilegedAction) null);
590 shouldThrow();
591 } catch (NullPointerException success) {}
592 }
593
594 /**
595 * callable(null PrivilegedExceptionAction) throws NPE
596 */
597 public void testCallableNPE4() {
598 try {
599 Callable c = Executors.callable((PrivilegedExceptionAction) null);
600 shouldThrow();
601 } catch (NullPointerException success) {}
602 }
603
604
605 }