ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.17
Committed: Tue Dec 1 22:51:44 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.16: +49 -60 lines
Log Message:
various improvements for invokeAll and invokeAny tests

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 static java.util.concurrent.TimeUnit.MILLISECONDS;
11 import java.util.concurrent.locks.*;
12
13 import junit.framework.*;
14 import java.util.*;
15
16 public class ThreadPoolExecutorSubclassTest extends JSR166TestCase {
17 public static void main(String[] args) {
18 junit.textui.TestRunner.run(suite());
19 }
20 public static Test suite() {
21 return new TestSuite(ThreadPoolExecutorSubclassTest.class);
22 }
23
24 static class CustomTask<V> implements RunnableFuture<V> {
25 final Callable<V> callable;
26 final ReentrantLock lock = new ReentrantLock();
27 final Condition cond = lock.newCondition();
28 boolean done;
29 boolean cancelled;
30 V result;
31 Thread thread;
32 Exception exception;
33 CustomTask(Callable<V> c) {
34 if (c == null) throw new NullPointerException();
35 callable = c;
36 }
37 CustomTask(final Runnable r, final V res) {
38 if (r == null) throw new NullPointerException();
39 callable = new Callable<V>() {
40 public V call() throws Exception { r.run(); return res; }};
41 }
42 public boolean isDone() {
43 lock.lock(); try { return done; } finally { lock.unlock() ; }
44 }
45 public boolean isCancelled() {
46 lock.lock(); try { return cancelled; } finally { lock.unlock() ; }
47 }
48 public boolean cancel(boolean mayInterrupt) {
49 lock.lock();
50 try {
51 if (!done) {
52 cancelled = true;
53 done = true;
54 if (mayInterrupt && thread != null)
55 thread.interrupt();
56 return true;
57 }
58 return false;
59 }
60 finally { lock.unlock() ; }
61 }
62 public void run() {
63 boolean runme;
64 lock.lock();
65 try {
66 runme = !done;
67 if (!runme)
68 thread = Thread.currentThread();
69 }
70 finally { lock.unlock() ; }
71 if (!runme) return;
72 V v = null;
73 Exception e = null;
74 try {
75 v = callable.call();
76 }
77 catch (Exception ex) {
78 e = ex;
79 }
80 lock.lock();
81 try {
82 result = v;
83 exception = e;
84 done = true;
85 thread = null;
86 cond.signalAll();
87 }
88 finally { lock.unlock(); }
89 }
90 public V get() throws InterruptedException, ExecutionException {
91 lock.lock();
92 try {
93 while (!done)
94 cond.await();
95 if (exception != null)
96 throw new ExecutionException(exception);
97 return result;
98 }
99 finally { lock.unlock(); }
100 }
101 public V get(long timeout, TimeUnit unit)
102 throws InterruptedException, ExecutionException, TimeoutException {
103 long nanos = unit.toNanos(timeout);
104 lock.lock();
105 try {
106 for (;;) {
107 if (done) break;
108 if (nanos < 0)
109 throw new TimeoutException();
110 nanos = cond.awaitNanos(nanos);
111 }
112 if (exception != null)
113 throw new ExecutionException(exception);
114 return result;
115 }
116 finally { lock.unlock(); }
117 }
118 }
119
120
121 static class CustomTPE extends ThreadPoolExecutor {
122 protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
123 return new CustomTask<V>(c);
124 }
125 protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) {
126 return new CustomTask<V>(r, v);
127 }
128
129 CustomTPE(int corePoolSize,
130 int maximumPoolSize,
131 long keepAliveTime,
132 TimeUnit unit,
133 BlockingQueue<Runnable> workQueue) {
134 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
135 workQueue);
136 }
137 CustomTPE(int corePoolSize,
138 int maximumPoolSize,
139 long keepAliveTime,
140 TimeUnit unit,
141 BlockingQueue<Runnable> workQueue,
142 ThreadFactory threadFactory) {
143 super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
144 threadFactory);
145 }
146
147 CustomTPE(int corePoolSize,
148 int maximumPoolSize,
149 long keepAliveTime,
150 TimeUnit unit,
151 BlockingQueue<Runnable> workQueue,
152 RejectedExecutionHandler handler) {
153 super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
154 handler);
155 }
156 CustomTPE(int corePoolSize,
157 int maximumPoolSize,
158 long keepAliveTime,
159 TimeUnit unit,
160 BlockingQueue<Runnable> workQueue,
161 ThreadFactory threadFactory,
162 RejectedExecutionHandler handler) {
163 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
164 workQueue, threadFactory, handler);
165 }
166
167 volatile boolean beforeCalled = false;
168 volatile boolean afterCalled = false;
169 volatile boolean terminatedCalled = false;
170 public CustomTPE() {
171 super(1, 1, LONG_DELAY_MS, MILLISECONDS, new SynchronousQueue<Runnable>());
172 }
173 protected void beforeExecute(Thread t, Runnable r) {
174 beforeCalled = true;
175 }
176 protected void afterExecute(Runnable r, Throwable t) {
177 afterCalled = true;
178 }
179 protected void terminated() {
180 terminatedCalled = true;
181 }
182
183 }
184
185 static class FailingThreadFactory implements ThreadFactory {
186 int calls = 0;
187 public Thread newThread(Runnable r) {
188 if (++calls > 1) return null;
189 return new Thread(r);
190 }
191 }
192
193
194 /**
195 * execute successfully executes a runnable
196 */
197 public void testExecute() throws InterruptedException {
198 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
199 try {
200 p1.execute(new ShortRunnable());
201 Thread.sleep(SMALL_DELAY_MS);
202 } finally {
203 joinPool(p1);
204 }
205 }
206
207 /**
208 * getActiveCount increases but doesn't overestimate, when a
209 * thread becomes active
210 */
211 public void testGetActiveCount() throws InterruptedException {
212 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
213 assertEquals(0, p2.getActiveCount());
214 p2.execute(new MediumRunnable());
215 Thread.sleep(SHORT_DELAY_MS);
216 assertEquals(1, p2.getActiveCount());
217 joinPool(p2);
218 }
219
220 /**
221 * prestartCoreThread starts a thread if under corePoolSize, else doesn't
222 */
223 public void testPrestartCoreThread() {
224 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
225 assertEquals(0, p2.getPoolSize());
226 assertTrue(p2.prestartCoreThread());
227 assertEquals(1, p2.getPoolSize());
228 assertTrue(p2.prestartCoreThread());
229 assertEquals(2, p2.getPoolSize());
230 assertFalse(p2.prestartCoreThread());
231 assertEquals(2, p2.getPoolSize());
232 joinPool(p2);
233 }
234
235 /**
236 * prestartAllCoreThreads starts all corePoolSize threads
237 */
238 public void testPrestartAllCoreThreads() {
239 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
240 assertEquals(0, p2.getPoolSize());
241 p2.prestartAllCoreThreads();
242 assertEquals(2, p2.getPoolSize());
243 p2.prestartAllCoreThreads();
244 assertEquals(2, p2.getPoolSize());
245 joinPool(p2);
246 }
247
248 /**
249 * getCompletedTaskCount increases, but doesn't overestimate,
250 * when tasks complete
251 */
252 public void testGetCompletedTaskCount() throws InterruptedException {
253 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
254 assertEquals(0, p2.getCompletedTaskCount());
255 p2.execute(new ShortRunnable());
256 Thread.sleep(SMALL_DELAY_MS);
257 assertEquals(1, p2.getCompletedTaskCount());
258 try { p2.shutdown(); } catch (SecurityException ok) { return; }
259 joinPool(p2);
260 }
261
262 /**
263 * getCorePoolSize returns size given in constructor if not otherwise set
264 */
265 public void testGetCorePoolSize() {
266 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
267 assertEquals(1, p1.getCorePoolSize());
268 joinPool(p1);
269 }
270
271 /**
272 * getKeepAliveTime returns value given in constructor if not otherwise set
273 */
274 public void testGetKeepAliveTime() {
275 ThreadPoolExecutor p2 = new CustomTPE(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
276 assertEquals(1, p2.getKeepAliveTime(TimeUnit.SECONDS));
277 joinPool(p2);
278 }
279
280
281 /**
282 * getThreadFactory returns factory in constructor if not set
283 */
284 public void testGetThreadFactory() {
285 ThreadFactory tf = new SimpleThreadFactory();
286 ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), tf, new NoOpREHandler());
287 assertSame(tf, p.getThreadFactory());
288 joinPool(p);
289 }
290
291 /**
292 * setThreadFactory sets the thread factory returned by getThreadFactory
293 */
294 public void testSetThreadFactory() {
295 ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
296 ThreadFactory tf = new SimpleThreadFactory();
297 p.setThreadFactory(tf);
298 assertSame(tf, p.getThreadFactory());
299 joinPool(p);
300 }
301
302
303 /**
304 * setThreadFactory(null) throws NPE
305 */
306 public void testSetThreadFactoryNull() {
307 ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
308 try {
309 p.setThreadFactory(null);
310 shouldThrow();
311 } catch (NullPointerException success) {
312 } finally {
313 joinPool(p);
314 }
315 }
316
317 /**
318 * getRejectedExecutionHandler returns handler in constructor if not set
319 */
320 public void testGetRejectedExecutionHandler() {
321 RejectedExecutionHandler h = new NoOpREHandler();
322 ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), h);
323 assertSame(h, p.getRejectedExecutionHandler());
324 joinPool(p);
325 }
326
327 /**
328 * setRejectedExecutionHandler sets the handler returned by
329 * getRejectedExecutionHandler
330 */
331 public void testSetRejectedExecutionHandler() {
332 ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
333 RejectedExecutionHandler h = new NoOpREHandler();
334 p.setRejectedExecutionHandler(h);
335 assertSame(h, p.getRejectedExecutionHandler());
336 joinPool(p);
337 }
338
339
340 /**
341 * setRejectedExecutionHandler(null) throws NPE
342 */
343 public void testSetRejectedExecutionHandlerNull() {
344 ThreadPoolExecutor p = new CustomTPE(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
345 try {
346 p.setRejectedExecutionHandler(null);
347 shouldThrow();
348 } catch (NullPointerException success) {
349 } finally {
350 joinPool(p);
351 }
352 }
353
354
355 /**
356 * getLargestPoolSize increases, but doesn't overestimate, when
357 * multiple threads active
358 */
359 public void testGetLargestPoolSize() throws InterruptedException {
360 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
361 assertEquals(0, p2.getLargestPoolSize());
362 p2.execute(new MediumRunnable());
363 p2.execute(new MediumRunnable());
364 Thread.sleep(SHORT_DELAY_MS);
365 assertEquals(2, p2.getLargestPoolSize());
366 joinPool(p2);
367 }
368
369 /**
370 * getMaximumPoolSize returns value given in constructor if not
371 * otherwise set
372 */
373 public void testGetMaximumPoolSize() {
374 ThreadPoolExecutor p2 = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
375 assertEquals(2, p2.getMaximumPoolSize());
376 joinPool(p2);
377 }
378
379 /**
380 * getPoolSize increases, but doesn't overestimate, when threads
381 * become active
382 */
383 public void testGetPoolSize() {
384 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
385 assertEquals(0, p1.getPoolSize());
386 p1.execute(new MediumRunnable());
387 assertEquals(1, p1.getPoolSize());
388 joinPool(p1);
389 }
390
391 /**
392 * getTaskCount increases, but doesn't overestimate, when tasks submitted
393 */
394 public void testGetTaskCount() throws InterruptedException {
395 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
396 assertEquals(0, p1.getTaskCount());
397 p1.execute(new MediumRunnable());
398 Thread.sleep(SHORT_DELAY_MS);
399 assertEquals(1, p1.getTaskCount());
400 joinPool(p1);
401 }
402
403 /**
404 * isShutDown is false before shutdown, true after
405 */
406 public void testIsShutdown() {
407
408 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
409 assertFalse(p1.isShutdown());
410 try { p1.shutdown(); } catch (SecurityException ok) { return; }
411 assertTrue(p1.isShutdown());
412 joinPool(p1);
413 }
414
415
416 /**
417 * isTerminated is false before termination, true after
418 */
419 public void testIsTerminated() throws InterruptedException {
420 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
421 assertFalse(p1.isTerminated());
422 try {
423 p1.execute(new MediumRunnable());
424 } finally {
425 try { p1.shutdown(); } catch (SecurityException ok) { return; }
426 }
427 assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
428 assertTrue(p1.isTerminated());
429 }
430
431 /**
432 * isTerminating is not true when running or when terminated
433 */
434 public void testIsTerminating() throws InterruptedException {
435 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
436 assertFalse(p1.isTerminating());
437 try {
438 p1.execute(new SmallRunnable());
439 assertFalse(p1.isTerminating());
440 } finally {
441 try { p1.shutdown(); } catch (SecurityException ok) { return; }
442 }
443 assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
444 assertTrue(p1.isTerminated());
445 assertFalse(p1.isTerminating());
446 }
447
448 /**
449 * getQueue returns the work queue, which contains queued tasks
450 */
451 public void testGetQueue() throws InterruptedException {
452 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
453 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, q);
454 FutureTask[] tasks = new FutureTask[5];
455 for (int i = 0; i < 5; i++) {
456 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
457 p1.execute(tasks[i]);
458 }
459 try {
460 Thread.sleep(SHORT_DELAY_MS);
461 BlockingQueue<Runnable> wq = p1.getQueue();
462 assertSame(q, wq);
463 assertFalse(wq.contains(tasks[0]));
464 assertTrue(wq.contains(tasks[4]));
465 for (int i = 1; i < 5; ++i)
466 tasks[i].cancel(true);
467 p1.shutdownNow();
468 } finally {
469 joinPool(p1);
470 }
471 }
472
473 /**
474 * remove(task) removes queued task, and fails to remove active task
475 */
476 public void testRemove() throws InterruptedException {
477 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
478 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, q);
479 FutureTask[] tasks = new FutureTask[5];
480 for (int i = 0; i < 5; i++) {
481 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
482 p1.execute(tasks[i]);
483 }
484 try {
485 Thread.sleep(SHORT_DELAY_MS);
486 assertFalse(p1.remove(tasks[0]));
487 assertTrue(q.contains(tasks[4]));
488 assertTrue(q.contains(tasks[3]));
489 assertTrue(p1.remove(tasks[4]));
490 assertFalse(p1.remove(tasks[4]));
491 assertFalse(q.contains(tasks[4]));
492 assertTrue(q.contains(tasks[3]));
493 assertTrue(p1.remove(tasks[3]));
494 assertFalse(q.contains(tasks[3]));
495 } finally {
496 joinPool(p1);
497 }
498 }
499
500 /**
501 * purge removes cancelled tasks from the queue
502 */
503 public void testPurge() {
504 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
505 FutureTask[] tasks = new FutureTask[5];
506 for (int i = 0; i < 5; i++) {
507 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
508 p1.execute(tasks[i]);
509 }
510 tasks[4].cancel(true);
511 tasks[3].cancel(true);
512 p1.purge();
513 long count = p1.getTaskCount();
514 assertTrue(count >= 2 && count < 5);
515 joinPool(p1);
516 }
517
518 /**
519 * shutDownNow returns a list containing tasks that were not run
520 */
521 public void testShutDownNow() {
522 ThreadPoolExecutor p1 = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
523 List l;
524 try {
525 for (int i = 0; i < 5; i++)
526 p1.execute(new MediumPossiblyInterruptedRunnable());
527 }
528 finally {
529 try {
530 l = p1.shutdownNow();
531 } catch (SecurityException ok) { return; }
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, 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, 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, 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,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, 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, 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, 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, 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, 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,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, 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, 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, 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, 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, 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, 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,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, 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, 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, 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, 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, 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, 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,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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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 =
1021 new CustomTPE(2,3,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1022 try {
1023 tpe.setMaximumPoolSize(1);
1024 shouldThrow();
1025 } catch (IllegalArgumentException success) {
1026 } finally {
1027 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1028 }
1029 joinPool(tpe);
1030 }
1031
1032 /**
1033 * setMaximumPoolSize throws IllegalArgumentException
1034 * if given a negative value
1035 */
1036 public void testMaximumPoolSizeIllegalArgumentException2() {
1037 ThreadPoolExecutor tpe =
1038 new CustomTPE(2,3,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1039 try {
1040 tpe.setMaximumPoolSize(-1);
1041 shouldThrow();
1042 } catch (IllegalArgumentException success) {
1043 } finally {
1044 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1045 }
1046 joinPool(tpe);
1047 }
1048
1049
1050 /**
1051 * setKeepAliveTime throws IllegalArgumentException
1052 * when given a negative value
1053 */
1054 public void testKeepAliveTimeIllegalArgumentException() {
1055 ThreadPoolExecutor tpe =
1056 new CustomTPE(2,3,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1057
1058 try {
1059 tpe.setKeepAliveTime(-1,MILLISECONDS);
1060 shouldThrow();
1061 } catch (IllegalArgumentException success) {
1062 } finally {
1063 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1064 }
1065 joinPool(tpe);
1066 }
1067
1068 /**
1069 * terminated() is called on termination
1070 */
1071 public void testTerminated() {
1072 CustomTPE tpe = new CustomTPE();
1073 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1074 assertTrue(tpe.terminatedCalled);
1075 joinPool(tpe);
1076 }
1077
1078 /**
1079 * beforeExecute and afterExecute are called when executing task
1080 */
1081 public void testBeforeAfter() throws InterruptedException {
1082 CustomTPE tpe = new CustomTPE();
1083 try {
1084 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1085 tpe.execute(r);
1086 Thread.sleep(SHORT_DELAY_MS);
1087 assertTrue(r.done);
1088 assertTrue(tpe.beforeCalled);
1089 assertTrue(tpe.afterCalled);
1090 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1091 } finally {
1092 joinPool(tpe);
1093 }
1094 }
1095
1096 /**
1097 * completed submit of callable returns result
1098 */
1099 public void testSubmitCallable() throws Exception {
1100 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1101 try {
1102 Future<String> future = e.submit(new StringTask());
1103 String result = future.get();
1104 assertSame(TEST_STRING, result);
1105 } finally {
1106 joinPool(e);
1107 }
1108 }
1109
1110 /**
1111 * completed submit of runnable returns successfully
1112 */
1113 public void testSubmitRunnable() throws Exception {
1114 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1115 try {
1116 Future<?> future = e.submit(new NoOpRunnable());
1117 future.get();
1118 assertTrue(future.isDone());
1119 } finally {
1120 joinPool(e);
1121 }
1122 }
1123
1124 /**
1125 * completed submit of (runnable, result) returns result
1126 */
1127 public void testSubmitRunnable2() throws Exception {
1128 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1129 try {
1130 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1131 String result = future.get();
1132 assertSame(TEST_STRING, result);
1133 } finally {
1134 joinPool(e);
1135 }
1136 }
1137
1138
1139 /**
1140 * invokeAny(null) throws NPE
1141 */
1142 public void testInvokeAny1() throws Exception {
1143 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1144 try {
1145 e.invokeAny(null);
1146 shouldThrow();
1147 } catch (NullPointerException success) {
1148 } finally {
1149 joinPool(e);
1150 }
1151 }
1152
1153 /**
1154 * invokeAny(empty collection) throws IAE
1155 */
1156 public void testInvokeAny2() throws Exception {
1157 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1158 try {
1159 e.invokeAny(new ArrayList<Callable<String>>());
1160 shouldThrow();
1161 } catch (IllegalArgumentException success) {
1162 } finally {
1163 joinPool(e);
1164 }
1165 }
1166
1167 /**
1168 * invokeAny(c) throws NPE if c has null elements
1169 */
1170 public void testInvokeAny3() throws Exception {
1171 CountDownLatch latch = new CountDownLatch(1);
1172 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1173 List<Callable<String>> l = new ArrayList<Callable<String>>();
1174 l.add(latchAwaitingStringTask(latch));
1175 l.add(null);
1176 try {
1177 e.invokeAny(l);
1178 shouldThrow();
1179 } catch (NullPointerException success) {
1180 } finally {
1181 latch.countDown();
1182 joinPool(e);
1183 }
1184 }
1185
1186 /**
1187 * invokeAny(c) throws ExecutionException if no task completes
1188 */
1189 public void testInvokeAny4() throws Exception {
1190 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1191 List<Callable<String>> l = new ArrayList<Callable<String>>();
1192 l.add(new NPETask());
1193 try {
1194 e.invokeAny(l);
1195 shouldThrow();
1196 } catch (ExecutionException success) {
1197 assertTrue(success.getCause() instanceof NullPointerException);
1198 } finally {
1199 joinPool(e);
1200 }
1201 }
1202
1203 /**
1204 * invokeAny(c) returns result of some task
1205 */
1206 public void testInvokeAny5() throws Exception {
1207 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1208 try {
1209 List<Callable<String>> l = new ArrayList<Callable<String>>();
1210 l.add(new StringTask());
1211 l.add(new StringTask());
1212 String result = e.invokeAny(l);
1213 assertSame(TEST_STRING, result);
1214 } finally {
1215 joinPool(e);
1216 }
1217 }
1218
1219 /**
1220 * invokeAll(null) throws NPE
1221 */
1222 public void testInvokeAll1() throws Exception {
1223 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1224 try {
1225 e.invokeAll(null);
1226 shouldThrow();
1227 } catch (NullPointerException success) {
1228 } finally {
1229 joinPool(e);
1230 }
1231 }
1232
1233 /**
1234 * invokeAll(empty collection) returns empty collection
1235 */
1236 public void testInvokeAll2() throws Exception {
1237 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1238 try {
1239 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1240 assertTrue(r.isEmpty());
1241 } finally {
1242 joinPool(e);
1243 }
1244 }
1245
1246 /**
1247 * invokeAll(c) throws NPE if c has null elements
1248 */
1249 public void testInvokeAll3() throws Exception {
1250 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1251 List<Callable<String>> l = new ArrayList<Callable<String>>();
1252 l.add(new StringTask());
1253 l.add(null);
1254 try {
1255 e.invokeAll(l);
1256 shouldThrow();
1257 } catch (NullPointerException success) {
1258 } finally {
1259 joinPool(e);
1260 }
1261 }
1262
1263 /**
1264 * get of element of invokeAll(c) throws exception on failed task
1265 */
1266 public void testInvokeAll4() throws Exception {
1267 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1268 List<Callable<String>> l = new ArrayList<Callable<String>>();
1269 l.add(new NPETask());
1270 List<Future<String>> futures = e.invokeAll(l);
1271 assertEquals(1, futures.size());
1272 try {
1273 futures.get(0).get();
1274 shouldThrow();
1275 } catch (ExecutionException success) {
1276 assertTrue(success.getCause() instanceof NullPointerException);
1277 } finally {
1278 joinPool(e);
1279 }
1280 }
1281
1282 /**
1283 * invokeAll(c) returns results of all completed tasks
1284 */
1285 public void testInvokeAll5() throws Exception {
1286 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1287 try {
1288 List<Callable<String>> l = new ArrayList<Callable<String>>();
1289 l.add(new StringTask());
1290 l.add(new StringTask());
1291 List<Future<String>> futures = e.invokeAll(l);
1292 assertEquals(2, futures.size());
1293 for (Future<String> future : futures)
1294 assertSame(TEST_STRING, future.get());
1295 } finally {
1296 joinPool(e);
1297 }
1298 }
1299
1300
1301
1302 /**
1303 * timed invokeAny(null) throws NPE
1304 */
1305 public void testTimedInvokeAny1() throws Exception {
1306 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1307 try {
1308 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1309 shouldThrow();
1310 } catch (NullPointerException success) {
1311 } finally {
1312 joinPool(e);
1313 }
1314 }
1315
1316 /**
1317 * timed invokeAny(,,null) throws NPE
1318 */
1319 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1320 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1321 List<Callable<String>> l = new ArrayList<Callable<String>>();
1322 l.add(new StringTask());
1323 try {
1324 e.invokeAny(l, MEDIUM_DELAY_MS, null);
1325 shouldThrow();
1326 } catch (NullPointerException success) {
1327 } finally {
1328 joinPool(e);
1329 }
1330 }
1331
1332 /**
1333 * timed invokeAny(empty collection) throws IAE
1334 */
1335 public void testTimedInvokeAny2() throws Exception {
1336 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1337 try {
1338 e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1339 shouldThrow();
1340 } catch (IllegalArgumentException success) {
1341 } finally {
1342 joinPool(e);
1343 }
1344 }
1345
1346 /**
1347 * timed invokeAny(c) throws NPE if c has null elements
1348 */
1349 public void testTimedInvokeAny3() throws Exception {
1350 CountDownLatch latch = new CountDownLatch(1);
1351 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1352 List<Callable<String>> l = new ArrayList<Callable<String>>();
1353 l.add(latchAwaitingStringTask(latch));
1354 l.add(null);
1355 try {
1356 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1357 shouldThrow();
1358 } catch (NullPointerException success) {
1359 } finally {
1360 latch.countDown();
1361 joinPool(e);
1362 }
1363 }
1364
1365 /**
1366 * timed invokeAny(c) throws ExecutionException if no task completes
1367 */
1368 public void testTimedInvokeAny4() throws Exception {
1369 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1370 List<Callable<String>> l = new ArrayList<Callable<String>>();
1371 l.add(new NPETask());
1372 try {
1373 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1374 shouldThrow();
1375 } catch (ExecutionException success) {
1376 assertTrue(success.getCause() instanceof NullPointerException);
1377 } finally {
1378 joinPool(e);
1379 }
1380 }
1381
1382 /**
1383 * timed invokeAny(c) returns result of some task
1384 */
1385 public void testTimedInvokeAny5() throws Exception {
1386 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1387 try {
1388 List<Callable<String>> l = new ArrayList<Callable<String>>();
1389 l.add(new StringTask());
1390 l.add(new StringTask());
1391 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1392 assertSame(TEST_STRING, result);
1393 } finally {
1394 joinPool(e);
1395 }
1396 }
1397
1398 /**
1399 * timed invokeAll(null) throws NPE
1400 */
1401 public void testTimedInvokeAll1() throws Exception {
1402 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1403 try {
1404 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1405 shouldThrow();
1406 } catch (NullPointerException success) {
1407 } finally {
1408 joinPool(e);
1409 }
1410 }
1411
1412 /**
1413 * timed invokeAll(,,null) throws NPE
1414 */
1415 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1416 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1417 List<Callable<String>> l = new ArrayList<Callable<String>>();
1418 l.add(new StringTask());
1419 try {
1420 e.invokeAll(l, MEDIUM_DELAY_MS, null);
1421 shouldThrow();
1422 } catch (NullPointerException success) {
1423 } finally {
1424 joinPool(e);
1425 }
1426 }
1427
1428 /**
1429 * timed invokeAll(empty collection) returns empty collection
1430 */
1431 public void testTimedInvokeAll2() throws Exception {
1432 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1433 try {
1434 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1435 assertTrue(r.isEmpty());
1436 } finally {
1437 joinPool(e);
1438 }
1439 }
1440
1441 /**
1442 * timed invokeAll(c) throws NPE if c has null elements
1443 */
1444 public void testTimedInvokeAll3() throws Exception {
1445 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1446 List<Callable<String>> l = new ArrayList<Callable<String>>();
1447 l.add(new StringTask());
1448 l.add(null);
1449 try {
1450 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1451 shouldThrow();
1452 } catch (NullPointerException success) {
1453 } finally {
1454 joinPool(e);
1455 }
1456 }
1457
1458 /**
1459 * get of element of invokeAll(c) throws exception on failed task
1460 */
1461 public void testTimedInvokeAll4() throws Exception {
1462 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1463 List<Callable<String>> l = new ArrayList<Callable<String>>();
1464 l.add(new NPETask());
1465 List<Future<String>> futures =
1466 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1467 assertEquals(1, futures.size());
1468 try {
1469 futures.get(0).get();
1470 shouldThrow();
1471 } catch (ExecutionException success) {
1472 assertTrue(success.getCause() instanceof NullPointerException);
1473 } finally {
1474 joinPool(e);
1475 }
1476 }
1477
1478 /**
1479 * timed invokeAll(c) returns results of all completed tasks
1480 */
1481 public void testTimedInvokeAll5() throws Exception {
1482 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1483 try {
1484 List<Callable<String>> l = new ArrayList<Callable<String>>();
1485 l.add(new StringTask());
1486 l.add(new StringTask());
1487 List<Future<String>> futures =
1488 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1489 assertEquals(2, futures.size());
1490 for (Future<String> future : futures)
1491 assertSame(TEST_STRING, future.get());
1492 } finally {
1493 joinPool(e);
1494 }
1495 }
1496
1497 /**
1498 * timed invokeAll(c) cancels tasks not completed by timeout
1499 */
1500 public void testTimedInvokeAll6() throws Exception {
1501 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1502 try {
1503 List<Callable<String>> l = new ArrayList<Callable<String>>();
1504 l.add(new StringTask());
1505 l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1506 l.add(new StringTask());
1507 List<Future<String>> futures =
1508 e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
1509 assertEquals(3, futures.size());
1510 Iterator<Future<String>> it = futures.iterator();
1511 Future<String> f1 = it.next();
1512 Future<String> f2 = it.next();
1513 Future<String> f3 = it.next();
1514 assertTrue(f1.isDone());
1515 assertTrue(f2.isDone());
1516 assertTrue(f3.isDone());
1517 assertFalse(f1.isCancelled());
1518 assertTrue(f2.isCancelled());
1519 } finally {
1520 joinPool(e);
1521 }
1522 }
1523
1524 /**
1525 * Execution continues if there is at least one thread even if
1526 * thread factory fails to create more
1527 */
1528 public void testFailingThreadFactory() throws InterruptedException {
1529 ExecutorService e = new CustomTPE(100, 100, LONG_DELAY_MS, MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new FailingThreadFactory());
1530 try {
1531 for (int k = 0; k < 100; ++k) {
1532 e.execute(new NoOpRunnable());
1533 }
1534 Thread.sleep(LONG_DELAY_MS);
1535 } finally {
1536 joinPool(e);
1537 }
1538 }
1539
1540 /**
1541 * allowsCoreThreadTimeOut is by default false.
1542 */
1543 public void testAllowsCoreThreadTimeOut() {
1544 ThreadPoolExecutor tpe = new CustomTPE(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1545 assertFalse(tpe.allowsCoreThreadTimeOut());
1546 joinPool(tpe);
1547 }
1548
1549 /**
1550 * allowCoreThreadTimeOut(true) causes idle threads to time out
1551 */
1552 public void testAllowCoreThreadTimeOut_true() throws InterruptedException {
1553 ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1554 tpe.allowCoreThreadTimeOut(true);
1555 tpe.execute(new NoOpRunnable());
1556 try {
1557 Thread.sleep(MEDIUM_DELAY_MS);
1558 assertEquals(0, tpe.getPoolSize());
1559 } finally {
1560 joinPool(tpe);
1561 }
1562 }
1563
1564 /**
1565 * allowCoreThreadTimeOut(false) causes idle threads not to time out
1566 */
1567 public void testAllowCoreThreadTimeOut_false() throws InterruptedException {
1568 ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1569 tpe.allowCoreThreadTimeOut(false);
1570 tpe.execute(new NoOpRunnable());
1571 try {
1572 Thread.sleep(MEDIUM_DELAY_MS);
1573 assertTrue(tpe.getPoolSize() >= 1);
1574 } finally {
1575 joinPool(tpe);
1576 }
1577 }
1578
1579 }