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