ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AbstractExecutorServiceTest.java
Revision: 1.40
Committed: Sun Oct 4 18:18:48 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.39: +143 -175 lines
Log Message:
PoolCleaning

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/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10
11 import java.security.PrivilegedAction;
12 import java.security.PrivilegedExceptionAction;
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.concurrent.AbstractExecutorService;
17 import java.util.concurrent.ArrayBlockingQueue;
18 import java.util.concurrent.Callable;
19 import java.util.concurrent.CancellationException;
20 import java.util.concurrent.CountDownLatch;
21 import java.util.concurrent.ExecutionException;
22 import java.util.concurrent.Executors;
23 import java.util.concurrent.ExecutorService;
24 import java.util.concurrent.Future;
25 import java.util.concurrent.ThreadPoolExecutor;
26 import java.util.concurrent.TimeUnit;
27 import java.util.concurrent.atomic.AtomicBoolean;
28
29 import junit.framework.Test;
30 import junit.framework.TestSuite;
31
32 public class AbstractExecutorServiceTest extends JSR166TestCase {
33 public static void main(String[] args) {
34 main(suite(), args);
35 }
36 public static Test suite() {
37 return new TestSuite(AbstractExecutorServiceTest.class);
38 }
39
40 /**
41 * A no-frills implementation of AbstractExecutorService, designed
42 * to test the submit methods only.
43 */
44 static class DirectExecutorService extends AbstractExecutorService {
45 public void execute(Runnable r) { r.run(); }
46 public void shutdown() { shutdown = true; }
47 public List<Runnable> shutdownNow() {
48 shutdown = true;
49 return Collections.EMPTY_LIST;
50 }
51 public boolean isShutdown() { return shutdown; }
52 public boolean isTerminated() { return isShutdown(); }
53 public boolean awaitTermination(long timeout, TimeUnit unit) {
54 return isShutdown();
55 }
56 private volatile boolean shutdown = false;
57 }
58
59 /**
60 * execute(runnable) runs it to completion
61 */
62 public void testExecuteRunnable() throws Exception {
63 ExecutorService e = new DirectExecutorService();
64 final AtomicBoolean done = new AtomicBoolean(false);
65 Future<?> future = e.submit(new CheckedRunnable() {
66 public void realRun() {
67 done.set(true);
68 }});
69 assertNull(future.get());
70 assertNull(future.get(0, MILLISECONDS));
71 assertTrue(done.get());
72 assertTrue(future.isDone());
73 assertFalse(future.isCancelled());
74 }
75
76 /**
77 * Completed submit(callable) returns result
78 */
79 public void testSubmitCallable() throws Exception {
80 ExecutorService e = new DirectExecutorService();
81 Future<String> future = e.submit(new StringTask());
82 String result = future.get();
83 assertSame(TEST_STRING, result);
84 }
85
86 /**
87 * Completed submit(runnable) returns successfully
88 */
89 public void testSubmitRunnable() throws Exception {
90 ExecutorService e = new DirectExecutorService();
91 Future<?> future = e.submit(new NoOpRunnable());
92 future.get();
93 assertTrue(future.isDone());
94 }
95
96 /**
97 * Completed submit(runnable, result) returns result
98 */
99 public void testSubmitRunnable2() throws Exception {
100 ExecutorService e = new DirectExecutorService();
101 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
102 String result = future.get();
103 assertSame(TEST_STRING, result);
104 }
105
106 /**
107 * A submitted privileged action runs to completion
108 */
109 public void testSubmitPrivilegedAction() throws Exception {
110 Runnable r = new CheckedRunnable() {
111 public void realRun() throws Exception {
112 ExecutorService e = new DirectExecutorService();
113 Future future = e.submit(Executors.callable(new PrivilegedAction() {
114 public Object run() {
115 return TEST_STRING;
116 }}));
117
118 assertSame(TEST_STRING, future.get());
119 }};
120
121 runWithPermissions(r,
122 new RuntimePermission("getClassLoader"),
123 new RuntimePermission("setContextClassLoader"),
124 new RuntimePermission("modifyThread"));
125 }
126
127 /**
128 * A submitted privileged exception action runs to completion
129 */
130 public void testSubmitPrivilegedExceptionAction() throws Exception {
131 Runnable r = new CheckedRunnable() {
132 public void realRun() throws Exception {
133 ExecutorService e = new DirectExecutorService();
134 Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
135 public Object run() {
136 return TEST_STRING;
137 }}));
138
139 assertSame(TEST_STRING, future.get());
140 }};
141
142 runWithPermissions(r);
143 }
144
145 /**
146 * A submitted failed privileged exception action reports exception
147 */
148 public void testSubmitFailedPrivilegedExceptionAction() throws Exception {
149 Runnable r = new CheckedRunnable() {
150 public void realRun() throws Exception {
151 ExecutorService e = new DirectExecutorService();
152 Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
153 public Object run() throws Exception {
154 throw new IndexOutOfBoundsException();
155 }}));
156
157 try {
158 future.get();
159 shouldThrow();
160 } catch (ExecutionException success) {
161 assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
162 }}};
163
164 runWithPermissions(r);
165 }
166
167 /**
168 * execute(null runnable) throws NPE
169 */
170 public void testExecuteNullRunnable() {
171 ExecutorService e = new DirectExecutorService();
172 try {
173 e.submit((Runnable) null);
174 shouldThrow();
175 } catch (NullPointerException success) {}
176 }
177
178 /**
179 * submit(null callable) throws NPE
180 */
181 public void testSubmitNullCallable() {
182 ExecutorService e = new DirectExecutorService();
183 try {
184 e.submit((Callable) null);
185 shouldThrow();
186 } catch (NullPointerException success) {}
187 }
188
189 /**
190 * submit(callable).get() throws InterruptedException if interrupted
191 */
192 public void testInterruptedSubmit() throws InterruptedException {
193 final CountDownLatch submitted = new CountDownLatch(1);
194 final CountDownLatch quittingTime = new CountDownLatch(1);
195 final Callable<Void> awaiter = new CheckedCallable<Void>() {
196 public Void realCall() throws InterruptedException {
197 quittingTime.await();
198 return null;
199 }};
200 final ExecutorService p
201 = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS,
202 new ArrayBlockingQueue<Runnable>(10));
203 try (PoolCleaner cleaner = cleaner(p)) {
204 Thread t = new Thread(new CheckedInterruptedRunnable() {
205 public void realRun() throws Exception {
206 Future<Void> future = p.submit(awaiter);
207 submitted.countDown();
208 future.get();
209 }});
210 t.start();
211 submitted.await();
212 t.interrupt();
213 t.join();
214 quittingTime.countDown();
215 }
216 }
217
218 /**
219 * get of submit(callable) throws ExecutionException if callable
220 * throws exception
221 */
222 public void testSubmitEE() throws InterruptedException {
223 final ThreadPoolExecutor p =
224 new ThreadPoolExecutor(1, 1,
225 60, TimeUnit.SECONDS,
226 new ArrayBlockingQueue<Runnable>(10));
227 try (PoolCleaner cleaner = cleaner(p)) {
228 Callable c = new Callable() {
229 public Object call() { throw new ArithmeticException(); }};
230 try {
231 p.submit(c).get();
232 shouldThrow();
233 } catch (ExecutionException success) {
234 assertTrue(success.getCause() instanceof ArithmeticException);
235 }
236 }
237 }
238
239 /**
240 * invokeAny(null) throws NPE
241 */
242 public void testInvokeAny1() throws Exception {
243 final ExecutorService e = new DirectExecutorService();
244 try (PoolCleaner cleaner = cleaner(e)) {
245 try {
246 e.invokeAny(null);
247 shouldThrow();
248 } catch (NullPointerException success) {}
249 }
250 }
251
252 /**
253 * invokeAny(empty collection) throws IAE
254 */
255 public void testInvokeAny2() throws Exception {
256 final ExecutorService e = new DirectExecutorService();
257 try (PoolCleaner cleaner = cleaner(e)) {
258 try {
259 e.invokeAny(new ArrayList<Callable<String>>());
260 shouldThrow();
261 } catch (IllegalArgumentException success) {}
262 }
263 }
264
265 /**
266 * invokeAny(c) throws NPE if c has null elements
267 */
268 public void testInvokeAny3() throws Exception {
269 final ExecutorService e = new DirectExecutorService();
270 try (PoolCleaner cleaner = cleaner(e)) {
271 List<Callable<Long>> l = new ArrayList<Callable<Long>>();
272 l.add(new Callable<Long>() {
273 public Long call() { throw new ArithmeticException(); }});
274 l.add(null);
275 try {
276 e.invokeAny(l);
277 shouldThrow();
278 } catch (NullPointerException success) {}
279 }
280 }
281
282 /**
283 * invokeAny(c) throws ExecutionException if no task in c completes
284 */
285 public void testInvokeAny4() throws InterruptedException {
286 final ExecutorService e = new DirectExecutorService();
287 try (PoolCleaner cleaner = cleaner(e)) {
288 List<Callable<String>> l = new ArrayList<Callable<String>>();
289 l.add(new NPETask());
290 try {
291 e.invokeAny(l);
292 shouldThrow();
293 } catch (ExecutionException success) {
294 assertTrue(success.getCause() instanceof NullPointerException);
295 }
296 }
297 }
298
299 /**
300 * invokeAny(c) returns result of some task in c if at least one completes
301 */
302 public void testInvokeAny5() throws Exception {
303 final ExecutorService e = new DirectExecutorService();
304 try (PoolCleaner cleaner = cleaner(e)) {
305 List<Callable<String>> l = new ArrayList<Callable<String>>();
306 l.add(new StringTask());
307 l.add(new StringTask());
308 String result = e.invokeAny(l);
309 assertSame(TEST_STRING, result);
310 }
311 }
312
313 /**
314 * invokeAll(null) throws NPE
315 */
316 public void testInvokeAll1() throws InterruptedException {
317 final ExecutorService e = new DirectExecutorService();
318 try (PoolCleaner cleaner = cleaner(e)) {
319 try {
320 e.invokeAll(null);
321 shouldThrow();
322 } catch (NullPointerException success) {}
323 }
324 }
325
326 /**
327 * invokeAll(empty collection) returns empty collection
328 */
329 public void testInvokeAll2() throws InterruptedException {
330 final ExecutorService e = new DirectExecutorService();
331 try (PoolCleaner cleaner = cleaner(e)) {
332 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
333 assertTrue(r.isEmpty());
334 }
335 }
336
337 /**
338 * invokeAll(c) throws NPE if c has null elements
339 */
340 public void testInvokeAll3() throws InterruptedException {
341 final ExecutorService e = new DirectExecutorService();
342 try (PoolCleaner cleaner = cleaner(e)) {
343 List<Callable<String>> l = new ArrayList<Callable<String>>();
344 l.add(new StringTask());
345 l.add(null);
346 try {
347 e.invokeAll(l);
348 shouldThrow();
349 } catch (NullPointerException success) {}
350 }
351 }
352
353 /**
354 * get of returned element of invokeAll(c) throws exception on failed task
355 */
356 public void testInvokeAll4() throws Exception {
357 final ExecutorService e = new DirectExecutorService();
358 try (PoolCleaner cleaner = cleaner(e)) {
359 List<Callable<String>> l = new ArrayList<Callable<String>>();
360 l.add(new NPETask());
361 List<Future<String>> futures = e.invokeAll(l);
362 assertEquals(1, futures.size());
363 try {
364 futures.get(0).get();
365 shouldThrow();
366 } catch (ExecutionException success) {
367 assertTrue(success.getCause() instanceof NullPointerException);
368 }
369 }
370 }
371
372 /**
373 * invokeAll(c) returns results of all completed tasks in c
374 */
375 public void testInvokeAll5() throws Exception {
376 final ExecutorService e = new DirectExecutorService();
377 try (PoolCleaner cleaner = cleaner(e)) {
378 List<Callable<String>> l = new ArrayList<Callable<String>>();
379 l.add(new StringTask());
380 l.add(new StringTask());
381 List<Future<String>> futures = e.invokeAll(l);
382 assertEquals(2, futures.size());
383 for (Future<String> future : futures)
384 assertSame(TEST_STRING, future.get());
385 }
386 }
387
388 /**
389 * timed invokeAny(null) throws NPE
390 */
391 public void testTimedInvokeAny1() throws Exception {
392 final ExecutorService e = new DirectExecutorService();
393 try (PoolCleaner cleaner = cleaner(e)) {
394 try {
395 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
396 shouldThrow();
397 } catch (NullPointerException success) {}
398 }
399 }
400
401 /**
402 * timed invokeAny(null time unit) throws NPE
403 */
404 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
405 final ExecutorService e = new DirectExecutorService();
406 try (PoolCleaner cleaner = cleaner(e)) {
407 List<Callable<String>> l = new ArrayList<Callable<String>>();
408 l.add(new StringTask());
409 try {
410 e.invokeAny(l, MEDIUM_DELAY_MS, null);
411 shouldThrow();
412 } catch (NullPointerException success) {}
413 }
414 }
415
416 /**
417 * timed invokeAny(empty collection) throws IAE
418 */
419 public void testTimedInvokeAny2() throws Exception {
420 final ExecutorService e = new DirectExecutorService();
421 try (PoolCleaner cleaner = cleaner(e)) {
422 try {
423 e.invokeAny(new ArrayList<Callable<String>>(),
424 MEDIUM_DELAY_MS, MILLISECONDS);
425 shouldThrow();
426 } catch (IllegalArgumentException success) {}
427 }
428 }
429
430 /**
431 * timed invokeAny(c) throws NPE if c has null elements
432 */
433 public void testTimedInvokeAny3() throws Exception {
434 final ExecutorService e = new DirectExecutorService();
435 try (PoolCleaner cleaner = cleaner(e)) {
436 List<Callable<Long>> l = new ArrayList<Callable<Long>>();
437 l.add(new Callable<Long>() {
438 public Long call() { throw new ArithmeticException(); }});
439 l.add(null);
440 try {
441 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
442 shouldThrow();
443 } catch (NullPointerException success) {}
444 }
445 }
446
447 /**
448 * timed invokeAny(c) throws ExecutionException if no task completes
449 */
450 public void testTimedInvokeAny4() throws Exception {
451 final ExecutorService e = new DirectExecutorService();
452 try (PoolCleaner cleaner = cleaner(e)) {
453 List<Callable<String>> l = new ArrayList<Callable<String>>();
454 l.add(new NPETask());
455 try {
456 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
457 shouldThrow();
458 } catch (ExecutionException success) {
459 assertTrue(success.getCause() instanceof NullPointerException);
460 }
461 }
462 }
463
464 /**
465 * timed invokeAny(c) returns result of some task in c
466 */
467 public void testTimedInvokeAny5() throws Exception {
468 final ExecutorService e = new DirectExecutorService();
469 try (PoolCleaner cleaner = cleaner(e)) {
470 List<Callable<String>> l = new ArrayList<Callable<String>>();
471 l.add(new StringTask());
472 l.add(new StringTask());
473 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
474 assertSame(TEST_STRING, result);
475 }
476 }
477
478 /**
479 * timed invokeAll(null) throws NPE
480 */
481 public void testTimedInvokeAll1() throws InterruptedException {
482 final ExecutorService e = new DirectExecutorService();
483 try (PoolCleaner cleaner = cleaner(e)) {
484 try {
485 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
486 shouldThrow();
487 } catch (NullPointerException success) {}
488 }
489 }
490
491 /**
492 * timed invokeAll(null time unit) throws NPE
493 */
494 public void testTimedInvokeAllNullTimeUnit() throws InterruptedException {
495 final ExecutorService e = new DirectExecutorService();
496 try (PoolCleaner cleaner = cleaner(e)) {
497 List<Callable<String>> l = new ArrayList<Callable<String>>();
498 l.add(new StringTask());
499 try {
500 e.invokeAll(l, MEDIUM_DELAY_MS, null);
501 shouldThrow();
502 } catch (NullPointerException success) {}
503 }
504 }
505
506 /**
507 * timed invokeAll(empty collection) returns empty collection
508 */
509 public void testTimedInvokeAll2() throws InterruptedException {
510 final ExecutorService e = new DirectExecutorService();
511 try (PoolCleaner cleaner = cleaner(e)) {
512 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
513 assertTrue(r.isEmpty());
514 }
515 }
516
517 /**
518 * timed invokeAll(c) throws NPE if c has null elements
519 */
520 public void testTimedInvokeAll3() throws InterruptedException {
521 final ExecutorService e = new DirectExecutorService();
522 try (PoolCleaner cleaner = cleaner(e)) {
523 List<Callable<String>> l = new ArrayList<Callable<String>>();
524 l.add(new StringTask());
525 l.add(null);
526 try {
527 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
528 shouldThrow();
529 } catch (NullPointerException success) {}
530 }
531 }
532
533 /**
534 * get of returned element of invokeAll(c) throws exception on failed task
535 */
536 public void testTimedInvokeAll4() throws Exception {
537 final ExecutorService e = new DirectExecutorService();
538 try (PoolCleaner cleaner = cleaner(e)) {
539 List<Callable<String>> l = new ArrayList<Callable<String>>();
540 l.add(new NPETask());
541 List<Future<String>> futures =
542 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
543 assertEquals(1, futures.size());
544 try {
545 futures.get(0).get();
546 shouldThrow();
547 } catch (ExecutionException success) {
548 assertTrue(success.getCause() instanceof NullPointerException);
549 }
550 }
551 }
552
553 /**
554 * timed invokeAll(c) returns results of all completed tasks in c
555 */
556 public void testTimedInvokeAll5() throws Exception {
557 final ExecutorService e = new DirectExecutorService();
558 try (PoolCleaner cleaner = cleaner(e)) {
559 List<Callable<String>> l = new ArrayList<Callable<String>>();
560 l.add(new StringTask());
561 l.add(new StringTask());
562 List<Future<String>> futures =
563 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
564 assertEquals(2, futures.size());
565 for (Future<String> future : futures)
566 assertSame(TEST_STRING, future.get());
567 }
568 }
569
570 /**
571 * timed invokeAll cancels tasks not completed by timeout
572 */
573 public void testTimedInvokeAll6() throws Exception {
574 final ExecutorService e = new DirectExecutorService();
575 try (PoolCleaner cleaner = cleaner(e)) {
576 for (long timeout = timeoutMillis();;) {
577 List<Callable<String>> tasks = new ArrayList<>();
578 tasks.add(new StringTask("0"));
579 tasks.add(Executors.callable(possiblyInterruptedRunnable(timeout),
580 TEST_STRING));
581 tasks.add(new StringTask("2"));
582 long startTime = System.nanoTime();
583 List<Future<String>> futures =
584 e.invokeAll(tasks, timeout, MILLISECONDS);
585 assertEquals(tasks.size(), futures.size());
586 assertTrue(millisElapsedSince(startTime) >= timeout);
587 for (Future future : futures)
588 assertTrue(future.isDone());
589 try {
590 assertEquals("0", futures.get(0).get());
591 assertEquals(TEST_STRING, futures.get(1).get());
592 } catch (CancellationException retryWithLongerTimeout) {
593 // unusual delay before starting second task
594 timeout *= 2;
595 if (timeout >= LONG_DELAY_MS / 2)
596 fail("expected exactly one task to be cancelled");
597 continue;
598 }
599 assertTrue(futures.get(2).isCancelled());
600 break;
601 }
602 }
603 }
604
605 }