ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.6
Committed: Fri Nov 20 06:33:25 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +20 -22 lines
Log Message:
various bug fixes for perplexing test failures

File Contents

# User Rev Content
1 dl 1.1 /*
2     * 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     * http://creativecommons.org/licenses/publicdomain
5 jsr166 1.2 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     import java.util.concurrent.*;
10     import java.util.concurrent.locks.*;
11    
12     import junit.framework.*;
13     import java.util.*;
14    
15     public class ThreadPoolExecutorSubclassTest extends JSR166TestCase {
16     public static void main(String[] args) {
17 jsr166 1.6 junit.textui.TestRunner.run(suite());
18 dl 1.1 }
19     public static Test suite() {
20 jsr166 1.6 return new TestSuite(ThreadPoolExecutorSubclassTest.class);
21 dl 1.1 }
22    
23     static class CustomTask<V> implements RunnableFuture<V> {
24     final Callable<V> callable;
25     final ReentrantLock lock = new ReentrantLock();
26     final Condition cond = lock.newCondition();
27     boolean done;
28     boolean cancelled;
29     V result;
30     Thread thread;
31     Exception exception;
32 jsr166 1.6 CustomTask(Callable<V> c) {
33     if (c == null) throw new NullPointerException();
34     callable = c;
35     }
36     CustomTask(final Runnable r, final V res) {
37     if (r == null) throw new NullPointerException();
38     callable = new Callable<V>() {
39 jsr166 1.2 public V call() throws Exception { r.run(); return res; }};
40 dl 1.1 }
41     public boolean isDone() {
42     lock.lock(); try { return done; } finally { lock.unlock() ; }
43     }
44     public boolean isCancelled() {
45     lock.lock(); try { return cancelled; } finally { lock.unlock() ; }
46     }
47     public boolean cancel(boolean mayInterrupt) {
48     lock.lock();
49     try {
50     if (!done) {
51     cancelled = true;
52     done = true;
53 jsr166 1.2 if (mayInterrupt && thread != null)
54 dl 1.1 thread.interrupt();
55     return true;
56     }
57     return false;
58     }
59     finally { lock.unlock() ; }
60     }
61     public void run() {
62     boolean runme;
63     lock.lock();
64     try {
65     runme = !done;
66     if (!runme)
67     thread = Thread.currentThread();
68     }
69     finally { lock.unlock() ; }
70     if (!runme) return;
71     V v = null;
72     Exception e = null;
73     try {
74     v = callable.call();
75     }
76 jsr166 1.3 catch (Exception ex) {
77 dl 1.1 e = ex;
78     }
79     lock.lock();
80     try {
81     result = v;
82     exception = e;
83     done = true;
84     thread = null;
85     cond.signalAll();
86     }
87     finally { lock.unlock(); }
88     }
89     public V get() throws InterruptedException, ExecutionException {
90     lock.lock();
91     try {
92 jsr166 1.2 while (!done)
93 dl 1.1 cond.await();
94     if (exception != null)
95     throw new ExecutionException(exception);
96     return result;
97     }
98     finally { lock.unlock(); }
99     }
100     public V get(long timeout, TimeUnit unit)
101 jsr166 1.4 throws InterruptedException, ExecutionException, TimeoutException {
102 dl 1.1 long nanos = unit.toNanos(timeout);
103     lock.lock();
104     try {
105     for (;;) {
106     if (done) break;
107     if (nanos < 0)
108     throw new TimeoutException();
109     nanos = cond.awaitNanos(nanos);
110     }
111     if (exception != null)
112     throw new ExecutionException(exception);
113     return result;
114     }
115     finally { lock.unlock(); }
116     }
117 jsr166 1.2 }
118    
119 dl 1.1
120     static class CustomTPE extends ThreadPoolExecutor {
121     protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
122     return new CustomTask<V>(c);
123     }
124     protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) {
125     return new CustomTask<V>(r, v);
126 jsr166 1.2 }
127    
128 dl 1.1 CustomTPE(int corePoolSize,
129     int maximumPoolSize,
130     long keepAliveTime,
131     TimeUnit unit,
132     BlockingQueue<Runnable> workQueue) {
133 jsr166 1.2 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
134 dl 1.1 workQueue);
135     }
136     CustomTPE(int corePoolSize,
137     int maximumPoolSize,
138     long keepAliveTime,
139     TimeUnit unit,
140     BlockingQueue<Runnable> workQueue,
141     ThreadFactory threadFactory) {
142     super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
143     threadFactory);
144     }
145    
146     CustomTPE(int corePoolSize,
147     int maximumPoolSize,
148     long keepAliveTime,
149     TimeUnit unit,
150     BlockingQueue<Runnable> workQueue,
151     RejectedExecutionHandler handler) {
152     super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
153     handler);
154     }
155     CustomTPE(int corePoolSize,
156     int maximumPoolSize,
157     long keepAliveTime,
158     TimeUnit unit,
159     BlockingQueue<Runnable> workQueue,
160     ThreadFactory threadFactory,
161     RejectedExecutionHandler handler) {
162 jsr166 1.2 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
163 dl 1.1 workQueue, threadFactory, handler);
164     }
165    
166     volatile boolean beforeCalled = false;
167     volatile boolean afterCalled = false;
168     volatile boolean terminatedCalled = false;
169     public CustomTPE() {
170     super(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
171     }
172     protected void beforeExecute(Thread t, Runnable r) {
173     beforeCalled = true;
174     }
175     protected void afterExecute(Runnable r, Throwable t) {
176     afterCalled = true;
177     }
178     protected void terminated() {
179     terminatedCalled = true;
180     }
181 jsr166 1.2
182 dl 1.1 }
183    
184 jsr166 1.4 static class FailingThreadFactory implements ThreadFactory {
185 dl 1.1 int calls = 0;
186 jsr166 1.4 public Thread newThread(Runnable r) {
187 dl 1.1 if (++calls > 1) return null;
188     return new Thread(r);
189 jsr166 1.2 }
190 dl 1.1 }
191 jsr166 1.2
192 dl 1.1
193     /**
194     * execute successfully executes a runnable
195     */
196 jsr166 1.5 public void testExecute() throws InterruptedException {
197 dl 1.1 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
198     try {
199 jsr166 1.5 p1.execute(new ShortRunnable());
200 dl 1.1 Thread.sleep(SMALL_DELAY_MS);
201 jsr166 1.5 } finally {
202     joinPool(p1);
203 jsr166 1.2 }
204 dl 1.1 }
205    
206     /**
207     * getActiveCount increases but doesn't overestimate, when a
208     * thread becomes active
209     */
210 jsr166 1.5 public void testGetActiveCount() throws InterruptedException {
211 dl 1.1 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
212     assertEquals(0, p2.getActiveCount());
213     p2.execute(new MediumRunnable());
214 jsr166 1.5 Thread.sleep(SHORT_DELAY_MS);
215 dl 1.1 assertEquals(1, p2.getActiveCount());
216     joinPool(p2);
217     }
218    
219     /**
220     * prestartCoreThread starts a thread if under corePoolSize, else doesn't
221     */
222     public void testPrestartCoreThread() {
223     ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
224     assertEquals(0, p2.getPoolSize());
225     assertTrue(p2.prestartCoreThread());
226     assertEquals(1, p2.getPoolSize());
227     assertTrue(p2.prestartCoreThread());
228     assertEquals(2, p2.getPoolSize());
229     assertFalse(p2.prestartCoreThread());
230     assertEquals(2, p2.getPoolSize());
231     joinPool(p2);
232     }
233    
234     /**
235     * prestartAllCoreThreads starts all corePoolSize threads
236     */
237     public void testPrestartAllCoreThreads() {
238     ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
239     assertEquals(0, p2.getPoolSize());
240     p2.prestartAllCoreThreads();
241     assertEquals(2, p2.getPoolSize());
242     p2.prestartAllCoreThreads();
243     assertEquals(2, p2.getPoolSize());
244     joinPool(p2);
245     }
246 jsr166 1.2
247 dl 1.1 /**
248     * getCompletedTaskCount increases, but doesn't overestimate,
249     * when tasks complete
250     */
251 jsr166 1.5 public void testGetCompletedTaskCount() throws InterruptedException {
252 dl 1.1 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
253     assertEquals(0, p2.getCompletedTaskCount());
254     p2.execute(new ShortRunnable());
255 jsr166 1.5 Thread.sleep(SMALL_DELAY_MS);
256 dl 1.1 assertEquals(1, p2.getCompletedTaskCount());
257 jsr166 1.3 try { p2.shutdown(); } catch (SecurityException ok) { return; }
258 dl 1.1 joinPool(p2);
259     }
260 jsr166 1.2
261 dl 1.1 /**
262     * getCorePoolSize returns size given in constructor if not otherwise set
263     */
264     public void testGetCorePoolSize() {
265     ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
266     assertEquals(1, p1.getCorePoolSize());
267     joinPool(p1);
268     }
269 jsr166 1.2
270 dl 1.1 /**
271     * getKeepAliveTime returns value given in constructor if not otherwise set
272     */
273     public void testGetKeepAliveTime() {
274     ThreadPoolExecutor p2 = new CustomTPE(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
275     assertEquals(1, p2.getKeepAliveTime(TimeUnit.SECONDS));
276     joinPool(p2);
277     }
278    
279    
280 jsr166 1.2 /**
281 dl 1.1 * getThreadFactory returns factory in constructor if not set
282     */
283     public void testGetThreadFactory() {
284     ThreadFactory tf = new SimpleThreadFactory();
285     ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), tf, new NoOpREHandler());
286     assertSame(tf, p.getThreadFactory());
287     joinPool(p);
288     }
289    
290 jsr166 1.2 /**
291 dl 1.1 * setThreadFactory sets the thread factory returned by getThreadFactory
292     */
293     public void testSetThreadFactory() {
294     ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
295     ThreadFactory tf = new SimpleThreadFactory();
296     p.setThreadFactory(tf);
297     assertSame(tf, p.getThreadFactory());
298     joinPool(p);
299     }
300    
301    
302 jsr166 1.2 /**
303 dl 1.1 * setThreadFactory(null) throws NPE
304     */
305     public void testSetThreadFactoryNull() {
306     ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
307     try {
308     p.setThreadFactory(null);
309     shouldThrow();
310     } catch (NullPointerException success) {
311     } finally {
312     joinPool(p);
313     }
314     }
315    
316 jsr166 1.2 /**
317 dl 1.1 * getRejectedExecutionHandler returns handler in constructor if not set
318     */
319     public void testGetRejectedExecutionHandler() {
320     RejectedExecutionHandler h = new NoOpREHandler();
321     ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), h);
322     assertSame(h, p.getRejectedExecutionHandler());
323     joinPool(p);
324     }
325    
326 jsr166 1.2 /**
327 dl 1.1 * setRejectedExecutionHandler sets the handler returned by
328     * getRejectedExecutionHandler
329     */
330     public void testSetRejectedExecutionHandler() {
331     ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
332     RejectedExecutionHandler h = new NoOpREHandler();
333     p.setRejectedExecutionHandler(h);
334     assertSame(h, p.getRejectedExecutionHandler());
335     joinPool(p);
336     }
337    
338    
339 jsr166 1.2 /**
340 dl 1.1 * setRejectedExecutionHandler(null) throws NPE
341     */
342     public void testSetRejectedExecutionHandlerNull() {
343     ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
344     try {
345     p.setRejectedExecutionHandler(null);
346     shouldThrow();
347     } catch (NullPointerException success) {
348     } finally {
349     joinPool(p);
350     }
351     }
352    
353 jsr166 1.2
354 dl 1.1 /**
355     * getLargestPoolSize increases, but doesn't overestimate, when
356     * multiple threads active
357     */
358 jsr166 1.5 public void testGetLargestPoolSize() throws InterruptedException {
359 dl 1.1 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
360 jsr166 1.5 assertEquals(0, p2.getLargestPoolSize());
361     p2.execute(new MediumRunnable());
362     p2.execute(new MediumRunnable());
363     Thread.sleep(SHORT_DELAY_MS);
364     assertEquals(2, p2.getLargestPoolSize());
365 dl 1.1 joinPool(p2);
366     }
367 jsr166 1.2
368 dl 1.1 /**
369     * getMaximumPoolSize returns value given in constructor if not
370     * otherwise set
371     */
372     public void testGetMaximumPoolSize() {
373     ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
374     assertEquals(2, p2.getMaximumPoolSize());
375     joinPool(p2);
376     }
377 jsr166 1.2
378 dl 1.1 /**
379     * getPoolSize increases, but doesn't overestimate, when threads
380     * become active
381     */
382     public void testGetPoolSize() {
383     ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
384     assertEquals(0, p1.getPoolSize());
385     p1.execute(new MediumRunnable());
386     assertEquals(1, p1.getPoolSize());
387     joinPool(p1);
388     }
389 jsr166 1.2
390 dl 1.1 /**
391     * getTaskCount increases, but doesn't overestimate, when tasks submitted
392     */
393 jsr166 1.5 public void testGetTaskCount() throws InterruptedException {
394 dl 1.1 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
395 jsr166 1.5 assertEquals(0, p1.getTaskCount());
396     p1.execute(new MediumRunnable());
397     Thread.sleep(SHORT_DELAY_MS);
398     assertEquals(1, p1.getTaskCount());
399 dl 1.1 joinPool(p1);
400     }
401 jsr166 1.2
402 dl 1.1 /**
403     * isShutDown is false before shutdown, true after
404     */
405     public void testIsShutdown() {
406 jsr166 1.2
407 dl 1.1 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
408     assertFalse(p1.isShutdown());
409 jsr166 1.3 try { p1.shutdown(); } catch (SecurityException ok) { return; }
410 dl 1.1 assertTrue(p1.isShutdown());
411     joinPool(p1);
412     }
413    
414 jsr166 1.2
415 dl 1.1 /**
416     * isTerminated is false before termination, true after
417     */
418 jsr166 1.5 public void testIsTerminated() throws InterruptedException {
419 dl 1.1 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
420     assertFalse(p1.isTerminated());
421     try {
422     p1.execute(new MediumRunnable());
423     } finally {
424 jsr166 1.3 try { p1.shutdown(); } catch (SecurityException ok) { return; }
425 dl 1.1 }
426 jsr166 1.5 assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
427     assertTrue(p1.isTerminated());
428 dl 1.1 }
429    
430     /**
431     * isTerminating is not true when running or when terminated
432     */
433 jsr166 1.5 public void testIsTerminating() throws InterruptedException {
434 dl 1.1 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
435     assertFalse(p1.isTerminating());
436     try {
437     p1.execute(new SmallRunnable());
438     assertFalse(p1.isTerminating());
439     } finally {
440 jsr166 1.3 try { p1.shutdown(); } catch (SecurityException ok) { return; }
441 dl 1.1 }
442 jsr166 1.5 assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
443     assertTrue(p1.isTerminated());
444     assertFalse(p1.isTerminating());
445 dl 1.1 }
446    
447     /**
448     * getQueue returns the work queue, which contains queued tasks
449     */
450 jsr166 1.5 public void testGetQueue() throws InterruptedException {
451 dl 1.1 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
452     ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
453     FutureTask[] tasks = new FutureTask[5];
454 jsr166 1.4 for (int i = 0; i < 5; i++) {
455 dl 1.1 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
456     p1.execute(tasks[i]);
457     }
458     try {
459     Thread.sleep(SHORT_DELAY_MS);
460     BlockingQueue<Runnable> wq = p1.getQueue();
461     assertSame(q, wq);
462     assertFalse(wq.contains(tasks[0]));
463     assertTrue(wq.contains(tasks[4]));
464     for (int i = 1; i < 5; ++i)
465     tasks[i].cancel(true);
466     p1.shutdownNow();
467     } finally {
468     joinPool(p1);
469     }
470     }
471    
472     /**
473     * remove(task) removes queued task, and fails to remove active task
474     */
475 jsr166 1.5 public void testRemove() throws InterruptedException {
476 dl 1.1 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
477     ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
478     FutureTask[] tasks = new FutureTask[5];
479 jsr166 1.4 for (int i = 0; i < 5; i++) {
480 dl 1.1 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
481     p1.execute(tasks[i]);
482     }
483     try {
484     Thread.sleep(SHORT_DELAY_MS);
485     assertFalse(p1.remove(tasks[0]));
486     assertTrue(q.contains(tasks[4]));
487     assertTrue(q.contains(tasks[3]));
488     assertTrue(p1.remove(tasks[4]));
489     assertFalse(p1.remove(tasks[4]));
490     assertFalse(q.contains(tasks[4]));
491     assertTrue(q.contains(tasks[3]));
492     assertTrue(p1.remove(tasks[3]));
493     assertFalse(q.contains(tasks[3]));
494     } finally {
495     joinPool(p1);
496     }
497     }
498    
499     /**
500     * purge removes cancelled tasks from the queue
501     */
502     public void testPurge() {
503     ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
504     FutureTask[] tasks = new FutureTask[5];
505 jsr166 1.4 for (int i = 0; i < 5; i++) {
506 dl 1.1 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
507     p1.execute(tasks[i]);
508     }
509     tasks[4].cancel(true);
510     tasks[3].cancel(true);
511     p1.purge();
512     long count = p1.getTaskCount();
513     assertTrue(count >= 2 && count < 5);
514     joinPool(p1);
515     }
516    
517     /**
518     * shutDownNow returns a list containing tasks that were not run
519     */
520     public void testShutDownNow() {
521     ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
522     List l;
523     try {
524 jsr166 1.3 for (int i = 0; i < 5; i++)
525 dl 1.1 p1.execute(new MediumPossiblyInterruptedRunnable());
526     }
527     finally {
528     try {
529     l = p1.shutdownNow();
530     } catch (SecurityException ok) { return; }
531 jsr166 1.2
532 dl 1.1 }
533     assertTrue(p1.isShutdown());
534     assertTrue(l.size() <= 4);
535     }
536    
537     // Exception Tests
538    
539 jsr166 1.2
540     /**
541     * Constructor throws if corePoolSize argument is less than zero
542 dl 1.1 */
543     public void testConstructor1() {
544     try {
545     new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
546     shouldThrow();
547 jsr166 1.5 } catch (IllegalArgumentException success) {}
548 dl 1.1 }
549 jsr166 1.2
550     /**
551     * Constructor throws if maximumPoolSize is less than zero
552 dl 1.1 */
553     public void testConstructor2() {
554     try {
555     new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
556     shouldThrow();
557 jsr166 1.5 } catch (IllegalArgumentException success) {}
558 dl 1.1 }
559 jsr166 1.2
560     /**
561     * Constructor throws if maximumPoolSize is equal to zero
562 dl 1.1 */
563     public void testConstructor3() {
564     try {
565     new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
566     shouldThrow();
567 jsr166 1.5 } catch (IllegalArgumentException success) {}
568 dl 1.1 }
569    
570 jsr166 1.2 /**
571     * Constructor throws if keepAliveTime is less than zero
572 dl 1.1 */
573     public void testConstructor4() {
574     try {
575     new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
576     shouldThrow();
577 jsr166 1.5 } catch (IllegalArgumentException success) {}
578 dl 1.1 }
579    
580 jsr166 1.2 /**
581     * Constructor throws if corePoolSize is greater than the maximumPoolSize
582 dl 1.1 */
583     public void testConstructor5() {
584     try {
585     new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
586     shouldThrow();
587 jsr166 1.5 } catch (IllegalArgumentException success) {}
588 dl 1.1 }
589 jsr166 1.2
590     /**
591     * Constructor throws if workQueue is set to null
592 dl 1.1 */
593     public void testConstructorNullPointerException() {
594     try {
595     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null);
596     shouldThrow();
597 jsr166 1.5 } catch (NullPointerException success) {}
598 dl 1.1 }
599    
600 jsr166 1.2
601    
602     /**
603     * Constructor throws if corePoolSize argument is less than zero
604 dl 1.1 */
605     public void testConstructor6() {
606     try {
607     new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
608     shouldThrow();
609 jsr166 1.4 } catch (IllegalArgumentException success) {}
610 dl 1.1 }
611 jsr166 1.2
612     /**
613     * Constructor throws if maximumPoolSize is less than zero
614 dl 1.1 */
615     public void testConstructor7() {
616     try {
617     new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
618     shouldThrow();
619 jsr166 1.5 } catch (IllegalArgumentException success) {}
620 dl 1.1 }
621    
622 jsr166 1.2 /**
623     * Constructor throws if maximumPoolSize is equal to zero
624 dl 1.1 */
625     public void testConstructor8() {
626     try {
627     new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
628     shouldThrow();
629 jsr166 1.5 } catch (IllegalArgumentException success) {}
630 dl 1.1 }
631    
632 jsr166 1.2 /**
633     * Constructor throws if keepAliveTime is less than zero
634 dl 1.1 */
635     public void testConstructor9() {
636     try {
637     new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
638     shouldThrow();
639 jsr166 1.5 } catch (IllegalArgumentException success) {}
640 dl 1.1 }
641    
642 jsr166 1.2 /**
643     * Constructor throws if corePoolSize is greater than the maximumPoolSize
644 dl 1.1 */
645     public void testConstructor10() {
646     try {
647     new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
648     shouldThrow();
649 jsr166 1.5 } catch (IllegalArgumentException success) {}
650 dl 1.1 }
651    
652 jsr166 1.2 /**
653     * Constructor throws if workQueue is set to null
654 dl 1.1 */
655     public void testConstructorNullPointerException2() {
656     try {
657     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory());
658     shouldThrow();
659 jsr166 1.5 } catch (NullPointerException success) {}
660 dl 1.1 }
661    
662 jsr166 1.2 /**
663     * Constructor throws if threadFactory is set to null
664 dl 1.1 */
665     public void testConstructorNullPointerException3() {
666     try {
667     ThreadFactory f = null;
668     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f);
669     shouldThrow();
670 jsr166 1.5 } catch (NullPointerException success) {}
671 dl 1.1 }
672 jsr166 1.2
673    
674     /**
675     * Constructor throws if corePoolSize argument is less than zero
676 dl 1.1 */
677     public void testConstructor11() {
678     try {
679     new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
680     shouldThrow();
681 jsr166 1.5 } catch (IllegalArgumentException success) {}
682 dl 1.1 }
683    
684 jsr166 1.2 /**
685     * Constructor throws if maximumPoolSize is less than zero
686 dl 1.1 */
687     public void testConstructor12() {
688     try {
689     new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
690     shouldThrow();
691 jsr166 1.5 } catch (IllegalArgumentException success) {}
692 dl 1.1 }
693    
694 jsr166 1.2 /**
695     * Constructor throws if maximumPoolSize is equal to zero
696 dl 1.1 */
697     public void testConstructor13() {
698     try {
699     new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
700     shouldThrow();
701 jsr166 1.5 } catch (IllegalArgumentException success) {}
702 dl 1.1 }
703    
704 jsr166 1.2 /**
705     * Constructor throws if keepAliveTime is less than zero
706 dl 1.1 */
707     public void testConstructor14() {
708     try {
709     new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
710     shouldThrow();
711 jsr166 1.5 } catch (IllegalArgumentException success) {}
712 dl 1.1 }
713    
714 jsr166 1.2 /**
715     * Constructor throws if corePoolSize is greater than the maximumPoolSize
716 dl 1.1 */
717     public void testConstructor15() {
718     try {
719     new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
720     shouldThrow();
721 jsr166 1.5 } catch (IllegalArgumentException success) {}
722 dl 1.1 }
723    
724 jsr166 1.2 /**
725     * Constructor throws if workQueue is set to null
726 dl 1.1 */
727     public void testConstructorNullPointerException4() {
728     try {
729     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new NoOpREHandler());
730     shouldThrow();
731 jsr166 1.5 } catch (NullPointerException success) {}
732 dl 1.1 }
733    
734 jsr166 1.2 /**
735     * Constructor throws if handler is set to null
736 dl 1.1 */
737     public void testConstructorNullPointerException5() {
738     try {
739     RejectedExecutionHandler r = null;
740     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),r);
741     shouldThrow();
742 jsr166 1.5 } catch (NullPointerException success) {}
743 dl 1.1 }
744    
745 jsr166 1.2
746     /**
747     * Constructor throws if corePoolSize argument is less than zero
748 dl 1.1 */
749     public void testConstructor16() {
750     try {
751     new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
752     shouldThrow();
753 jsr166 1.5 } catch (IllegalArgumentException success) {}
754 dl 1.1 }
755    
756 jsr166 1.2 /**
757     * Constructor throws if maximumPoolSize is less than zero
758 dl 1.1 */
759     public void testConstructor17() {
760     try {
761     new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
762     shouldThrow();
763 jsr166 1.5 } catch (IllegalArgumentException success) {}
764 dl 1.1 }
765    
766 jsr166 1.2 /**
767     * Constructor throws if maximumPoolSize is equal to zero
768 dl 1.1 */
769     public void testConstructor18() {
770     try {
771     new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
772     shouldThrow();
773 jsr166 1.5 } catch (IllegalArgumentException success) {}
774 dl 1.1 }
775    
776 jsr166 1.2 /**
777     * Constructor throws if keepAliveTime is less than zero
778 dl 1.1 */
779     public void testConstructor19() {
780     try {
781     new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
782     shouldThrow();
783 jsr166 1.5 } catch (IllegalArgumentException success) {}
784 dl 1.1 }
785    
786 jsr166 1.2 /**
787     * Constructor throws if corePoolSize is greater than the maximumPoolSize
788 dl 1.1 */
789     public void testConstructor20() {
790     try {
791     new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
792     shouldThrow();
793 jsr166 1.5 } catch (IllegalArgumentException success) {}
794 dl 1.1 }
795    
796 jsr166 1.2 /**
797     * Constructor throws if workQueue is set to null
798 dl 1.1 */
799     public void testConstructorNullPointerException6() {
800     try {
801     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory(),new NoOpREHandler());
802     shouldThrow();
803 jsr166 1.5 } catch (NullPointerException success) {}
804 dl 1.1 }
805    
806 jsr166 1.2 /**
807     * Constructor throws if handler is set to null
808 dl 1.1 */
809     public void testConstructorNullPointerException7() {
810     try {
811     RejectedExecutionHandler r = null;
812     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),r);
813     shouldThrow();
814 jsr166 1.5 } catch (NullPointerException success) {}
815 dl 1.1 }
816    
817 jsr166 1.2 /**
818     * Constructor throws if ThreadFactory is set top null
819 dl 1.1 */
820     public void testConstructorNullPointerException8() {
821     try {
822     ThreadFactory f = null;
823     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f,new NoOpREHandler());
824     shouldThrow();
825 jsr166 1.5 } catch (NullPointerException success) {}
826 dl 1.1 }
827 jsr166 1.2
828 dl 1.1
829     /**
830     * execute throws RejectedExecutionException
831     * if saturated.
832     */
833     public void testSaturatedExecute() {
834     ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
835     try {
836 jsr166 1.2
837 jsr166 1.4 for (int i = 0; i < 5; ++i) {
838 dl 1.1 p.execute(new MediumRunnable());
839     }
840     shouldThrow();
841 jsr166 1.4 } catch (RejectedExecutionException success) {}
842 dl 1.1 joinPool(p);
843     }
844    
845     /**
846     * executor using CallerRunsPolicy runs task if saturated.
847     */
848     public void testSaturatedExecute2() {
849     RejectedExecutionHandler h = new CustomTPE.CallerRunsPolicy();
850     ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
851     try {
852 jsr166 1.2
853 dl 1.1 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
854 jsr166 1.4 for (int i = 0; i < 5; ++i) {
855 dl 1.1 tasks[i] = new TrackedNoOpRunnable();
856     }
857     TrackedLongRunnable mr = new TrackedLongRunnable();
858     p.execute(mr);
859 jsr166 1.4 for (int i = 0; i < 5; ++i) {
860 dl 1.1 p.execute(tasks[i]);
861     }
862 jsr166 1.3 for (int i = 1; i < 5; ++i) {
863 dl 1.1 assertTrue(tasks[i].done);
864     }
865 jsr166 1.3 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
866 dl 1.1 } finally {
867     joinPool(p);
868     }
869     }
870    
871     /**
872     * executor using DiscardPolicy drops task if saturated.
873     */
874     public void testSaturatedExecute3() {
875     RejectedExecutionHandler h = new CustomTPE.DiscardPolicy();
876     ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
877     try {
878 jsr166 1.2
879 dl 1.1 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
880 jsr166 1.4 for (int i = 0; i < 5; ++i) {
881 dl 1.1 tasks[i] = new TrackedNoOpRunnable();
882     }
883     p.execute(new TrackedLongRunnable());
884 jsr166 1.4 for (int i = 0; i < 5; ++i) {
885 dl 1.1 p.execute(tasks[i]);
886     }
887 jsr166 1.4 for (int i = 0; i < 5; ++i) {
888 dl 1.1 assertFalse(tasks[i].done);
889     }
890 jsr166 1.3 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
891 dl 1.1 } finally {
892     joinPool(p);
893     }
894     }
895    
896     /**
897     * executor using DiscardOldestPolicy drops oldest task if saturated.
898     */
899     public void testSaturatedExecute4() {
900     RejectedExecutionHandler h = new CustomTPE.DiscardOldestPolicy();
901     ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
902     try {
903     p.execute(new TrackedLongRunnable());
904     TrackedLongRunnable r2 = new TrackedLongRunnable();
905     p.execute(r2);
906     assertTrue(p.getQueue().contains(r2));
907     TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
908     p.execute(r3);
909     assertFalse(p.getQueue().contains(r2));
910     assertTrue(p.getQueue().contains(r3));
911 jsr166 1.3 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
912 dl 1.1 } finally {
913     joinPool(p);
914     }
915     }
916    
917     /**
918     * execute throws RejectedExecutionException if shutdown
919     */
920     public void testRejectedExecutionExceptionOnShutdown() {
921 jsr166 1.2 ThreadPoolExecutor tpe =
922 dl 1.1 new CustomTPE(1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
923 jsr166 1.3 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
924 dl 1.1 try {
925     tpe.execute(new NoOpRunnable());
926     shouldThrow();
927 jsr166 1.4 } catch (RejectedExecutionException success) {}
928 jsr166 1.2
929 dl 1.1 joinPool(tpe);
930     }
931    
932     /**
933     * execute using CallerRunsPolicy drops task on shutdown
934     */
935     public void testCallerRunsOnShutdown() {
936     RejectedExecutionHandler h = new CustomTPE.CallerRunsPolicy();
937     ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
938    
939 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
940 dl 1.1 try {
941     TrackedNoOpRunnable r = new TrackedNoOpRunnable();
942     p.execute(r);
943     assertFalse(r.done);
944     } finally {
945     joinPool(p);
946     }
947     }
948    
949     /**
950     * execute using DiscardPolicy drops task on shutdown
951     */
952     public void testDiscardOnShutdown() {
953     RejectedExecutionHandler h = new CustomTPE.DiscardPolicy();
954     ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
955    
956 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
957 dl 1.1 try {
958     TrackedNoOpRunnable r = new TrackedNoOpRunnable();
959     p.execute(r);
960     assertFalse(r.done);
961     } finally {
962     joinPool(p);
963     }
964     }
965    
966    
967     /**
968     * execute using DiscardOldestPolicy drops task on shutdown
969     */
970     public void testDiscardOldestOnShutdown() {
971     RejectedExecutionHandler h = new CustomTPE.DiscardOldestPolicy();
972     ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
973    
974 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
975 dl 1.1 try {
976     TrackedNoOpRunnable r = new TrackedNoOpRunnable();
977     p.execute(r);
978     assertFalse(r.done);
979     } finally {
980     joinPool(p);
981     }
982     }
983    
984    
985     /**
986     * execute (null) throws NPE
987     */
988     public void testExecuteNull() {
989     ThreadPoolExecutor tpe = null;
990     try {
991     tpe = new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
992     tpe.execute(null);
993     shouldThrow();
994 jsr166 1.4 } catch (NullPointerException success) {}
995 jsr166 1.2
996 dl 1.1 joinPool(tpe);
997     }
998 jsr166 1.2
999 dl 1.1 /**
1000     * setCorePoolSize of negative value throws IllegalArgumentException
1001     */
1002     public void testCorePoolSizeIllegalArgumentException() {
1003 jsr166 1.6 ThreadPoolExecutor tpe =
1004     new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1005 dl 1.1 try {
1006     tpe.setCorePoolSize(-1);
1007     shouldThrow();
1008 jsr166 1.4 } catch (IllegalArgumentException success) {
1009 dl 1.1 } finally {
1010 jsr166 1.3 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1011 dl 1.1 }
1012     joinPool(tpe);
1013 jsr166 1.2 }
1014 dl 1.1
1015     /**
1016     * setMaximumPoolSize(int) throws IllegalArgumentException if
1017     * given a value less the core pool size
1018 jsr166 1.2 */
1019 dl 1.1 public void testMaximumPoolSizeIllegalArgumentException() {
1020     ThreadPoolExecutor tpe = null;
1021     try {
1022     tpe = new CustomTPE(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1023 jsr166 1.4 } catch (Exception e) {}
1024 dl 1.1 try {
1025     tpe.setMaximumPoolSize(1);
1026     shouldThrow();
1027 jsr166 1.4 } catch (IllegalArgumentException success) {
1028 dl 1.1 } finally {
1029 jsr166 1.3 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1030 dl 1.1 }
1031     joinPool(tpe);
1032     }
1033 jsr166 1.2
1034 dl 1.1 /**
1035     * setMaximumPoolSize throws IllegalArgumentException
1036     * if given a negative value
1037     */
1038     public void testMaximumPoolSizeIllegalArgumentException2() {
1039     ThreadPoolExecutor tpe = null;
1040     try {
1041     tpe = new CustomTPE(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1042 jsr166 1.4 } catch (Exception e) {}
1043 dl 1.1 try {
1044     tpe.setMaximumPoolSize(-1);
1045     shouldThrow();
1046 jsr166 1.4 } catch (IllegalArgumentException success) {
1047 dl 1.1 } finally {
1048 jsr166 1.3 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1049 dl 1.1 }
1050     joinPool(tpe);
1051     }
1052 jsr166 1.2
1053 dl 1.1
1054     /**
1055     * setKeepAliveTime throws IllegalArgumentException
1056     * when given a negative value
1057     */
1058     public void testKeepAliveTimeIllegalArgumentException() {
1059     ThreadPoolExecutor tpe = null;
1060     try {
1061     tpe = new CustomTPE(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1062 jsr166 1.4 } catch (Exception e) {}
1063 jsr166 1.2
1064 dl 1.1 try {
1065     tpe.setKeepAliveTime(-1,TimeUnit.MILLISECONDS);
1066     shouldThrow();
1067 jsr166 1.4 } catch (IllegalArgumentException success) {
1068 dl 1.1 } finally {
1069 jsr166 1.3 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1070 dl 1.1 }
1071     joinPool(tpe);
1072     }
1073    
1074     /**
1075     * terminated() is called on termination
1076     */
1077     public void testTerminated() {
1078     CustomTPE tpe = new CustomTPE();
1079 jsr166 1.3 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1080 dl 1.1 assertTrue(tpe.terminatedCalled);
1081     joinPool(tpe);
1082     }
1083    
1084     /**
1085     * beforeExecute and afterExecute are called when executing task
1086     */
1087 jsr166 1.5 public void testBeforeAfter() throws InterruptedException {
1088 dl 1.1 CustomTPE tpe = new CustomTPE();
1089     try {
1090     TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1091     tpe.execute(r);
1092     Thread.sleep(SHORT_DELAY_MS);
1093     assertTrue(r.done);
1094     assertTrue(tpe.beforeCalled);
1095     assertTrue(tpe.afterCalled);
1096 jsr166 1.3 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1097 dl 1.1 } finally {
1098     joinPool(tpe);
1099     }
1100     }
1101    
1102     /**
1103     * completed submit of callable returns result
1104     */
1105 jsr166 1.5 public void testSubmitCallable() throws Exception {
1106 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1107     try {
1108     Future<String> future = e.submit(new StringTask());
1109     String result = future.get();
1110     assertSame(TEST_STRING, result);
1111     } finally {
1112     joinPool(e);
1113     }
1114     }
1115    
1116     /**
1117     * completed submit of runnable returns successfully
1118     */
1119 jsr166 1.5 public void testSubmitRunnable() throws Exception {
1120 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1121     try {
1122     Future<?> future = e.submit(new NoOpRunnable());
1123     future.get();
1124     assertTrue(future.isDone());
1125     } finally {
1126     joinPool(e);
1127     }
1128     }
1129    
1130     /**
1131     * completed submit of (runnable, result) returns result
1132     */
1133 jsr166 1.5 public void testSubmitRunnable2() throws Exception {
1134 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1135     try {
1136     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1137     String result = future.get();
1138     assertSame(TEST_STRING, result);
1139     } finally {
1140     joinPool(e);
1141     }
1142     }
1143    
1144    
1145     /**
1146     * invokeAny(null) throws NPE
1147     */
1148 jsr166 1.5 public void testInvokeAny1() throws Exception {
1149 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1150     try {
1151     e.invokeAny(null);
1152 jsr166 1.5 shouldThrow();
1153 dl 1.1 } catch (NullPointerException success) {
1154     } finally {
1155     joinPool(e);
1156     }
1157     }
1158    
1159     /**
1160     * invokeAny(empty collection) throws IAE
1161     */
1162 jsr166 1.5 public void testInvokeAny2() throws Exception {
1163 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1164     try {
1165     e.invokeAny(new ArrayList<Callable<String>>());
1166 jsr166 1.5 shouldThrow();
1167 dl 1.1 } catch (IllegalArgumentException success) {
1168     } finally {
1169     joinPool(e);
1170     }
1171     }
1172    
1173     /**
1174     * invokeAny(c) throws NPE if c has null elements
1175     */
1176 jsr166 1.5 public void testInvokeAny3() throws Exception {
1177     final CountDownLatch latch = new CountDownLatch(1);
1178 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1179     try {
1180     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1181 jsr166 1.5 l.add(new CheckedCallable<String>() {
1182     public String realCall() throws InterruptedException {
1183     latch.await();
1184     return TEST_STRING;
1185     }});
1186 dl 1.1 l.add(null);
1187     e.invokeAny(l);
1188 jsr166 1.5 shouldThrow();
1189 dl 1.1 } catch (NullPointerException success) {
1190     } finally {
1191 jsr166 1.5 latch.countDown();
1192 dl 1.1 joinPool(e);
1193     }
1194     }
1195    
1196     /**
1197     * invokeAny(c) throws ExecutionException if no task completes
1198     */
1199 jsr166 1.5 public void testInvokeAny4() throws Exception {
1200 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1201     try {
1202     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1203     l.add(new NPETask());
1204     e.invokeAny(l);
1205 jsr166 1.5 shouldThrow();
1206 dl 1.1 } catch (ExecutionException success) {
1207     } finally {
1208     joinPool(e);
1209     }
1210     }
1211    
1212     /**
1213     * invokeAny(c) returns result of some task
1214     */
1215 jsr166 1.5 public void testInvokeAny5() throws Exception {
1216 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1217     try {
1218     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1219     l.add(new StringTask());
1220     l.add(new StringTask());
1221     String result = e.invokeAny(l);
1222     assertSame(TEST_STRING, result);
1223     } finally {
1224     joinPool(e);
1225     }
1226     }
1227    
1228     /**
1229     * invokeAll(null) throws NPE
1230     */
1231 jsr166 1.5 public void testInvokeAll1() throws Exception {
1232 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1233     try {
1234     e.invokeAll(null);
1235 jsr166 1.5 shouldThrow();
1236 dl 1.1 } catch (NullPointerException success) {
1237     } finally {
1238     joinPool(e);
1239     }
1240     }
1241    
1242     /**
1243     * invokeAll(empty collection) returns empty collection
1244     */
1245 jsr166 1.5 public void testInvokeAll2() throws Exception {
1246 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1247     try {
1248     List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1249     assertTrue(r.isEmpty());
1250     } finally {
1251     joinPool(e);
1252     }
1253     }
1254    
1255     /**
1256     * invokeAll(c) throws NPE if c has null elements
1257     */
1258 jsr166 1.5 public void testInvokeAll3() throws Exception {
1259 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1260     try {
1261     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1262     l.add(new StringTask());
1263     l.add(null);
1264     e.invokeAll(l);
1265 jsr166 1.5 shouldThrow();
1266 dl 1.1 } catch (NullPointerException success) {
1267     } finally {
1268     joinPool(e);
1269     }
1270     }
1271    
1272     /**
1273     * get of element of invokeAll(c) throws exception on failed task
1274     */
1275 jsr166 1.5 public void testInvokeAll4() throws Exception {
1276 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1277     try {
1278     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1279     l.add(new NPETask());
1280     List<Future<String>> result = e.invokeAll(l);
1281     assertEquals(1, result.size());
1282 jsr166 1.6 for (Future<String> future : result)
1283     future.get();
1284 jsr166 1.5 shouldThrow();
1285 jsr166 1.3 } catch (ExecutionException success) {
1286 dl 1.1 } finally {
1287     joinPool(e);
1288     }
1289     }
1290    
1291     /**
1292     * invokeAll(c) returns results of all completed tasks
1293     */
1294 jsr166 1.5 public void testInvokeAll5() throws Exception {
1295 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1296     try {
1297     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1298     l.add(new StringTask());
1299     l.add(new StringTask());
1300     List<Future<String>> result = e.invokeAll(l);
1301     assertEquals(2, result.size());
1302 jsr166 1.6 for (Future<String> future : result)
1303     assertSame(TEST_STRING, future.get());
1304 dl 1.1 } finally {
1305     joinPool(e);
1306     }
1307     }
1308    
1309    
1310    
1311     /**
1312     * timed invokeAny(null) throws NPE
1313     */
1314 jsr166 1.5 public void testTimedInvokeAny1() throws Exception {
1315 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1316     try {
1317     e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1318 jsr166 1.5 shouldThrow();
1319 dl 1.1 } catch (NullPointerException success) {
1320     } finally {
1321     joinPool(e);
1322     }
1323     }
1324    
1325     /**
1326     * timed invokeAny(,,null) throws NPE
1327     */
1328 jsr166 1.5 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1329 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1330     try {
1331     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1332     l.add(new StringTask());
1333     e.invokeAny(l, MEDIUM_DELAY_MS, null);
1334 jsr166 1.5 shouldThrow();
1335 dl 1.1 } catch (NullPointerException success) {
1336     } finally {
1337     joinPool(e);
1338     }
1339     }
1340    
1341     /**
1342     * timed invokeAny(empty collection) throws IAE
1343     */
1344 jsr166 1.5 public void testTimedInvokeAny2() throws Exception {
1345 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1346     try {
1347     e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1348 jsr166 1.5 shouldThrow();
1349 dl 1.1 } catch (IllegalArgumentException success) {
1350     } finally {
1351     joinPool(e);
1352     }
1353     }
1354    
1355     /**
1356     * timed invokeAny(c) throws NPE if c has null elements
1357     */
1358 jsr166 1.5 public void testTimedInvokeAny3() throws Exception {
1359 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1360     try {
1361     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1362     l.add(new StringTask());
1363     l.add(null);
1364     e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1365 jsr166 1.5 shouldThrow();
1366 dl 1.1 } catch (NullPointerException success) {
1367     } finally {
1368     joinPool(e);
1369     }
1370     }
1371    
1372     /**
1373     * timed invokeAny(c) throws ExecutionException if no task completes
1374     */
1375 jsr166 1.5 public void testTimedInvokeAny4() throws Exception {
1376 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1377     try {
1378     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1379     l.add(new NPETask());
1380     e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1381 jsr166 1.5 shouldThrow();
1382 jsr166 1.3 } catch (ExecutionException success) {
1383 dl 1.1 } finally {
1384     joinPool(e);
1385     }
1386     }
1387    
1388     /**
1389     * timed invokeAny(c) returns result of some task
1390     */
1391 jsr166 1.5 public void testTimedInvokeAny5() throws Exception {
1392 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1393     try {
1394     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1395     l.add(new StringTask());
1396     l.add(new StringTask());
1397     String result = e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1398     assertSame(TEST_STRING, result);
1399     } finally {
1400     joinPool(e);
1401     }
1402     }
1403    
1404     /**
1405     * timed invokeAll(null) throws NPE
1406     */
1407 jsr166 1.5 public void testTimedInvokeAll1() throws Exception {
1408 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1409     try {
1410     e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1411 jsr166 1.5 shouldThrow();
1412 dl 1.1 } catch (NullPointerException success) {
1413     } finally {
1414     joinPool(e);
1415     }
1416     }
1417    
1418     /**
1419     * timed invokeAll(,,null) throws NPE
1420     */
1421 jsr166 1.5 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1422 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1423     try {
1424     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1425     l.add(new StringTask());
1426     e.invokeAll(l, MEDIUM_DELAY_MS, null);
1427 jsr166 1.5 shouldThrow();
1428 dl 1.1 } catch (NullPointerException success) {
1429     } finally {
1430     joinPool(e);
1431     }
1432     }
1433    
1434     /**
1435     * timed invokeAll(empty collection) returns empty collection
1436     */
1437 jsr166 1.5 public void testTimedInvokeAll2() throws Exception {
1438 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1439     try {
1440     List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1441     assertTrue(r.isEmpty());
1442     } finally {
1443     joinPool(e);
1444     }
1445     }
1446    
1447     /**
1448     * timed invokeAll(c) throws NPE if c has null elements
1449     */
1450 jsr166 1.5 public void testTimedInvokeAll3() throws Exception {
1451 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1452     try {
1453     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1454     l.add(new StringTask());
1455     l.add(null);
1456     e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1457 jsr166 1.5 shouldThrow();
1458 dl 1.1 } catch (NullPointerException success) {
1459     } finally {
1460     joinPool(e);
1461     }
1462     }
1463    
1464     /**
1465     * get of element of invokeAll(c) throws exception on failed task
1466     */
1467 jsr166 1.5 public void testTimedInvokeAll4() throws Exception {
1468 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1469     try {
1470     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1471     l.add(new NPETask());
1472     List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1473     assertEquals(1, result.size());
1474 jsr166 1.6 for (Future<String> future : result)
1475     future.get();
1476 jsr166 1.5 shouldThrow();
1477 jsr166 1.3 } catch (ExecutionException success) {
1478 jsr166 1.6 assertTrue(success.getCause() instanceof NullPointerException);
1479 dl 1.1 } finally {
1480     joinPool(e);
1481     }
1482     }
1483    
1484     /**
1485     * timed invokeAll(c) returns results of all completed tasks
1486     */
1487 jsr166 1.5 public void testTimedInvokeAll5() throws Exception {
1488 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1489     try {
1490     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1491     l.add(new StringTask());
1492     l.add(new StringTask());
1493     List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1494     assertEquals(2, result.size());
1495 jsr166 1.6 for (Future<String> future : result)
1496     assertSame(TEST_STRING, future.get());
1497 dl 1.1 } catch (ExecutionException success) {
1498     } finally {
1499     joinPool(e);
1500     }
1501     }
1502    
1503     /**
1504     * timed invokeAll(c) cancels tasks not completed by timeout
1505     */
1506 jsr166 1.5 public void testTimedInvokeAll6() throws Exception {
1507 dl 1.1 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1508     try {
1509     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1510     l.add(new StringTask());
1511     l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1512     l.add(new StringTask());
1513     List<Future<String>> result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
1514     assertEquals(3, result.size());
1515 jsr166 1.2 Iterator<Future<String>> it = result.iterator();
1516 dl 1.1 Future<String> f1 = it.next();
1517     Future<String> f2 = it.next();
1518     Future<String> f3 = it.next();
1519     assertTrue(f1.isDone());
1520     assertTrue(f2.isDone());
1521     assertTrue(f3.isDone());
1522     assertFalse(f1.isCancelled());
1523     assertTrue(f2.isCancelled());
1524     } finally {
1525     joinPool(e);
1526     }
1527     }
1528    
1529     /**
1530     * Execution continues if there is at least one thread even if
1531     * thread factory fails to create more
1532     */
1533 jsr166 1.5 public void testFailingThreadFactory() throws InterruptedException {
1534 dl 1.1 ExecutorService e = new CustomTPE(100, 100, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new FailingThreadFactory());
1535     try {
1536     for (int k = 0; k < 100; ++k) {
1537     e.execute(new NoOpRunnable());
1538     }
1539     Thread.sleep(LONG_DELAY_MS);
1540     } finally {
1541     joinPool(e);
1542     }
1543     }
1544    
1545     /**
1546     * allowsCoreThreadTimeOut is by default false.
1547     */
1548     public void testAllowsCoreThreadTimeOut() {
1549     ThreadPoolExecutor tpe = new CustomTPE(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1550     assertFalse(tpe.allowsCoreThreadTimeOut());
1551     joinPool(tpe);
1552     }
1553    
1554     /**
1555     * allowCoreThreadTimeOut(true) causes idle threads to time out
1556     */
1557 jsr166 1.5 public void testAllowCoreThreadTimeOut_true() throws InterruptedException {
1558 dl 1.1 ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1559     tpe.allowCoreThreadTimeOut(true);
1560     tpe.execute(new NoOpRunnable());
1561     try {
1562     Thread.sleep(MEDIUM_DELAY_MS);
1563     assertEquals(0, tpe.getPoolSize());
1564     } finally {
1565     joinPool(tpe);
1566     }
1567     }
1568    
1569     /**
1570     * allowCoreThreadTimeOut(false) causes idle threads not to time out
1571     */
1572 jsr166 1.5 public void testAllowCoreThreadTimeOut_false() throws InterruptedException {
1573 dl 1.1 ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1574     tpe.allowCoreThreadTimeOut(false);
1575     tpe.execute(new NoOpRunnable());
1576     try {
1577     Thread.sleep(MEDIUM_DELAY_MS);
1578     assertTrue(tpe.getPoolSize() >= 1);
1579     } finally {
1580     joinPool(tpe);
1581     }
1582     }
1583    
1584     }