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.2 by dl, Sun Sep 7 20:39:11 2003 UTC vs.
Revision 1.9 by tim, Tue Dec 9 19:09:24 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 TestCase{
15 <    
15 > public class ExecutorsTest extends JSR166TestCase{
16      public static void main(String[] args) {
17 <        junit.textui.TestRunner.run (suite());  
17 >        junit.textui.TestRunner.run (suite());  
18      }
19    
20
19      public static Test suite() {
20 <        return new TestSuite(ExecutorsTest.class);
20 >        return new TestSuite(ExecutorsTest.class);
21 >    }
22 >
23 >    private static final String TEST_STRING = "a test string";
24 >
25 >    private static class StringTask implements Callable<String> {
26 >        public String call() { return TEST_STRING; }
27      }
28  
29 <    private static long SHORT_DELAY_MS = 100;
30 <    private static long MEDIUM_DELAY_MS = 1000;
31 <    private static long LONG_DELAY_MS = 10000;
32 <
33 <    class SleepRun implements Runnable {
34 <        public void run() {
35 <            try{
36 <                Thread.sleep(MEDIUM_DELAY_MS);
37 <            } catch(InterruptedException e){
38 <                fail("unexpected exception");
29 >    static class DirectExecutor implements Executor {
30 >        public void execute(Runnable r) {
31 >            r.run();
32 >        }
33 >    }
34 >
35 >    static class TimedCallable<T> implements Callable<T> {
36 >        private final Executor exec;
37 >        private final Callable<T> func;
38 >        private final long msecs;
39 >        
40 >        TimedCallable(Executor exec, Callable<T> func, long msecs) {
41 >            this.exec = exec;
42 >            this.func = func;
43 >            this.msecs = msecs;
44 >        }
45 >        
46 >        public T call() throws Exception {
47 >            Future<T> ftask = Executors.execute(exec, func);
48 >            try {
49 >                return ftask.get(msecs, TimeUnit.MILLISECONDS);
50 >            } finally {
51 >                ftask.cancel(true);
52              }
53          }
54      }
38    
55  
56 <    class SleepCall implements Callable {
57 <        public Object call(){
58 <            try{
59 <                Thread.sleep(MEDIUM_DELAY_MS);
60 <            }catch(InterruptedException e){
61 <                fail("unexpected exception");
56 >
57 >    private static class Fib implements Callable<BigInteger> {
58 >        private final BigInteger n;
59 >        Fib(long n) {
60 >            if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
61 >            this.n = BigInteger.valueOf(n);
62 >        }
63 >        public BigInteger call() {
64 >            BigInteger f1 = BigInteger.ONE;
65 >            BigInteger f2 = f1;
66 >            for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
67 >                BigInteger t = f1.add(f2);
68 >                f1 = f2;
69 >                f2 = t;
70              }
71 <            return Boolean.TRUE;
71 >            return f1;
72 >        }
73 >    };
74 >
75 >    /**
76 >     * A newCachedThreadPool can execute runnables
77 >     */
78 >    public void testNewCachedThreadPool1() {
79 >        ExecutorService e = Executors.newCachedThreadPool();
80 >        e.execute(new NoOpRunnable());
81 >        e.execute(new NoOpRunnable());
82 >        e.execute(new NoOpRunnable());
83 >        e.shutdown();
84 >    }
85 >
86 >    /**
87 >     * A newCachedThreadPool with given ThreadFactory can execute runnables
88 >     */
89 >    public void testNewCachedThreadPool2() {
90 >        ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
91 >        e.execute(new NoOpRunnable());
92 >        e.execute(new NoOpRunnable());
93 >        e.execute(new NoOpRunnable());
94 >        e.shutdown();
95 >    }
96 >
97 >    /**
98 >     * A newCachedThreadPool with null ThreadFactory throws NPE
99 >     */
100 >    public void testNewCachedThreadPool3() {
101 >        try {
102 >            ExecutorService e = Executors.newCachedThreadPool(null);
103 >            shouldThrow();
104 >        }
105 >        catch(NullPointerException success) {
106 >        }
107 >    }
108 >
109 >
110 >    /**
111 >     * A new SingleThreadExecutor can execute runnables
112 >     */
113 >    public void testNewSingleThreadExecutor1() {
114 >        ExecutorService e = Executors.newSingleThreadExecutor();
115 >        e.execute(new NoOpRunnable());
116 >        e.execute(new NoOpRunnable());
117 >        e.execute(new NoOpRunnable());
118 >        e.shutdown();
119 >    }
120 >
121 >    /**
122 >     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
123 >     */
124 >    public void testNewSingleThreadExecutor2() {
125 >        ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
126 >        e.execute(new NoOpRunnable());
127 >        e.execute(new NoOpRunnable());
128 >        e.execute(new NoOpRunnable());
129 >        e.shutdown();
130 >    }
131 >
132 >    /**
133 >     * A new SingleThreadExecutor with null ThreadFactory throws NPE
134 >     */
135 >    public void testNewSingleThreadExecutor3() {
136 >        try {
137 >            ExecutorService e = Executors.newSingleThreadExecutor(null);
138 >            shouldThrow();
139 >        }
140 >        catch(NullPointerException success) {
141          }
142      }
143  
144 +    /**
145 +     * A new newFixedThreadPool can execute runnables
146 +     */
147 +    public void testNewFixedThreadPool1() {
148 +        ExecutorService e = Executors.newFixedThreadPool(2);
149 +        e.execute(new NoOpRunnable());
150 +        e.execute(new NoOpRunnable());
151 +        e.execute(new NoOpRunnable());
152 +        e.shutdown();
153 +    }
154  
155 +    /**
156 +     * A new newFixedThreadPool with given ThreadFactory can execute runnables
157 +     */
158 +    public void testNewFixedThreadPool2() {
159 +        ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
160 +        e.execute(new NoOpRunnable());
161 +        e.execute(new NoOpRunnable());
162 +        e.execute(new NoOpRunnable());
163 +        e.shutdown();
164 +    }
165 +
166 +    /**
167 +     * A new newFixedThreadPool with null ThreadFactory throws NPE
168 +     */
169 +    public void testNewFixedThreadPool3() {
170 +        try {
171 +            ExecutorService e = Executors.newFixedThreadPool(2, null);
172 +            shouldThrow();
173 +        }
174 +        catch(NullPointerException success) {
175 +        }
176 +    }
177 +
178 +    /**
179 +     * A new newFixedThreadPool with 0 threads throws IAE
180 +     */
181 +    public void testNewFixedThreadPool4() {
182 +        try {
183 +            ExecutorService e = Executors.newFixedThreadPool(0);
184 +            shouldThrow();
185 +        }
186 +        catch(IllegalArgumentException success) {
187 +        }
188 +    }
189 +
190 +    /**
191 +     * execute of runnable runs it to completion
192 +     */
193 +    public void testExecuteRunnable() {
194 +        try {
195 +            Executor e = new DirectExecutor();
196 +            TrackedShortRunnable task = new TrackedShortRunnable();
197 +            assertFalse(task.done);
198 +            Future<?> future = Executors.execute(e, task);
199 +            future.get();
200 +            assertTrue(task.done);
201 +        }
202 +        catch (ExecutionException ex) {
203 +            unexpectedException();
204 +        }
205 +        catch (InterruptedException ex) {
206 +            unexpectedException();
207 +        }
208 +    }
209 +
210 +    /**
211 +     * invoke of a runnable runs it to completion
212 +     */
213 +    public void testInvokeRunnable() {
214 +        try {
215 +            Executor e = new DirectExecutor();
216 +            TrackedShortRunnable task = new TrackedShortRunnable();
217 +            assertFalse(task.done);
218 +            Executors.invoke(e, task);
219 +            assertTrue(task.done);
220 +        }
221 +        catch (ExecutionException ex) {
222 +            unexpectedException();
223 +        }
224 +        catch (InterruptedException ex) {
225 +            unexpectedException();
226 +        }
227 +    }
228 +
229 +    /**
230 +     * execute of a callable runs it to completion
231 +     */
232 +    public void testExecuteCallable() {
233 +        try {
234 +            Executor e = new DirectExecutor();
235 +            Future<String> future = Executors.execute(e, new StringTask());
236 +            String result = future.get();
237 +            assertSame(TEST_STRING, result);
238 +        }
239 +        catch (ExecutionException ex) {
240 +            unexpectedException();
241 +        }
242 +        catch (InterruptedException ex) {
243 +            unexpectedException();
244 +        }
245 +    }
246 +
247 +
248 +    /**
249 +     * execute of a privileged action runs it to completion
250 +     */
251 +    public void testExecutePrivilegedAction() {
252 +        Policy savedPolicy = Policy.getPolicy();
253 +        AdjustablePolicy policy = new AdjustablePolicy();
254 +        policy.addPermission(new RuntimePermission("getContextClassLoader"));
255 +        policy.addPermission(new RuntimePermission("setContextClassLoader"));
256 +        Policy.setPolicy(policy);
257 +        try {
258 +            Executor e = new DirectExecutor();
259 +            Future future = Executors.execute(e, new PrivilegedAction() {
260 +                    public Object run() {
261 +                        return TEST_STRING;
262 +                    }});
263 +
264 +            Object result = future.get();
265 +            assertSame(TEST_STRING, result);
266 +        }
267 +        catch (ExecutionException ex) {
268 +            unexpectedException();
269 +        }
270 +        catch (InterruptedException ex) {
271 +            unexpectedException();
272 +        }
273 +        finally {
274 +            Policy.setPolicy(savedPolicy);
275 +        }
276 +    }
277 +
278 +    /**
279 +     * execute of a privileged exception action runs it to completion
280 +     */
281 +    public void testExecutePrivilegedExceptionAction() {
282 +        Policy savedPolicy = Policy.getPolicy();
283 +        AdjustablePolicy policy = new AdjustablePolicy();
284 +        policy.addPermission(new RuntimePermission("getContextClassLoader"));
285 +        policy.addPermission(new RuntimePermission("setContextClassLoader"));
286 +        Policy.setPolicy(policy);
287 +        try {
288 +            Executor e = new DirectExecutor();
289 +            Future future = Executors.execute(e, new PrivilegedExceptionAction() {
290 +                    public Object run() {
291 +                        return TEST_STRING;
292 +                    }});
293 +
294 +            Object result = future.get();
295 +            assertSame(TEST_STRING, result);
296 +        }
297 +        catch (ExecutionException ex) {
298 +            unexpectedException();
299 +        }
300 +        catch (InterruptedException ex) {
301 +            unexpectedException();
302 +        }
303 +        finally {
304 +            Policy.setPolicy(savedPolicy);
305 +        }
306 +    }
307 +
308 +    /**
309 +     * execute of a failed privileged exception action reports exception
310 +     */
311 +    public void testExecuteFailedPrivilegedExceptionAction() {
312 +        Policy savedPolicy = Policy.getPolicy();
313 +        AdjustablePolicy policy = new AdjustablePolicy();
314 +        policy.addPermission(new RuntimePermission("getContextClassLoader"));
315 +        policy.addPermission(new RuntimePermission("setContextClassLoader"));
316 +        Policy.setPolicy(policy);
317 +        try {
318 +            Executor e = new DirectExecutor();
319 +            Future future = Executors.execute(e, new PrivilegedExceptionAction() {
320 +                    public Object run() throws Exception {
321 +                        throw new IndexOutOfBoundsException();
322 +                    }});
323 +
324 +            Object result = future.get();
325 +            shouldThrow();
326 +        }
327 +        catch (ExecutionException success) {
328 +        }
329 +        catch (InterruptedException ex) {
330 +            unexpectedException();
331 +        }
332 +        finally {
333 +            Policy.setPolicy(savedPolicy);
334 +        }
335 +    }
336  
337      /**
338 <     *  Test to verify execute(Executor, Runnable) will throw
55 <     *  RejectedExecutionException Attempting to execute a runnable on
56 <     *  a full ThreadPool will cause such an exception here, up to 5
57 <     *  runnables are attempted on a pool capable on handling one
58 <     *  until it throws an exception
338 >     * invoke of a collable runs it to completion
339       */
340 <    public void testExecute1(){
341 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
342 <        try{
340 >    public void testInvokeCallable() {
341 >        try {
342 >            Executor e = new DirectExecutor();
343 >            String result = Executors.invoke(e, new StringTask());
344 >
345 >            assertSame(TEST_STRING, result);
346 >        }
347 >        catch (ExecutionException ex) {
348 >            unexpectedException();
349 >        }
350 >        catch (InterruptedException ex) {
351 >            unexpectedException();
352 >        }
353 >    }
354 >
355 >    /**
356 >     * execute with null executor throws NPE
357 >     */
358 >    public void testNullExecuteRunnable() {
359 >        try {
360 >            TrackedShortRunnable task = new TrackedShortRunnable();
361 >            assertFalse(task.done);
362 >            Future<?> future = Executors.execute(null, task);
363 >            shouldThrow();
364 >        }
365 >        catch (NullPointerException success) {
366 >        }
367 >        catch (Exception ex) {
368 >            unexpectedException();
369 >        }
370 >    }
371 >
372 >    /**
373 >     * execute with a null runnable throws NPE
374 >     */
375 >    public void testExecuteNullRunnable() {
376 >        try {
377 >            Executor e = new DirectExecutor();
378 >            TrackedShortRunnable task = null;
379 >            Future<?> future = Executors.execute(e, task);
380 >            shouldThrow();
381 >        }
382 >        catch (NullPointerException success) {
383 >        }
384 >        catch (Exception ex) {
385 >            unexpectedException();
386 >        }
387 >    }
388 >
389 >    /**
390 >     * invoke of a null runnable throws NPE
391 >     */
392 >    public void testInvokeNullRunnable() {
393 >        try {
394 >            Executor e = new DirectExecutor();
395 >            TrackedShortRunnable task = null;
396 >            Executors.invoke(e, task);
397 >            shouldThrow();
398 >        }
399 >        catch (NullPointerException success) {
400 >        }
401 >        catch (Exception ex) {
402 >            unexpectedException();
403 >        }
404 >    }
405 >
406 >    /**
407 >     * execute of a null callable throws NPE
408 >     */
409 >    public void testExecuteNullCallable() {
410 >        try {
411 >            Executor e = new DirectExecutor();
412 >            StringTask t = null;
413 >            Future<String> future = Executors.execute(e, t);
414 >            shouldThrow();
415 >        }
416 >        catch (NullPointerException success) {
417 >        }
418 >        catch (Exception ex) {
419 >            unexpectedException();
420 >        }
421 >    }
422 >
423 >    /**
424 >     * invoke of a null callable throws NPE
425 >     */
426 >    public void testInvokeNullCallable() {
427 >        try {
428 >            Executor e = new DirectExecutor();
429 >            StringTask t = null;
430 >            String result = Executors.invoke(e, t);
431 >            shouldThrow();
432 >        }
433 >        catch (NullPointerException success) {
434 >        }
435 >        catch (Exception ex) {
436 >            unexpectedException();
437 >        }
438 >    }
439 >
440 >    /**
441 >     *  execute(Executor, Runnable) throws RejectedExecutionException
442 >     *  if saturated.
443 >     */
444 >    public void testExecute1() {
445 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
446 >        try {
447              
448              for(int i = 0; i < 5; ++i){
449 <                Executors.execute(p, new SleepRun(), Boolean.TRUE);
449 >                Executors.execute(p, new MediumRunnable());
450              }
451 <            fail("should throw");
451 >            shouldThrow();
452          } catch(RejectedExecutionException success){}
453 <        p.shutdownNow();
453 >        joinPool(p);
454      }
455  
456      /**
457 <     *  Test to verify execute(Executor, Callable) will throw
458 <     *  RejectedExecutionException Attempting to execute a callable on
75 <     *  a full ThreadPool will cause such an exception here, up to 5
76 <     *  runnables are attempted on a pool capable on handling one
77 <     *  until it throws an exception
457 >     *  execute(Executor, Callable)throws RejectedExecutionException
458 >     *  if saturated.
459       */
460 <    public void testExecute2(){
461 <         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
462 <        try{
460 >    public void testExecute2() {
461 >         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
462 >        try {
463              for(int i = 0; i < 5; ++i) {
464 <                Executors.execute(p, new SleepCall());
464 >                Executors.execute(p, new SmallCallable());
465              }
466 <            fail("should throw");
467 <        }catch(RejectedExecutionException e){}
468 <        p.shutdownNow();
466 >            shouldThrow();
467 >        } catch(RejectedExecutionException e){}
468 >        joinPool(p);
469      }
470  
471  
472      /**
473 <     *  Test to verify invoke(Executor, Runnable) throws InterruptedException
474 <     *  A single use of invoke starts that will wait long enough
94 <     *  for the invoking thread to be interrupted
473 >     *  invoke(Executor, Runnable) throws InterruptedException if
474 >     *  caller interrupted.
475       */
476 <    public void testInvoke2(){
477 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
476 >    public void testInterruptedInvoke() {
477 >        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
478          Thread t = new Thread(new Runnable() {
479 <                public void run(){
480 <                    try{
481 <                        Executors.invoke(p,new Runnable(){
482 <                                public void run(){
483 <                                    try{
479 >                public void run() {
480 >                    try {
481 >                        Executors.invoke(p,new Runnable() {
482 >                                public void run() {
483 >                                    try {
484                                          Thread.sleep(MEDIUM_DELAY_MS);
485 <                                        fail("should throw");
486 <                                    }catch(InterruptedException e){
485 >                                        shouldThrow();
486 >                                    } catch(InterruptedException e){
487                                      }
488                                  }
489                              });
490                      } catch(InterruptedException success){
491                      } catch(Exception e) {
492 <                        fail("unexpected exception");
492 >                        unexpectedException();
493                      }
494                      
495                  }
496              });
497 <        try{
497 >        try {
498              t.start();
499              Thread.sleep(SHORT_DELAY_MS);
500              t.interrupt();
501 <        }catch(Exception e){
502 <            fail("unexpected exception");
501 >        } catch(Exception e){
502 >            unexpectedException();
503          }
504 <        p.shutdownNow();
504 >        joinPool(p);
505      }
506  
507      /**
508 <     *  Test to verify invoke(Executor, Runnable) will throw
509 <     *  ExecutionException An ExecutionException occurs when the
130 <     *  underlying Runnable throws an exception, here the
131 <     *  DivideByZeroException will cause an ExecutionException
508 >     *  invoke(Executor, Runnable) throws ExecutionException if
509 >     *  runnable throws exception.
510       */
511 <    public void testInvoke3(){
512 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
513 <        try{
514 <            Runnable r = new Runnable(){
515 <                    public void run(){
511 >    public void testInvoke3() {
512 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
513 >        try {
514 >            Runnable r = new Runnable() {
515 >                    public void run() {
516                          int i = 5/0;
517                      }
518                  };
# Line 143 | Line 521 | public class ExecutorsTest extends TestC
521                  Executors.invoke(p,r);
522              }
523              
524 <            fail("should throw");
524 >            shouldThrow();
525          } catch(ExecutionException success){
526          } catch(Exception e){
527 <            fail("should throw EE");
527 >            unexpectedException();
528          }
529 <        p.shutdownNow();
529 >        joinPool(p);
530      }
531  
532  
533  
534      /**
535 <     *  Test to verify invoke(Executor, Callable) throws
536 <     *  InterruptedException A single use of invoke starts that will
159 <     *  wait long enough for the invoking thread to be interrupted
535 >     *  invoke(Executor, Callable) throws InterruptedException if
536 >     *  callable throws exception
537       */
538 <    public void testInvoke5(){
539 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
538 >    public void testInvoke5() {
539 >        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
540          
541 <        final Callable c = new Callable(){
542 <                public Object call(){
543 <                    try{
544 <                        Executors.invoke(p, new SleepCall());
545 <                        fail("should throw");
546 <                    }catch(InterruptedException e){}
541 >        final Callable c = new Callable() {
542 >                public Object call() {
543 >                    try {
544 >                        Executors.invoke(p, new SmallCallable());
545 >                        shouldThrow();
546 >                    } catch(InterruptedException e){}
547                      catch(RejectedExecutionException e2){}
548                      catch(ExecutionException e3){}
549                      return Boolean.TRUE;
# Line 175 | Line 552 | public class ExecutorsTest extends TestC
552  
553  
554          
555 <        Thread t = new Thread(new Runnable(){
556 <                public void run(){
557 <                    try{
555 >        Thread t = new Thread(new Runnable() {
556 >                public void run() {
557 >                    try {
558                          c.call();
559 <                    }catch(Exception e){}
559 >                    } catch(Exception e){}
560                  }
561            });
562 <        try{
562 >        try {
563              t.start();
564              Thread.sleep(SHORT_DELAY_MS);
565              t.interrupt();
566              t.join();
567 <        }catch(InterruptedException e){
568 <            fail("unexpected exception");
567 >        } catch(InterruptedException e){
568 >            unexpectedException();
569          }
570          
571 <        p.shutdownNow();
571 >        joinPool(p);
572      }
573  
574      /**
575 <     *  Test to verify invoke(Executor, Callable) will throw ExecutionException
576 <     *  An ExecutionException occurs when the underlying Runnable throws
200 <     *  an exception, here the DivideByZeroException will cause an ExecutionException
575 >     *  invoke(Executor, Callable) will throw ExecutionException
576 >     *  if callable throws exception
577       */
578 <    public void testInvoke6(){
579 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
578 >    public void testInvoke6() {
579 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
580  
581 <        try{
582 <            Callable c = new Callable(){
583 <                    public Object call(){
581 >        try {
582 >            Callable c = new Callable() {
583 >                    public Object call() {
584                          int i = 5/0;
585                          return Boolean.TRUE;
586                      }
# Line 214 | Line 590 | public class ExecutorsTest extends TestC
590                  Executors.invoke(p,c);
591              }
592              
593 <            fail("should throw");
594 <        }catch(RejectedExecutionException e){}
595 <        catch(InterruptedException e2){}
596 <        catch(ExecutionException e3){}
597 <        p.shutdownNow();
222 <    }
223 <
224 <    public void testExecuteRunnable () {
225 <        try {
226 <            Executor e = new DirectExecutor();
227 <            Task task = new Task();
228 <
229 <            assertFalse("task should not be complete", task.isCompleted());
230 <
231 <            Future<String> future = Executors.execute(e, task, TEST_STRING);
232 <            String result = future.get();
233 <
234 <            assertTrue("task should be complete", task.isCompleted());
235 <            assertSame("should return test string", TEST_STRING, result);
236 <        }
237 <        catch (ExecutionException ex) {
238 <            fail("Unexpected exception");
239 <        }
240 <        catch (InterruptedException ex) {
241 <            fail("Unexpected exception");
242 <        }
243 <    }
244 <
245 <    public void testInvokeRunnable () {
246 <        try {
247 <            Executor e = new DirectExecutor();
248 <            Task task = new Task();
249 <
250 <            assertFalse("task should not be complete", task.isCompleted());
251 <
252 <            Executors.invoke(e, task);
253 <
254 <            assertTrue("task should be complete", task.isCompleted());
255 <        }
256 <        catch (ExecutionException ex) {
257 <            fail("Unexpected exception");
258 <        }
259 <        catch (InterruptedException ex) {
260 <            fail("Unexpected exception");
261 <        }
262 <    }
263 <
264 <    public void testExecuteCallable () {
265 <        try {
266 <            Executor e = new DirectExecutor();
267 <            Future<String> future = Executors.execute(e, new StringTask());
268 <            String result = future.get();
269 <
270 <            assertSame("should return test string", TEST_STRING, result);
271 <        }
272 <        catch (ExecutionException ex) {
273 <            fail("Unexpected exception");
274 <        }
275 <        catch (InterruptedException ex) {
276 <            fail("Unexpected exception");
277 <        }
278 <    }
279 <
280 <    public void testInvokeCallable () {
281 <        try {
282 <            Executor e = new DirectExecutor();
283 <            String result = Executors.invoke(e, new StringTask());
284 <
285 <            assertSame("should return test string", TEST_STRING, result);
286 <        }
287 <        catch (ExecutionException ex) {
288 <            fail("Unexpected exception" );
289 <        }
290 <        catch (InterruptedException ex) {
291 <            fail("Unexpected exception");
593 >            shouldThrow();
594 >        }
595 >        catch(ExecutionException success){
596 >        } catch(Exception e) {
597 >            unexpectedException();
598          }
599 +        joinPool(p);
600      }
601  
295    private static final String TEST_STRING = "a test string";
296
297    private static class Task implements Runnable {
298        public void run() { completed = true; }
299        public boolean isCompleted() { return completed; }
300        public void reset() { completed = false; }
301        private boolean completed = false;
302    }
303
304    private static class StringTask implements Callable<String> {
305        public String call() { return TEST_STRING; }
306    }
602  
308    static class DirectExecutor implements Executor {
309        public void execute(Runnable r) {
310            r.run();
311        }
312    }
603  
604      /**
605 <     * Check that timeouts from execute will time out if they compute
316 <     * too long.
605 >     *  timeouts from execute will time out if they compute too long.
606       */
318
607      public void testTimedCallable() {
608          int N = 10000;
609          ExecutorService executor = Executors.newSingleThreadExecutor();
# Line 341 | Line 629 | public class ExecutorsTest extends TestC
629                      return;
630                  }
631                  catch (Exception e) {
632 <                    fail("unexpected exception: " + e);
632 >                    unexpectedException();
633                  }
634              }
635              // if by chance we didn't ever time out, total time must be small
# Line 349 | Line 637 | public class ExecutorsTest extends TestC
637              assertTrue(elapsed < N);
638          }
639          finally {
640 <            executor.shutdownNow();
640 >            joinPool(executor);
641          }
642      }
643  
644      
645 <    static class TimedCallable<T> implements Callable<T> {
646 <        private final Executor exec;
647 <        private final Callable<T> func;
648 <        private final long msecs;
649 <        
650 <        TimedCallable(Executor exec, Callable<T> func, long msecs) {
651 <            this.exec = exec;
652 <            this.func = func;
653 <            this.msecs = msecs;
654 <        }
645 >    /**
646 >     * ThreadPoolExecutor using defaultThreadFactory has
647 >     * specified group, priority, daemon status, and name
648 >     */
649 >    public void testDefaultThreadFactory() {
650 >        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
651 >        Runnable r = new Runnable() {
652 >                public void run() {
653 >                    Thread current = Thread.currentThread();
654 >                    threadAssertTrue(!current.isDaemon());
655 >                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
656 >                    ThreadGroup g = current.getThreadGroup();
657 >                    SecurityManager s = System.getSecurityManager();
658 >                    if (s != null)
659 >                        threadAssertTrue(g == s.getThreadGroup());
660 >                    else
661 >                        threadAssertTrue(g == egroup);
662 >                    String name = current.getName();
663 >                    threadAssertTrue(name.endsWith("thread-1"));
664 >                }
665 >            };
666 >        ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
667          
668 <        public T call() throws Exception {
669 <            Future<T> ftask = Executors.execute(exec, func);
670 <            try {
671 <                return ftask.get(msecs, TimeUnit.MILLISECONDS);
672 <            } finally {
673 <                ftask.cancel(true);
674 <            }
668 >        e.execute(r);
669 >        e.shutdown();
670 >        try {
671 >            Thread.sleep(SHORT_DELAY_MS);
672 >        } catch (Exception eX) {
673 >            unexpectedException();
674 >        } finally {
675 >            joinPool(e);
676          }
677      }
678  
679 <
680 <    private static class Fib implements Callable<BigInteger> {
681 <        private final BigInteger n;
682 <        Fib(long n) {
683 <            if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
684 <            this.n = BigInteger.valueOf(n);
685 <        }
686 <        public BigInteger call() {
687 <            BigInteger f1 = BigInteger.ONE;
688 <            BigInteger f2 = f1;
689 <            for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
690 <                BigInteger t = f1.add(f2);
691 <                f1 = f2;
692 <                f2 = t;
693 <            }
694 <            return f1;
679 >    /**
680 >     * ThreadPoolExecutor using privilegedThreadFactory has
681 >     * specified group, priority, daemon status, name,
682 >     * access control context and context class loader
683 >     */
684 >    public void testPrivilegedThreadFactory() {
685 >        Policy savedPolicy = Policy.getPolicy();
686 >        AdjustablePolicy policy = new AdjustablePolicy();
687 >        policy.addPermission(new RuntimePermission("getContextClassLoader"));
688 >        policy.addPermission(new RuntimePermission("setContextClassLoader"));
689 >        Policy.setPolicy(policy);
690 >        final ThreadGroup egroup = Thread.currentThread().getThreadGroup();
691 >        final ClassLoader thisccl = Thread.currentThread().getContextClassLoader();
692 >        final AccessControlContext thisacc = AccessController.getContext();
693 >        Runnable r = new Runnable() {
694 >                public void run() {
695 >                    Thread current = Thread.currentThread();
696 >                    threadAssertTrue(!current.isDaemon());
697 >                    threadAssertTrue(current.getPriority() == Thread.NORM_PRIORITY);
698 >                    ThreadGroup g = current.getThreadGroup();
699 >                    SecurityManager s = System.getSecurityManager();
700 >                    if (s != null)
701 >                        threadAssertTrue(g == s.getThreadGroup());
702 >                    else
703 >                        threadAssertTrue(g == egroup);
704 >                    String name = current.getName();
705 >                    threadAssertTrue(name.endsWith("thread-1"));
706 >                    threadAssertTrue(thisccl == current.getContextClassLoader());
707 >                    threadAssertTrue(thisacc.equals(AccessController.getContext()));
708 >                }
709 >            };
710 >        ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory());
711 >        
712 >        Policy.setPolicy(savedPolicy);
713 >        e.execute(r);
714 >        e.shutdown();
715 >        try {
716 >            Thread.sleep(SHORT_DELAY_MS);
717 >        } catch (Exception ex) {
718 >            unexpectedException();
719 >        } finally {
720 >            joinPool(e);
721          }
395    };
396
722  
723 +    }
724  
725   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines