blob: d9bf255c5f7307bfb7637140075d037ff238caf2 [file] [log] [blame]
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001/*
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
9package jsr166;
10
11import junit.framework.*;
12import java.io.ByteArrayInputStream;
13import java.io.ByteArrayOutputStream;
14import java.io.ObjectInputStream;
15import java.io.ObjectOutputStream;
16import java.lang.reflect.Method;
17import java.util.ArrayList;
18import java.util.Arrays;
19import java.util.Date;
20import java.util.Enumeration;
21import java.util.List;
22import java.util.NoSuchElementException;
23import java.util.PropertyPermission;
24import java.util.concurrent.*;
25import java.util.concurrent.atomic.AtomicBoolean;
26import java.util.concurrent.atomic.AtomicReference;
27import static java.util.concurrent.TimeUnit.MILLISECONDS;
28import static java.util.concurrent.TimeUnit.NANOSECONDS;
29import java.security.CodeSource;
30import java.security.Permission;
31import java.security.PermissionCollection;
32import java.security.Permissions;
33import java.security.Policy;
34import java.security.ProtectionDomain;
35import java.security.SecurityPermission;
36
37/**
38 * Base class for JSR166 Junit TCK tests. Defines some constants,
39 * utility methods and classes, as well as a simple framework for
40 * helping to make sure that assertions failing in generated threads
41 * cause the associated test that generated them to itself fail (which
42 * JUnit does not otherwise arrange). The rules for creating such
43 * tests are:
44 *
45 * <ol>
46 *
47 * <li> All assertions in code running in generated threads must use
48 * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
49 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
50 * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
51 * particularly recommended) for other code to use these forms too.
52 * Only the most typically used JUnit assertion methods are defined
53 * this way, but enough to live with.</li>
54 *
55 * <li> If you override {@link #setUp} or {@link #tearDown}, make sure
56 * to invoke {@code super.setUp} and {@code super.tearDown} within
57 * them. These methods are used to clear and check for thread
58 * assertion failures.</li>
59 *
60 * <li>All delays and timeouts must use one of the constants {@code
61 * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
62 * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
63 * discriminable from zero time, and always allows enough time for the
64 * small amounts of computation (creating a thread, calling a few
65 * methods, etc) needed to reach a timeout point. Similarly, a SMALL
66 * is always discriminable as larger than SHORT and smaller than
67 * MEDIUM. And so on. These constants are set to conservative values,
68 * but even so, if there is ever any doubt, they can all be increased
69 * in one spot to rerun tests on slower platforms.</li>
70 *
71 * <li> All threads generated must be joined inside each test case
72 * method (or {@code fail} to do so) before returning from the
73 * method. The {@code joinPool} method can be used to do this when
74 * using Executors.</li>
75 *
76 * </ol>
77 *
78 * <p><b>Other notes</b>
79 * <ul>
80 *
81 * <li> Usually, there is one testcase method per JSR166 method
82 * covering "normal" operation, and then as many exception-testing
83 * methods as there are exceptions the method can throw. Sometimes
84 * there are multiple tests per JSR166 method when the different
85 * "normal" behaviors differ significantly. And sometimes testcases
86 * cover multiple methods when they cannot be tested in
87 * isolation.</li>
88 *
89 * <li> The documentation style for testcases is to provide as javadoc
90 * a simple sentence or two describing the property that the testcase
91 * method purports to test. The javadocs do not say anything about how
92 * the property is tested. To find out, read the code.</li>
93 *
94 * <li> These tests are "conformance tests", and do not attempt to
95 * test throughput, latency, scalability or other performance factors
96 * (see the separate "jtreg" tests for a set intended to check these
97 * for the most central aspects of functionality.) So, most tests use
98 * the smallest sensible numbers of threads, collection sizes, etc
99 * needed to check basic conformance.</li>
100 *
101 * <li>The test classes currently do not declare inclusion in
102 * any particular package to simplify things for people integrating
103 * them in TCK test suites.</li>
104 *
105 * <li> As a convenience, the {@code main} of this class (JSR166TestCase)
106 * runs all JSR166 unit tests.</li>
107 *
108 * </ul>
109 */
110public class JSR166TestCase extends TestCase {
111
112 protected static final boolean expensiveTests = false;
113
114 public static long SHORT_DELAY_MS;
115 public static long SMALL_DELAY_MS;
116 public static long MEDIUM_DELAY_MS;
117 public static long LONG_DELAY_MS;
118
119
120 /**
121 * Returns the shortest timed delay. This could
122 * be reimplemented to use for example a Property.
123 */
124 protected long getShortDelay() {
125 return 50;
126 }
127
128 /**
129 * Sets delays as multiples of SHORT_DELAY.
130 */
131 protected void setDelays() {
132 SHORT_DELAY_MS = getShortDelay();
133 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
134 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
135 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
136 }
137
138 /**
139 * Returns a timeout in milliseconds to be used in tests that
140 * verify that operations block or time out.
141 */
142 long timeoutMillis() {
143 return SHORT_DELAY_MS / 4;
144 }
145
146 /**
147 * Returns a new Date instance representing a time delayMillis
148 * milliseconds in the future.
149 */
150 Date delayedDate(long delayMillis) {
151 return new Date(System.currentTimeMillis() + delayMillis);
152 }
153
154 /**
155 * The first exception encountered if any threadAssertXXX method fails.
156 */
157 private final AtomicReference<Throwable> threadFailure
158 = new AtomicReference<Throwable>(null);
159
160 /**
161 * Records an exception so that it can be rethrown later in the test
162 * harness thread, triggering a test case failure. Only the first
163 * failure is recorded; subsequent calls to this method from within
164 * the same test have no effect.
165 */
166 public void threadRecordFailure(Throwable t) {
167 threadFailure.compareAndSet(null, t);
168 }
169
170 public void setUp() {
171 setDelays();
172 }
173
174 /**
175 * Extra checks that get done for all test cases.
176 *
177 * Triggers test case failure if any thread assertions have failed,
178 * by rethrowing, in the test harness thread, any exception recorded
179 * earlier by threadRecordFailure.
180 *
181 * Triggers test case failure if interrupt status is set in the main thread.
182 */
183 public void tearDown() throws Exception {
184 Throwable t = threadFailure.getAndSet(null);
185 if (t != null) {
186 if (t instanceof Error)
187 throw (Error) t;
188 else if (t instanceof RuntimeException)
189 throw (RuntimeException) t;
190 else if (t instanceof Exception)
191 throw (Exception) t;
192 else {
193 AssertionFailedError afe =
194 new AssertionFailedError(t.toString());
195 afe.initCause(t);
196 throw afe;
197 }
198 }
199
200 if (Thread.interrupted())
201 throw new AssertionFailedError("interrupt status set in main thread");
202
203 checkForkJoinPoolThreadLeaks();
204 }
205
206 /**
207 * Find missing try { ... } finally { joinPool(e); }
208 */
209 void checkForkJoinPoolThreadLeaks() throws InterruptedException {
210 Thread[] survivors = new Thread[5];
211 int count = Thread.enumerate(survivors);
212 for (int i = 0; i < count; i++) {
213 Thread thread = survivors[i];
214 String name = thread.getName();
215 if (name.startsWith("ForkJoinPool-")) {
216 // give thread some time to terminate
217 thread.join(LONG_DELAY_MS);
218 if (!thread.isAlive()) continue;
219 thread.stop();
220 throw new AssertionFailedError
221 (String.format("Found leaked ForkJoinPool thread test=%s thread=%s%n",
222 toString(), name));
223 }
224 }
225 }
226
227 /**
228 * Just like fail(reason), but additionally recording (using
229 * threadRecordFailure) any AssertionFailedError thrown, so that
230 * the current testcase will fail.
231 */
232 public void threadFail(String reason) {
233 try {
234 fail(reason);
235 } catch (AssertionFailedError t) {
236 threadRecordFailure(t);
237 fail(reason);
238 }
239 }
240
241 /**
242 * Just like assertTrue(b), but additionally recording (using
243 * threadRecordFailure) any AssertionFailedError thrown, so that
244 * the current testcase will fail.
245 */
246 public void threadAssertTrue(boolean b) {
247 try {
248 assertTrue(b);
249 } catch (AssertionFailedError t) {
250 threadRecordFailure(t);
251 throw t;
252 }
253 }
254
255 /**
256 * Just like assertFalse(b), but additionally recording (using
257 * threadRecordFailure) any AssertionFailedError thrown, so that
258 * the current testcase will fail.
259 */
260 public void threadAssertFalse(boolean b) {
261 try {
262 assertFalse(b);
263 } catch (AssertionFailedError t) {
264 threadRecordFailure(t);
265 throw t;
266 }
267 }
268
269 /**
270 * Just like assertNull(x), but additionally recording (using
271 * threadRecordFailure) any AssertionFailedError thrown, so that
272 * the current testcase will fail.
273 */
274 public void threadAssertNull(Object x) {
275 try {
276 assertNull(x);
277 } catch (AssertionFailedError t) {
278 threadRecordFailure(t);
279 throw t;
280 }
281 }
282
283 /**
284 * Just like assertEquals(x, y), but additionally recording (using
285 * threadRecordFailure) any AssertionFailedError thrown, so that
286 * the current testcase will fail.
287 */
288 public void threadAssertEquals(long x, long y) {
289 try {
290 assertEquals(x, y);
291 } catch (AssertionFailedError t) {
292 threadRecordFailure(t);
293 throw t;
294 }
295 }
296
297 /**
298 * Just like assertEquals(x, y), but additionally recording (using
299 * threadRecordFailure) any AssertionFailedError thrown, so that
300 * the current testcase will fail.
301 */
302 public void threadAssertEquals(Object x, Object y) {
303 try {
304 assertEquals(x, y);
305 } catch (AssertionFailedError t) {
306 threadRecordFailure(t);
307 throw t;
308 } catch (Throwable t) {
309 threadUnexpectedException(t);
310 }
311 }
312
313 /**
314 * Just like assertSame(x, y), but additionally recording (using
315 * threadRecordFailure) any AssertionFailedError thrown, so that
316 * the current testcase will fail.
317 */
318 public void threadAssertSame(Object x, Object y) {
319 try {
320 assertSame(x, y);
321 } catch (AssertionFailedError t) {
322 threadRecordFailure(t);
323 throw t;
324 }
325 }
326
327 /**
328 * Calls threadFail with message "should throw exception".
329 */
330 public void threadShouldThrow() {
331 threadFail("should throw exception");
332 }
333
334 /**
335 * Calls threadFail with message "should throw" + exceptionName.
336 */
337 public void threadShouldThrow(String exceptionName) {
338 threadFail("should throw " + exceptionName);
339 }
340
341 /**
342 * Records the given exception using {@link #threadRecordFailure},
343 * then rethrows the exception, wrapping it in an
344 * AssertionFailedError if necessary.
345 */
346 public void threadUnexpectedException(Throwable t) {
347 threadRecordFailure(t);
348 t.printStackTrace();
349 if (t instanceof RuntimeException)
350 throw (RuntimeException) t;
351 else if (t instanceof Error)
352 throw (Error) t;
353 else {
354 AssertionFailedError afe =
355 new AssertionFailedError("unexpected exception: " + t);
356 afe.initCause(t);
357 throw afe;
358 }
359 }
360
361 /**
362 * Delays, via Thread.sleep, for the given millisecond delay, but
363 * if the sleep is shorter than specified, may re-sleep or yield
364 * until time elapses.
365 */
366 static void delay(long millis) throws InterruptedException {
367 long startTime = System.nanoTime();
368 long ns = millis * 1000 * 1000;
369 for (;;) {
370 if (millis > 0L)
371 Thread.sleep(millis);
372 else // too short to sleep
373 Thread.yield();
374 long d = ns - (System.nanoTime() - startTime);
375 if (d > 0L)
376 millis = d / (1000 * 1000);
377 else
378 break;
379 }
380 }
381
382 /**
383 * Waits out termination of a thread pool or fails doing so.
384 */
385 void joinPool(ExecutorService exec) {
386 try {
387 exec.shutdown();
388 assertTrue("ExecutorService did not terminate in a timely manner",
389 exec.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS));
390 } catch (SecurityException ok) {
391 // Allowed in case test doesn't have privs
392 } catch (InterruptedException ie) {
393 fail("Unexpected InterruptedException");
394 }
395 }
396
397 /**
398 * Checks that thread does not terminate within the default
399 * millisecond delay of {@code timeoutMillis()}.
400 */
401 void assertThreadStaysAlive(Thread thread) {
402 assertThreadStaysAlive(thread, timeoutMillis());
403 }
404
405 /**
406 * Checks that thread does not terminate within the given millisecond delay.
407 */
408 void assertThreadStaysAlive(Thread thread, long millis) {
409 try {
410 // No need to optimize the failing case via Thread.join.
411 delay(millis);
412 assertTrue(thread.isAlive());
413 } catch (InterruptedException ie) {
414 fail("Unexpected InterruptedException");
415 }
416 }
417
418 /**
419 * Checks that the threads do not terminate within the default
420 * millisecond delay of {@code timeoutMillis()}.
421 */
422 void assertThreadsStayAlive(Thread... threads) {
423 assertThreadsStayAlive(timeoutMillis(), threads);
424 }
425
426 /**
427 * Checks that the threads do not terminate within the given millisecond delay.
428 */
429 void assertThreadsStayAlive(long millis, Thread... threads) {
430 try {
431 // No need to optimize the failing case via Thread.join.
432 delay(millis);
433 for (Thread thread : threads)
434 assertTrue(thread.isAlive());
435 } catch (InterruptedException ie) {
436 fail("Unexpected InterruptedException");
437 }
438 }
439
440 /**
441 * Checks that future.get times out, with the default timeout of
442 * {@code timeoutMillis()}.
443 */
444 void assertFutureTimesOut(Future future) {
445 assertFutureTimesOut(future, timeoutMillis());
446 }
447
448 /**
449 * Checks that future.get times out, with the given millisecond timeout.
450 */
451 void assertFutureTimesOut(Future future, long timeoutMillis) {
452 long startTime = System.nanoTime();
453 try {
454 future.get(timeoutMillis, MILLISECONDS);
455 shouldThrow();
456 } catch (TimeoutException success) {
457 } catch (Exception e) {
458 threadUnexpectedException(e);
459 } finally { future.cancel(true); }
460 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
461 }
462
463 /**
464 * Fails with message "should throw exception".
465 */
466 public void shouldThrow() {
467 fail("Should throw exception");
468 }
469
470 /**
471 * Fails with message "should throw " + exceptionName.
472 */
473 public void shouldThrow(String exceptionName) {
474 fail("Should throw " + exceptionName);
475 }
476
477 /**
478 * The number of elements to place in collections, arrays, etc.
479 */
480 public static final int SIZE = 20;
481
482 // Some convenient Integer constants
483
484 public static final Integer zero = new Integer(0);
485 public static final Integer one = new Integer(1);
486 public static final Integer two = new Integer(2);
487 public static final Integer three = new Integer(3);
488 public static final Integer four = new Integer(4);
489 public static final Integer five = new Integer(5);
490 public static final Integer six = new Integer(6);
491 public static final Integer seven = new Integer(7);
492 public static final Integer eight = new Integer(8);
493 public static final Integer nine = new Integer(9);
494 public static final Integer m1 = new Integer(-1);
495 public static final Integer m2 = new Integer(-2);
496 public static final Integer m3 = new Integer(-3);
497 public static final Integer m4 = new Integer(-4);
498 public static final Integer m5 = new Integer(-5);
499 public static final Integer m6 = new Integer(-6);
500 public static final Integer m10 = new Integer(-10);
501
502
503 /**
504 * android-changed
505 * Android does not use a SecurityManager. This will simply execute
506 * the runnable ingoring permisions.
507 */
508 public void runWithPermissions(Runnable r, Permission... permissions) {
509 r.run();
510 }
511
512 /**
513 * android-changed
514 * Android does not use a SecurityManager. This will simply execute
515 * the runnable ingoring permisions.
516 */
517 public void runWithSecurityManagerWithPermissions(Runnable r,
518 Permission... permissions) {
519 r.run();
520 }
521
522 /**
523 * Runs a runnable without any permissions.
524 */
525 public void runWithoutPermissions(Runnable r) {
526 runWithPermissions(r);
527 }
528
529 /**
530 * A security policy where new permissions can be dynamically added
531 * or all cleared.
532 */
533 public static class AdjustablePolicy extends java.security.Policy {
534 Permissions perms = new Permissions();
535 AdjustablePolicy(Permission... permissions) {
536 for (Permission permission : permissions)
537 perms.add(permission);
538 }
539 void addPermission(Permission perm) { perms.add(perm); }
540 void clearPermissions() { perms = new Permissions(); }
541 public PermissionCollection getPermissions(CodeSource cs) {
542 return perms;
543 }
544 public PermissionCollection getPermissions(ProtectionDomain pd) {
545 return perms;
546 }
547 public boolean implies(ProtectionDomain pd, Permission p) {
548 return perms.implies(p);
549 }
550 public void refresh() {}
551 public String toString() {
552 List<Permission> ps = new ArrayList<Permission>();
553 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
554 ps.add(e.nextElement());
555 return "AdjustablePolicy with permissions " + ps;
556 }
557 }
558
559 /**
560 * Returns a policy containing all the permissions we ever need.
561 */
562 public static Policy permissivePolicy() {
563 return new AdjustablePolicy
564 // Permissions j.u.c. needs directly
565 (new RuntimePermission("modifyThread"),
566 new RuntimePermission("getClassLoader"),
567 new RuntimePermission("setContextClassLoader"),
568 // Permissions needed to change permissions!
569 new SecurityPermission("getPolicy"),
570 new SecurityPermission("setPolicy"),
571 new RuntimePermission("setSecurityManager"),
572 // Permissions needed by the junit test harness
573 new RuntimePermission("accessDeclaredMembers"),
574 new PropertyPermission("*", "read"),
575 new java.io.FilePermission("<<ALL FILES>>", "read"));
576 }
577
578 /**
579 * Sleeps until the given time has elapsed.
580 * Throws AssertionFailedError if interrupted.
581 */
582 void sleep(long millis) {
583 try {
584 delay(millis);
585 } catch (InterruptedException ie) {
586 AssertionFailedError afe =
587 new AssertionFailedError("Unexpected InterruptedException");
588 afe.initCause(ie);
589 throw afe;
590 }
591 }
592
593 /**
594 * Spin-waits up to the specified number of milliseconds for the given
595 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
596 */
597 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
598 long startTime = System.nanoTime();
599 for (;;) {
600 Thread.State s = thread.getState();
601 if (s == Thread.State.BLOCKED ||
602 s == Thread.State.WAITING ||
603 s == Thread.State.TIMED_WAITING)
604 return;
605 else if (s == Thread.State.TERMINATED)
606 fail("Unexpected thread termination");
607 else if (millisElapsedSince(startTime) > timeoutMillis) {
608 threadAssertTrue(thread.isAlive());
609 return;
610 }
611 Thread.yield();
612 }
613 }
614
615 /**
616 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
617 * state: BLOCKED, WAITING, or TIMED_WAITING.
618 */
619 void waitForThreadToEnterWaitState(Thread thread) {
620 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
621 }
622
623 /**
624 * Returns the number of milliseconds since time given by
625 * startNanoTime, which must have been previously returned from a
626 * call to {@link System.nanoTime()}.
627 */
628 long millisElapsedSince(long startNanoTime) {
629 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
630 }
631
632 /**
633 * Returns a new started daemon Thread running the given runnable.
634 */
635 Thread newStartedThread(Runnable runnable) {
636 Thread t = new Thread(runnable);
637 t.setDaemon(true);
638 t.start();
639 return t;
640 }
641
642 /**
643 * Waits for the specified time (in milliseconds) for the thread
644 * to terminate (using {@link Thread#join(long)}), else interrupts
645 * the thread (in the hope that it may terminate later) and fails.
646 */
647 void awaitTermination(Thread t, long timeoutMillis) {
648 try {
649 t.join(timeoutMillis);
650 } catch (InterruptedException ie) {
651 threadUnexpectedException(ie);
652 } finally {
653 if (t.getState() != Thread.State.TERMINATED) {
654 t.interrupt();
655 fail("Test timed out");
656 }
657 }
658 }
659
660 /**
661 * Waits for LONG_DELAY_MS milliseconds for the thread to
662 * terminate (using {@link Thread#join(long)}), else interrupts
663 * the thread (in the hope that it may terminate later) and fails.
664 */
665 void awaitTermination(Thread t) {
666 awaitTermination(t, LONG_DELAY_MS);
667 }
668
669 // Some convenient Runnable classes
670
671 public abstract class CheckedRunnable implements Runnable {
672 protected abstract void realRun() throws Throwable;
673
674 public final void run() {
675 try {
676 realRun();
677 } catch (Throwable t) {
678 threadUnexpectedException(t);
679 }
680 }
681 }
682
683 public abstract class RunnableShouldThrow implements Runnable {
684 protected abstract void realRun() throws Throwable;
685
686 final Class<?> exceptionClass;
687
688 <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
689 this.exceptionClass = exceptionClass;
690 }
691
692 public final void run() {
693 try {
694 realRun();
695 threadShouldThrow(exceptionClass.getSimpleName());
696 } catch (Throwable t) {
697 if (! exceptionClass.isInstance(t))
698 threadUnexpectedException(t);
699 }
700 }
701 }
702
703 public abstract class ThreadShouldThrow extends Thread {
704 protected abstract void realRun() throws Throwable;
705
706 final Class<?> exceptionClass;
707
708 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
709 this.exceptionClass = exceptionClass;
710 }
711
712 public final void run() {
713 try {
714 realRun();
715 threadShouldThrow(exceptionClass.getSimpleName());
716 } catch (Throwable t) {
717 if (! exceptionClass.isInstance(t))
718 threadUnexpectedException(t);
719 }
720 }
721 }
722
723 public abstract class CheckedInterruptedRunnable implements Runnable {
724 protected abstract void realRun() throws Throwable;
725
726 public final void run() {
727 try {
728 realRun();
729 threadShouldThrow("InterruptedException");
730 } catch (InterruptedException success) {
731 threadAssertFalse(Thread.interrupted());
732 } catch (Throwable t) {
733 threadUnexpectedException(t);
734 }
735 }
736 }
737
738 public abstract class CheckedCallable<T> implements Callable<T> {
739 protected abstract T realCall() throws Throwable;
740
741 public final T call() {
742 try {
743 return realCall();
744 } catch (Throwable t) {
745 threadUnexpectedException(t);
746 return null;
747 }
748 }
749 }
750
751 public abstract class CheckedInterruptedCallable<T>
752 implements Callable<T> {
753 protected abstract T realCall() throws Throwable;
754
755 public final T call() {
756 try {
757 T result = realCall();
758 threadShouldThrow("InterruptedException");
759 return result;
760 } catch (InterruptedException success) {
761 threadAssertFalse(Thread.interrupted());
762 } catch (Throwable t) {
763 threadUnexpectedException(t);
764 }
765 return null;
766 }
767 }
768
769 public static class NoOpRunnable implements Runnable {
770 public void run() {}
771 }
772
773 public static class NoOpCallable implements Callable {
774 public Object call() { return Boolean.TRUE; }
775 }
776
777 public static final String TEST_STRING = "a test string";
778
779 public static class StringTask implements Callable<String> {
780 public String call() { return TEST_STRING; }
781 }
782
783 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
784 return new CheckedCallable<String>() {
785 protected String realCall() {
786 try {
787 latch.await();
788 } catch (InterruptedException quittingTime) {}
789 return TEST_STRING;
790 }};
791 }
792
793 public Runnable awaiter(final CountDownLatch latch) {
794 return new CheckedRunnable() {
795 public void realRun() throws InterruptedException {
796 await(latch);
797 }};
798 }
799
800 public void await(CountDownLatch latch) {
801 try {
802 assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
803 } catch (Throwable t) {
804 threadUnexpectedException(t);
805 }
806 }
807
808 public void await(Semaphore semaphore) {
809 try {
810 assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
811 } catch (Throwable t) {
812 threadUnexpectedException(t);
813 }
814 }
815
816// /**
817// * Spin-waits up to LONG_DELAY_MS until flag becomes true.
818// */
819// public void await(AtomicBoolean flag) {
820// await(flag, LONG_DELAY_MS);
821// }
822
823// /**
824// * Spin-waits up to the specified timeout until flag becomes true.
825// */
826// public void await(AtomicBoolean flag, long timeoutMillis) {
827// long startTime = System.nanoTime();
828// while (!flag.get()) {
829// if (millisElapsedSince(startTime) > timeoutMillis)
830// throw new AssertionFailedError("timed out");
831// Thread.yield();
832// }
833// }
834
835 public static class NPETask implements Callable<String> {
836 public String call() { throw new NullPointerException(); }
837 }
838
839 public static class CallableOne implements Callable<Integer> {
840 public Integer call() { return one; }
841 }
842
843 public class ShortRunnable extends CheckedRunnable {
844 protected void realRun() throws Throwable {
845 delay(SHORT_DELAY_MS);
846 }
847 }
848
849 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
850 protected void realRun() throws InterruptedException {
851 delay(SHORT_DELAY_MS);
852 }
853 }
854
855 public class SmallRunnable extends CheckedRunnable {
856 protected void realRun() throws Throwable {
857 delay(SMALL_DELAY_MS);
858 }
859 }
860
861 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
862 protected void realRun() {
863 try {
864 delay(SMALL_DELAY_MS);
865 } catch (InterruptedException ok) {}
866 }
867 }
868
869 public class SmallCallable extends CheckedCallable {
870 protected Object realCall() throws InterruptedException {
871 delay(SMALL_DELAY_MS);
872 return Boolean.TRUE;
873 }
874 }
875
876 public class MediumRunnable extends CheckedRunnable {
877 protected void realRun() throws Throwable {
878 delay(MEDIUM_DELAY_MS);
879 }
880 }
881
882 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
883 protected void realRun() throws InterruptedException {
884 delay(MEDIUM_DELAY_MS);
885 }
886 }
887
888 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
889 return new CheckedRunnable() {
890 protected void realRun() {
891 try {
892 delay(timeoutMillis);
893 } catch (InterruptedException ok) {}
894 }};
895 }
896
897 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
898 protected void realRun() {
899 try {
900 delay(MEDIUM_DELAY_MS);
901 } catch (InterruptedException ok) {}
902 }
903 }
904
905 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
906 protected void realRun() {
907 try {
908 delay(LONG_DELAY_MS);
909 } catch (InterruptedException ok) {}
910 }
911 }
912
913 /**
914 * For use as ThreadFactory in constructors
915 */
916 public static class SimpleThreadFactory implements ThreadFactory {
917 public Thread newThread(Runnable r) {
918 return new Thread(r);
919 }
920 }
921
922 public interface TrackedRunnable extends Runnable {
923 boolean isDone();
924 }
925
926 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
927 return new TrackedRunnable() {
928 private volatile boolean done = false;
929 public boolean isDone() { return done; }
930 public void run() {
931 try {
932 delay(timeoutMillis);
933 done = true;
934 } catch (InterruptedException ok) {}
935 }
936 };
937 }
938
939 public static class TrackedShortRunnable implements Runnable {
940 public volatile boolean done = false;
941 public void run() {
942 try {
943 delay(SHORT_DELAY_MS);
944 done = true;
945 } catch (InterruptedException ok) {}
946 }
947 }
948
949 public static class TrackedSmallRunnable implements Runnable {
950 public volatile boolean done = false;
951 public void run() {
952 try {
953 delay(SMALL_DELAY_MS);
954 done = true;
955 } catch (InterruptedException ok) {}
956 }
957 }
958
959 public static class TrackedMediumRunnable implements Runnable {
960 public volatile boolean done = false;
961 public void run() {
962 try {
963 delay(MEDIUM_DELAY_MS);
964 done = true;
965 } catch (InterruptedException ok) {}
966 }
967 }
968
969 public static class TrackedLongRunnable implements Runnable {
970 public volatile boolean done = false;
971 public void run() {
972 try {
973 delay(LONG_DELAY_MS);
974 done = true;
975 } catch (InterruptedException ok) {}
976 }
977 }
978
979 public static class TrackedNoOpRunnable implements Runnable {
980 public volatile boolean done = false;
981 public void run() {
982 done = true;
983 }
984 }
985
986 public static class TrackedCallable implements Callable {
987 public volatile boolean done = false;
988 public Object call() {
989 try {
990 delay(SMALL_DELAY_MS);
991 done = true;
992 } catch (InterruptedException ok) {}
993 return Boolean.TRUE;
994 }
995 }
996
997 /**
998 * Analog of CheckedRunnable for RecursiveAction
999 */
1000 public abstract class CheckedRecursiveAction extends RecursiveAction {
1001 protected abstract void realCompute() throws Throwable;
1002
1003 @Override protected final void compute() {
1004 try {
1005 realCompute();
1006 } catch (Throwable t) {
1007 threadUnexpectedException(t);
1008 }
1009 }
1010 }
1011
1012 /**
1013 * Analog of CheckedCallable for RecursiveTask
1014 */
1015 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1016 protected abstract T realCompute() throws Throwable;
1017
1018 @Override protected final T compute() {
1019 try {
1020 return realCompute();
1021 } catch (Throwable t) {
1022 threadUnexpectedException(t);
1023 return null;
1024 }
1025 }
1026 }
1027
1028 /**
1029 * For use as RejectedExecutionHandler in constructors
1030 */
1031 public static class NoOpREHandler implements RejectedExecutionHandler {
1032 public void rejectedExecution(Runnable r,
1033 ThreadPoolExecutor executor) {}
1034 }
1035
1036 /**
1037 * A CyclicBarrier that uses timed await and fails with
1038 * AssertionFailedErrors instead of throwing checked exceptions.
1039 */
1040 public class CheckedBarrier extends CyclicBarrier {
1041 public CheckedBarrier(int parties) { super(parties); }
1042
1043 public int await() {
1044 try {
1045 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1046 } catch (TimeoutException e) {
1047 throw new AssertionFailedError("timed out");
1048 } catch (Exception e) {
1049 AssertionFailedError afe =
1050 new AssertionFailedError("Unexpected exception: " + e);
1051 afe.initCause(e);
1052 throw afe;
1053 }
1054 }
1055 }
1056
1057 void checkEmpty(BlockingQueue q) {
1058 try {
1059 assertTrue(q.isEmpty());
1060 assertEquals(0, q.size());
1061 assertNull(q.peek());
1062 assertNull(q.poll());
1063 assertNull(q.poll(0, MILLISECONDS));
1064 assertEquals(q.toString(), "[]");
1065 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1066 assertFalse(q.iterator().hasNext());
1067 try {
1068 q.element();
1069 shouldThrow();
1070 } catch (NoSuchElementException success) {}
1071 try {
1072 q.iterator().next();
1073 shouldThrow();
1074 } catch (NoSuchElementException success) {}
1075 try {
1076 q.remove();
1077 shouldThrow();
1078 } catch (NoSuchElementException success) {}
1079 } catch (InterruptedException ie) {
1080 threadUnexpectedException(ie);
1081 }
1082 }
1083
1084 void assertSerialEquals(Object x, Object y) {
1085 assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1086 }
1087
1088 void assertNotSerialEquals(Object x, Object y) {
1089 assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1090 }
1091
1092 byte[] serialBytes(Object o) {
1093 try {
1094 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1095 ObjectOutputStream oos = new ObjectOutputStream(bos);
1096 oos.writeObject(o);
1097 oos.flush();
1098 oos.close();
1099 return bos.toByteArray();
1100 } catch (Throwable t) {
1101 threadUnexpectedException(t);
1102 return new byte[0];
1103 }
1104 }
1105
1106 @SuppressWarnings("unchecked")
1107 <T> T serialClone(T o) {
1108 try {
1109 ObjectInputStream ois = new ObjectInputStream
1110 (new ByteArrayInputStream(serialBytes(o)));
1111 T clone = (T) ois.readObject();
1112 assertSame(o.getClass(), clone.getClass());
1113 return clone;
1114 } catch (Throwable t) {
1115 threadUnexpectedException(t);
1116 return null;
1117 }
1118 }
1119
1120 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1121 Runnable... throwingActions) {
1122 for (Runnable throwingAction : throwingActions) {
1123 boolean threw = false;
1124 try { throwingAction.run(); }
1125 catch (Throwable t) {
1126 threw = true;
1127 if (!expectedExceptionClass.isInstance(t)) {
1128 AssertionFailedError afe =
1129 new AssertionFailedError
1130 ("Expected " + expectedExceptionClass.getName() +
1131 ", got " + t.getClass().getName());
1132 afe.initCause(t);
1133 threadUnexpectedException(afe);
1134 }
1135 }
1136 if (!threw)
1137 shouldThrow(expectedExceptionClass.getName());
1138 }
1139 }
1140}