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 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}
1141