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

# User Rev Content
1 dl 1.1 /*
2 dl 1.12 * 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 jsr166 1.20 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9    
10     import junit.framework.*;
11     import java.util.*;
12     import java.util.concurrent.*;
13 jsr166 1.26 import static java.util.concurrent.TimeUnit.MILLISECONDS;
14 dl 1.2 import java.math.BigInteger;
15 dl 1.8 import java.security.*;
16 dl 1.1
17 jsr166 1.22 public class ExecutorsTest extends JSR166TestCase {
18 dl 1.1 public static void main(String[] args) {
19 jsr166 1.20 junit.textui.TestRunner.run (suite());
20 dl 1.1 }
21     public static Test suite() {
22 tim 1.9 return new TestSuite(ExecutorsTest.class);
23 dl 1.1 }
24    
25 dl 1.5 /**
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 dl 1.14 joinPool(e);
34 dl 1.5 }
35    
36     /**
37     * A newCachedThreadPool with given ThreadFactory can execute runnables
38     */
39     public void testNewCachedThreadPool2() {
40 dl 1.6 ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
41 dl 1.5 e.execute(new NoOpRunnable());
42     e.execute(new NoOpRunnable());
43     e.execute(new NoOpRunnable());
44 dl 1.14 joinPool(e);
45 dl 1.5 }
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 jsr166 1.23 } catch (NullPointerException success) {}
55 dl 1.5 }
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 dl 1.14 joinPool(e);
67 dl 1.5 }
68    
69     /**
70     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
71     */
72     public void testNewSingleThreadExecutor2() {
73 dl 1.6 ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
74 dl 1.5 e.execute(new NoOpRunnable());
75     e.execute(new NoOpRunnable());
76     e.execute(new NoOpRunnable());
77 dl 1.14 joinPool(e);
78 dl 1.5 }
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 jsr166 1.23 } catch (NullPointerException success) {}
88 dl 1.5 }
89    
90     /**
91 dl 1.11 * 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 jsr166 1.23 shouldThrow();
98 dl 1.11 } catch (ClassCastException success) {
99     } finally {
100     joinPool(e);
101     }
102     }
103    
104    
105     /**
106 dl 1.5 * 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 dl 1.14 joinPool(e);
114 dl 1.5 }
115    
116     /**
117     * A new newFixedThreadPool with given ThreadFactory can execute runnables
118     */
119     public void testNewFixedThreadPool2() {
120 dl 1.6 ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
121 dl 1.5 e.execute(new NoOpRunnable());
122     e.execute(new NoOpRunnable());
123     e.execute(new NoOpRunnable());
124 dl 1.14 joinPool(e);
125 dl 1.5 }
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 jsr166 1.23 } catch (NullPointerException success) {}
135 dl 1.5 }
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 jsr166 1.23 } catch (IllegalArgumentException success) {}
145 dl 1.5 }
146 dl 1.1
147 dl 1.2
148     /**
149 dl 1.11 * 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 dl 1.14 joinPool(e);
157 dl 1.11 }
158    
159     /**
160     * unconfigurableExecutorService(null) throws NPE
161     */
162     public void testunconfigurableExecutorServiceNPE() {
163     try {
164     ExecutorService e = Executors.unconfigurableExecutorService(null);
165 jsr166 1.23 shouldThrow();
166     } catch (NullPointerException success) {}
167 dl 1.11 }
168    
169     /**
170     * unconfigurableScheduledExecutorService(null) throws NPE
171     */
172     public void testunconfigurableScheduledExecutorServiceNPE() {
173     try {
174     ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
175 jsr166 1.23 shouldThrow();
176     } catch (NullPointerException success) {}
177 dl 1.11 }
178    
179    
180     /**
181     * a newSingleThreadScheduledExecutor successfully runs delayed task
182     */
183 jsr166 1.23 public void testNewSingleThreadScheduledExecutor() throws Exception {
184 jsr166 1.24 TrackedCallable callable = new TrackedCallable();
185     ScheduledExecutorService p1 = Executors.newSingleThreadScheduledExecutor();
186 jsr166 1.26 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
187 jsr166 1.24 assertFalse(callable.done);
188     Thread.sleep(MEDIUM_DELAY_MS);
189     assertTrue(callable.done);
190     assertEquals(Boolean.TRUE, f.get());
191     joinPool(p1);
192 dl 1.11 }
193    
194     /**
195     * a newScheduledThreadPool successfully runs delayed task
196     */
197 jsr166 1.23 public void testnewScheduledThreadPool() throws Exception {
198 jsr166 1.24 TrackedCallable callable = new TrackedCallable();
199     ScheduledExecutorService p1 = Executors.newScheduledThreadPool(2);
200 jsr166 1.26 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
201 jsr166 1.24 assertFalse(callable.done);
202     Thread.sleep(MEDIUM_DELAY_MS);
203     assertTrue(callable.done);
204     assertEquals(Boolean.TRUE, f.get());
205     joinPool(p1);
206 dl 1.11 }
207    
208     /**
209 jsr166 1.24 * an unconfigurable newScheduledThreadPool successfully runs delayed task
210 dl 1.11 */
211 jsr166 1.23 public void testunconfigurableScheduledExecutorService() throws Exception {
212 jsr166 1.24 TrackedCallable callable = new TrackedCallable();
213     ScheduledExecutorService p1 = Executors.unconfigurableScheduledExecutorService(Executors.newScheduledThreadPool(2));
214 jsr166 1.26 Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
215 jsr166 1.24 assertFalse(callable.done);
216     Thread.sleep(MEDIUM_DELAY_MS);
217     assertTrue(callable.done);
218     assertEquals(Boolean.TRUE, f.get());
219     joinPool(p1);
220 dl 1.11 }
221    
222     /**
223 jsr166 1.28 * Future.get on submitted tasks will time out if they compute too long.
224 dl 1.2 */
225 jsr166 1.23 public void testTimedCallable() throws Exception {
226 jsr166 1.28 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 dl 1.2 try {
241 jsr166 1.28 future.get(SHORT_DELAY_MS, MILLISECONDS);
242     shouldThrow();
243     } catch (TimeoutException success) {
244     } finally {
245     future.cancel(true);
246 dl 1.2 }
247     }
248 jsr166 1.28 finally {
249     joinPool(executor);
250     }
251 dl 1.2 }
252     }
253    
254 jsr166 1.20
255 dl 1.8 /**
256     * ThreadPoolExecutor using defaultThreadFactory has
257     * specified group, priority, daemon status, and name
258     */
259 jsr166 1.23 public void testDefaultThreadFactory() throws Exception {
260 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
261     Runnable r = new Runnable() {
262     public void run() {
263 jsr166 1.25 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 tim 1.9 }
279     };
280     ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
281 jsr166 1.20
282 tim 1.9 e.execute(r);
283 dl 1.14 try {
284     e.shutdown();
285 jsr166 1.21 } catch (SecurityException ok) {
286 dl 1.14 }
287 jsr166 1.20
288 tim 1.9 try {
289     Thread.sleep(SHORT_DELAY_MS);
290     } finally {
291     joinPool(e);
292     }
293 dl 1.8 }
294    
295     /**
296     * ThreadPoolExecutor using privilegedThreadFactory has
297     * specified group, priority, daemon status, name,
298     * access control context and context class loader
299     */
300 jsr166 1.23 public void testPrivilegedThreadFactory() throws Exception {
301 dl 1.14 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 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
312     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
313 dl 1.8 final AccessControlContext thisacc = AccessController.getContext();
314 tim 1.9 Runnable r = new Runnable() {
315     public void run() {
316 jsr166 1.25 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 dl 1.14 }
334 tim 1.9 };
335     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
336 jsr166 1.20
337 tim 1.9 Policy.setPolicy(savedPolicy);
338     e.execute(r);
339 dl 1.14 try {
340     e.shutdown();
341 jsr166 1.21 } catch (SecurityException ok) {
342 dl 1.14 }
343 tim 1.9 try {
344     Thread.sleep(SHORT_DELAY_MS);
345     } finally {
346     joinPool(e);
347     }
348 dl 1.8 }
349 dl 1.11
350 dl 1.16 void checkCCL() {
351 dl 1.18 SecurityManager sm = System.getSecurityManager();
352     if (sm != null) {
353     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
354 jsr166 1.19 sm.checkPermission(new RuntimePermission("getClassLoader"));
355 dl 1.18 }
356 dl 1.16 }
357    
358     class CheckCCL implements Callable<Object> {
359 dl 1.11 public Object call() {
360 dl 1.16 checkCCL();
361 dl 1.11 return null;
362     }
363     }
364    
365    
366     /**
367     * Without class loader permissions, creating
368     * privilegedCallableUsingCurrentClassLoader throws ACE
369     */
370     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
371 jsr166 1.25 Policy savedPolicy = null;
372 dl 1.14 try {
373     savedPolicy = Policy.getPolicy();
374     AdjustablePolicy policy = new AdjustablePolicy();
375     Policy.setPolicy(policy);
376     } catch (AccessControlException ok) {
377     return;
378     }
379    
380 dl 1.16 // 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 jsr166 1.21 } catch (AccessControlException ok) {
387 jsr166 1.20 }
388 dl 1.16
389 dl 1.11 try {
390     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
391     shouldThrow();
392 jsr166 1.21 } catch (AccessControlException success) {
393 jsr166 1.23 } finally {
394 dl 1.11 Policy.setPolicy(savedPolicy);
395     }
396     }
397    
398     /**
399 dl 1.16 * With class loader permissions, calling
400     * privilegedCallableUsingCurrentClassLoader does not throw ACE
401 dl 1.11 */
402 jsr166 1.23 public void testprivilegedCallableUsingCCLWithPrivs() throws Exception {
403 jsr166 1.25 Policy savedPolicy = null;
404 dl 1.14 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 jsr166 1.20
414 dl 1.11 try {
415     Callable task = Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
416     task.call();
417 jsr166 1.20 }
418 dl 1.11 finally {
419     Policy.setPolicy(savedPolicy);
420     }
421     }
422    
423     /**
424     * Without permissions, calling privilegedCallable throws ACE
425     */
426 jsr166 1.23 public void testprivilegedCallableWithNoPrivs() throws Exception {
427 dl 1.16 Callable task;
428     Policy savedPolicy = null;
429     AdjustablePolicy policy = null;
430     AccessControlContext noprivAcc = null;
431 dl 1.14 try {
432 dl 1.16 savedPolicy = Policy.getPolicy();
433     policy = new AdjustablePolicy();
434 dl 1.14 Policy.setPolicy(policy);
435 dl 1.16 noprivAcc = AccessController.getContext();
436     task = Executors.privilegedCallable(new CheckCCL());
437 dl 1.15 Policy.setPolicy(savedPolicy);
438 dl 1.14 } catch (AccessControlException ok) {
439 dl 1.16 return; // program has too few permissions to set up test
440     }
441    
442 jsr166 1.20 // Make sure that program doesn't have too many permissions
443 dl 1.16 try {
444     AccessController.doPrivileged(new PrivilegedAction() {
445     public Object run() {
446     checkCCL();
447     return null;
448     }}, noprivAcc);
449     // too many permssions; skip test
450 dl 1.14 return;
451 jsr166 1.21 } catch (AccessControlException ok) {
452 dl 1.14 }
453    
454 dl 1.11 try {
455 dl 1.16 task.call();
456     shouldThrow();
457 jsr166 1.23 } catch (AccessControlException success) {}
458 dl 1.11 }
459    
460     /**
461     * With permissions, calling privilegedCallable succeeds
462     */
463 jsr166 1.23 public void testprivilegedCallableWithPrivs() throws Exception {
464 jsr166 1.25 Policy savedPolicy = null;
465 dl 1.14 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 jsr166 1.20
475 dl 1.11 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 jsr166 1.20 */
486 jsr166 1.23 public void testCallable1() throws Exception {
487     Callable c = Executors.callable(new NoOpRunnable());
488     assertNull(c.call());
489 dl 1.11 }
490    
491     /**
492     * callable(Runnable, result) returns result when called
493 jsr166 1.20 */
494 jsr166 1.23 public void testCallable2() throws Exception {
495     Callable c = Executors.callable(new NoOpRunnable(), one);
496 jsr166 1.27 assertSame(one, c.call());
497 dl 1.11 }
498    
499     /**
500     * callable(PrivilegedAction) returns its result when called
501 jsr166 1.20 */
502 jsr166 1.23 public void testCallable3() throws Exception {
503     Callable c = Executors.callable(new PrivilegedAction() {
504     public Object run() { return one; }});
505 jsr166 1.27 assertSame(one, c.call());
506 dl 1.11 }
507    
508     /**
509     * callable(PrivilegedExceptionAction) returns its result when called
510 jsr166 1.20 */
511 jsr166 1.23 public void testCallable4() throws Exception {
512     Callable c = Executors.callable(new PrivilegedExceptionAction() {
513     public Object run() { return one; }});
514 jsr166 1.27 assertSame(one, c.call());
515 dl 1.11 }
516    
517    
518     /**
519     * callable(null Runnable) throws NPE
520 jsr166 1.20 */
521 dl 1.11 public void testCallableNPE1() {
522     try {
523 jsr166 1.23 Callable c = Executors.callable((Runnable) null);
524     shouldThrow();
525     } catch (NullPointerException success) {}
526 dl 1.11 }
527    
528     /**
529     * callable(null, result) throws NPE
530 jsr166 1.20 */
531 dl 1.11 public void testCallableNPE2() {
532     try {
533 jsr166 1.23 Callable c = Executors.callable((Runnable) null, one);
534     shouldThrow();
535     } catch (NullPointerException success) {}
536 dl 1.11 }
537    
538     /**
539     * callable(null PrivilegedAction) throws NPE
540 jsr166 1.20 */
541 dl 1.11 public void testCallableNPE3() {
542     try {
543 jsr166 1.23 Callable c = Executors.callable((PrivilegedAction) null);
544     shouldThrow();
545     } catch (NullPointerException success) {}
546 dl 1.11 }
547    
548     /**
549     * callable(null PrivilegedExceptionAction) throws NPE
550 jsr166 1.20 */
551 dl 1.11 public void testCallableNPE4() {
552     try {
553 jsr166 1.23 Callable c = Executors.callable((PrivilegedExceptionAction) null);
554     shouldThrow();
555     } catch (NullPointerException success) {}
556 dl 1.11 }
557    
558 dl 1.1
559     }