ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.45
Committed: Sat Apr 25 04:55:30 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.44: +1 -1 lines
Log Message:
improve main methods; respect system properties; actually fail if a test fails

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