ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.8
Committed: Sat Nov 21 02:07:27 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.7: +31 -31 lines
Log Message:
untabify

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 Callable<String>() {
1182 public String call() {
1183 try {
1184 latch.await();
1185 } catch (InterruptedException ok) {}
1186 return TEST_STRING;
1187 }});
1188 l.add(null);
1189 e.invokeAny(l);
1190 shouldThrow();
1191 } catch (NullPointerException success) {
1192 } finally {
1193 latch.countDown();
1194 joinPool(e);
1195 }
1196 }
1197
1198 /**
1199 * invokeAny(c) throws ExecutionException if no task completes
1200 */
1201 public void testInvokeAny4() throws Exception {
1202 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1203 try {
1204 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1205 l.add(new NPETask());
1206 e.invokeAny(l);
1207 shouldThrow();
1208 } catch (ExecutionException success) {
1209 } finally {
1210 joinPool(e);
1211 }
1212 }
1213
1214 /**
1215 * invokeAny(c) returns result of some task
1216 */
1217 public void testInvokeAny5() throws Exception {
1218 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1219 try {
1220 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1221 l.add(new StringTask());
1222 l.add(new StringTask());
1223 String result = e.invokeAny(l);
1224 assertSame(TEST_STRING, result);
1225 } finally {
1226 joinPool(e);
1227 }
1228 }
1229
1230 /**
1231 * invokeAll(null) throws NPE
1232 */
1233 public void testInvokeAll1() throws Exception {
1234 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1235 try {
1236 e.invokeAll(null);
1237 shouldThrow();
1238 } catch (NullPointerException success) {
1239 } finally {
1240 joinPool(e);
1241 }
1242 }
1243
1244 /**
1245 * invokeAll(empty collection) returns empty collection
1246 */
1247 public void testInvokeAll2() throws Exception {
1248 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1249 try {
1250 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1251 assertTrue(r.isEmpty());
1252 } finally {
1253 joinPool(e);
1254 }
1255 }
1256
1257 /**
1258 * invokeAll(c) throws NPE if c has null elements
1259 */
1260 public void testInvokeAll3() throws Exception {
1261 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1262 try {
1263 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1264 l.add(new StringTask());
1265 l.add(null);
1266 e.invokeAll(l);
1267 shouldThrow();
1268 } catch (NullPointerException success) {
1269 } finally {
1270 joinPool(e);
1271 }
1272 }
1273
1274 /**
1275 * get of element of invokeAll(c) throws exception on failed task
1276 */
1277 public void testInvokeAll4() throws Exception {
1278 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1279 try {
1280 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1281 l.add(new NPETask());
1282 List<Future<String>> result = e.invokeAll(l);
1283 assertEquals(1, result.size());
1284 for (Future<String> future : result)
1285 future.get();
1286 shouldThrow();
1287 } catch (ExecutionException success) {
1288 } finally {
1289 joinPool(e);
1290 }
1291 }
1292
1293 /**
1294 * invokeAll(c) returns results of all completed tasks
1295 */
1296 public void testInvokeAll5() throws Exception {
1297 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1298 try {
1299 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1300 l.add(new StringTask());
1301 l.add(new StringTask());
1302 List<Future<String>> result = e.invokeAll(l);
1303 assertEquals(2, result.size());
1304 for (Future<String> future : result)
1305 assertSame(TEST_STRING, future.get());
1306 } finally {
1307 joinPool(e);
1308 }
1309 }
1310
1311
1312
1313 /**
1314 * timed invokeAny(null) throws NPE
1315 */
1316 public void testTimedInvokeAny1() throws Exception {
1317 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1318 try {
1319 e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1320 shouldThrow();
1321 } catch (NullPointerException success) {
1322 } finally {
1323 joinPool(e);
1324 }
1325 }
1326
1327 /**
1328 * timed invokeAny(,,null) throws NPE
1329 */
1330 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1331 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1332 try {
1333 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1334 l.add(new StringTask());
1335 e.invokeAny(l, MEDIUM_DELAY_MS, null);
1336 shouldThrow();
1337 } catch (NullPointerException success) {
1338 } finally {
1339 joinPool(e);
1340 }
1341 }
1342
1343 /**
1344 * timed invokeAny(empty collection) throws IAE
1345 */
1346 public void testTimedInvokeAny2() throws Exception {
1347 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1348 try {
1349 e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1350 shouldThrow();
1351 } catch (IllegalArgumentException success) {
1352 } finally {
1353 joinPool(e);
1354 }
1355 }
1356
1357 /**
1358 * timed invokeAny(c) throws NPE if c has null elements
1359 */
1360 public void testTimedInvokeAny3() throws Exception {
1361 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1362 try {
1363 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1364 l.add(new StringTask());
1365 l.add(null);
1366 e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1367 shouldThrow();
1368 } catch (NullPointerException success) {
1369 } finally {
1370 joinPool(e);
1371 }
1372 }
1373
1374 /**
1375 * timed invokeAny(c) throws ExecutionException if no task completes
1376 */
1377 public void testTimedInvokeAny4() throws Exception {
1378 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1379 try {
1380 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1381 l.add(new NPETask());
1382 e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1383 shouldThrow();
1384 } catch (ExecutionException success) {
1385 } finally {
1386 joinPool(e);
1387 }
1388 }
1389
1390 /**
1391 * timed invokeAny(c) returns result of some task
1392 */
1393 public void testTimedInvokeAny5() throws Exception {
1394 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1395 try {
1396 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1397 l.add(new StringTask());
1398 l.add(new StringTask());
1399 String result = e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1400 assertSame(TEST_STRING, result);
1401 } finally {
1402 joinPool(e);
1403 }
1404 }
1405
1406 /**
1407 * timed invokeAll(null) throws NPE
1408 */
1409 public void testTimedInvokeAll1() throws Exception {
1410 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1411 try {
1412 e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1413 shouldThrow();
1414 } catch (NullPointerException success) {
1415 } finally {
1416 joinPool(e);
1417 }
1418 }
1419
1420 /**
1421 * timed invokeAll(,,null) throws NPE
1422 */
1423 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1424 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1425 try {
1426 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1427 l.add(new StringTask());
1428 e.invokeAll(l, MEDIUM_DELAY_MS, null);
1429 shouldThrow();
1430 } catch (NullPointerException success) {
1431 } finally {
1432 joinPool(e);
1433 }
1434 }
1435
1436 /**
1437 * timed invokeAll(empty collection) returns empty collection
1438 */
1439 public void testTimedInvokeAll2() throws Exception {
1440 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1441 try {
1442 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1443 assertTrue(r.isEmpty());
1444 } finally {
1445 joinPool(e);
1446 }
1447 }
1448
1449 /**
1450 * timed invokeAll(c) throws NPE if c has null elements
1451 */
1452 public void testTimedInvokeAll3() throws Exception {
1453 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1454 try {
1455 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1456 l.add(new StringTask());
1457 l.add(null);
1458 e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1459 shouldThrow();
1460 } catch (NullPointerException success) {
1461 } finally {
1462 joinPool(e);
1463 }
1464 }
1465
1466 /**
1467 * get of element of invokeAll(c) throws exception on failed task
1468 */
1469 public void testTimedInvokeAll4() throws Exception {
1470 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1471 try {
1472 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1473 l.add(new NPETask());
1474 List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1475 assertEquals(1, result.size());
1476 for (Future<String> future : result)
1477 future.get();
1478 shouldThrow();
1479 } catch (ExecutionException success) {
1480 assertTrue(success.getCause() instanceof NullPointerException);
1481 } finally {
1482 joinPool(e);
1483 }
1484 }
1485
1486 /**
1487 * timed invokeAll(c) returns results of all completed tasks
1488 */
1489 public void testTimedInvokeAll5() throws Exception {
1490 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1491 try {
1492 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1493 l.add(new StringTask());
1494 l.add(new StringTask());
1495 List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1496 assertEquals(2, result.size());
1497 for (Future<String> future : result)
1498 assertSame(TEST_STRING, future.get());
1499 } catch (ExecutionException success) {
1500 } finally {
1501 joinPool(e);
1502 }
1503 }
1504
1505 /**
1506 * timed invokeAll(c) cancels tasks not completed by timeout
1507 */
1508 public void testTimedInvokeAll6() throws Exception {
1509 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1510 try {
1511 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1512 l.add(new StringTask());
1513 l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1514 l.add(new StringTask());
1515 List<Future<String>> result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
1516 assertEquals(3, result.size());
1517 Iterator<Future<String>> it = result.iterator();
1518 Future<String> f1 = it.next();
1519 Future<String> f2 = it.next();
1520 Future<String> f3 = it.next();
1521 assertTrue(f1.isDone());
1522 assertTrue(f2.isDone());
1523 assertTrue(f3.isDone());
1524 assertFalse(f1.isCancelled());
1525 assertTrue(f2.isCancelled());
1526 } finally {
1527 joinPool(e);
1528 }
1529 }
1530
1531 /**
1532 * Execution continues if there is at least one thread even if
1533 * thread factory fails to create more
1534 */
1535 public void testFailingThreadFactory() throws InterruptedException {
1536 ExecutorService e = new CustomTPE(100, 100, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new FailingThreadFactory());
1537 try {
1538 for (int k = 0; k < 100; ++k) {
1539 e.execute(new NoOpRunnable());
1540 }
1541 Thread.sleep(LONG_DELAY_MS);
1542 } finally {
1543 joinPool(e);
1544 }
1545 }
1546
1547 /**
1548 * allowsCoreThreadTimeOut is by default false.
1549 */
1550 public void testAllowsCoreThreadTimeOut() {
1551 ThreadPoolExecutor tpe = new CustomTPE(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1552 assertFalse(tpe.allowsCoreThreadTimeOut());
1553 joinPool(tpe);
1554 }
1555
1556 /**
1557 * allowCoreThreadTimeOut(true) causes idle threads to time out
1558 */
1559 public void testAllowCoreThreadTimeOut_true() throws InterruptedException {
1560 ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1561 tpe.allowCoreThreadTimeOut(true);
1562 tpe.execute(new NoOpRunnable());
1563 try {
1564 Thread.sleep(MEDIUM_DELAY_MS);
1565 assertEquals(0, tpe.getPoolSize());
1566 } finally {
1567 joinPool(tpe);
1568 }
1569 }
1570
1571 /**
1572 * allowCoreThreadTimeOut(false) causes idle threads not to time out
1573 */
1574 public void testAllowCoreThreadTimeOut_false() throws InterruptedException {
1575 ThreadPoolExecutor tpe = new CustomTPE(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1576 tpe.allowCoreThreadTimeOut(false);
1577 tpe.execute(new NoOpRunnable());
1578 try {
1579 Thread.sleep(MEDIUM_DELAY_MS);
1580 assertTrue(tpe.getPoolSize() >= 1);
1581 } finally {
1582 joinPool(tpe);
1583 }
1584 }
1585
1586 }