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, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +20 -22 lines
Log Message:
various bug fixes for perplexing test failures

File Contents

# Content
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 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
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 junit.textui.TestRunner.run(suite());
18 }
19 public static Test suite() {
20 return new TestSuite(ThreadPoolExecutorSubclassTest.class);
21 }
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 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 public V call() throws Exception { r.run(); return res; }};
40 }
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 if (mayInterrupt && thread != null)
54 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 catch (Exception ex) {
77 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 while (!done)
93 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 throws InterruptedException, ExecutionException, TimeoutException {
102 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 }
118
119
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 }
127
128 CustomTPE(int corePoolSize,
129 int maximumPoolSize,
130 long keepAliveTime,
131 TimeUnit unit,
132 BlockingQueue<Runnable> workQueue) {
133 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
134 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 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
163 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
182 }
183
184 static class FailingThreadFactory implements ThreadFactory {
185 int calls = 0;
186 public Thread newThread(Runnable r) {
187 if (++calls > 1) return null;
188 return new Thread(r);
189 }
190 }
191
192
193 /**
194 * execute successfully executes a runnable
195 */
196 public void testExecute() throws InterruptedException {
197 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
198 try {
199 p1.execute(new ShortRunnable());
200 Thread.sleep(SMALL_DELAY_MS);
201 } finally {
202 joinPool(p1);
203 }
204 }
205
206 /**
207 * getActiveCount increases but doesn't overestimate, when a
208 * thread becomes active
209 */
210 public void testGetActiveCount() throws InterruptedException {
211 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 Thread.sleep(SHORT_DELAY_MS);
215 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
247 /**
248 * getCompletedTaskCount increases, but doesn't overestimate,
249 * when tasks complete
250 */
251 public void testGetCompletedTaskCount() throws InterruptedException {
252 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 Thread.sleep(SMALL_DELAY_MS);
256 assertEquals(1, p2.getCompletedTaskCount());
257 try { p2.shutdown(); } catch (SecurityException ok) { return; }
258 joinPool(p2);
259 }
260
261 /**
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
270 /**
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 /**
281 * 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 /**
291 * 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 /**
303 * 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 /**
317 * 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 /**
327 * 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 /**
340 * 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
354 /**
355 * getLargestPoolSize increases, but doesn't overestimate, when
356 * multiple threads active
357 */
358 public void testGetLargestPoolSize() throws InterruptedException {
359 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
360 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 joinPool(p2);
366 }
367
368 /**
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
378 /**
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
390 /**
391 * getTaskCount increases, but doesn't overestimate, when tasks submitted
392 */
393 public void testGetTaskCount() throws InterruptedException {
394 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
395 assertEquals(0, p1.getTaskCount());
396 p1.execute(new MediumRunnable());
397 Thread.sleep(SHORT_DELAY_MS);
398 assertEquals(1, p1.getTaskCount());
399 joinPool(p1);
400 }
401
402 /**
403 * isShutDown is false before shutdown, true after
404 */
405 public void testIsShutdown() {
406
407 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
408 assertFalse(p1.isShutdown());
409 try { p1.shutdown(); } catch (SecurityException ok) { return; }
410 assertTrue(p1.isShutdown());
411 joinPool(p1);
412 }
413
414
415 /**
416 * isTerminated is false before termination, true after
417 */
418 public void testIsTerminated() throws InterruptedException {
419 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 try { p1.shutdown(); } catch (SecurityException ok) { return; }
425 }
426 assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
427 assertTrue(p1.isTerminated());
428 }
429
430 /**
431 * isTerminating is not true when running or when terminated
432 */
433 public void testIsTerminating() throws InterruptedException {
434 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 try { p1.shutdown(); } catch (SecurityException ok) { return; }
441 }
442 assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
443 assertTrue(p1.isTerminated());
444 assertFalse(p1.isTerminating());
445 }
446
447 /**
448 * getQueue returns the work queue, which contains queued tasks
449 */
450 public void testGetQueue() throws InterruptedException {
451 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 for (int i = 0; i < 5; i++) {
455 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 public void testRemove() throws InterruptedException {
476 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 for (int i = 0; i < 5; i++) {
480 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 for (int i = 0; i < 5; i++) {
506 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 for (int i = 0; i < 5; i++)
525 p1.execute(new MediumPossiblyInterruptedRunnable());
526 }
527 finally {
528 try {
529 l = p1.shutdownNow();
530 } catch (SecurityException ok) { return; }
531
532 }
533 assertTrue(p1.isShutdown());
534 assertTrue(l.size() <= 4);
535 }
536
537 // Exception Tests
538
539
540 /**
541 * Constructor throws if corePoolSize argument is less than zero
542 */
543 public void testConstructor1() {
544 try {
545 new CustomTPE(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
546 shouldThrow();
547 } catch (IllegalArgumentException success) {}
548 }
549
550 /**
551 * Constructor throws if maximumPoolSize is less than zero
552 */
553 public void testConstructor2() {
554 try {
555 new CustomTPE(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
556 shouldThrow();
557 } catch (IllegalArgumentException success) {}
558 }
559
560 /**
561 * Constructor throws if maximumPoolSize is equal to zero
562 */
563 public void testConstructor3() {
564 try {
565 new CustomTPE(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
566 shouldThrow();
567 } catch (IllegalArgumentException success) {}
568 }
569
570 /**
571 * Constructor throws if keepAliveTime is less than zero
572 */
573 public void testConstructor4() {
574 try {
575 new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
576 shouldThrow();
577 } catch (IllegalArgumentException success) {}
578 }
579
580 /**
581 * Constructor throws if corePoolSize is greater than the maximumPoolSize
582 */
583 public void testConstructor5() {
584 try {
585 new CustomTPE(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
586 shouldThrow();
587 } catch (IllegalArgumentException success) {}
588 }
589
590 /**
591 * Constructor throws if workQueue is set to null
592 */
593 public void testConstructorNullPointerException() {
594 try {
595 new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null);
596 shouldThrow();
597 } catch (NullPointerException success) {}
598 }
599
600
601
602 /**
603 * Constructor throws if corePoolSize argument is less than zero
604 */
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 } catch (IllegalArgumentException success) {}
610 }
611
612 /**
613 * Constructor throws if maximumPoolSize is less than zero
614 */
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 } catch (IllegalArgumentException success) {}
620 }
621
622 /**
623 * Constructor throws if maximumPoolSize is equal to zero
624 */
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 } catch (IllegalArgumentException success) {}
630 }
631
632 /**
633 * Constructor throws if keepAliveTime is less than zero
634 */
635 public void testConstructor9() {
636 try {
637 new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
638 shouldThrow();
639 } catch (IllegalArgumentException success) {}
640 }
641
642 /**
643 * Constructor throws if corePoolSize is greater than the maximumPoolSize
644 */
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 } catch (IllegalArgumentException success) {}
650 }
651
652 /**
653 * Constructor throws if workQueue is set to null
654 */
655 public void testConstructorNullPointerException2() {
656 try {
657 new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory());
658 shouldThrow();
659 } catch (NullPointerException success) {}
660 }
661
662 /**
663 * Constructor throws if threadFactory is set to null
664 */
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 } catch (NullPointerException success) {}
671 }
672
673
674 /**
675 * Constructor throws if corePoolSize argument is less than zero
676 */
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 } catch (IllegalArgumentException success) {}
682 }
683
684 /**
685 * Constructor throws if maximumPoolSize is less than zero
686 */
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 } catch (IllegalArgumentException success) {}
692 }
693
694 /**
695 * Constructor throws if maximumPoolSize is equal to zero
696 */
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 } catch (IllegalArgumentException success) {}
702 }
703
704 /**
705 * Constructor throws if keepAliveTime is less than zero
706 */
707 public void testConstructor14() {
708 try {
709 new CustomTPE(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
710 shouldThrow();
711 } catch (IllegalArgumentException success) {}
712 }
713
714 /**
715 * Constructor throws if corePoolSize is greater than the maximumPoolSize
716 */
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 } catch (IllegalArgumentException success) {}
722 }
723
724 /**
725 * Constructor throws if workQueue is set to null
726 */
727 public void testConstructorNullPointerException4() {
728 try {
729 new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new NoOpREHandler());
730 shouldThrow();
731 } catch (NullPointerException success) {}
732 }
733
734 /**
735 * Constructor throws if handler is set to null
736 */
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 } catch (NullPointerException success) {}
743 }
744
745
746 /**
747 * Constructor throws if corePoolSize argument is less than zero
748 */
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 } catch (IllegalArgumentException success) {}
754 }
755
756 /**
757 * Constructor throws if maximumPoolSize is less than zero
758 */
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 } catch (IllegalArgumentException success) {}
764 }
765
766 /**
767 * Constructor throws if maximumPoolSize is equal to zero
768 */
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 } catch (IllegalArgumentException success) {}
774 }
775
776 /**
777 * Constructor throws if keepAliveTime is less than zero
778 */
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 } catch (IllegalArgumentException success) {}
784 }
785
786 /**
787 * Constructor throws if corePoolSize is greater than the maximumPoolSize
788 */
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 } catch (IllegalArgumentException success) {}
794 }
795
796 /**
797 * Constructor throws if workQueue is set to null
798 */
799 public void testConstructorNullPointerException6() {
800 try {
801 new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory(),new NoOpREHandler());
802 shouldThrow();
803 } catch (NullPointerException success) {}
804 }
805
806 /**
807 * Constructor throws if handler is set to null
808 */
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 } catch (NullPointerException success) {}
815 }
816
817 /**
818 * Constructor throws if ThreadFactory is set top null
819 */
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 } catch (NullPointerException success) {}
826 }
827
828
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
837 for (int i = 0; i < 5; ++i) {
838 p.execute(new MediumRunnable());
839 }
840 shouldThrow();
841 } catch (RejectedExecutionException success) {}
842 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
853 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
854 for (int i = 0; i < 5; ++i) {
855 tasks[i] = new TrackedNoOpRunnable();
856 }
857 TrackedLongRunnable mr = new TrackedLongRunnable();
858 p.execute(mr);
859 for (int i = 0; i < 5; ++i) {
860 p.execute(tasks[i]);
861 }
862 for (int i = 1; i < 5; ++i) {
863 assertTrue(tasks[i].done);
864 }
865 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
866 } 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
879 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
880 for (int i = 0; i < 5; ++i) {
881 tasks[i] = new TrackedNoOpRunnable();
882 }
883 p.execute(new TrackedLongRunnable());
884 for (int i = 0; i < 5; ++i) {
885 p.execute(tasks[i]);
886 }
887 for (int i = 0; i < 5; ++i) {
888 assertFalse(tasks[i].done);
889 }
890 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
891 } 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 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
912 } finally {
913 joinPool(p);
914 }
915 }
916
917 /**
918 * execute throws RejectedExecutionException if shutdown
919 */
920 public void testRejectedExecutionExceptionOnShutdown() {
921 ThreadPoolExecutor tpe =
922 new CustomTPE(1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
923 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
924 try {
925 tpe.execute(new NoOpRunnable());
926 shouldThrow();
927 } catch (RejectedExecutionException success) {}
928
929 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 try { p.shutdown(); } catch (SecurityException ok) { return; }
940 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 try { p.shutdown(); } catch (SecurityException ok) { return; }
957 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 try { p.shutdown(); } catch (SecurityException ok) { return; }
975 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 } catch (NullPointerException success) {}
995
996 joinPool(tpe);
997 }
998
999 /**
1000 * setCorePoolSize of negative value throws IllegalArgumentException
1001 */
1002 public void testCorePoolSizeIllegalArgumentException() {
1003 ThreadPoolExecutor tpe =
1004 new CustomTPE(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1005 try {
1006 tpe.setCorePoolSize(-1);
1007 shouldThrow();
1008 } catch (IllegalArgumentException success) {
1009 } finally {
1010 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1011 }
1012 joinPool(tpe);
1013 }
1014
1015 /**
1016 * setMaximumPoolSize(int) throws IllegalArgumentException if
1017 * given a value less the core pool size
1018 */
1019 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 } catch (Exception e) {}
1024 try {
1025 tpe.setMaximumPoolSize(1);
1026 shouldThrow();
1027 } catch (IllegalArgumentException success) {
1028 } finally {
1029 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1030 }
1031 joinPool(tpe);
1032 }
1033
1034 /**
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 } catch (Exception e) {}
1043 try {
1044 tpe.setMaximumPoolSize(-1);
1045 shouldThrow();
1046 } catch (IllegalArgumentException success) {
1047 } finally {
1048 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1049 }
1050 joinPool(tpe);
1051 }
1052
1053
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 } catch (Exception e) {}
1063
1064 try {
1065 tpe.setKeepAliveTime(-1,TimeUnit.MILLISECONDS);
1066 shouldThrow();
1067 } catch (IllegalArgumentException success) {
1068 } finally {
1069 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1070 }
1071 joinPool(tpe);
1072 }
1073
1074 /**
1075 * terminated() is called on termination
1076 */
1077 public void testTerminated() {
1078 CustomTPE tpe = new CustomTPE();
1079 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1080 assertTrue(tpe.terminatedCalled);
1081 joinPool(tpe);
1082 }
1083
1084 /**
1085 * beforeExecute and afterExecute are called when executing task
1086 */
1087 public void testBeforeAfter() throws InterruptedException {
1088 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 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1097 } finally {
1098 joinPool(tpe);
1099 }
1100 }
1101
1102 /**
1103 * completed submit of callable returns result
1104 */
1105 public void testSubmitCallable() throws Exception {
1106 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 public void testSubmitRunnable() throws Exception {
1120 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 public void testSubmitRunnable2() throws Exception {
1134 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 public void testInvokeAny1() throws Exception {
1149 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1150 try {
1151 e.invokeAny(null);
1152 shouldThrow();
1153 } catch (NullPointerException success) {
1154 } finally {
1155 joinPool(e);
1156 }
1157 }
1158
1159 /**
1160 * invokeAny(empty collection) throws IAE
1161 */
1162 public void testInvokeAny2() throws Exception {
1163 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 shouldThrow();
1167 } catch (IllegalArgumentException success) {
1168 } finally {
1169 joinPool(e);
1170 }
1171 }
1172
1173 /**
1174 * invokeAny(c) throws NPE if c has null elements
1175 */
1176 public void testInvokeAny3() throws Exception {
1177 final CountDownLatch latch = new CountDownLatch(1);
1178 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 l.add(new CheckedCallable<String>() {
1182 public String realCall() throws InterruptedException {
1183 latch.await();
1184 return TEST_STRING;
1185 }});
1186 l.add(null);
1187 e.invokeAny(l);
1188 shouldThrow();
1189 } catch (NullPointerException success) {
1190 } finally {
1191 latch.countDown();
1192 joinPool(e);
1193 }
1194 }
1195
1196 /**
1197 * invokeAny(c) throws ExecutionException if no task completes
1198 */
1199 public void testInvokeAny4() throws Exception {
1200 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 shouldThrow();
1206 } catch (ExecutionException success) {
1207 } finally {
1208 joinPool(e);
1209 }
1210 }
1211
1212 /**
1213 * invokeAny(c) returns result of some task
1214 */
1215 public void testInvokeAny5() throws Exception {
1216 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 public void testInvokeAll1() throws Exception {
1232 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1233 try {
1234 e.invokeAll(null);
1235 shouldThrow();
1236 } catch (NullPointerException success) {
1237 } finally {
1238 joinPool(e);
1239 }
1240 }
1241
1242 /**
1243 * invokeAll(empty collection) returns empty collection
1244 */
1245 public void testInvokeAll2() throws Exception {
1246 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 public void testInvokeAll3() throws Exception {
1259 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 shouldThrow();
1266 } 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 public void testInvokeAll4() throws Exception {
1276 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 for (Future<String> future : result)
1283 future.get();
1284 shouldThrow();
1285 } catch (ExecutionException success) {
1286 } finally {
1287 joinPool(e);
1288 }
1289 }
1290
1291 /**
1292 * invokeAll(c) returns results of all completed tasks
1293 */
1294 public void testInvokeAll5() throws Exception {
1295 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 for (Future<String> future : result)
1303 assertSame(TEST_STRING, future.get());
1304 } finally {
1305 joinPool(e);
1306 }
1307 }
1308
1309
1310
1311 /**
1312 * timed invokeAny(null) throws NPE
1313 */
1314 public void testTimedInvokeAny1() throws Exception {
1315 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 shouldThrow();
1319 } catch (NullPointerException success) {
1320 } finally {
1321 joinPool(e);
1322 }
1323 }
1324
1325 /**
1326 * timed invokeAny(,,null) throws NPE
1327 */
1328 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1329 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 shouldThrow();
1335 } catch (NullPointerException success) {
1336 } finally {
1337 joinPool(e);
1338 }
1339 }
1340
1341 /**
1342 * timed invokeAny(empty collection) throws IAE
1343 */
1344 public void testTimedInvokeAny2() throws Exception {
1345 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 shouldThrow();
1349 } 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 public void testTimedInvokeAny3() throws Exception {
1359 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 shouldThrow();
1366 } catch (NullPointerException success) {
1367 } finally {
1368 joinPool(e);
1369 }
1370 }
1371
1372 /**
1373 * timed invokeAny(c) throws ExecutionException if no task completes
1374 */
1375 public void testTimedInvokeAny4() throws Exception {
1376 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 shouldThrow();
1382 } catch (ExecutionException success) {
1383 } finally {
1384 joinPool(e);
1385 }
1386 }
1387
1388 /**
1389 * timed invokeAny(c) returns result of some task
1390 */
1391 public void testTimedInvokeAny5() throws Exception {
1392 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 public void testTimedInvokeAll1() throws Exception {
1408 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 shouldThrow();
1412 } catch (NullPointerException success) {
1413 } finally {
1414 joinPool(e);
1415 }
1416 }
1417
1418 /**
1419 * timed invokeAll(,,null) throws NPE
1420 */
1421 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1422 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 shouldThrow();
1428 } catch (NullPointerException success) {
1429 } finally {
1430 joinPool(e);
1431 }
1432 }
1433
1434 /**
1435 * timed invokeAll(empty collection) returns empty collection
1436 */
1437 public void testTimedInvokeAll2() throws Exception {
1438 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 public void testTimedInvokeAll3() throws Exception {
1451 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 shouldThrow();
1458 } 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 public void testTimedInvokeAll4() throws Exception {
1468 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 for (Future<String> future : result)
1475 future.get();
1476 shouldThrow();
1477 } catch (ExecutionException success) {
1478 assertTrue(success.getCause() instanceof NullPointerException);
1479 } finally {
1480 joinPool(e);
1481 }
1482 }
1483
1484 /**
1485 * timed invokeAll(c) returns results of all completed tasks
1486 */
1487 public void testTimedInvokeAll5() throws Exception {
1488 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 for (Future<String> future : result)
1496 assertSame(TEST_STRING, future.get());
1497 } catch (ExecutionException success) {
1498 } finally {
1499 joinPool(e);
1500 }
1501 }
1502
1503 /**
1504 * timed invokeAll(c) cancels tasks not completed by timeout
1505 */
1506 public void testTimedInvokeAll6() throws Exception {
1507 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 Iterator<Future<String>> it = result.iterator();
1516 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 public void testFailingThreadFactory() throws InterruptedException {
1534 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 public void testAllowCoreThreadTimeOut_true() throws InterruptedException {
1558 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 public void testAllowCoreThreadTimeOut_false() throws InterruptedException {
1573 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 }