ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
Revision: 1.55
Committed: Tue Jan 26 13:33:06 2021 UTC (3 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.54: +13 -13 lines
Log Message:
Replace Integer with Item class

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 jsr166 1.51 ExecutorService unused = Executors.newCachedThreadPool(null);
67 dl 1.5 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 jsr166 1.51 ExecutorService unused = Executors.newSingleThreadExecutor(null);
101 dl 1.5 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 jsr166 1.51 ExecutorService unused = Executors.newFixedThreadPool(2, null);
149 dl 1.5 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 jsr166 1.51 ExecutorService unused = Executors.newFixedThreadPool(0);
159 dl 1.5 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 jsr166 1.51 ExecutorService unused =
181     Executors.unconfigurableExecutorService(null);
182 jsr166 1.23 shouldThrow();
183     } catch (NullPointerException success) {}
184 dl 1.11 }
185    
186     /**
187     * unconfigurableScheduledExecutorService(null) throws NPE
188     */
189 jsr166 1.42 public void testUnconfigurableScheduledExecutorServiceNPE() {
190 dl 1.11 try {
191 jsr166 1.51 ExecutorService unused =
192     Executors.unconfigurableScheduledExecutorService(null);
193 jsr166 1.23 shouldThrow();
194     } catch (NullPointerException success) {}
195 dl 1.11 }
196    
197     /**
198     * a newSingleThreadScheduledExecutor successfully runs delayed task
199     */
200 jsr166 1.23 public void testNewSingleThreadScheduledExecutor() throws Exception {
201 jsr166 1.46 final ScheduledExecutorService p = Executors.newSingleThreadScheduledExecutor();
202     try (PoolCleaner cleaner = cleaner(p)) {
203 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
204 jsr166 1.35 final Runnable task = new CheckedRunnable() {
205     public void realRun() {
206 jsr166 1.42 await(proceed);
207 jsr166 1.35 }};
208 jsr166 1.42 long startTime = System.nanoTime();
209 dl 1.55 Future<?> f = p.schedule(Executors.callable(task, Boolean.TRUE),
210 jsr166 1.42 timeoutMillis(), MILLISECONDS);
211 jsr166 1.35 assertFalse(f.isDone());
212 jsr166 1.42 proceed.countDown();
213     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
214 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
215 jsr166 1.35 assertTrue(f.isDone());
216 jsr166 1.42 assertFalse(f.isCancelled());
217     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
218 jsr166 1.35 }
219 dl 1.11 }
220    
221     /**
222     * a newScheduledThreadPool successfully runs delayed task
223     */
224 jsr166 1.42 public void testNewScheduledThreadPool() throws Exception {
225 jsr166 1.46 final ScheduledExecutorService p = Executors.newScheduledThreadPool(2);
226     try (PoolCleaner cleaner = cleaner(p)) {
227 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
228 jsr166 1.35 final Runnable task = new CheckedRunnable() {
229     public void realRun() {
230 jsr166 1.42 await(proceed);
231 jsr166 1.35 }};
232 jsr166 1.42 long startTime = System.nanoTime();
233 dl 1.55 Future<?> f = p.schedule(Executors.callable(task, Boolean.TRUE),
234 jsr166 1.42 timeoutMillis(), MILLISECONDS);
235 jsr166 1.35 assertFalse(f.isDone());
236 jsr166 1.42 proceed.countDown();
237     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
238 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
239 jsr166 1.35 assertTrue(f.isDone());
240 jsr166 1.42 assertFalse(f.isCancelled());
241     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
242 jsr166 1.35 }
243 dl 1.11 }
244    
245     /**
246 jsr166 1.24 * an unconfigurable newScheduledThreadPool successfully runs delayed task
247 dl 1.11 */
248 jsr166 1.42 public void testUnconfigurableScheduledExecutorService() throws Exception {
249 jsr166 1.46 final ScheduledExecutorService p =
250 jsr166 1.35 Executors.unconfigurableScheduledExecutorService
251     (Executors.newScheduledThreadPool(2));
252 jsr166 1.46 try (PoolCleaner cleaner = cleaner(p)) {
253 jsr166 1.42 final CountDownLatch proceed = new CountDownLatch(1);
254 jsr166 1.35 final Runnable task = new CheckedRunnable() {
255     public void realRun() {
256 jsr166 1.42 await(proceed);
257 jsr166 1.35 }};
258 jsr166 1.42 long startTime = System.nanoTime();
259 dl 1.55 Future<?> f = p.schedule(Executors.callable(task, Boolean.TRUE),
260 jsr166 1.42 timeoutMillis(), MILLISECONDS);
261 jsr166 1.35 assertFalse(f.isDone());
262 jsr166 1.42 proceed.countDown();
263     assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
264 jsr166 1.36 assertSame(Boolean.TRUE, f.get());
265 jsr166 1.35 assertTrue(f.isDone());
266 jsr166 1.42 assertFalse(f.isCancelled());
267     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
268 jsr166 1.35 }
269 dl 1.11 }
270    
271     /**
272 jsr166 1.34 * Future.get on submitted tasks will time out if they compute too long.
273 dl 1.2 */
274 jsr166 1.23 public void testTimedCallable() throws Exception {
275 jsr166 1.40 final ExecutorService[] executors = {
276     Executors.newSingleThreadExecutor(),
277     Executors.newCachedThreadPool(),
278     Executors.newFixedThreadPool(2),
279     Executors.newScheduledThreadPool(2),
280     };
281    
282 jsr166 1.54 final CountDownLatch done = new CountDownLatch(1);
283    
284 dl 1.52 final Runnable sleeper = new CheckedRunnable() {
285 jsr166 1.33 public void realRun() throws InterruptedException {
286 jsr166 1.54 done.await(LONG_DELAY_MS, MILLISECONDS);
287 jsr166 1.33 }};
288 jsr166 1.40
289 jsr166 1.47 List<Thread> threads = new ArrayList<>();
290 jsr166 1.40 for (final ExecutorService executor : executors) {
291     threads.add(newStartedThread(new CheckedRunnable() {
292     public void realRun() {
293 dl 1.55 Future<?> future = executor.submit(sleeper);
294 jsr166 1.40 assertFutureTimesOut(future);
295     }}));
296 dl 1.2 }
297 jsr166 1.40 for (Thread thread : threads)
298     awaitTermination(thread);
299 jsr166 1.54 done.countDown();
300 dl 1.52 for (ExecutorService executor : executors)
301 jsr166 1.40 joinPool(executor);
302 dl 1.2 }
303    
304 dl 1.8 /**
305     * ThreadPoolExecutor using defaultThreadFactory has
306     * specified group, priority, daemon status, and name
307     */
308 jsr166 1.23 public void testDefaultThreadFactory() throws Exception {
309 tim 1.9 final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
310 jsr166 1.42 final CountDownLatch done = new CountDownLatch(1);
311 jsr166 1.31 Runnable r = new CheckedRunnable() {
312     public void realRun() {
313     try {
314     Thread current = Thread.currentThread();
315 jsr166 1.48 assertFalse(current.isDaemon());
316 jsr166 1.31 assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
317     SecurityManager s = System.getSecurityManager();
318 jsr166 1.48 assertSame(current.getThreadGroup(),
319     (s == null) ? egroup : s.getThreadGroup());
320     assertTrue(current.getName().endsWith("thread-1"));
321 jsr166 1.31 } catch (SecurityException ok) {
322     // Also pass if not allowed to change setting
323 tim 1.9 }
324 jsr166 1.42 done.countDown();
325 jsr166 1.31 }};
326 tim 1.9 ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
327 jsr166 1.46 try (PoolCleaner cleaner = cleaner(e)) {
328     e.execute(r);
329     await(done);
330 dl 1.14 }
331 dl 1.8 }
332    
333     /**
334     * ThreadPoolExecutor using privilegedThreadFactory has
335     * specified group, priority, daemon status, name,
336     * access control context and context class loader
337     */
338 jsr166 1.23 public void testPrivilegedThreadFactory() throws Exception {
339 jsr166 1.42 final CountDownLatch done = new CountDownLatch(1);
340 jsr166 1.29 Runnable r = new CheckedRunnable() {
341     public void realRun() throws Exception {
342     final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
343     final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
344     final AccessControlContext thisacc = AccessController.getContext();
345     Runnable r = new CheckedRunnable() {
346     public void realRun() {
347 jsr166 1.25 Thread current = Thread.currentThread();
348 jsr166 1.48 assertFalse(current.isDaemon());
349 jsr166 1.29 assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
350 jsr166 1.25 SecurityManager s = System.getSecurityManager();
351 jsr166 1.48 assertSame(current.getThreadGroup(),
352     (s == null) ? egroup : s.getThreadGroup());
353     assertTrue(current.getName().endsWith("thread-1"));
354 jsr166 1.31 assertSame(thisccl, current.getContextClassLoader());
355     assertEquals(thisacc, AccessController.getContext());
356 jsr166 1.42 done.countDown();
357 jsr166 1.29 }};
358     ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
359 jsr166 1.46 try (PoolCleaner cleaner = cleaner(e)) {
360     e.execute(r);
361     await(done);
362     }
363 jsr166 1.29 }};
364    
365     runWithPermissions(r,
366     new RuntimePermission("getClassLoader"),
367     new RuntimePermission("setContextClassLoader"),
368     new RuntimePermission("modifyThread"));
369     }
370 jsr166 1.20
371 jsr166 1.29 boolean haveCCLPermissions() {
372     SecurityManager sm = System.getSecurityManager();
373     if (sm != null) {
374     try {
375     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
376     sm.checkPermission(new RuntimePermission("getClassLoader"));
377     } catch (AccessControlException e) {
378     return false;
379     }
380 tim 1.9 }
381 jsr166 1.29 return true;
382 dl 1.8 }
383 dl 1.11
384 dl 1.16 void checkCCL() {
385 dl 1.18 SecurityManager sm = System.getSecurityManager();
386     if (sm != null) {
387     sm.checkPermission(new RuntimePermission("setContextClassLoader"));
388 jsr166 1.19 sm.checkPermission(new RuntimePermission("getClassLoader"));
389 dl 1.18 }
390 dl 1.16 }
391    
392     class CheckCCL implements Callable<Object> {
393 dl 1.11 public Object call() {
394 dl 1.16 checkCCL();
395 dl 1.11 return null;
396     }
397     }
398    
399     /**
400     * Without class loader permissions, creating
401     * privilegedCallableUsingCurrentClassLoader throws ACE
402     */
403     public void testCreatePrivilegedCallableUsingCCLWithNoPrivs() {
404 jsr166 1.29 Runnable r = new CheckedRunnable() {
405     public void realRun() throws Exception {
406     if (System.getSecurityManager() == null)
407     return;
408     try {
409     Executors.privilegedCallableUsingCurrentClassLoader(new NoOpCallable());
410     shouldThrow();
411     } catch (AccessControlException success) {}
412     }};
413 dl 1.16
414 jsr166 1.29 runWithoutPermissions(r);
415 dl 1.11 }
416    
417     /**
418 dl 1.16 * With class loader permissions, calling
419     * privilegedCallableUsingCurrentClassLoader does not throw ACE
420 dl 1.11 */
421 jsr166 1.42 public void testPrivilegedCallableUsingCCLWithPrivs() throws Exception {
422 jsr166 1.29 Runnable r = new CheckedRunnable() {
423     public void realRun() throws Exception {
424     Executors.privilegedCallableUsingCurrentClassLoader
425     (new NoOpCallable())
426     .call();
427     }};
428    
429     runWithPermissions(r,
430     new RuntimePermission("getClassLoader"),
431     new RuntimePermission("setContextClassLoader"));
432 dl 1.11 }
433    
434     /**
435     * Without permissions, calling privilegedCallable throws ACE
436     */
437 jsr166 1.42 public void testPrivilegedCallableWithNoPrivs() throws Exception {
438 jsr166 1.32 // Avoid classloader-related SecurityExceptions in swingui.TestRunner
439     Executors.privilegedCallable(new CheckCCL());
440    
441 jsr166 1.29 Runnable r = new CheckedRunnable() {
442     public void realRun() throws Exception {
443     if (System.getSecurityManager() == null)
444     return;
445 dl 1.55 Callable<?> task = Executors.privilegedCallable(new CheckCCL());
446 jsr166 1.29 try {
447     task.call();
448     shouldThrow();
449     } catch (AccessControlException success) {}
450     }};
451    
452     runWithoutPermissions(r);
453    
454     // It seems rather difficult to test that the
455     // AccessControlContext of the privilegedCallable is used
456     // instead of its caller. Below is a failed attempt to do
457     // that, which does not work because the AccessController
458     // cannot capture the internal state of the current Policy.
459     // It would be much more work to differentiate based on,
460     // e.g. CodeSource.
461    
462     // final AccessControlContext[] noprivAcc = new AccessControlContext[1];
463     // final Callable[] task = new Callable[1];
464    
465     // runWithPermissions
466     // (new CheckedRunnable() {
467     // public void realRun() {
468     // if (System.getSecurityManager() == null)
469     // return;
470     // noprivAcc[0] = AccessController.getContext();
471     // task[0] = Executors.privilegedCallable(new CheckCCL());
472     // try {
473     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
474     // public Void run() {
475     // checkCCL();
476     // return null;
477     // }}, noprivAcc[0]);
478     // shouldThrow();
479     // } catch (AccessControlException success) {}
480     // }});
481    
482     // runWithPermissions
483     // (new CheckedRunnable() {
484     // public void realRun() throws Exception {
485     // if (System.getSecurityManager() == null)
486     // return;
487     // // Verify that we have an underprivileged ACC
488     // try {
489     // AccessController.doPrivileged(new PrivilegedAction<Void>() {
490     // public Void run() {
491     // checkCCL();
492     // return null;
493     // }}, noprivAcc[0]);
494     // shouldThrow();
495     // } catch (AccessControlException success) {}
496    
497     // try {
498     // task[0].call();
499     // shouldThrow();
500     // } catch (AccessControlException success) {}
501     // }},
502     // new RuntimePermission("getClassLoader"),
503     // new RuntimePermission("setContextClassLoader"));
504 dl 1.11 }
505    
506     /**
507     * With permissions, calling privilegedCallable succeeds
508     */
509 jsr166 1.42 public void testPrivilegedCallableWithPrivs() throws Exception {
510 jsr166 1.29 Runnable r = new CheckedRunnable() {
511     public void realRun() throws Exception {
512     Executors.privilegedCallable(new CheckCCL()).call();
513     }};
514    
515 jsr166 1.38 runWithPermissions(r,
516 jsr166 1.29 new RuntimePermission("getClassLoader"),
517     new RuntimePermission("setContextClassLoader"));
518 dl 1.11 }
519    
520     /**
521     * callable(Runnable) returns null when called
522 jsr166 1.20 */
523 jsr166 1.23 public void testCallable1() throws Exception {
524 dl 1.55 Callable<?> c = Executors.callable(new NoOpRunnable());
525 jsr166 1.23 assertNull(c.call());
526 dl 1.11 }
527    
528     /**
529     * callable(Runnable, result) returns result when called
530 jsr166 1.20 */
531 jsr166 1.23 public void testCallable2() throws Exception {
532 dl 1.55 Callable<?> c = Executors.callable(new NoOpRunnable(), one);
533 jsr166 1.27 assertSame(one, c.call());
534 dl 1.11 }
535    
536     /**
537     * callable(PrivilegedAction) returns its result when called
538 jsr166 1.20 */
539 jsr166 1.23 public void testCallable3() throws Exception {
540 dl 1.55 Callable<?> c = Executors.callable(new PrivilegedAction() {
541 jsr166 1.23 public Object run() { return one; }});
542 jsr166 1.27 assertSame(one, c.call());
543 dl 1.11 }
544    
545     /**
546     * callable(PrivilegedExceptionAction) returns its result when called
547 jsr166 1.20 */
548 jsr166 1.23 public void testCallable4() throws Exception {
549 dl 1.55 Callable<?> c = Executors.callable(new PrivilegedExceptionAction() {
550 jsr166 1.23 public Object run() { return one; }});
551 jsr166 1.27 assertSame(one, c.call());
552 dl 1.11 }
553    
554     /**
555     * callable(null Runnable) throws NPE
556 jsr166 1.20 */
557 dl 1.11 public void testCallableNPE1() {
558     try {
559 dl 1.55 Callable<?> unused = Executors.callable((Runnable) null);
560 jsr166 1.23 shouldThrow();
561     } catch (NullPointerException success) {}
562 dl 1.11 }
563    
564     /**
565     * callable(null, result) throws NPE
566 jsr166 1.20 */
567 dl 1.11 public void testCallableNPE2() {
568     try {
569 dl 1.55 Callable<?> unused = Executors.callable((Runnable) null, one);
570 jsr166 1.23 shouldThrow();
571     } catch (NullPointerException success) {}
572 dl 1.11 }
573    
574     /**
575     * callable(null PrivilegedAction) throws NPE
576 jsr166 1.20 */
577 dl 1.11 public void testCallableNPE3() {
578     try {
579 dl 1.55 Callable<?> unused = Executors.callable((PrivilegedAction) null);
580 jsr166 1.23 shouldThrow();
581     } catch (NullPointerException success) {}
582 dl 1.11 }
583    
584     /**
585     * callable(null PrivilegedExceptionAction) throws NPE
586 jsr166 1.20 */
587 dl 1.11 public void testCallableNPE4() {
588     try {
589 dl 1.55 Callable<?> unused = Executors.callable((PrivilegedExceptionAction) null);
590 jsr166 1.23 shouldThrow();
591     } catch (NullPointerException success) {}
592 dl 1.11 }
593    
594 jsr166 1.50 /**
595     * callable(runnable, x).toString() contains toString of wrapped task
596     */
597     public void testCallable_withResult_toString() {
598     if (testImplementationDetails) {
599     Runnable r = () -> {};
600     Callable<String> c = Executors.callable(r, "");
601     assertEquals(
602     identityString(c) + "[Wrapped task = " + r.toString() + "]",
603     c.toString());
604     }
605     }
606    
607     /**
608     * callable(runnable).toString() contains toString of wrapped task
609     */
610     public void testCallable_toString() {
611     if (testImplementationDetails) {
612     Runnable r = () -> {};
613     Callable<Object> c = Executors.callable(r);
614     assertEquals(
615     identityString(c) + "[Wrapped task = " + r.toString() + "]",
616     c.toString());
617     }
618     }
619    
620     /**
621     * privilegedCallable(callable).toString() contains toString of wrapped task
622     */
623     public void testPrivilegedCallable_toString() {
624     if (testImplementationDetails) {
625     Callable<String> c = () -> "";
626     Callable<String> priv = Executors.privilegedCallable(c);
627     assertEquals(
628     identityString(priv) + "[Wrapped task = " + c.toString() + "]",
629     priv.toString());
630     }
631     }
632    
633     /**
634     * privilegedCallableUsingCurrentClassLoader(callable).toString()
635     * contains toString of wrapped task
636     */
637     public void testPrivilegedCallableUsingCurrentClassLoader_toString() {
638     if (testImplementationDetails) {
639     Callable<String> c = () -> "";
640     Callable<String> priv = Executors.privilegedCallableUsingCurrentClassLoader(c);
641     assertEquals(
642     identityString(priv) + "[Wrapped task = " + c.toString() + "]",
643     priv.toString());
644     }
645     }
646 dl 1.1 }