ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorsTest.java
(Generate patch)

Comparing jsr166/src/test/tck/ExecutorsTest.java (file contents):
Revision 1.4 by dl, Sat Sep 20 18:20:07 2003 UTC vs.
Revision 1.11 by dl, Mon Dec 22 00:48:55 2003 UTC

# Line 10 | Line 10 | 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{
15  
16      public static void main(String[] args) {
17 <        junit.textui.TestRunner.run (suite());  
17 >        junit.textui.TestRunner.run (suite());  
18      }
19      public static Test suite() {
20 <        return new TestSuite(ExecutorsTest.class);
21 <    }
22 <
23 <    private static final String TEST_STRING = "a test string";
24 <
25 <    private static class MyTask implements Runnable {
26 <        public void run() { completed = true; }
27 <        public boolean isCompleted() { return completed; }
28 <        public void reset() { completed = false; }
29 <        private boolean completed = false;
30 <    }
31 <
32 <    private static class StringTask implements Callable<String> {
33 <        public String call() { return TEST_STRING; }
34 <    }
35 <
36 <    static class DirectExecutor implements Executor {
37 <        public void execute(Runnable r) {
38 <            r.run();
39 <        }
20 >        return new TestSuite(ExecutorsTest.class);
21      }
22  
23      static class TimedCallable<T> implements Callable<T> {
24 <        private final Executor exec;
24 >        private final ExecutorService exec;
25          private final Callable<T> func;
26          private final long msecs;
27          
28 <        TimedCallable(Executor exec, Callable<T> func, long msecs) {
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 = Executors.execute(exec, func);
35 >            Future<T> ftask = exec.submit(func);
36              try {
37                  return ftask.get(msecs, TimeUnit.MILLISECONDS);
38              } finally {
# Line 79 | Line 60 | public class ExecutorsTest extends JSR16
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 <     *   execute(Executor, Runnable) will throw
86 <     *  RejectedExecutionException Attempting to execute a runnable on
87 <     *  a full ThreadPool will cause such an exception here, up to 5
88 <     *  runnables are attempted on a pool capable on handling one
89 <     *  until it throws an exception
86 >     * A newCachedThreadPool with null ThreadFactory throws NPE
87       */
88 <    public void testExecute1() {
92 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
88 >    public void testNewCachedThreadPool3() {
89          try {
90 <            
95 <            for(int i = 0; i < 5; ++i){
96 <                Executors.execute(p, new MediumRunnable(), Boolean.TRUE);
97 <            }
90 >            ExecutorService e = Executors.newCachedThreadPool(null);
91              shouldThrow();
92 <        } catch(RejectedExecutionException success){}
93 <        joinPool(p);
92 >        }
93 >        catch(NullPointerException success) {
94 >        }
95      }
96  
97 +
98      /**
99 <     *   execute(Executor, Callable) will throw
105 <     *  RejectedExecutionException Attempting to execute a callable on
106 <     *  a full ThreadPool will cause such an exception here, up to 5
107 <     *  runnables are attempted on a pool capable on handling one
108 <     *  until it throws an exception
99 >     * A new SingleThreadExecutor can execute runnables
100       */
101 <    public void testExecute2() {
102 <         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
103 <        try {
104 <            for(int i = 0; i < 5; ++i) {
105 <                Executors.execute(p, new SmallCallable());
106 <            }
116 <            shouldThrow();
117 <        } catch(RejectedExecutionException e){}
118 <        joinPool(p);
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 <     *   invoke(Executor, Runnable) throws InterruptedException
124 <     *  A single use of invoke starts that will wait long enough
125 <     *  for the invoking thread to be interrupted
121 >     * A new SingleThreadExecutor with null ThreadFactory throws NPE
122       */
123 <    public void testInvoke2() {
128 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
129 <        Thread t = new Thread(new Runnable() {
130 <                public void run() {
131 <                    try {
132 <                        Executors.invoke(p,new Runnable() {
133 <                                public void run() {
134 <                                    try {
135 <                                        Thread.sleep(MEDIUM_DELAY_MS);
136 <                                        shouldThrow();
137 <                                    } catch(InterruptedException e){
138 <                                    }
139 <                                }
140 <                            });
141 <                    } catch(InterruptedException success){
142 <                    } catch(Exception e) {
143 <                        unexpectedException();
144 <                    }
145 <                    
146 <                }
147 <            });
123 >    public void testNewSingleThreadExecutor3() {
124          try {
125 <            t.start();
126 <            Thread.sleep(SHORT_DELAY_MS);
127 <            t.interrupt();
128 <        } catch(Exception e){
153 <            unexpectedException();
125 >            ExecutorService e = Executors.newSingleThreadExecutor(null);
126 >            shouldThrow();
127 >        }
128 >        catch(NullPointerException success) {
129          }
155        joinPool(p);
130      }
131  
132      /**
133 <     *   invoke(Executor, Runnable) will throw
160 <     *  ExecutionException An ExecutionException occurs when the
161 <     *  underlying Runnable throws an exception, here the
162 <     *  DivideByZeroException will cause an ExecutionException
133 >     * A new SingleThreadExecutor cannot be casted to concrete implementation
134       */
135 <    public void testInvoke3() {
136 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
135 >    public void testCastNewSingleThreadExecutor() {
136 >        ExecutorService e = Executors.newSingleThreadExecutor();
137          try {
138 <            Runnable r = new Runnable() {
139 <                    public void run() {
140 <                        int i = 5/0;
141 <                    }
171 <                };
172 <            
173 <            for(int i =0; i < 5; i++){
174 <                Executors.invoke(p,r);
175 <            }
176 <            
177 <            shouldThrow();
178 <        } catch(ExecutionException success){
179 <        } catch(Exception e){
180 <            unexpectedException();
138 >            ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
139 >        } catch (ClassCastException success) {
140 >        } finally {
141 >            joinPool(e);
142          }
182        joinPool(p);
143      }
144  
145  
186
146      /**
147 <     *   invoke(Executor, Callable) throws
189 <     *  InterruptedException A single use of invoke starts that will
190 <     *  wait long enough for the invoking thread to be interrupted
147 >     * A new newFixedThreadPool can execute runnables
148       */
149 <    public void testInvoke5() {
150 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
151 <        
152 <        final Callable c = new Callable() {
153 <                public Object call() {
154 <                    try {
198 <                        Executors.invoke(p, new SmallCallable());
199 <                        shouldThrow();
200 <                    } catch(InterruptedException e){}
201 <                    catch(RejectedExecutionException e2){}
202 <                    catch(ExecutionException e3){}
203 <                    return Boolean.TRUE;
204 <                }
205 <            };
206 <
207 <
208 <        
209 <        Thread t = new Thread(new Runnable() {
210 <                public void run() {
211 <                    try {
212 <                        c.call();
213 <                    } catch(Exception e){}
214 <                }
215 <          });
216 <        try {
217 <            t.start();
218 <            Thread.sleep(SHORT_DELAY_MS);
219 <            t.interrupt();
220 <            t.join();
221 <        } catch(InterruptedException e){
222 <            unexpectedException();
223 <        }
224 <        
225 <        joinPool(p);
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 <     *   invoke(Executor, Callable) will throw ExecutionException
230 <     *  An ExecutionException occurs when the underlying Runnable throws
231 <     *  an exception, here the DivideByZeroException will cause an ExecutionException
158 >     * A new newFixedThreadPool with given ThreadFactory can execute runnables
159       */
160 <    public void testInvoke6() {
161 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
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 <            Callable c = new Callable() {
238 <                    public Object call() {
239 <                        int i = 5/0;
240 <                        return Boolean.TRUE;
241 <                    }
242 <                };
243 <            
244 <            for(int i =0; i < 5; i++){
245 <                Executors.invoke(p,c);
246 <            }
247 <            
173 >            ExecutorService e = Executors.newFixedThreadPool(2, null);
174              shouldThrow();
175 <        } catch(RejectedExecutionException e){}
176 <        catch(InterruptedException e2){}
177 <        catch(ExecutionException e3){}
252 <        joinPool(p);
175 >        }
176 >        catch(NullPointerException success) {
177 >        }
178      }
179  
180      /**
181 <     *
181 >     * A new newFixedThreadPool with 0 threads throws IAE
182       */
183 <    public void testExecuteRunnable () {
183 >    public void testNewFixedThreadPool4() {
184          try {
185 <            Executor e = new DirectExecutor();
186 <            MyTask task = new MyTask();
262 <            assertFalse(task.isCompleted());
263 <            Future<String> future = Executors.execute(e, task, TEST_STRING);
264 <            String result = future.get();
265 <            assertTrue(task.isCompleted());
266 <            assertSame(TEST_STRING, result);
267 <        }
268 <        catch (ExecutionException ex) {
269 <            unexpectedException();
185 >            ExecutorService e = Executors.newFixedThreadPool(0);
186 >            shouldThrow();
187          }
188 <        catch (InterruptedException ex) {
272 <            unexpectedException();
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 <     *
205 >     * unconfigurableExecutorService(null) throws NPE
206       */
207 <    public void testInvokeRunnable () {
207 >    public void testunconfigurableExecutorServiceNPE() {
208          try {
209 <            Executor e = new DirectExecutor();
282 <            MyTask task = new MyTask();
283 <            assertFalse(task.isCompleted());
284 <            Executors.invoke(e, task);
285 <            assertTrue(task.isCompleted());
286 <        }
287 <        catch (ExecutionException ex) {
288 <            unexpectedException();
209 >            ExecutorService e = Executors.unconfigurableExecutorService(null);
210          }
211 <        catch (InterruptedException ex) {
291 <            unexpectedException();
211 >        catch (NullPointerException success) {
212          }
213      }
214  
215      /**
216 <     *
216 >     * unconfigurableScheduledExecutorService(null) throws NPE
217       */
218 <    public void testExecuteCallable () {
218 >    public void testunconfigurableScheduledExecutorServiceNPE() {
219          try {
220 <            Executor e = new DirectExecutor();
301 <            Future<String> future = Executors.execute(e, new StringTask());
302 <            String result = future.get();
303 <            assertSame(TEST_STRING, result);
220 >            ExecutorService e = Executors.unconfigurableScheduledExecutorService(null);
221          }
222 <        catch (ExecutionException ex) {
306 <            unexpectedException();
222 >        catch (NullPointerException success) {
223          }
224 <        catch (InterruptedException ex) {
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 <     *
249 >     * a newScheduledThreadPool successfully runs delayed task
250       */
251 <    public void testInvokeCallable () {
252 <        try {
253 <            Executor e = new DirectExecutor();
254 <            String result = Executors.invoke(e, new StringTask());
255 <
256 <            assertSame(TEST_STRING, result);
257 <        }
258 <        catch (ExecutionException ex) {
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 <        catch (InterruptedException ex) {
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      }
# Line 369 | Line 328 | public class ExecutorsTest extends JSR16
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   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines