ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.49
Committed: Mon May 29 22:44:26 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.48: +3 -2 lines
Log Message:
more timeout handling rework; remove most uses of MEDIUM_DELAY_MS; randomize timeouts and TimeUnits; write out IAE and ISE

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 jsr166 1.37 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.20 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.26 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10 jsr166 1.43
11     import java.security.AccessControlContext;
12     import java.security.AccessControlException;
13     import java.security.AccessController;
14     import java.security.PrivilegedAction;
15     import java.security.PrivilegedExceptionAction;
16     import java.util.ArrayList;
17     import java.util.List;
18     import java.util.concurrent.Callable;
19     import java.util.concurrent.CountDownLatch;
20     import java.util.concurrent.Executors;
21     import java.util.concurrent.ExecutorService;
22     import java.util.concurrent.Future;
23     import java.util.concurrent.ScheduledExecutorService;
24     import java.util.concurrent.ThreadPoolExecutor;
25    
26     import junit.framework.Test;
27     import junit.framework.TestSuite;
28 dl 1.1
29 jsr166 1.22 public class ExecutorsTest extends JSR166TestCase {
30 dl 1.1 public static void main(String[] args) {
31 jsr166 1.45 main(suite(), args);
32 dl 1.1 }
33     public static Test suite() {
34 tim 1.9 return new TestSuite(ExecutorsTest.class);
35 dl 1.1 }
36    
37 dl 1.5 /**
38     * A newCachedThreadPool can execute runnables
39     */
40     public void testNewCachedThreadPool1() {
41 jsr166 1.46 final ExecutorService e = Executors.newCachedThreadPool();
42     try (PoolCleaner cleaner = cleaner(e)) {
43     e.execute(new NoOpRunnable());
44     e.execute(new NoOpRunnable());
45     e.execute(new NoOpRunnable());
46     }
47 dl 1.5 }
48    
49     /**
50     * A newCachedThreadPool with given ThreadFactory can execute runnables
51     */
52     public void testNewCachedThreadPool2() {
53 jsr166 1.46 final ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
54     try (PoolCleaner cleaner = cleaner(e)) {
55     e.execute(new NoOpRunnable());
56     e.execute(new NoOpRunnable());
57     e.execute(new NoOpRunnable());
58     }
59 dl 1.5 }
60    
61     /**
62     * A newCachedThreadPool with null ThreadFactory throws NPE
63     */
64     public void testNewCachedThreadPool3() {
65     try {
66     ExecutorService e = Executors.newCachedThreadPool(null);
67     shouldThrow();
68 jsr166 1.23 } catch (NullPointerException success) {}
69 dl 1.5 }
70    
71     /**
72     * A new SingleThreadExecutor can execute runnables
73     */
74     public void testNewSingleThreadExecutor1() {
75 jsr166 1.46 final ExecutorService e = Executors.newSingleThreadExecutor();
76     try (PoolCleaner cleaner = cleaner(e)) {
77     e.execute(new NoOpRunnable());
78     e.execute(new NoOpRunnable());
79     e.execute(new NoOpRunnable());
80     }
81 dl 1.5 }
82    
83     /**
84     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
85     */
86     public void testNewSingleThreadExecutor2() {
87 jsr166 1.46 final ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
88     try (PoolCleaner cleaner = cleaner(e)) {
89     e.execute(new NoOpRunnable());
90     e.execute(new NoOpRunnable());
91     e.execute(new NoOpRunnable());
92     }
93 dl 1.5 }
94    
95     /**
96     * A new SingleThreadExecutor with null ThreadFactory throws NPE
97     */
98     public void testNewSingleThreadExecutor3() {
99     try {
100     ExecutorService e = Executors.newSingleThreadExecutor(null);
101     shouldThrow();
102 jsr166 1.23 } catch (NullPointerException success) {}
103 dl 1.5 }
104    
105     /**
106 dl 1.11 * A new SingleThreadExecutor cannot be casted to concrete implementation
107     */
108     public void testCastNewSingleThreadExecutor() {
109 jsr166 1.46 final ExecutorService e = Executors.newSingleThreadExecutor();
110     try (PoolCleaner cleaner = cleaner(e)) {
111     try {
112     ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
113     shouldThrow();
114     } catch (ClassCastException success) {}
115 dl 1.11 }
116     }
117    
118     /**
119 dl 1.5 * A new newFixedThreadPool can execute runnables
120     */
121     public void testNewFixedThreadPool1() {
122 jsr166 1.46 final ExecutorService e = Executors.newFixedThreadPool(2);
123     try (PoolCleaner cleaner = cleaner(e)) {
124     e.execute(new NoOpRunnable());
125     e.execute(new NoOpRunnable());
126     e.execute(new NoOpRunnable());
127     }
128 dl 1.5 }
129    
130     /**
131     * A new newFixedThreadPool with given ThreadFactory can execute runnables
132     */
133     public void testNewFixedThreadPool2() {
134 jsr166 1.46 final ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
135     try (PoolCleaner cleaner = cleaner(e)) {
136     e.execute(new NoOpRunnable());
137     e.execute(new NoOpRunnable());
138     e.execute(new NoOpRunnable());
139     }
140 dl 1.5 }
141    
142     /**
143 jsr166 1.49 * A new newFixedThreadPool with null ThreadFactory throws
144     * NullPointerException
145 dl 1.5 */
146     public void testNewFixedThreadPool3() {
147     try {
148     ExecutorService e = Executors.newFixedThreadPool(2, null);
149     shouldThrow();
150 jsr166 1.23 } catch (NullPointerException success) {}
151 dl 1.5 }
152    
153     /**
154 jsr166 1.49 * A new newFixedThreadPool with 0 threads throws IllegalArgumentException
155 dl 1.5 */
156     public void testNewFixedThreadPool4() {
157     try {
158     ExecutorService e = Executors.newFixedThreadPool(0);
159     shouldThrow();
160 jsr166 1.23 } catch (IllegalArgumentException success) {}
161 dl 1.5 }
162 dl 1.1
163 dl 1.2 /**
164 dl 1.11 * An unconfigurable newFixedThreadPool can execute runnables
165     */
166 jsr166 1.42 public void testUnconfigurableExecutorService() {
167 jsr166 1.46 final ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2));
168     try (PoolCleaner cleaner = cleaner(e)) {
169     e.execute(new NoOpRunnable());
170     e.execute(new NoOpRunnable());
171     e.execute(new NoOpRunnable());
172     }
173 dl 1.11 }
174    
175     /**
176     * unconfigurableExecutorService(null) throws NPE
177     */
178 jsr166 1.42 public void testUnconfigurableExecutorServiceNPE() {
179 dl 1.11 try {
180     ExecutorService e = Executors.unconfigurableExecutorService(null);
181 jsr166 1.23 shouldThrow();
182     } catch (NullPointerException success) {}
183 dl 1.11 }
184    
185     /**
186     * unconfigurableScheduledExecutorService(null) throws NPE
187     */
188 jsr166 1.42 public void testUnconfigurableScheduledExecutorServiceNPE() {
189 dl 1.11 try {
190     ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
191 jsr166 1.23 shouldThrow();
192     } catch (NullPointerException success) {}
193 dl 1.11 }
194    
195     /**
196     * a newSingleThreadScheduledExecutor successfully runs delayed task
197     */
198 jsr166 1.23 public void testNewSingleThreadScheduledExecutor() throws Exception {
199 jsr166 1.46 final ScheduledExecutorService p = Executors.newSingleThreadScheduledExecutor();
200     try (PoolCleaner cleaner = cleaner(p)) {
201 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
202 jsr166 1.35 final Runnable task = new CheckedRunnable() {
203     public void realRun() {
204 jsr166 1.42 await(proceed);
205 jsr166 1.35 }};
206 jsr166 1.42 long startTime = System.nanoTime();
207 jsr166 1.35 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
208 jsr166 1.42 timeoutMillis(), MILLISECONDS);
209 jsr166 1.35 assertFalse(f.isDone());
210 jsr166 1.42 proceed.countDown();
211     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
212 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
213 jsr166 1.35 assertTrue(f.isDone());
214 jsr166 1.42 assertFalse(f.isCancelled());
215     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
216 jsr166 1.35 }
217 dl 1.11 }
218    
219     /**
220     * a newScheduledThreadPool successfully runs delayed task
221     */
222 jsr166 1.42 public void testNewScheduledThreadPool() throws Exception {
223 jsr166 1.46 final ScheduledExecutorService p = Executors.newScheduledThreadPool(2);
224     try (PoolCleaner cleaner = cleaner(p)) {
225 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
226 jsr166 1.35 final Runnable task = new CheckedRunnable() {
227     public void realRun() {
228 jsr166 1.42 await(proceed);
229 jsr166 1.35 }};
230 jsr166 1.42 long startTime = System.nanoTime();
231 jsr166 1.35 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
232 jsr166 1.42 timeoutMillis(), MILLISECONDS);
233 jsr166 1.35 assertFalse(f.isDone());
234 jsr166 1.42 proceed.countDown();
235     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
236 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
237 jsr166 1.35 assertTrue(f.isDone());
238 jsr166 1.42 assertFalse(f.isCancelled());
239     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
240 jsr166 1.35 }
241 dl 1.11 }
242    
243     /**
244 jsr166 1.24 * an unconfigurable newScheduledThreadPool successfully runs delayed task
245 dl 1.11 */
246 jsr166 1.42 public void testUnconfigurableScheduledExecutorService() throws Exception {
247 jsr166 1.46 final ScheduledExecutorService p =
248 jsr166 1.35 Executors.unconfigurableScheduledExecutorService
249     (Executors.newScheduledThreadPool(2));
250 jsr166 1.46 try (PoolCleaner cleaner = cleaner(p)) {
251 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
252 jsr166 1.35 final Runnable task = new CheckedRunnable() {
253     public void realRun() {
254 jsr166 1.42 await(proceed);
255 jsr166 1.35 }};
256 jsr166 1.42 long startTime = System.nanoTime();
257 jsr166 1.35 Future f = p.schedule(Executors.callable(task, Boolean.TRUE),
258 jsr166 1.42 timeoutMillis(), MILLISECONDS);
259 jsr166 1.35 assertFalse(f.isDone());
260 jsr166 1.42 proceed.countDown();
261     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
262 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
263 jsr166 1.35 assertTrue(f.isDone());
264 jsr166 1.42 assertFalse(f.isCancelled());
265     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
266 jsr166 1.35 }
267 dl 1.11 }
268    
269     /**
270 jsr166 1.34 * Future.get on submitted tasks will time out if they compute too long.
271 dl 1.2 */
272 jsr166 1.23 public void testTimedCallable() throws Exception {
273 jsr166 1.40 final ExecutorService[] executors = {
274     Executors.newSingleThreadExecutor(),
275     Executors.newCachedThreadPool(),
276     Executors.newFixedThreadPool(2),
277     Executors.newScheduledThreadPool(2),
278     };
279    
280 jsr166 1.33 final Runnable sleeper = new CheckedInterruptedRunnable() {
281     public void realRun() throws InterruptedException {
282 dl 1.39 delay(LONG_DELAY_MS);
283 jsr166 1.33 }};
284 jsr166 1.40
285 jsr166 1.47 List<Thread> threads = new ArrayList<>();
286 jsr166 1.40 for (final ExecutorService executor : executors) {
287     threads.add(newStartedThread(new CheckedRunnable() {
288     public void realRun() {
289     Future future = executor.submit(sleeper);
290     assertFutureTimesOut(future);
291     }}));
292 dl 1.2 }
293 jsr166 1.40 for (Thread thread : threads)
294     awaitTermination(thread);
295     for (ExecutorService executor : executors)
296     joinPool(executor);
297 dl 1.2 }
298    
299 dl 1.8 /**
300     * ThreadPoolExecutor using defaultThreadFactory has
301     * specified group, priority, daemon status, and name
302     */
303 jsr166 1.23 public void testDefaultThreadFactory() throws Exception {
304 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
305 jsr166 1.42 final CountDownLatch done = new CountDownLatch(1);
306 jsr166 1.31 Runnable r = new CheckedRunnable() {
307     public void realRun() {
308     try {
309     Thread current = Thread.currentThread();
310 jsr166 1.48 assertFalse(current.isDaemon());
311 jsr166 1.31 assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
312     SecurityManager s = System.getSecurityManager();
313 jsr166 1.48 assertSame(current.getThreadGroup(),
314     (s == null) ? egroup : s.getThreadGroup());
315     assertTrue(current.getName().endsWith("thread-1"));
316 jsr166 1.31 } catch (SecurityException ok) {
317     // Also pass if not allowed to change setting
318 tim 1.9 }
319 jsr166 1.42 done.countDown();
320 jsr166 1.31 }};
321 tim 1.9 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
322 jsr166 1.46 try (PoolCleaner cleaner = cleaner(e)) {
323     e.execute(r);
324     await(done);
325 dl 1.14 }
326 dl 1.8 }
327    
328     /**
329     * ThreadPoolExecutor using privilegedThreadFactory has
330     * specified group, priority, daemon status, name,
331     * access control context and context class loader
332     */
333 jsr166 1.23 public void testPrivilegedThreadFactory() throws Exception {
334 jsr166 1.42 final CountDownLatch done = new CountDownLatch(1);
335 jsr166 1.29 Runnable r = new CheckedRunnable() {
336     public void realRun() throws Exception {
337     final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
338     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
339     final AccessControlContext thisacc = AccessController.getContext();
340     Runnable r = new CheckedRunnable() {
341     public void realRun() {
342 jsr166 1.25 Thread current = Thread.currentThread();
343 jsr166 1.48 assertFalse(current.isDaemon());
344 jsr166 1.29 assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
345 jsr166 1.25 SecurityManager s = System.getSecurityManager();
346 jsr166 1.48 assertSame(current.getThreadGroup(),
347     (s == null) ? egroup : s.getThreadGroup());
348     assertTrue(current.getName().endsWith("thread-1"));
349 jsr166 1.31 assertSame(thisccl, current.getContextClassLoader());
350     assertEquals(thisacc, AccessController.getContext());
351 jsr166 1.42 done.countDown();
352 jsr166 1.29 }};
353     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
354 jsr166 1.46 try (PoolCleaner cleaner = cleaner(e)) {
355     e.execute(r);
356     await(done);
357     }
358 jsr166 1.29 }};
359    
360     runWithPermissions(r,
361     new RuntimePermission("getClassLoader"),
362     new RuntimePermission("setContextClassLoader"),
363     new RuntimePermission("modifyThread"));
364     }
365 jsr166 1.20
366 jsr166 1.29 boolean haveCCLPermissions() {
367     SecurityManager sm = System.getSecurityManager();
368     if (sm != null) {
369     try {
370     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
371     sm.checkPermission(new RuntimePermission("getClassLoader"));
372     } catch (AccessControlException e) {
373     return false;
374     }
375 tim 1.9 }
376 jsr166 1.29 return true;
377 dl 1.8 }
378 dl 1.11
379 dl 1.16 void checkCCL() {
380 dl 1.18 SecurityManager sm = System.getSecurityManager();
381     if (sm != null) {
382     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
383 jsr166 1.19 sm.checkPermission(new RuntimePermission("getClassLoader"));
384 dl 1.18 }
385 dl 1.16 }
386    
387     class CheckCCL implements Callable<Object> {
388 dl 1.11 public Object call() {
389 dl 1.16 checkCCL();
390 dl 1.11 return null;
391     }
392     }
393    
394     /**
395     * Without class loader permissions, creating
396     * privilegedCallableUsingCurrentClassLoader throws ACE
397     */
398     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
399 jsr166 1.29 Runnable r = new CheckedRunnable() {
400     public void realRun() throws Exception {
401     if (System.getSecurityManager() == null)
402     return;
403     try {
404     Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
405     shouldThrow();
406     } catch (AccessControlException success) {}
407     }};
408 dl 1.16
409 jsr166 1.29 runWithoutPermissions(r);
410 dl 1.11 }
411    
412     /**
413 dl 1.16 * With class loader permissions, calling
414     * privilegedCallableUsingCurrentClassLoader does not throw ACE
415 dl 1.11 */
416 jsr166 1.42 public void testPrivilegedCallableUsingCCLWithPrivs() throws Exception {
417 jsr166 1.29 Runnable r = new CheckedRunnable() {
418     public void realRun() throws Exception {
419     Executors.privilegedCallableUsingCurrentClassLoader
420     (new NoOpCallable())
421     .call();
422     }};
423    
424     runWithPermissions(r,
425     new RuntimePermission("getClassLoader"),
426     new RuntimePermission("setContextClassLoader"));
427 dl 1.11 }
428    
429     /**
430     * Without permissions, calling privilegedCallable throws ACE
431     */
432 jsr166 1.42 public void testPrivilegedCallableWithNoPrivs() throws Exception {
433 jsr166 1.32 // Avoid classloader-related SecurityExceptions in swingui.TestRunner
434     Executors.privilegedCallable(new CheckCCL());
435    
436 jsr166 1.29 Runnable r = new CheckedRunnable() {
437     public void realRun() throws Exception {
438     if (System.getSecurityManager() == null)
439     return;
440     Callable task = Executors.privilegedCallable(new CheckCCL());
441     try {
442     task.call();
443     shouldThrow();
444     } catch (AccessControlException success) {}
445     }};
446    
447     runWithoutPermissions(r);
448    
449     // It seems rather difficult to test that the
450     // AccessControlContext of the privilegedCallable is used
451     // instead of its caller. Below is a failed attempt to do
452     // that, which does not work because the AccessController
453     // cannot capture the internal state of the current Policy.
454     // It would be much more work to differentiate based on,
455     // e.g. CodeSource.
456    
457     // final AccessControlContext[] noprivAcc = new AccessControlContext[1];
458     // final Callable[] task = new Callable[1];
459    
460     // runWithPermissions
461     // (new CheckedRunnable() {
462     // public void realRun() {
463     // if (System.getSecurityManager() == null)
464     // return;
465     // noprivAcc[0] = AccessController.getContext();
466     // task[0] = Executors.privilegedCallable(new CheckCCL());
467     // try {
468     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
469     // public Void run() {
470     // checkCCL();
471     // return null;
472     // }}, noprivAcc[0]);
473     // shouldThrow();
474     // } catch (AccessControlException success) {}
475     // }});
476    
477     // runWithPermissions
478     // (new CheckedRunnable() {
479     // public void realRun() throws Exception {
480     // if (System.getSecurityManager() == null)
481     // return;
482     // // Verify that we have an underprivileged ACC
483     // try {
484     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
485     // public Void run() {
486     // checkCCL();
487     // return null;
488     // }}, noprivAcc[0]);
489     // shouldThrow();
490     // } catch (AccessControlException success) {}
491    
492     // try {
493     // task[0].call();
494     // shouldThrow();
495     // } catch (AccessControlException success) {}
496     // }},
497     // new RuntimePermission("getClassLoader"),
498     // new RuntimePermission("setContextClassLoader"));
499 dl 1.11 }
500    
501     /**
502     * With permissions, calling privilegedCallable succeeds
503     */
504 jsr166 1.42 public void testPrivilegedCallableWithPrivs() throws Exception {
505 jsr166 1.29 Runnable r = new CheckedRunnable() {
506     public void realRun() throws Exception {
507     Executors.privilegedCallable(new CheckCCL()).call();
508     }};
509    
510 jsr166 1.38 runWithPermissions(r,
511 jsr166 1.29 new RuntimePermission("getClassLoader"),
512     new RuntimePermission("setContextClassLoader"));
513 dl 1.11 }
514    
515     /**
516     * callable(Runnable) returns null when called
517 jsr166 1.20 */
518 jsr166 1.23 public void testCallable1() throws Exception {
519     Callable c = Executors.callable(new NoOpRunnable());
520     assertNull(c.call());
521 dl 1.11 }
522    
523     /**
524     * callable(Runnable, result) returns result when called
525 jsr166 1.20 */
526 jsr166 1.23 public void testCallable2() throws Exception {
527     Callable c = Executors.callable(new NoOpRunnable(), one);
528 jsr166 1.27 assertSame(one, c.call());
529 dl 1.11 }
530    
531     /**
532     * callable(PrivilegedAction) returns its result when called
533 jsr166 1.20 */
534 jsr166 1.23 public void testCallable3() throws Exception {
535     Callable c = Executors.callable(new PrivilegedAction() {
536     public Object run() { return one; }});
537 jsr166 1.27 assertSame(one, c.call());
538 dl 1.11 }
539    
540     /**
541     * callable(PrivilegedExceptionAction) returns its result when called
542 jsr166 1.20 */
543 jsr166 1.23 public void testCallable4() throws Exception {
544     Callable c = Executors.callable(new PrivilegedExceptionAction() {
545     public Object run() { return one; }});
546 jsr166 1.27 assertSame(one, c.call());
547 dl 1.11 }
548    
549     /**
550     * callable(null Runnable) throws NPE
551 jsr166 1.20 */
552 dl 1.11 public void testCallableNPE1() {
553     try {
554 jsr166 1.23 Callable c = Executors.callable((Runnable) null);
555     shouldThrow();
556     } catch (NullPointerException success) {}
557 dl 1.11 }
558    
559     /**
560     * callable(null, result) throws NPE
561 jsr166 1.20 */
562 dl 1.11 public void testCallableNPE2() {
563     try {
564 jsr166 1.23 Callable c = Executors.callable((Runnable) null, one);
565     shouldThrow();
566     } catch (NullPointerException success) {}
567 dl 1.11 }
568    
569     /**
570     * callable(null PrivilegedAction) throws NPE
571 jsr166 1.20 */
572 dl 1.11 public void testCallableNPE3() {
573     try {
574 jsr166 1.23 Callable c = Executors.callable((PrivilegedAction) null);
575     shouldThrow();
576     } catch (NullPointerException success) {}
577 dl 1.11 }
578    
579     /**
580     * callable(null PrivilegedExceptionAction) throws NPE
581 jsr166 1.20 */
582 dl 1.11 public void testCallableNPE4() {
583     try {
584 jsr166 1.23 Callable c = Executors.callable((PrivilegedExceptionAction) null);
585     shouldThrow();
586     } catch (NullPointerException success) {}
587 dl 1.11 }
588    
589 dl 1.1 }