ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.11
Committed: Mon Dec 22 00:48:55 2003 UTC (20 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.10: +296 -0 lines
Log Message:
Add and adjust tests reflecting API changes

File Contents

# Content
1 /*
2 * Written by members of JCP JSR-166 Expert Group and released to the
3 * public domain. Use, modify, and redistribute this code in any way
4 * without acknowledgement. Other contributors include Andrew Wright,
5 * Jeffrey Hayes, Pat Fischer, Mike Judd.
6 */
7
8
9 import junit.framework.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12 import java.math.BigInteger;
13 import java.security.*;
14
15 public class ExecutorsTest extends JSR166TestCase{
16 public static void main(String[] args) {
17 junit.textui.TestRunner.run (suite());
18 }
19 public static Test suite() {
20 return new TestSuite(ExecutorsTest.class);
21 }
22
23 static class TimedCallable<T> implements Callable<T> {
24 private final ExecutorService exec;
25 private final Callable<T> func;
26 private final long msecs;
27
28 TimedCallable(ExecutorService exec, Callable<T> func, long msecs) {
29 this.exec = exec;
30 this.func = func;
31 this.msecs = msecs;
32 }
33
34 public T call() throws Exception {
35 Future<T> ftask = exec.submit(func);
36 try {
37 return ftask.get(msecs, TimeUnit.MILLISECONDS);
38 } finally {
39 ftask.cancel(true);
40 }
41 }
42 }
43
44
45 private static class Fib implements Callable<BigInteger> {
46 private final BigInteger n;
47 Fib(long n) {
48 if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
49 this.n = BigInteger.valueOf(n);
50 }
51 public BigInteger call() {
52 BigInteger f1 = BigInteger.ONE;
53 BigInteger f2 = f1;
54 for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
55 BigInteger t = f1.add(f2);
56 f1 = f2;
57 f2 = t;
58 }
59 return f1;
60 }
61 };
62
63 /**
64 * A newCachedThreadPool can execute runnables
65 */
66 public void testNewCachedThreadPool1() {
67 ExecutorService e = Executors.newCachedThreadPool();
68 e.execute(new NoOpRunnable());
69 e.execute(new NoOpRunnable());
70 e.execute(new NoOpRunnable());
71 e.shutdown();
72 }
73
74 /**
75 * A newCachedThreadPool with given ThreadFactory can execute runnables
76 */
77 public void testNewCachedThreadPool2() {
78 ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
79 e.execute(new NoOpRunnable());
80 e.execute(new NoOpRunnable());
81 e.execute(new NoOpRunnable());
82 e.shutdown();
83 }
84
85 /**
86 * A newCachedThreadPool with null ThreadFactory throws NPE
87 */
88 public void testNewCachedThreadPool3() {
89 try {
90 ExecutorService e = Executors.newCachedThreadPool(null);
91 shouldThrow();
92 }
93 catch(NullPointerException success) {
94 }
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 e.shutdown();
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 e.shutdown();
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 }
128 catch(NullPointerException success) {
129 }
130 }
131
132 /**
133 * A new SingleThreadExecutor cannot be casted to concrete implementation
134 */
135 public void testCastNewSingleThreadExecutor() {
136 ExecutorService e = Executors.newSingleThreadExecutor();
137 try {
138 ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
139 } catch (ClassCastException success) {
140 } finally {
141 joinPool(e);
142 }
143 }
144
145
146 /**
147 * A new newFixedThreadPool can execute runnables
148 */
149 public void testNewFixedThreadPool1() {
150 ExecutorService e = Executors.newFixedThreadPool(2);
151 e.execute(new NoOpRunnable());
152 e.execute(new NoOpRunnable());
153 e.execute(new NoOpRunnable());
154 e.shutdown();
155 }
156
157 /**
158 * A new newFixedThreadPool with given ThreadFactory can execute runnables
159 */
160 public void testNewFixedThreadPool2() {
161 ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
162 e.execute(new NoOpRunnable());
163 e.execute(new NoOpRunnable());
164 e.execute(new NoOpRunnable());
165 e.shutdown();
166 }
167
168 /**
169 * A new newFixedThreadPool with null ThreadFactory throws NPE
170 */
171 public void testNewFixedThreadPool3() {
172 try {
173 ExecutorService e = Executors.newFixedThreadPool(2, null);
174 shouldThrow();
175 }
176 catch(NullPointerException success) {
177 }
178 }
179
180 /**
181 * A new newFixedThreadPool with 0 threads throws IAE
182 */
183 public void testNewFixedThreadPool4() {
184 try {
185 ExecutorService e = Executors.newFixedThreadPool(0);
186 shouldThrow();
187 }
188 catch(IllegalArgumentException success) {
189 }
190 }
191
192
193 /**
194 * An unconfigurable newFixedThreadPool can execute runnables
195 */
196 public void testunconfigurableExecutorService() {
197 ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
198 e.execute(new NoOpRunnable());
199 e.execute(new NoOpRunnable());
200 e.execute(new NoOpRunnable());
201 e.shutdown();
202 }
203
204 /**
205 * unconfigurableExecutorService(null) throws NPE
206 */
207 public void testunconfigurableExecutorServiceNPE() {
208 try {
209 ExecutorService e = Executors.unconfigurableExecutorService(null);
210 }
211 catch (NullPointerException success) {
212 }
213 }
214
215 /**
216 * unconfigurableScheduledExecutorService(null) throws NPE
217 */
218 public void testunconfigurableScheduledExecutorServiceNPE() {
219 try {
220 ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
221 }
222 catch (NullPointerException success) {
223 }
224 }
225
226
227 /**
228 * a newSingleThreadScheduledExecutor successfully runs delayed task
229 */
230 public void testNewSingleThreadScheduledExecutor() {
231 try {
232 TrackedCallable callable = new TrackedCallable();
233 ScheduledExecutorService p1 = Executors.newSingleThreadScheduledExecutor();
234 Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
235 assertFalse(callable.done);
236 Thread.sleep(MEDIUM_DELAY_MS);
237 assertTrue(callable.done);
238 assertEquals(Boolean.TRUE, f.get());
239 p1.shutdown();
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 p1.shutdown();
261 joinPool(p1);
262 } catch(RejectedExecutionException e){}
263 catch(Exception e){
264 e.printStackTrace();
265 unexpectedException();
266 }
267 }
268
269 /**
270 * an unconfigurable newScheduledThreadPool successfully runs delayed task
271 */
272 public void testunconfigurableScheduledExecutorService() {
273 try {
274 TrackedCallable callable = new TrackedCallable();
275 ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
276 Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
277 assertFalse(callable.done);
278 Thread.sleep(MEDIUM_DELAY_MS);
279 assertTrue(callable.done);
280 assertEquals(Boolean.TRUE, f.get());
281 p1.shutdown();
282 joinPool(p1);
283 } catch(RejectedExecutionException e){}
284 catch(Exception e){
285 e.printStackTrace();
286 unexpectedException();
287 }
288 }
289
290 /**
291 * timeouts from execute will time out if they compute too long.
292 */
293 public void testTimedCallable() {
294 int N = 10000;
295 ExecutorService executor = Executors.newSingleThreadExecutor();
296 List<Callable<BigInteger>> tasks = new ArrayList<Callable<BigInteger>>(N);
297 try {
298 long startTime = System.currentTimeMillis();
299
300 long i = 0;
301 while (tasks.size() < N) {
302 tasks.add(new TimedCallable<BigInteger>(executor, new Fib(i), 1));
303 i += 10;
304 }
305
306 int iters = 0;
307 BigInteger sum = BigInteger.ZERO;
308 for (Iterator<Callable<BigInteger>> it = tasks.iterator(); it.hasNext();) {
309 try {
310 ++iters;
311 sum = sum.add(it.next().call());
312 }
313 catch (TimeoutException success) {
314 assertTrue(iters > 0);
315 return;
316 }
317 catch (Exception e) {
318 unexpectedException();
319 }
320 }
321 // if by chance we didn't ever time out, total time must be small
322 long elapsed = System.currentTimeMillis() - startTime;
323 assertTrue(elapsed < N);
324 }
325 finally {
326 joinPool(executor);
327 }
328 }
329
330
331 /**
332 * ThreadPoolExecutor using defaultThreadFactory has
333 * specified group, priority, daemon status, and name
334 */
335 public void testDefaultThreadFactory() {
336 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
337 Runnable r = new Runnable() {
338 public void run() {
339 Thread current = Thread.currentThread();
340 threadAssertTrue(!current.isDaemon());
341 threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
342 ThreadGroup g = current.getThreadGroup();
343 SecurityManager s = System.getSecurityManager();
344 if (s != null)
345 threadAssertTrue(g == s.getThreadGroup());
346 else
347 threadAssertTrue(g == egroup);
348 String name = current.getName();
349 threadAssertTrue(name.endsWith("thread-1"));
350 }
351 };
352 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
353
354 e.execute(r);
355 e.shutdown();
356 try {
357 Thread.sleep(SHORT_DELAY_MS);
358 } catch (Exception eX) {
359 unexpectedException();
360 } finally {
361 joinPool(e);
362 }
363 }
364
365 /**
366 * ThreadPoolExecutor using privilegedThreadFactory has
367 * specified group, priority, daemon status, name,
368 * access control context and context class loader
369 */
370 public void testPrivilegedThreadFactory() {
371 Policy savedPolicy = Policy.getPolicy();
372 AdjustablePolicy policy = new AdjustablePolicy();
373 policy.addPermission(new RuntimePermission("getContextClassLoader"));
374 policy.addPermission(new RuntimePermission("setContextClassLoader"));
375 Policy.setPolicy(policy);
376 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
377 final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
378 final AccessControlContext thisacc = AccessController.getContext();
379 Runnable r = new Runnable() {
380 public void run() {
381 Thread current = Thread.currentThread();
382 threadAssertTrue(!current.isDaemon());
383 threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
384 ThreadGroup g = current.getThreadGroup();
385 SecurityManager s = System.getSecurityManager();
386 if (s != null)
387 threadAssertTrue(g == s.getThreadGroup());
388 else
389 threadAssertTrue(g == egroup);
390 String name = current.getName();
391 threadAssertTrue(name.endsWith("thread-1"));
392 threadAssertTrue(thisccl == current.getContextClassLoader());
393 threadAssertTrue(thisacc.equals(AccessController.getContext()));
394 }
395 };
396 ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
397
398 Policy.setPolicy(savedPolicy);
399 e.execute(r);
400 e.shutdown();
401 try {
402 Thread.sleep(SHORT_DELAY_MS);
403 } catch (Exception ex) {
404 unexpectedException();
405 } finally {
406 joinPool(e);
407 }
408
409 }
410
411 static class CheckCCL implements Callable<Object> {
412 public Object call() {
413 AccessControlContext acc = AccessController.getContext();
414 acc.checkPermission(new RuntimePermission("getContextClassLoader"));
415 return null;
416 }
417 }
418
419
420 /**
421 * Without class loader permissions, creating
422 * privilegedCallableUsingCurrentClassLoader throws ACE
423 */
424 public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
425 Policy savedPolicy = Policy.getPolicy();
426 AdjustablePolicy policy = new AdjustablePolicy();
427 Policy.setPolicy(policy);
428 try {
429 Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
430 shouldThrow();
431 } catch(AccessControlException success) {
432 } catch(Exception ex) {
433 unexpectedException();
434 }
435 finally {
436 Policy.setPolicy(savedPolicy);
437 }
438 }
439
440 /**
441 * Without class loader permissions, calling
442 * privilegedCallableUsingCurrentClassLoader throws ACE
443 */
444 public void testprivilegedCallableUsingCCLWithPrivs() {
445 Policy savedPolicy = Policy.getPolicy();
446 AdjustablePolicy policy = new AdjustablePolicy();
447 policy.addPermission(new RuntimePermission("getContextClassLoader"));
448 policy.addPermission(new RuntimePermission("setContextClassLoader"));
449 Policy.setPolicy(policy);
450 try {
451 Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
452 task.call();
453 } catch(Exception ex) {
454 unexpectedException();
455 }
456 finally {
457 Policy.setPolicy(savedPolicy);
458 }
459 }
460
461 /**
462 * Without permissions, calling privilegedCallable throws ACE
463 */
464 public void testprivilegedCallableWithNoPrivs() {
465 Policy savedPolicy = Policy.getPolicy();
466 AdjustablePolicy policy = new AdjustablePolicy();
467 Policy.setPolicy(policy);
468 Callable task = Executors.privilegedCallable(new CheckCCL());
469 Policy.setPolicy(savedPolicy);
470 try {
471 task.call();
472 shouldThrow();
473 } catch(AccessControlException success) {
474 } catch(Exception ex) {
475 unexpectedException();
476 } finally {
477 }
478 }
479
480 /**
481 * With permissions, calling privilegedCallable succeeds
482 */
483 public void testprivilegedCallableWithPrivs() {
484 Policy savedPolicy = Policy.getPolicy();
485 AdjustablePolicy policy = new AdjustablePolicy();
486 policy.addPermission(new RuntimePermission("getContextClassLoader"));
487 policy.addPermission(new RuntimePermission("setContextClassLoader"));
488 Policy.setPolicy(policy);
489 Callable task = Executors.privilegedCallable(new CheckCCL());
490 try {
491 task.call();
492 } catch(Exception ex) {
493 unexpectedException();
494 } finally {
495 Policy.setPolicy(savedPolicy);
496 }
497 }
498
499 /**
500 * callable(Runnable) returns null when called
501 */
502 public void testCallable1() {
503 try {
504 Callable c = Executors.callable(new NoOpRunnable());
505 assertNull(c.call());
506 } catch(Exception ex) {
507 unexpectedException();
508 }
509
510 }
511
512 /**
513 * callable(Runnable, result) returns result when called
514 */
515 public void testCallable2() {
516 try {
517 Callable c = Executors.callable(new NoOpRunnable(), one);
518 assertEquals(one, c.call());
519 } catch(Exception ex) {
520 unexpectedException();
521 }
522 }
523
524 /**
525 * callable(PrivilegedAction) returns its result when called
526 */
527 public void testCallable3() {
528 try {
529 Callable c = Executors.callable(new PrivilegedAction() {
530 public Object run() { return one; }});
531 assertEquals(one, c.call());
532 } catch(Exception ex) {
533 unexpectedException();
534 }
535 }
536
537 /**
538 * callable(PrivilegedExceptionAction) returns its result when called
539 */
540 public void testCallable4() {
541 try {
542 Callable c = Executors.callable(new PrivilegedExceptionAction() {
543 public Object run() { return one; }});
544 assertEquals(one, c.call());
545 } catch(Exception ex) {
546 unexpectedException();
547 }
548 }
549
550
551 /**
552 * callable(null Runnable) throws NPE
553 */
554 public void testCallableNPE1() {
555 try {
556 Runnable r = null;
557 Callable c = Executors.callable(r);
558 } catch (NullPointerException success) {
559 }
560 }
561
562 /**
563 * callable(null, result) throws NPE
564 */
565 public void testCallableNPE2() {
566 try {
567 Runnable r = null;
568 Callable c = Executors.callable(r, one);
569 } catch (NullPointerException success) {
570 }
571 }
572
573 /**
574 * callable(null PrivilegedAction) throws NPE
575 */
576 public void testCallableNPE3() {
577 try {
578 PrivilegedAction r = null;
579 Callable c = Executors.callable(r);
580 } catch (NullPointerException success) {
581 }
582 }
583
584 /**
585 * callable(null PrivilegedExceptionAction) throws NPE
586 */
587 public void testCallableNPE4() {
588 try {
589 PrivilegedExceptionAction r = null;
590 Callable c = Executors.callable(r);
591 } catch (NullPointerException success) {
592 }
593 }
594
595
596 }