Home | History | Annotate | Download | only in jsr166
      1 /*
      2  * Written by Doug Lea with assistance from members of JCP JSR-166
      3  * Expert Group and released to the public domain, as explained at
      4  * http://creativecommons.org/publicdomain/zero/1.0/
      5  * Other contributors include Andrew Wright, Jeffrey Hayes,
      6  * Pat Fisher, Mike Judd.
      7  */
      8 
      9 
     10 package jsr166;
     11 
     12 import static java.util.concurrent.TimeUnit.MILLISECONDS;
     13 import static java.util.concurrent.TimeUnit.MINUTES;
     14 import static java.util.concurrent.TimeUnit.NANOSECONDS;
     15 
     16 import java.io.ByteArrayInputStream;
     17 import java.io.ByteArrayOutputStream;
     18 import java.io.ObjectInputStream;
     19 import java.io.ObjectOutputStream;
     20 import java.lang.reflect.Constructor;
     21 import java.lang.reflect.Method;
     22 import java.lang.reflect.Modifier;
     23  import java.security.CodeSource;
     24 import java.security.Permission;
     25 import java.security.PermissionCollection;
     26 import java.security.Permissions;
     27 import java.security.Policy;
     28 import java.security.ProtectionDomain;
     29 import java.security.SecurityPermission;
     30 import java.util.ArrayList;
     31 import java.util.Arrays;
     32 import java.util.Date;
     33 import java.util.Enumeration;
     34 import java.util.Iterator;
     35 import java.util.List;
     36 import java.util.NoSuchElementException;
     37 import java.util.PropertyPermission;
     38 import java.util.concurrent.BlockingQueue;
     39 import java.util.concurrent.Callable;
     40 import java.util.concurrent.CountDownLatch;
     41 import java.util.concurrent.CyclicBarrier;
     42 import java.util.concurrent.ExecutionException;
     43 import java.util.concurrent.Executors;
     44 import java.util.concurrent.ExecutorService;
     45 import java.util.concurrent.ForkJoinPool;
     46 import java.util.concurrent.Future;
     47 import java.util.concurrent.RecursiveAction;
     48 import java.util.concurrent.RecursiveTask;
     49 import java.util.concurrent.RejectedExecutionHandler;
     50 import java.util.concurrent.Semaphore;
     51 import java.util.concurrent.ThreadFactory;
     52 import java.util.concurrent.ThreadPoolExecutor;
     53 import java.util.concurrent.TimeoutException;
     54 import java.util.concurrent.atomic.AtomicBoolean;
     55 import java.util.concurrent.atomic.AtomicReference;
     56 import java.util.regex.Matcher;
     57 import java.util.regex.Pattern;
     58 
     59 import junit.framework.AssertionFailedError;
     60 import junit.framework.Test;
     61 import junit.framework.TestCase;
     62 import junit.framework.TestResult;
     63 import junit.framework.TestSuite;
     64 
     65 /**
     66  * Base class for JSR166 Junit TCK tests.  Defines some constants,
     67  * utility methods and classes, as well as a simple framework for
     68  * helping to make sure that assertions failing in generated threads
     69  * cause the associated test that generated them to itself fail (which
     70  * JUnit does not otherwise arrange).  The rules for creating such
     71  * tests are:
     72  *
     73  * <ol>
     74  *
     75  * <li>All assertions in code running in generated threads must use
     76  * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
     77  * #threadAssertEquals}, or {@link #threadAssertNull}, (not
     78  * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
     79  * particularly recommended) for other code to use these forms too.
     80  * Only the most typically used JUnit assertion methods are defined
     81  * this way, but enough to live with.
     82  *
     83  * <li>If you override {@link #setUp} or {@link #tearDown}, make sure
     84  * to invoke {@code super.setUp} and {@code super.tearDown} within
     85  * them. These methods are used to clear and check for thread
     86  * assertion failures.
     87  *
     88  * <li>All delays and timeouts must use one of the constants {@code
     89  * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
     90  * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
     91  * discriminable from zero time, and always allows enough time for the
     92  * small amounts of computation (creating a thread, calling a few
     93  * methods, etc) needed to reach a timeout point. Similarly, a SMALL
     94  * is always discriminable as larger than SHORT and smaller than
     95  * MEDIUM.  And so on. These constants are set to conservative values,
     96  * but even so, if there is ever any doubt, they can all be increased
     97  * in one spot to rerun tests on slower platforms.
     98  *
     99  * <li>All threads generated must be joined inside each test case
    100  * method (or {@code fail} to do so) before returning from the
    101  * method. The {@code joinPool} method can be used to do this when
    102  * using Executors.
    103  *
    104  * </ol>
    105  *
    106  * <p><b>Other notes</b>
    107  * <ul>
    108  *
    109  * <li>Usually, there is one testcase method per JSR166 method
    110  * covering "normal" operation, and then as many exception-testing
    111  * methods as there are exceptions the method can throw. Sometimes
    112  * there are multiple tests per JSR166 method when the different
    113  * "normal" behaviors differ significantly. And sometimes testcases
    114  * cover multiple methods when they cannot be tested in isolation.
    115  *
    116  * <li>The documentation style for testcases is to provide as javadoc
    117  * a simple sentence or two describing the property that the testcase
    118  * method purports to test. The javadocs do not say anything about how
    119  * the property is tested. To find out, read the code.
    120  *
    121  * <li>These tests are "conformance tests", and do not attempt to
    122  * test throughput, latency, scalability or other performance factors
    123  * (see the separate "jtreg" tests for a set intended to check these
    124  * for the most central aspects of functionality.) So, most tests use
    125  * the smallest sensible numbers of threads, collection sizes, etc
    126  * needed to check basic conformance.
    127  *
    128  * <li>The test classes currently do not declare inclusion in
    129  * any particular package to simplify things for people integrating
    130  * them in TCK test suites.
    131  *
    132  * <li>As a convenience, the {@code main} of this class (JSR166TestCase)
    133  * runs all JSR166 unit tests.
    134  *
    135  * </ul>
    136  */
    137 public class JSR166TestCase extends TestCase {
    138     private static final boolean useSecurityManager =
    139         Boolean.getBoolean("jsr166.useSecurityManager");
    140 
    141     protected static final boolean expensiveTests =
    142         Boolean.getBoolean("jsr166.expensiveTests");
    143 
    144     /**
    145      * If true, also run tests that are not part of the official tck
    146      * because they test unspecified implementation details.
    147      */
    148     protected static final boolean testImplementationDetails =
    149         Boolean.getBoolean("jsr166.testImplementationDetails");
    150 
    151     /**
    152      * If true, report on stdout all "slow" tests, that is, ones that
    153      * take more than profileThreshold milliseconds to execute.
    154      */
    155     private static final boolean profileTests =
    156         Boolean.getBoolean("jsr166.profileTests");
    157 
    158     /**
    159      * The number of milliseconds that tests are permitted for
    160      * execution without being reported, when profileTests is set.
    161      */
    162     private static final long profileThreshold =
    163         Long.getLong("jsr166.profileThreshold", 100);
    164 
    165     /**
    166      * The number of repetitions per test (for tickling rare bugs).
    167      */
    168     private static final int runsPerTest =
    169         Integer.getInteger("jsr166.runsPerTest", 1);
    170 
    171     /**
    172      * The number of repetitions of the test suite (for finding leaks?).
    173      */
    174     private static final int suiteRuns =
    175         Integer.getInteger("jsr166.suiteRuns", 1);
    176 
    177     private static float systemPropertyValue(String name, float defaultValue) {
    178         String floatString = System.getProperty(name);
    179         if (floatString == null)
    180             return defaultValue;
    181         try {
    182             return Float.parseFloat(floatString);
    183         } catch (NumberFormatException ex) {
    184             throw new IllegalArgumentException(
    185                 String.format("Bad float value in system property %s=%s",
    186                               name, floatString));
    187         }
    188     }
    189 
    190     /**
    191      * The scaling factor to apply to standard delays used in tests.
    192      */
    193     private static final float delayFactor =
    194         systemPropertyValue("jsr166.delay.factor", 1.0f);
    195 
    196     /**
    197      * The timeout factor as used in the jtreg test harness.
    198      * See: http://openjdk.java.net/jtreg/tag-spec.html
    199      */
    200     private static final float jtregTestTimeoutFactor
    201         = systemPropertyValue("test.timeout.factor", 1.0f);
    202 
    203     public JSR166TestCase() { super(); }
    204     public JSR166TestCase(String name) { super(name); }
    205 
    206     /**
    207      * A filter for tests to run, matching strings of the form
    208      * methodName(className), e.g. "testInvokeAll5(ForkJoinPoolTest)"
    209      * Usefully combined with jsr166.runsPerTest.
    210      */
    211     private static final Pattern methodFilter = methodFilter();
    212 
    213     private static Pattern methodFilter() {
    214         String regex = System.getProperty("jsr166.methodFilter");
    215         return (regex == null) ? null : Pattern.compile(regex);
    216     }
    217 
    218     // Instrumentation to debug very rare, but very annoying hung test runs.
    219     static volatile TestCase currentTestCase;
    220     // static volatile int currentRun = 0;
    221     static {
    222         Runnable checkForWedgedTest = new Runnable() { public void run() {
    223             // Avoid spurious reports with enormous runsPerTest.
    224             // A single test case run should never take more than 1 second.
    225             // But let's cap it at the high end too ...
    226             final int timeoutMinutes =
    227                 Math.min(15, Math.max(runsPerTest / 60, 1));
    228             for (TestCase lastTestCase = currentTestCase;;) {
    229                 try { MINUTES.sleep(timeoutMinutes); }
    230                 catch (InterruptedException unexpected) { break; }
    231                 if (lastTestCase == currentTestCase) {
    232                     System.err.printf(
    233                         "Looks like we're stuck running test: %s%n",
    234                         lastTestCase);
    235 //                     System.err.printf(
    236 //                         "Looks like we're stuck running test: %s (%d/%d)%n",
    237 //                         lastTestCase, currentRun, runsPerTest);
    238 //                     System.err.println("availableProcessors=" +
    239 //                         Runtime.getRuntime().availableProcessors());
    240 //                     System.err.printf("cpu model = %s%n", cpuModel());
    241                     dumpTestThreads();
    242                     // one stack dump is probably enough; more would be spam
    243                     break;
    244                 }
    245                 lastTestCase = currentTestCase;
    246             }}};
    247         Thread thread = new Thread(checkForWedgedTest, "checkForWedgedTest");
    248         thread.setDaemon(true);
    249         thread.start();
    250     }
    251 
    252 //     public static String cpuModel() {
    253 //         try {
    254 //             Matcher matcher = Pattern.compile("model name\\s*: (.*)")
    255 //                 .matcher(new String(
    256 //                      Files.readAllBytes(Paths.get("/proc/cpuinfo")), "UTF-8"));
    257 //             matcher.find();
    258 //             return matcher.group(1);
    259 //         } catch (Exception ex) { return null; }
    260 //     }
    261 
    262     public void runBare() throws Throwable {
    263         currentTestCase = this;
    264         if (methodFilter == null
    265             || methodFilter.matcher(toString()).find())
    266             super.runBare();
    267     }
    268 
    269     protected void runTest() throws Throwable {
    270         for (int i = 0; i < runsPerTest; i++) {
    271             // currentRun = i;
    272             if (profileTests)
    273                 runTestProfiled();
    274             else
    275                 super.runTest();
    276         }
    277     }
    278 
    279     protected void runTestProfiled() throws Throwable {
    280         for (int i = 0; i < 2; i++) {
    281             long startTime = System.nanoTime();
    282             super.runTest();
    283             long elapsedMillis = millisElapsedSince(startTime);
    284             if (elapsedMillis < profileThreshold)
    285                 break;
    286             // Never report first run of any test; treat it as a
    287             // warmup run, notably to trigger all needed classloading,
    288             if (i > 0)
    289                 System.out.printf("%n%s: %d%n", toString(), elapsedMillis);
    290         }
    291     }
    292 
    293     /**
    294      * Runs all JSR166 unit tests using junit.textui.TestRunner.
    295      */
    296     // android-note: Removed because no junit.textui
    297     // public static void main(String[] args) {
    298     //     main(suite(), args);
    299     // }
    300 
    301     // static class PithyResultPrinter extends junit.textui.ResultPrinter {
    302     //     PithyResultPrinter(java.io.PrintStream writer) { super(writer); }
    303     //     long runTime;
    304     //     public void startTest(Test test) {}
    305     //     protected void printHeader(long runTime) {
    306     //         this.runTime = runTime; // defer printing for later
    307     //     }
    308     //     protected void printFooter(TestResult result) {
    309     //         if (result.wasSuccessful()) {
    310     //             getWriter().println("OK (" + result.runCount() + " tests)"
    311     //                 + "  Time: " + elapsedTimeAsString(runTime));
    312     //         } else {
    313     //             getWriter().println("Time: " + elapsedTimeAsString(runTime));
    314     //             super.printFooter(result);
    315     //         }
    316     //     }
    317     // }
    318 
    319     /**
    320      * Returns a TestRunner that doesn't bother with unnecessary
    321      * fluff, like printing a "." for each test case.
    322      */
    323     // static junit.textui.TestRunner newPithyTestRunner() {
    324     //     junit.textui.TestRunner runner = new junit.textui.TestRunner();
    325     //     runner.setPrinter(new PithyResultPrinter(System.out));
    326     //     return runner;
    327     // }
    328 
    329     /**
    330      * Runs all unit tests in the given test suite.
    331      * Actual behavior influenced by jsr166.* system properties.
    332      */
    333     // static void main(Test suite, String[] args) {
    334     //     if (useSecurityManager) {
    335     //         System.err.println("Setting a permissive security manager");
    336     //         Policy.setPolicy(permissivePolicy());
    337     //         System.setSecurityManager(new SecurityManager());
    338     //     }
    339     //     for (int i = 0; i < suiteRuns; i++) {
    340     //         TestResult result = newPithyTestRunner().doRun(suite);
    341     //         if (!result.wasSuccessful())
    342     //             System.exit(1);
    343     //         System.gc();
    344     //         System.runFinalization();
    345     //     }
    346     // }
    347 
    348     public static TestSuite newTestSuite(Object... suiteOrClasses) {
    349         TestSuite suite = new TestSuite();
    350         for (Object suiteOrClass : suiteOrClasses) {
    351             if (suiteOrClass instanceof TestSuite)
    352                 suite.addTest((TestSuite) suiteOrClass);
    353             else if (suiteOrClass instanceof Class)
    354                 suite.addTest(new TestSuite((Class<?>) suiteOrClass));
    355             else
    356                 throw new ClassCastException("not a test suite or class");
    357         }
    358         return suite;
    359     }
    360 
    361     public static void addNamedTestClasses(TestSuite suite,
    362                                            String... testClassNames) {
    363         for (String testClassName : testClassNames) {
    364             try {
    365                 Class<?> testClass = Class.forName(testClassName);
    366                 Method m = testClass.getDeclaredMethod("suite",
    367                                                        new Class<?>[0]);
    368                 suite.addTest(newTestSuite((Test)m.invoke(null)));
    369             } catch (Exception e) {
    370                 throw new Error("Missing test class", e);
    371             }
    372         }
    373     }
    374 
    375     public static final double JAVA_CLASS_VERSION;
    376     public static final String JAVA_SPECIFICATION_VERSION;
    377     static {
    378         try {
    379             JAVA_CLASS_VERSION = java.security.AccessController.doPrivileged(
    380                 new java.security.PrivilegedAction<Double>() {
    381                 public Double run() {
    382                     return Double.valueOf(System.getProperty("java.class.version"));}});
    383             JAVA_SPECIFICATION_VERSION = java.security.AccessController.doPrivileged(
    384                 new java.security.PrivilegedAction<String>() {
    385                 public String run() {
    386                     return System.getProperty("java.specification.version");}});
    387         } catch (Throwable t) {
    388             throw new Error(t);
    389         }
    390     }
    391 
    392     public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
    393     public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
    394     public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
    395     public static boolean atLeastJava9() {
    396         return JAVA_CLASS_VERSION >= 53.0
    397             // As of 2015-09, java9 still uses 52.0 class file version
    398             || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?(9|[0-9][0-9])$");
    399     }
    400     public static boolean atLeastJava10() {
    401         return JAVA_CLASS_VERSION >= 54.0
    402             || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?[0-9][0-9]$");
    403     }
    404 
    405     /**
    406      * Collects all JSR166 unit tests as one suite.
    407      */
    408     // android-note: Removed because the CTS runner does a bad job of
    409     // public static Test suite() {
    410     //     // Java7+ test classes
    411     //     TestSuite suite = newTestSuite(
    412     //         ForkJoinPoolTest.suite(),
    413     //         ForkJoinTaskTest.suite(),
    414     //         RecursiveActionTest.suite(),
    415     //         RecursiveTaskTest.suite(),
    416     //         LinkedTransferQueueTest.suite(),
    417     //         PhaserTest.suite(),
    418     //         ThreadLocalRandomTest.suite(),
    419     //         AbstractExecutorServiceTest.suite(),
    420     //         AbstractQueueTest.suite(),
    421     //         AbstractQueuedSynchronizerTest.suite(),
    422     //         AbstractQueuedLongSynchronizerTest.suite(),
    423     //         ArrayBlockingQueueTest.suite(),
    424     //         ArrayDequeTest.suite(),
    425     //         AtomicBooleanTest.suite(),
    426     //         AtomicIntegerArrayTest.suite(),
    427     //         AtomicIntegerFieldUpdaterTest.suite(),
    428     //         AtomicIntegerTest.suite(),
    429     //         AtomicLongArrayTest.suite(),
    430     //         AtomicLongFieldUpdaterTest.suite(),
    431     //         AtomicLongTest.suite(),
    432     //         AtomicMarkableReferenceTest.suite(),
    433     //         AtomicReferenceArrayTest.suite(),
    434     //         AtomicReferenceFieldUpdaterTest.suite(),
    435     //         AtomicReferenceTest.suite(),
    436     //         AtomicStampedReferenceTest.suite(),
    437     //         ConcurrentHashMapTest.suite(),
    438     //         ConcurrentLinkedDequeTest.suite(),
    439     //         ConcurrentLinkedQueueTest.suite(),
    440     //         ConcurrentSkipListMapTest.suite(),
    441     //         ConcurrentSkipListSubMapTest.suite(),
    442     //         ConcurrentSkipListSetTest.suite(),
    443     //         ConcurrentSkipListSubSetTest.suite(),
    444     //         CopyOnWriteArrayListTest.suite(),
    445     //         CopyOnWriteArraySetTest.suite(),
    446     //         CountDownLatchTest.suite(),
    447     //         CyclicBarrierTest.suite(),
    448     //         DelayQueueTest.suite(),
    449     //         EntryTest.suite(),
    450     //         ExchangerTest.suite(),
    451     //         ExecutorsTest.suite(),
    452     //         ExecutorCompletionServiceTest.suite(),
    453     //         FutureTaskTest.suite(),
    454     //         LinkedBlockingDequeTest.suite(),
    455     //         LinkedBlockingQueueTest.suite(),
    456     //         LinkedListTest.suite(),
    457     //         LockSupportTest.suite(),
    458     //         PriorityBlockingQueueTest.suite(),
    459     //         PriorityQueueTest.suite(),
    460     //         ReentrantLockTest.suite(),
    461     //         ReentrantReadWriteLockTest.suite(),
    462     //         ScheduledExecutorTest.suite(),
    463     //         ScheduledExecutorSubclassTest.suite(),
    464     //         SemaphoreTest.suite(),
    465     //         SynchronousQueueTest.suite(),
    466     //         SystemTest.suite(),
    467     //         ThreadLocalTest.suite(),
    468     //         ThreadPoolExecutorTest.suite(),
    469     //         ThreadPoolExecutorSubclassTest.suite(),
    470     //         ThreadTest.suite(),
    471     //         TimeUnitTest.suite(),
    472     //         TreeMapTest.suite(),
    473     //         TreeSetTest.suite(),
    474     //         TreeSubMapTest.suite(),
    475     //         TreeSubSetTest.suite());
    476 
    477     //     // Java8+ test classes
    478     //     if (atLeastJava8()) {
    479     //         String[] java8TestClassNames = {
    480     //             "Atomic8Test",
    481     //             "CompletableFutureTest",
    482     //             "ConcurrentHashMap8Test",
    483     //             "CountedCompleterTest",
    484     //             "DoubleAccumulatorTest",
    485     //             "DoubleAdderTest",
    486     //             "ForkJoinPool8Test",
    487     //             "ForkJoinTask8Test",
    488     //             "LongAccumulatorTest",
    489     //             "LongAdderTest",
    490     //             "SplittableRandomTest",
    491     //             "StampedLockTest",
    492     //             "SubmissionPublisherTest",
    493     //             "ThreadLocalRandom8Test",
    494     //         };
    495     //         addNamedTestClasses(suite, java8TestClassNames);
    496     //     }
    497 
    498     //     // Java9+ test classes
    499     //     if (atLeastJava9()) {
    500     //         String[] java9TestClassNames = {
    501     //             // Currently empty, but expecting varhandle tests
    502     //         };
    503     //         addNamedTestClasses(suite, java9TestClassNames);
    504     //     }
    505 
    506     //     return suite;
    507     // }
    508 
    509     /** Returns list of junit-style test method names in given class. */
    510     public static ArrayList<String> testMethodNames(Class<?> testClass) {
    511         Method[] methods = testClass.getDeclaredMethods();
    512         ArrayList<String> names = new ArrayList<String>(methods.length);
    513         for (Method method : methods) {
    514             if (method.getName().startsWith("test")
    515                 && Modifier.isPublic(method.getModifiers())
    516                 // method.getParameterCount() requires jdk8+
    517                 && method.getParameterTypes().length == 0) {
    518                 names.add(method.getName());
    519             }
    520         }
    521         return names;
    522     }
    523 
    524     /**
    525      * Returns junit-style testSuite for the given test class, but
    526      * parameterized by passing extra data to each test.
    527      */
    528     public static <ExtraData> Test parameterizedTestSuite
    529         (Class<? extends JSR166TestCase> testClass,
    530          Class<ExtraData> dataClass,
    531          ExtraData data) {
    532         try {
    533             TestSuite suite = new TestSuite();
    534             Constructor c =
    535                 testClass.getDeclaredConstructor(dataClass, String.class);
    536             for (String methodName : testMethodNames(testClass))
    537                 suite.addTest((Test) c.newInstance(data, methodName));
    538             return suite;
    539         } catch (Exception e) {
    540             throw new Error(e);
    541         }
    542     }
    543 
    544     /**
    545      * Returns junit-style testSuite for the jdk8 extension of the
    546      * given test class, but parameterized by passing extra data to
    547      * each test.  Uses reflection to allow compilation in jdk7.
    548      */
    549     public static <ExtraData> Test jdk8ParameterizedTestSuite
    550         (Class<? extends JSR166TestCase> testClass,
    551          Class<ExtraData> dataClass,
    552          ExtraData data) {
    553         if (atLeastJava8()) {
    554             String name = testClass.getName();
    555             String name8 = name.replaceAll("Test$", "8Test");
    556             if (name.equals(name8)) throw new Error(name);
    557             try {
    558                 return (Test)
    559                     Class.forName(name8)
    560                     .getMethod("testSuite", new Class[] { dataClass })
    561                     .invoke(null, data);
    562             } catch (Exception e) {
    563                 throw new Error(e);
    564             }
    565         } else {
    566             return new TestSuite();
    567         }
    568     }
    569 
    570     // Delays for timing-dependent tests, in milliseconds.
    571 
    572     public static long SHORT_DELAY_MS;
    573     public static long SMALL_DELAY_MS;
    574     public static long MEDIUM_DELAY_MS;
    575     public static long LONG_DELAY_MS;
    576 
    577     /**
    578      * Returns the shortest timed delay. This can be scaled up for
    579      * slow machines using the jsr166.delay.factor system property,
    580      * or via jtreg's -timeoutFactor: flag.
    581      * http://openjdk.java.net/jtreg/command-help.html
    582      */
    583     protected long getShortDelay() {
    584         return (long) (50 * delayFactor * jtregTestTimeoutFactor);
    585     }
    586 
    587     /**
    588      * Sets delays as multiples of SHORT_DELAY.
    589      */
    590     protected void setDelays() {
    591         SHORT_DELAY_MS = getShortDelay();
    592         SMALL_DELAY_MS  = SHORT_DELAY_MS * 5;
    593         MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
    594         LONG_DELAY_MS   = SHORT_DELAY_MS * 200;
    595     }
    596 
    597     /**
    598      * Returns a timeout in milliseconds to be used in tests that
    599      * verify that operations block or time out.
    600      */
    601     long timeoutMillis() {
    602         return SHORT_DELAY_MS / 4;
    603     }
    604 
    605     /**
    606      * Returns a new Date instance representing a time at least
    607      * delayMillis milliseconds in the future.
    608      */
    609     Date delayedDate(long delayMillis) {
    610         // Add 1 because currentTimeMillis is known to round into the past.
    611         return new Date(System.currentTimeMillis() + delayMillis + 1);
    612     }
    613 
    614     /**
    615      * The first exception encountered if any threadAssertXXX method fails.
    616      */
    617     private final AtomicReference<Throwable> threadFailure
    618         = new AtomicReference<Throwable>(null);
    619 
    620     /**
    621      * Records an exception so that it can be rethrown later in the test
    622      * harness thread, triggering a test case failure.  Only the first
    623      * failure is recorded; subsequent calls to this method from within
    624      * the same test have no effect.
    625      */
    626     public void threadRecordFailure(Throwable t) {
    627         System.err.println(t);
    628         dumpTestThreads();
    629         threadFailure.compareAndSet(null, t);
    630     }
    631 
    632     public void setUp() {
    633         setDelays();
    634     }
    635 
    636     void tearDownFail(String format, Object... args) {
    637         String msg = toString() + ": " + String.format(format, args);
    638         System.err.println(msg);
    639         dumpTestThreads();
    640         throw new AssertionFailedError(msg);
    641     }
    642 
    643     /**
    644      * Extra checks that get done for all test cases.
    645      *
    646      * Triggers test case failure if any thread assertions have failed,
    647      * by rethrowing, in the test harness thread, any exception recorded
    648      * earlier by threadRecordFailure.
    649      *
    650      * Triggers test case failure if interrupt status is set in the main thread.
    651      */
    652     public void tearDown() throws Exception {
    653         Throwable t = threadFailure.getAndSet(null);
    654         if (t != null) {
    655             if (t instanceof Error)
    656                 throw (Error) t;
    657             else if (t instanceof RuntimeException)
    658                 throw (RuntimeException) t;
    659             else if (t instanceof Exception)
    660                 throw (Exception) t;
    661             else {
    662                 AssertionFailedError afe =
    663                     new AssertionFailedError(t.toString());
    664                 afe.initCause(t);
    665                 throw afe;
    666             }
    667         }
    668 
    669         if (Thread.interrupted())
    670             tearDownFail("interrupt status set in main thread");
    671 
    672         checkForkJoinPoolThreadLeaks();
    673     }
    674 
    675     /**
    676      * Finds missing PoolCleaners
    677      */
    678     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
    679         Thread[] survivors = new Thread[7];
    680         int count = Thread.enumerate(survivors);
    681         for (int i = 0; i < count; i++) {
    682             Thread thread = survivors[i];
    683             String name = thread.getName();
    684             if (name.startsWith("ForkJoinPool-")) {
    685                 // give thread some time to terminate
    686                 thread.join(LONG_DELAY_MS);
    687                 if (thread.isAlive())
    688                     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
    689                                  thread);
    690             }
    691         }
    692 
    693         if (!ForkJoinPool.commonPool()
    694             .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
    695             tearDownFail("ForkJoin common pool thread stuck");
    696     }
    697 
    698     /**
    699      * Just like fail(reason), but additionally recording (using
    700      * threadRecordFailure) any AssertionFailedError thrown, so that
    701      * the current testcase will fail.
    702      */
    703     public void threadFail(String reason) {
    704         try {
    705             fail(reason);
    706         } catch (AssertionFailedError t) {
    707             threadRecordFailure(t);
    708             throw t;
    709         }
    710     }
    711 
    712     /**
    713      * Just like assertTrue(b), but additionally recording (using
    714      * threadRecordFailure) any AssertionFailedError thrown, so that
    715      * the current testcase will fail.
    716      */
    717     public void threadAssertTrue(boolean b) {
    718         try {
    719             assertTrue(b);
    720         } catch (AssertionFailedError t) {
    721             threadRecordFailure(t);
    722             throw t;
    723         }
    724     }
    725 
    726     /**
    727      * Just like assertFalse(b), but additionally recording (using
    728      * threadRecordFailure) any AssertionFailedError thrown, so that
    729      * the current testcase will fail.
    730      */
    731     public void threadAssertFalse(boolean b) {
    732         try {
    733             assertFalse(b);
    734         } catch (AssertionFailedError t) {
    735             threadRecordFailure(t);
    736             throw t;
    737         }
    738     }
    739 
    740     /**
    741      * Just like assertNull(x), but additionally recording (using
    742      * threadRecordFailure) any AssertionFailedError thrown, so that
    743      * the current testcase will fail.
    744      */
    745     public void threadAssertNull(Object x) {
    746         try {
    747             assertNull(x);
    748         } catch (AssertionFailedError t) {
    749             threadRecordFailure(t);
    750             throw t;
    751         }
    752     }
    753 
    754     /**
    755      * Just like assertEquals(x, y), but additionally recording (using
    756      * threadRecordFailure) any AssertionFailedError thrown, so that
    757      * the current testcase will fail.
    758      */
    759     public void threadAssertEquals(long x, long y) {
    760         try {
    761             assertEquals(x, y);
    762         } catch (AssertionFailedError t) {
    763             threadRecordFailure(t);
    764             throw t;
    765         }
    766     }
    767 
    768     /**
    769      * Just like assertEquals(x, y), but additionally recording (using
    770      * threadRecordFailure) any AssertionFailedError thrown, so that
    771      * the current testcase will fail.
    772      */
    773     public void threadAssertEquals(Object x, Object y) {
    774         try {
    775             assertEquals(x, y);
    776         } catch (AssertionFailedError fail) {
    777             threadRecordFailure(fail);
    778             throw fail;
    779         } catch (Throwable fail) {
    780             threadUnexpectedException(fail);
    781         }
    782     }
    783 
    784     /**
    785      * Just like assertSame(x, y), but additionally recording (using
    786      * threadRecordFailure) any AssertionFailedError thrown, so that
    787      * the current testcase will fail.
    788      */
    789     public void threadAssertSame(Object x, Object y) {
    790         try {
    791             assertSame(x, y);
    792         } catch (AssertionFailedError fail) {
    793             threadRecordFailure(fail);
    794             throw fail;
    795         }
    796     }
    797 
    798     /**
    799      * Calls threadFail with message "should throw exception".
    800      */
    801     public void threadShouldThrow() {
    802         threadFail("should throw exception");
    803     }
    804 
    805     /**
    806      * Calls threadFail with message "should throw" + exceptionName.
    807      */
    808     public void threadShouldThrow(String exceptionName) {
    809         threadFail("should throw " + exceptionName);
    810     }
    811 
    812     /**
    813      * Records the given exception using {@link #threadRecordFailure},
    814      * then rethrows the exception, wrapping it in an
    815      * AssertionFailedError if necessary.
    816      */
    817     public void threadUnexpectedException(Throwable t) {
    818         threadRecordFailure(t);
    819         t.printStackTrace();
    820         if (t instanceof RuntimeException)
    821             throw (RuntimeException) t;
    822         else if (t instanceof Error)
    823             throw (Error) t;
    824         else {
    825             AssertionFailedError afe =
    826                 new AssertionFailedError("unexpected exception: " + t);
    827             afe.initCause(t);
    828             throw afe;
    829         }
    830     }
    831 
    832     /**
    833      * Delays, via Thread.sleep, for the given millisecond delay, but
    834      * if the sleep is shorter than specified, may re-sleep or yield
    835      * until time elapses.  Ensures that the given time, as measured
    836      * by System.nanoTime(), has elapsed.
    837      */
    838     static void delay(long millis) throws InterruptedException {
    839         long nanos = millis * (1000 * 1000);
    840         final long wakeupTime = System.nanoTime() + nanos;
    841         do {
    842             if (millis > 0L)
    843                 Thread.sleep(millis);
    844             else // too short to sleep
    845                 Thread.yield();
    846             nanos = wakeupTime - System.nanoTime();
    847             millis = nanos / (1000 * 1000);
    848         } while (nanos >= 0L);
    849     }
    850 
    851     /**
    852      * Allows use of try-with-resources with per-test thread pools.
    853      */
    854     class PoolCleaner implements AutoCloseable {
    855         private final ExecutorService pool;
    856         public PoolCleaner(ExecutorService pool) { this.pool = pool; }
    857         public void close() { joinPool(pool); }
    858     }
    859 
    860     /**
    861      * An extension of PoolCleaner that has an action to release the pool.
    862      */
    863     class PoolCleanerWithReleaser extends PoolCleaner {
    864         private final Runnable releaser;
    865         public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
    866             super(pool);
    867             this.releaser = releaser;
    868         }
    869         public void close() {
    870             try {
    871                 releaser.run();
    872             } finally {
    873                 super.close();
    874             }
    875         }
    876     }
    877 
    878     PoolCleaner cleaner(ExecutorService pool) {
    879         return new PoolCleaner(pool);
    880     }
    881 
    882     PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
    883         return new PoolCleanerWithReleaser(pool, releaser);
    884     }
    885 
    886     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
    887         return new PoolCleanerWithReleaser(pool, releaser(latch));
    888     }
    889 
    890     Runnable releaser(final CountDownLatch latch) {
    891         return new Runnable() { public void run() {
    892             do { latch.countDown(); }
    893             while (latch.getCount() > 0);
    894         }};
    895     }
    896 
    897     PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
    898         return new PoolCleanerWithReleaser(pool, releaser(flag));
    899     }
    900 
    901     Runnable releaser(final AtomicBoolean flag) {
    902         return new Runnable() { public void run() { flag.set(true); }};
    903     }
    904 
    905     /**
    906      * Waits out termination of a thread pool or fails doing so.
    907      */
    908     void joinPool(ExecutorService pool) {
    909         try {
    910             pool.shutdown();
    911             if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
    912                 try {
    913                     threadFail("ExecutorService " + pool +
    914                                " did not terminate in a timely manner");
    915                 } finally {
    916                     // last resort, for the benefit of subsequent tests
    917                     pool.shutdownNow();
    918                     pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
    919                 }
    920             }
    921         } catch (SecurityException ok) {
    922             // Allowed in case test doesn't have privs
    923         } catch (InterruptedException fail) {
    924             threadFail("Unexpected InterruptedException");
    925         }
    926     }
    927 
    928     /** Like Runnable, but with the freedom to throw anything */
    929     interface Action { public void run() throws Throwable; }
    930 
    931     /**
    932      * Runs all the given actions in parallel, failing if any fail.
    933      * Useful for running multiple variants of tests that are
    934      * necessarily individually slow because they must block.
    935      */
    936     void testInParallel(Action ... actions) {
    937         ExecutorService pool = Executors.newCachedThreadPool();
    938         try (PoolCleaner cleaner = cleaner(pool)) {
    939             ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
    940             for (final Action action : actions)
    941                 futures.add(pool.submit(new CheckedRunnable() {
    942                     public void realRun() throws Throwable { action.run();}}));
    943             for (Future<?> future : futures)
    944                 try {
    945                     assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
    946                 } catch (ExecutionException ex) {
    947                     threadUnexpectedException(ex.getCause());
    948                 } catch (Exception ex) {
    949                     threadUnexpectedException(ex);
    950                 }
    951         }
    952     }
    953 
    954     /**
    955      * A debugging tool to print stack traces of most threads, as jstack does.
    956      * Uninteresting threads are filtered out.
    957      */
    958     static void dumpTestThreads() {
    959         // Android-change no ThreadMXBean
    960         // ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    961         // System.err.println("------ stacktrace dump start ------");
    962         // for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
    963         //     String name = info.getThreadName();
    964         //     if ("Signal Dispatcher".equals(name))
    965         //         continue;
    966         //     if ("Reference Handler".equals(name)
    967         //         && info.getLockName().startsWith("java.lang.ref.Reference$Lock"))
    968         //         continue;
    969         //     if ("Finalizer".equals(name)
    970         //         && info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock"))
    971         //         continue;
    972         //     if ("checkForWedgedTest".equals(name))
    973         //         continue;
    974         //     System.err.print(info);
    975         // }
    976         // System.err.println("------ stacktrace dump end ------");
    977     }
    978 
    979     /**
    980      * Checks that thread does not terminate within the default
    981      * millisecond delay of {@code timeoutMillis()}.
    982      */
    983     void assertThreadStaysAlive(Thread thread) {
    984         assertThreadStaysAlive(thread, timeoutMillis());
    985     }
    986 
    987     /**
    988      * Checks that thread does not terminate within the given millisecond delay.
    989      */
    990     void assertThreadStaysAlive(Thread thread, long millis) {
    991         try {
    992             // No need to optimize the failing case via Thread.join.
    993             delay(millis);
    994             assertTrue(thread.isAlive());
    995         } catch (InterruptedException fail) {
    996             threadFail("Unexpected InterruptedException");
    997         }
    998     }
    999 
   1000     /**
   1001      * Checks that the threads do not terminate within the default
   1002      * millisecond delay of {@code timeoutMillis()}.
   1003      */
   1004     void assertThreadsStayAlive(Thread... threads) {
   1005         assertThreadsStayAlive(timeoutMillis(), threads);
   1006     }
   1007 
   1008     /**
   1009      * Checks that the threads do not terminate within the given millisecond delay.
   1010      */
   1011     void assertThreadsStayAlive(long millis, Thread... threads) {
   1012         try {
   1013             // No need to optimize the failing case via Thread.join.
   1014             delay(millis);
   1015             for (Thread thread : threads)
   1016                 assertTrue(thread.isAlive());
   1017         } catch (InterruptedException fail) {
   1018             threadFail("Unexpected InterruptedException");
   1019         }
   1020     }
   1021 
   1022     /**
   1023      * Checks that future.get times out, with the default timeout of
   1024      * {@code timeoutMillis()}.
   1025      */
   1026     void assertFutureTimesOut(Future future) {
   1027         assertFutureTimesOut(future, timeoutMillis());
   1028     }
   1029 
   1030     /**
   1031      * Checks that future.get times out, with the given millisecond timeout.
   1032      */
   1033     void assertFutureTimesOut(Future future, long timeoutMillis) {
   1034         long startTime = System.nanoTime();
   1035         try {
   1036             future.get(timeoutMillis, MILLISECONDS);
   1037             shouldThrow();
   1038         } catch (TimeoutException success) {
   1039         } catch (Exception fail) {
   1040             threadUnexpectedException(fail);
   1041         } finally { future.cancel(true); }
   1042         assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
   1043     }
   1044 
   1045     /**
   1046      * Fails with message "should throw exception".
   1047      */
   1048     public void shouldThrow() {
   1049         fail("Should throw exception");
   1050     }
   1051 
   1052     /**
   1053      * Fails with message "should throw " + exceptionName.
   1054      */
   1055     public void shouldThrow(String exceptionName) {
   1056         fail("Should throw " + exceptionName);
   1057     }
   1058 
   1059     /**
   1060      * The number of elements to place in collections, arrays, etc.
   1061      */
   1062     public static final int SIZE = 20;
   1063 
   1064     // Some convenient Integer constants
   1065 
   1066     public static final Integer zero  = new Integer(0);
   1067     public static final Integer one   = new Integer(1);
   1068     public static final Integer two   = new Integer(2);
   1069     public static final Integer three = new Integer(3);
   1070     public static final Integer four  = new Integer(4);
   1071     public static final Integer five  = new Integer(5);
   1072     public static final Integer six   = new Integer(6);
   1073     public static final Integer seven = new Integer(7);
   1074     public static final Integer eight = new Integer(8);
   1075     public static final Integer nine  = new Integer(9);
   1076     public static final Integer m1  = new Integer(-1);
   1077     public static final Integer m2  = new Integer(-2);
   1078     public static final Integer m3  = new Integer(-3);
   1079     public static final Integer m4  = new Integer(-4);
   1080     public static final Integer m5  = new Integer(-5);
   1081     public static final Integer m6  = new Integer(-6);
   1082     public static final Integer m10 = new Integer(-10);
   1083 
   1084     /**
   1085      * Runs Runnable r with a security policy that permits precisely
   1086      * the specified permissions.  If there is no current security
   1087      * manager, the runnable is run twice, both with and without a
   1088      * security manager.  We require that any security manager permit
   1089      * getPolicy/setPolicy.
   1090      */
   1091     public void runWithPermissions(Runnable r, Permission... permissions) {
   1092         // Android-changed: no SecurityManager
   1093         // SecurityManager sm = System.getSecurityManager();
   1094         // if (sm == null) {
   1095         //     r.run();
   1096         // }
   1097         // runWithSecurityManagerWithPermissions(r, permissions);
   1098         r.run();
   1099     }
   1100 
   1101     /**
   1102      * Runs Runnable r with a security policy that permits precisely
   1103      * the specified permissions.  If there is no current security
   1104      * manager, a temporary one is set for the duration of the
   1105      * Runnable.  We require that any security manager permit
   1106      * getPolicy/setPolicy.
   1107      */
   1108     public void runWithSecurityManagerWithPermissions(Runnable r,
   1109                                                       Permission... permissions) {
   1110         // Android-changed: no SecurityManager
   1111         // SecurityManager sm = System.getSecurityManager();
   1112         // if (sm == null) {
   1113         //     Policy savedPolicy = Policy.getPolicy();
   1114         //     try {
   1115         //         Policy.setPolicy(permissivePolicy());
   1116         //         System.setSecurityManager(new SecurityManager());
   1117         //         runWithSecurityManagerWithPermissions(r, permissions);
   1118         //     } finally {
   1119         //         System.setSecurityManager(null);
   1120         //         Policy.setPolicy(savedPolicy);
   1121         //     }
   1122         // } else {
   1123         //     Policy savedPolicy = Policy.getPolicy();
   1124         //     AdjustablePolicy policy = new AdjustablePolicy(permissions);
   1125         //     Policy.setPolicy(policy);
   1126 
   1127         //     try {
   1128         //         r.run();
   1129         //     } finally {
   1130         //         policy.addPermission(new SecurityPermission("setPolicy"));
   1131         //         Policy.setPolicy(savedPolicy);
   1132         //     }
   1133         // }
   1134         r.run();
   1135     }
   1136 
   1137     /**
   1138      * Runs a runnable without any permissions.
   1139      */
   1140     public void runWithoutPermissions(Runnable r) {
   1141         runWithPermissions(r);
   1142     }
   1143 
   1144     /**
   1145      * A security policy where new permissions can be dynamically added
   1146      * or all cleared.
   1147      */
   1148     public static class AdjustablePolicy extends java.security.Policy {
   1149         Permissions perms = new Permissions();
   1150         AdjustablePolicy(Permission... permissions) {
   1151             for (Permission permission : permissions)
   1152                 perms.add(permission);
   1153         }
   1154         void addPermission(Permission perm) { perms.add(perm); }
   1155         void clearPermissions() { perms = new Permissions(); }
   1156         public PermissionCollection getPermissions(CodeSource cs) {
   1157             return perms;
   1158         }
   1159         public PermissionCollection getPermissions(ProtectionDomain pd) {
   1160             return perms;
   1161         }
   1162         public boolean implies(ProtectionDomain pd, Permission p) {
   1163             return perms.implies(p);
   1164         }
   1165         public void refresh() {}
   1166         public String toString() {
   1167             List<Permission> ps = new ArrayList<Permission>();
   1168             for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
   1169                 ps.add(e.nextElement());
   1170             return "AdjustablePolicy with permissions " + ps;
   1171         }
   1172     }
   1173 
   1174     /**
   1175      * Returns a policy containing all the permissions we ever need.
   1176      */
   1177     public static Policy permissivePolicy() {
   1178         return new AdjustablePolicy
   1179             // Permissions j.u.c. needs directly
   1180             (new RuntimePermission("modifyThread"),
   1181              new RuntimePermission("getClassLoader"),
   1182              new RuntimePermission("setContextClassLoader"),
   1183              // Permissions needed to change permissions!
   1184              new SecurityPermission("getPolicy"),
   1185              new SecurityPermission("setPolicy"),
   1186              new RuntimePermission("setSecurityManager"),
   1187              // Permissions needed by the junit test harness
   1188              new RuntimePermission("accessDeclaredMembers"),
   1189              new PropertyPermission("*", "read"),
   1190              new java.io.FilePermission("<<ALL FILES>>", "read"));
   1191     }
   1192 
   1193     /**
   1194      * Sleeps until the given time has elapsed.
   1195      * Throws AssertionFailedError if interrupted.
   1196      */
   1197     void sleep(long millis) {
   1198         try {
   1199             delay(millis);
   1200         } catch (InterruptedException fail) {
   1201             AssertionFailedError afe =
   1202                 new AssertionFailedError("Unexpected InterruptedException");
   1203             afe.initCause(fail);
   1204             throw afe;
   1205         }
   1206     }
   1207 
   1208     /**
   1209      * Spin-waits up to the specified number of milliseconds for the given
   1210      * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
   1211      */
   1212     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
   1213         long startTime = System.nanoTime();
   1214         for (;;) {
   1215             Thread.State s = thread.getState();
   1216             if (s == Thread.State.BLOCKED ||
   1217                 s == Thread.State.WAITING ||
   1218                 s == Thread.State.TIMED_WAITING)
   1219                 return;
   1220             else if (s == Thread.State.TERMINATED)
   1221                 fail("Unexpected thread termination");
   1222             else if (millisElapsedSince(startTime) > timeoutMillis) {
   1223                 threadAssertTrue(thread.isAlive());
   1224                 fail("timed out waiting for thread to enter wait state");
   1225             }
   1226             Thread.yield();
   1227         }
   1228     }
   1229 
   1230     /**
   1231      * Spin-waits up to the specified number of milliseconds for the given
   1232      * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
   1233      * and additionally satisfy the given condition.
   1234      */
   1235     void waitForThreadToEnterWaitState(
   1236         Thread thread, long timeoutMillis, Callable<Boolean> waitingForGodot) {
   1237         long startTime = 0L;
   1238         for (;;) {
   1239             Thread.State s = thread.getState();
   1240             if (s == Thread.State.BLOCKED ||
   1241                 s == Thread.State.WAITING ||
   1242                 s == Thread.State.TIMED_WAITING) {
   1243                 try {
   1244                     if (waitingForGodot.call())
   1245                         return;
   1246                 } catch (Throwable fail) { threadUnexpectedException(fail); }
   1247             }
   1248             else if (s == Thread.State.TERMINATED)
   1249                 fail("Unexpected thread termination");
   1250             else if (startTime == 0L)
   1251                 startTime = System.nanoTime();
   1252             else if (millisElapsedSince(startTime) > timeoutMillis) {
   1253                 threadAssertTrue(thread.isAlive());
   1254                 fail("timed out waiting for thread to enter wait state");
   1255             }
   1256             Thread.yield();
   1257         }
   1258     }
   1259 
   1260     /**
   1261      * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
   1262      * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
   1263      */
   1264     void waitForThreadToEnterWaitState(Thread thread) {
   1265         waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
   1266     }
   1267 
   1268     /**
   1269      * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
   1270      * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
   1271      * and additionally satisfy the given condition.
   1272      */
   1273     void waitForThreadToEnterWaitState(
   1274         Thread thread, Callable<Boolean> waitingForGodot) {
   1275         waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, waitingForGodot);
   1276     }
   1277 
   1278     /**
   1279      * Returns the number of milliseconds since time given by
   1280      * startNanoTime, which must have been previously returned from a
   1281      * call to {@link System#nanoTime()}.
   1282      */
   1283     static long millisElapsedSince(long startNanoTime) {
   1284         return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
   1285     }
   1286 
   1287 //     void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
   1288 //         long startTime = System.nanoTime();
   1289 //         try {
   1290 //             r.run();
   1291 //         } catch (Throwable fail) { threadUnexpectedException(fail); }
   1292 //         if (millisElapsedSince(startTime) > timeoutMillis/2)
   1293 //             throw new AssertionFailedError("did not return promptly");
   1294 //     }
   1295 
   1296 //     void assertTerminatesPromptly(Runnable r) {
   1297 //         assertTerminatesPromptly(LONG_DELAY_MS/2, r);
   1298 //     }
   1299 
   1300     /**
   1301      * Checks that timed f.get() returns the expected value, and does not
   1302      * wait for the timeout to elapse before returning.
   1303      */
   1304     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
   1305         long startTime = System.nanoTime();
   1306         try {
   1307             assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
   1308         } catch (Throwable fail) { threadUnexpectedException(fail); }
   1309         if (millisElapsedSince(startTime) > timeoutMillis/2)
   1310             throw new AssertionFailedError("timed get did not return promptly");
   1311     }
   1312 
   1313     <T> void checkTimedGet(Future<T> f, T expectedValue) {
   1314         checkTimedGet(f, expectedValue, LONG_DELAY_MS);
   1315     }
   1316 
   1317     /**
   1318      * Returns a new started daemon Thread running the given runnable.
   1319      */
   1320     Thread newStartedThread(Runnable runnable) {
   1321         Thread t = new Thread(runnable);
   1322         t.setDaemon(true);
   1323         t.start();
   1324         return t;
   1325     }
   1326 
   1327     /**
   1328      * Waits for the specified time (in milliseconds) for the thread
   1329      * to terminate (using {@link Thread#join(long)}), else interrupts
   1330      * the thread (in the hope that it may terminate later) and fails.
   1331      */
   1332     void awaitTermination(Thread t, long timeoutMillis) {
   1333         try {
   1334             t.join(timeoutMillis);
   1335         } catch (InterruptedException fail) {
   1336             threadUnexpectedException(fail);
   1337         } finally {
   1338             if (t.getState() != Thread.State.TERMINATED) {
   1339                 t.interrupt();
   1340                 threadFail("timed out waiting for thread to terminate");
   1341             }
   1342         }
   1343     }
   1344 
   1345     /**
   1346      * Waits for LONG_DELAY_MS milliseconds for the thread to
   1347      * terminate (using {@link Thread#join(long)}), else interrupts
   1348      * the thread (in the hope that it may terminate later) and fails.
   1349      */
   1350     void awaitTermination(Thread t) {
   1351         awaitTermination(t, LONG_DELAY_MS);
   1352     }
   1353 
   1354     // Some convenient Runnable classes
   1355 
   1356     public abstract class CheckedRunnable implements Runnable {
   1357         protected abstract void realRun() throws Throwable;
   1358 
   1359         public final void run() {
   1360             try {
   1361                 realRun();
   1362             } catch (Throwable fail) {
   1363                 threadUnexpectedException(fail);
   1364             }
   1365         }
   1366     }
   1367 
   1368     public abstract class RunnableShouldThrow implements Runnable {
   1369         protected abstract void realRun() throws Throwable;
   1370 
   1371         final Class<?> exceptionClass;
   1372 
   1373         <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
   1374             this.exceptionClass = exceptionClass;
   1375         }
   1376 
   1377         public final void run() {
   1378             try {
   1379                 realRun();
   1380                 threadShouldThrow(exceptionClass.getSimpleName());
   1381             } catch (Throwable t) {
   1382                 if (! exceptionClass.isInstance(t))
   1383                     threadUnexpectedException(t);
   1384             }
   1385         }
   1386     }
   1387 
   1388     public abstract class ThreadShouldThrow extends Thread {
   1389         protected abstract void realRun() throws Throwable;
   1390 
   1391         final Class<?> exceptionClass;
   1392 
   1393         <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
   1394             this.exceptionClass = exceptionClass;
   1395         }
   1396 
   1397         public final void run() {
   1398             try {
   1399                 realRun();
   1400                 threadShouldThrow(exceptionClass.getSimpleName());
   1401             } catch (Throwable t) {
   1402                 if (! exceptionClass.isInstance(t))
   1403                     threadUnexpectedException(t);
   1404             }
   1405         }
   1406     }
   1407 
   1408     public abstract class CheckedInterruptedRunnable implements Runnable {
   1409         protected abstract void realRun() throws Throwable;
   1410 
   1411         public final void run() {
   1412             try {
   1413                 realRun();
   1414                 threadShouldThrow("InterruptedException");
   1415             } catch (InterruptedException success) {
   1416                 threadAssertFalse(Thread.interrupted());
   1417             } catch (Throwable fail) {
   1418                 threadUnexpectedException(fail);
   1419             }
   1420         }
   1421     }
   1422 
   1423     public abstract class CheckedCallable<T> implements Callable<T> {
   1424         protected abstract T realCall() throws Throwable;
   1425 
   1426         public final T call() {
   1427             try {
   1428                 return realCall();
   1429             } catch (Throwable fail) {
   1430                 threadUnexpectedException(fail);
   1431                 return null;
   1432             }
   1433         }
   1434     }
   1435 
   1436     public abstract class CheckedInterruptedCallable<T>
   1437         implements Callable<T> {
   1438         protected abstract T realCall() throws Throwable;
   1439 
   1440         public final T call() {
   1441             try {
   1442                 T result = realCall();
   1443                 threadShouldThrow("InterruptedException");
   1444                 return result;
   1445             } catch (InterruptedException success) {
   1446                 threadAssertFalse(Thread.interrupted());
   1447             } catch (Throwable fail) {
   1448                 threadUnexpectedException(fail);
   1449             }
   1450             return null;
   1451         }
   1452     }
   1453 
   1454     public static class NoOpRunnable implements Runnable {
   1455         public void run() {}
   1456     }
   1457 
   1458     public static class NoOpCallable implements Callable {
   1459         public Object call() { return Boolean.TRUE; }
   1460     }
   1461 
   1462     public static final String TEST_STRING = "a test string";
   1463 
   1464     public static class StringTask implements Callable<String> {
   1465         final String value;
   1466         public StringTask() { this(TEST_STRING); }
   1467         public StringTask(String value) { this.value = value; }
   1468         public String call() { return value; }
   1469     }
   1470 
   1471     public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
   1472         return new CheckedCallable<String>() {
   1473             protected String realCall() {
   1474                 try {
   1475                     latch.await();
   1476                 } catch (InterruptedException quittingTime) {}
   1477                 return TEST_STRING;
   1478             }};
   1479     }
   1480 
   1481     public Runnable countDowner(final CountDownLatch latch) {
   1482         return new CheckedRunnable() {
   1483             public void realRun() throws InterruptedException {
   1484                 latch.countDown();
   1485             }};
   1486     }
   1487 
   1488     class LatchAwaiter extends CheckedRunnable {
   1489         static final int NEW = 0;
   1490         static final int RUNNING = 1;
   1491         static final int DONE = 2;
   1492         final CountDownLatch latch;
   1493         int state = NEW;
   1494         LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
   1495         public void realRun() throws InterruptedException {
   1496             state = 1;
   1497             await(latch);
   1498             state = 2;
   1499         }
   1500     }
   1501 
   1502     public LatchAwaiter awaiter(CountDownLatch latch) {
   1503         return new LatchAwaiter(latch);
   1504     }
   1505 
   1506     public void await(CountDownLatch latch, long timeoutMillis) {
   1507         try {
   1508             if (!latch.await(timeoutMillis, MILLISECONDS))
   1509                 fail("timed out waiting for CountDownLatch for "
   1510                      + (timeoutMillis/1000) + " sec");
   1511         } catch (Throwable fail) {
   1512             threadUnexpectedException(fail);
   1513         }
   1514     }
   1515 
   1516     public void await(CountDownLatch latch) {
   1517         await(latch, LONG_DELAY_MS);
   1518     }
   1519 
   1520     public void await(Semaphore semaphore) {
   1521         try {
   1522             if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
   1523                 fail("timed out waiting for Semaphore for "
   1524                      + (LONG_DELAY_MS/1000) + " sec");
   1525         } catch (Throwable fail) {
   1526             threadUnexpectedException(fail);
   1527         }
   1528     }
   1529 
   1530 //     /**
   1531 //      * Spin-waits up to LONG_DELAY_MS until flag becomes true.
   1532 //      */
   1533 //     public void await(AtomicBoolean flag) {
   1534 //         await(flag, LONG_DELAY_MS);
   1535 //     }
   1536 
   1537 //     /**
   1538 //      * Spin-waits up to the specified timeout until flag becomes true.
   1539 //      */
   1540 //     public void await(AtomicBoolean flag, long timeoutMillis) {
   1541 //         long startTime = System.nanoTime();
   1542 //         while (!flag.get()) {
   1543 //             if (millisElapsedSince(startTime) > timeoutMillis)
   1544 //                 throw new AssertionFailedError("timed out");
   1545 //             Thread.yield();
   1546 //         }
   1547 //     }
   1548 
   1549     public static class NPETask implements Callable<String> {
   1550         public String call() { throw new NullPointerException(); }
   1551     }
   1552 
   1553     public static class CallableOne implements Callable<Integer> {
   1554         public Integer call() { return one; }
   1555     }
   1556 
   1557     public class ShortRunnable extends CheckedRunnable {
   1558         protected void realRun() throws Throwable {
   1559             delay(SHORT_DELAY_MS);
   1560         }
   1561     }
   1562 
   1563     public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
   1564         protected void realRun() throws InterruptedException {
   1565             delay(SHORT_DELAY_MS);
   1566         }
   1567     }
   1568 
   1569     public class SmallRunnable extends CheckedRunnable {
   1570         protected void realRun() throws Throwable {
   1571             delay(SMALL_DELAY_MS);
   1572         }
   1573     }
   1574 
   1575     public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
   1576         protected void realRun() {
   1577             try {
   1578                 delay(SMALL_DELAY_MS);
   1579             } catch (InterruptedException ok) {}
   1580         }
   1581     }
   1582 
   1583     public class SmallCallable extends CheckedCallable {
   1584         protected Object realCall() throws InterruptedException {
   1585             delay(SMALL_DELAY_MS);
   1586             return Boolean.TRUE;
   1587         }
   1588     }
   1589 
   1590     public class MediumRunnable extends CheckedRunnable {
   1591         protected void realRun() throws Throwable {
   1592             delay(MEDIUM_DELAY_MS);
   1593         }
   1594     }
   1595 
   1596     public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
   1597         protected void realRun() throws InterruptedException {
   1598             delay(MEDIUM_DELAY_MS);
   1599         }
   1600     }
   1601 
   1602     public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
   1603         return new CheckedRunnable() {
   1604             protected void realRun() {
   1605                 try {
   1606                     delay(timeoutMillis);
   1607                 } catch (InterruptedException ok) {}
   1608             }};
   1609     }
   1610 
   1611     public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
   1612         protected void realRun() {
   1613             try {
   1614                 delay(MEDIUM_DELAY_MS);
   1615             } catch (InterruptedException ok) {}
   1616         }
   1617     }
   1618 
   1619     public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
   1620         protected void realRun() {
   1621             try {
   1622                 delay(LONG_DELAY_MS);
   1623             } catch (InterruptedException ok) {}
   1624         }
   1625     }
   1626 
   1627     /**
   1628      * For use as ThreadFactory in constructors
   1629      */
   1630     public static class SimpleThreadFactory implements ThreadFactory {
   1631         public Thread newThread(Runnable r) {
   1632             return new Thread(r);
   1633         }
   1634     }
   1635 
   1636     public interface TrackedRunnable extends Runnable {
   1637         boolean isDone();
   1638     }
   1639 
   1640     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
   1641         return new TrackedRunnable() {
   1642                 private volatile boolean done = false;
   1643                 public boolean isDone() { return done; }
   1644                 public void run() {
   1645                     try {
   1646                         delay(timeoutMillis);
   1647                         done = true;
   1648                     } catch (InterruptedException ok) {}
   1649                 }
   1650             };
   1651     }
   1652 
   1653     public static class TrackedShortRunnable implements Runnable {
   1654         public volatile boolean done = false;
   1655         public void run() {
   1656             try {
   1657                 delay(SHORT_DELAY_MS);
   1658                 done = true;
   1659             } catch (InterruptedException ok) {}
   1660         }
   1661     }
   1662 
   1663     public static class TrackedSmallRunnable implements Runnable {
   1664         public volatile boolean done = false;
   1665         public void run() {
   1666             try {
   1667                 delay(SMALL_DELAY_MS);
   1668                 done = true;
   1669             } catch (InterruptedException ok) {}
   1670         }
   1671     }
   1672 
   1673     public static class TrackedMediumRunnable implements Runnable {
   1674         public volatile boolean done = false;
   1675         public void run() {
   1676             try {
   1677                 delay(MEDIUM_DELAY_MS);
   1678                 done = true;
   1679             } catch (InterruptedException ok) {}
   1680         }
   1681     }
   1682 
   1683     public static class TrackedLongRunnable implements Runnable {
   1684         public volatile boolean done = false;
   1685         public void run() {
   1686             try {
   1687                 delay(LONG_DELAY_MS);
   1688                 done = true;
   1689             } catch (InterruptedException ok) {}
   1690         }
   1691     }
   1692 
   1693     public static class TrackedNoOpRunnable implements Runnable {
   1694         public volatile boolean done = false;
   1695         public void run() {
   1696             done = true;
   1697         }
   1698     }
   1699 
   1700     public static class TrackedCallable implements Callable {
   1701         public volatile boolean done = false;
   1702         public Object call() {
   1703             try {
   1704                 delay(SMALL_DELAY_MS);
   1705                 done = true;
   1706             } catch (InterruptedException ok) {}
   1707             return Boolean.TRUE;
   1708         }
   1709     }
   1710 
   1711     /**
   1712      * Analog of CheckedRunnable for RecursiveAction
   1713      */
   1714     public abstract class CheckedRecursiveAction extends RecursiveAction {
   1715         protected abstract void realCompute() throws Throwable;
   1716 
   1717         @Override protected final void compute() {
   1718             try {
   1719                 realCompute();
   1720             } catch (Throwable fail) {
   1721                 threadUnexpectedException(fail);
   1722             }
   1723         }
   1724     }
   1725 
   1726     /**
   1727      * Analog of CheckedCallable for RecursiveTask
   1728      */
   1729     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
   1730         protected abstract T realCompute() throws Throwable;
   1731 
   1732         @Override protected final T compute() {
   1733             try {
   1734                 return realCompute();
   1735             } catch (Throwable fail) {
   1736                 threadUnexpectedException(fail);
   1737                 return null;
   1738             }
   1739         }
   1740     }
   1741 
   1742     /**
   1743      * For use as RejectedExecutionHandler in constructors
   1744      */
   1745     public static class NoOpREHandler implements RejectedExecutionHandler {
   1746         public void rejectedExecution(Runnable r,
   1747                                       ThreadPoolExecutor executor) {}
   1748     }
   1749 
   1750     /**
   1751      * A CyclicBarrier that uses timed await and fails with
   1752      * AssertionFailedErrors instead of throwing checked exceptions.
   1753      */
   1754     public class CheckedBarrier extends CyclicBarrier {
   1755         public CheckedBarrier(int parties) { super(parties); }
   1756 
   1757         public int await() {
   1758             try {
   1759                 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
   1760             } catch (TimeoutException timedOut) {
   1761                 throw new AssertionFailedError("timed out");
   1762             } catch (Exception fail) {
   1763                 AssertionFailedError afe =
   1764                     new AssertionFailedError("Unexpected exception: " + fail);
   1765                 afe.initCause(fail);
   1766                 throw afe;
   1767             }
   1768         }
   1769     }
   1770 
   1771     void checkEmpty(BlockingQueue q) {
   1772         try {
   1773             assertTrue(q.isEmpty());
   1774             assertEquals(0, q.size());
   1775             assertNull(q.peek());
   1776             assertNull(q.poll());
   1777             assertNull(q.poll(0, MILLISECONDS));
   1778             assertEquals(q.toString(), "[]");
   1779             assertTrue(Arrays.equals(q.toArray(), new Object[0]));
   1780             assertFalse(q.iterator().hasNext());
   1781             try {
   1782                 q.element();
   1783                 shouldThrow();
   1784             } catch (NoSuchElementException success) {}
   1785             try {
   1786                 q.iterator().next();
   1787                 shouldThrow();
   1788             } catch (NoSuchElementException success) {}
   1789             try {
   1790                 q.remove();
   1791                 shouldThrow();
   1792             } catch (NoSuchElementException success) {}
   1793         } catch (InterruptedException fail) { threadUnexpectedException(fail); }
   1794     }
   1795 
   1796     void assertSerialEquals(Object x, Object y) {
   1797         assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
   1798     }
   1799 
   1800     void assertNotSerialEquals(Object x, Object y) {
   1801         assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
   1802     }
   1803 
   1804     byte[] serialBytes(Object o) {
   1805         try {
   1806             ByteArrayOutputStream bos = new ByteArrayOutputStream();
   1807             ObjectOutputStream oos = new ObjectOutputStream(bos);
   1808             oos.writeObject(o);
   1809             oos.flush();
   1810             oos.close();
   1811             return bos.toByteArray();
   1812         } catch (Throwable fail) {
   1813             threadUnexpectedException(fail);
   1814             return new byte[0];
   1815         }
   1816     }
   1817 
   1818     @SuppressWarnings("unchecked")
   1819     <T> T serialClone(T o) {
   1820         try {
   1821             ObjectInputStream ois = new ObjectInputStream
   1822                 (new ByteArrayInputStream(serialBytes(o)));
   1823             T clone = (T) ois.readObject();
   1824             assertSame(o.getClass(), clone.getClass());
   1825             return clone;
   1826         } catch (Throwable fail) {
   1827             threadUnexpectedException(fail);
   1828             return null;
   1829         }
   1830     }
   1831 
   1832     public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
   1833                              Runnable... throwingActions) {
   1834         for (Runnable throwingAction : throwingActions) {
   1835             boolean threw = false;
   1836             try { throwingAction.run(); }
   1837             catch (Throwable t) {
   1838                 threw = true;
   1839                 if (!expectedExceptionClass.isInstance(t)) {
   1840                     AssertionFailedError afe =
   1841                         new AssertionFailedError
   1842                         ("Expected " + expectedExceptionClass.getName() +
   1843                          ", got " + t.getClass().getName());
   1844                     afe.initCause(t);
   1845                     threadUnexpectedException(afe);
   1846                 }
   1847             }
   1848             if (!threw)
   1849                 shouldThrow(expectedExceptionClass.getName());
   1850         }
   1851     }
   1852 
   1853     public void assertIteratorExhausted(Iterator<?> it) {
   1854         try {
   1855             it.next();
   1856             shouldThrow();
   1857         } catch (NoSuchElementException success) {}
   1858         assertFalse(it.hasNext());
   1859     }
   1860 }
   1861