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