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                 return;
   1225             }
   1226             Thread.yield();
   1227         }
   1228     }
   1229 
   1230     /**
   1231      * Waits up to LONG_DELAY_MS for the given thread to enter a wait
   1232      * state: BLOCKED, WAITING, or TIMED_WAITING.
   1233      */
   1234     void waitForThreadToEnterWaitState(Thread thread) {
   1235         waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
   1236     }
   1237 
   1238     /**
   1239      * Returns the number of milliseconds since time given by
   1240      * startNanoTime, which must have been previously returned from a
   1241      * call to {@link System#nanoTime()}.
   1242      */
   1243     static long millisElapsedSince(long startNanoTime) {
   1244         return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
   1245     }
   1246 
   1247 //     void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
   1248 //         long startTime = System.nanoTime();
   1249 //         try {
   1250 //             r.run();
   1251 //         } catch (Throwable fail) { threadUnexpectedException(fail); }
   1252 //         if (millisElapsedSince(startTime) > timeoutMillis/2)
   1253 //             throw new AssertionFailedError("did not return promptly");
   1254 //     }
   1255 
   1256 //     void assertTerminatesPromptly(Runnable r) {
   1257 //         assertTerminatesPromptly(LONG_DELAY_MS/2, r);
   1258 //     }
   1259 
   1260     /**
   1261      * Checks that timed f.get() returns the expected value, and does not
   1262      * wait for the timeout to elapse before returning.
   1263      */
   1264     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
   1265         long startTime = System.nanoTime();
   1266         try {
   1267             assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
   1268         } catch (Throwable fail) { threadUnexpectedException(fail); }
   1269         if (millisElapsedSince(startTime) > timeoutMillis/2)
   1270             throw new AssertionFailedError("timed get did not return promptly");
   1271     }
   1272 
   1273     <T> void checkTimedGet(Future<T> f, T expectedValue) {
   1274         checkTimedGet(f, expectedValue, LONG_DELAY_MS);
   1275     }
   1276 
   1277     /**
   1278      * Returns a new started daemon Thread running the given runnable.
   1279      */
   1280     Thread newStartedThread(Runnable runnable) {
   1281         Thread t = new Thread(runnable);
   1282         t.setDaemon(true);
   1283         t.start();
   1284         return t;
   1285     }
   1286 
   1287     /**
   1288      * Waits for the specified time (in milliseconds) for the thread
   1289      * to terminate (using {@link Thread#join(long)}), else interrupts
   1290      * the thread (in the hope that it may terminate later) and fails.
   1291      */
   1292     void awaitTermination(Thread t, long timeoutMillis) {
   1293         try {
   1294             t.join(timeoutMillis);
   1295         } catch (InterruptedException fail) {
   1296             threadUnexpectedException(fail);
   1297         } finally {
   1298             if (t.getState() != Thread.State.TERMINATED) {
   1299                 t.interrupt();
   1300                 threadFail("timed out waiting for thread to terminate");
   1301             }
   1302         }
   1303     }
   1304 
   1305     /**
   1306      * Waits for LONG_DELAY_MS milliseconds for the thread to
   1307      * terminate (using {@link Thread#join(long)}), else interrupts
   1308      * the thread (in the hope that it may terminate later) and fails.
   1309      */
   1310     void awaitTermination(Thread t) {
   1311         awaitTermination(t, LONG_DELAY_MS);
   1312     }
   1313 
   1314     // Some convenient Runnable classes
   1315 
   1316     public abstract class CheckedRunnable implements Runnable {
   1317         protected abstract void realRun() throws Throwable;
   1318 
   1319         public final void run() {
   1320             try {
   1321                 realRun();
   1322             } catch (Throwable fail) {
   1323                 threadUnexpectedException(fail);
   1324             }
   1325         }
   1326     }
   1327 
   1328     public abstract class RunnableShouldThrow implements Runnable {
   1329         protected abstract void realRun() throws Throwable;
   1330 
   1331         final Class<?> exceptionClass;
   1332 
   1333         <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
   1334             this.exceptionClass = exceptionClass;
   1335         }
   1336 
   1337         public final void run() {
   1338             try {
   1339                 realRun();
   1340                 threadShouldThrow(exceptionClass.getSimpleName());
   1341             } catch (Throwable t) {
   1342                 if (! exceptionClass.isInstance(t))
   1343                     threadUnexpectedException(t);
   1344             }
   1345         }
   1346     }
   1347 
   1348     public abstract class ThreadShouldThrow extends Thread {
   1349         protected abstract void realRun() throws Throwable;
   1350 
   1351         final Class<?> exceptionClass;
   1352 
   1353         <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
   1354             this.exceptionClass = exceptionClass;
   1355         }
   1356 
   1357         public final void run() {
   1358             try {
   1359                 realRun();
   1360                 threadShouldThrow(exceptionClass.getSimpleName());
   1361             } catch (Throwable t) {
   1362                 if (! exceptionClass.isInstance(t))
   1363                     threadUnexpectedException(t);
   1364             }
   1365         }
   1366     }
   1367 
   1368     public abstract class CheckedInterruptedRunnable implements Runnable {
   1369         protected abstract void realRun() throws Throwable;
   1370 
   1371         public final void run() {
   1372             try {
   1373                 realRun();
   1374                 threadShouldThrow("InterruptedException");
   1375             } catch (InterruptedException success) {
   1376                 threadAssertFalse(Thread.interrupted());
   1377             } catch (Throwable fail) {
   1378                 threadUnexpectedException(fail);
   1379             }
   1380         }
   1381     }
   1382 
   1383     public abstract class CheckedCallable<T> implements Callable<T> {
   1384         protected abstract T realCall() throws Throwable;
   1385 
   1386         public final T call() {
   1387             try {
   1388                 return realCall();
   1389             } catch (Throwable fail) {
   1390                 threadUnexpectedException(fail);
   1391                 return null;
   1392             }
   1393         }
   1394     }
   1395 
   1396     public abstract class CheckedInterruptedCallable<T>
   1397         implements Callable<T> {
   1398         protected abstract T realCall() throws Throwable;
   1399 
   1400         public final T call() {
   1401             try {
   1402                 T result = realCall();
   1403                 threadShouldThrow("InterruptedException");
   1404                 return result;
   1405             } catch (InterruptedException success) {
   1406                 threadAssertFalse(Thread.interrupted());
   1407             } catch (Throwable fail) {
   1408                 threadUnexpectedException(fail);
   1409             }
   1410             return null;
   1411         }
   1412     }
   1413 
   1414     public static class NoOpRunnable implements Runnable {
   1415         public void run() {}
   1416     }
   1417 
   1418     public static class NoOpCallable implements Callable {
   1419         public Object call() { return Boolean.TRUE; }
   1420     }
   1421 
   1422     public static final String TEST_STRING = "a test string";
   1423 
   1424     public static class StringTask implements Callable<String> {
   1425         final String value;
   1426         public StringTask() { this(TEST_STRING); }
   1427         public StringTask(String value) { this.value = value; }
   1428         public String call() { return value; }
   1429     }
   1430 
   1431     public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
   1432         return new CheckedCallable<String>() {
   1433             protected String realCall() {
   1434                 try {
   1435                     latch.await();
   1436                 } catch (InterruptedException quittingTime) {}
   1437                 return TEST_STRING;
   1438             }};
   1439     }
   1440 
   1441     public Runnable countDowner(final CountDownLatch latch) {
   1442         return new CheckedRunnable() {
   1443             public void realRun() throws InterruptedException {
   1444                 latch.countDown();
   1445             }};
   1446     }
   1447 
   1448     class LatchAwaiter extends CheckedRunnable {
   1449         static final int NEW = 0;
   1450         static final int RUNNING = 1;
   1451         static final int DONE = 2;
   1452         final CountDownLatch latch;
   1453         int state = NEW;
   1454         LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
   1455         public void realRun() throws InterruptedException {
   1456             state = 1;
   1457             await(latch);
   1458             state = 2;
   1459         }
   1460     }
   1461 
   1462     public LatchAwaiter awaiter(CountDownLatch latch) {
   1463         return new LatchAwaiter(latch);
   1464     }
   1465 
   1466     public void await(CountDownLatch latch, long timeoutMillis) {
   1467         try {
   1468             if (!latch.await(timeoutMillis, MILLISECONDS))
   1469                 fail("timed out waiting for CountDownLatch for "
   1470                      + (timeoutMillis/1000) + " sec");
   1471         } catch (Throwable fail) {
   1472             threadUnexpectedException(fail);
   1473         }
   1474     }
   1475 
   1476     public void await(CountDownLatch latch) {
   1477         await(latch, LONG_DELAY_MS);
   1478     }
   1479 
   1480     public void await(Semaphore semaphore) {
   1481         try {
   1482             if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
   1483                 fail("timed out waiting for Semaphore for "
   1484                      + (LONG_DELAY_MS/1000) + " sec");
   1485         } catch (Throwable fail) {
   1486             threadUnexpectedException(fail);
   1487         }
   1488     }
   1489 
   1490 //     /**
   1491 //      * Spin-waits up to LONG_DELAY_MS until flag becomes true.
   1492 //      */
   1493 //     public void await(AtomicBoolean flag) {
   1494 //         await(flag, LONG_DELAY_MS);
   1495 //     }
   1496 
   1497 //     /**
   1498 //      * Spin-waits up to the specified timeout until flag becomes true.
   1499 //      */
   1500 //     public void await(AtomicBoolean flag, long timeoutMillis) {
   1501 //         long startTime = System.nanoTime();
   1502 //         while (!flag.get()) {
   1503 //             if (millisElapsedSince(startTime) > timeoutMillis)
   1504 //                 throw new AssertionFailedError("timed out");
   1505 //             Thread.yield();
   1506 //         }
   1507 //     }
   1508 
   1509     public static class NPETask implements Callable<String> {
   1510         public String call() { throw new NullPointerException(); }
   1511     }
   1512 
   1513     public static class CallableOne implements Callable<Integer> {
   1514         public Integer call() { return one; }
   1515     }
   1516 
   1517     public class ShortRunnable extends CheckedRunnable {
   1518         protected void realRun() throws Throwable {
   1519             delay(SHORT_DELAY_MS);
   1520         }
   1521     }
   1522 
   1523     public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
   1524         protected void realRun() throws InterruptedException {
   1525             delay(SHORT_DELAY_MS);
   1526         }
   1527     }
   1528 
   1529     public class SmallRunnable extends CheckedRunnable {
   1530         protected void realRun() throws Throwable {
   1531             delay(SMALL_DELAY_MS);
   1532         }
   1533     }
   1534 
   1535     public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
   1536         protected void realRun() {
   1537             try {
   1538                 delay(SMALL_DELAY_MS);
   1539             } catch (InterruptedException ok) {}
   1540         }
   1541     }
   1542 
   1543     public class SmallCallable extends CheckedCallable {
   1544         protected Object realCall() throws InterruptedException {
   1545             delay(SMALL_DELAY_MS);
   1546             return Boolean.TRUE;
   1547         }
   1548     }
   1549 
   1550     public class MediumRunnable extends CheckedRunnable {
   1551         protected void realRun() throws Throwable {
   1552             delay(MEDIUM_DELAY_MS);
   1553         }
   1554     }
   1555 
   1556     public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
   1557         protected void realRun() throws InterruptedException {
   1558             delay(MEDIUM_DELAY_MS);
   1559         }
   1560     }
   1561 
   1562     public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
   1563         return new CheckedRunnable() {
   1564             protected void realRun() {
   1565                 try {
   1566                     delay(timeoutMillis);
   1567                 } catch (InterruptedException ok) {}
   1568             }};
   1569     }
   1570 
   1571     public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
   1572         protected void realRun() {
   1573             try {
   1574                 delay(MEDIUM_DELAY_MS);
   1575             } catch (InterruptedException ok) {}
   1576         }
   1577     }
   1578 
   1579     public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
   1580         protected void realRun() {
   1581             try {
   1582                 delay(LONG_DELAY_MS);
   1583             } catch (InterruptedException ok) {}
   1584         }
   1585     }
   1586 
   1587     /**
   1588      * For use as ThreadFactory in constructors
   1589      */
   1590     public static class SimpleThreadFactory implements ThreadFactory {
   1591         public Thread newThread(Runnable r) {
   1592             return new Thread(r);
   1593         }
   1594     }
   1595 
   1596     public interface TrackedRunnable extends Runnable {
   1597         boolean isDone();
   1598     }
   1599 
   1600     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
   1601         return new TrackedRunnable() {
   1602                 private volatile boolean done = false;
   1603                 public boolean isDone() { return done; }
   1604                 public void run() {
   1605                     try {
   1606                         delay(timeoutMillis);
   1607                         done = true;
   1608                     } catch (InterruptedException ok) {}
   1609                 }
   1610             };
   1611     }
   1612 
   1613     public static class TrackedShortRunnable implements Runnable {
   1614         public volatile boolean done = false;
   1615         public void run() {
   1616             try {
   1617                 delay(SHORT_DELAY_MS);
   1618                 done = true;
   1619             } catch (InterruptedException ok) {}
   1620         }
   1621     }
   1622 
   1623     public static class TrackedSmallRunnable implements Runnable {
   1624         public volatile boolean done = false;
   1625         public void run() {
   1626             try {
   1627                 delay(SMALL_DELAY_MS);
   1628                 done = true;
   1629             } catch (InterruptedException ok) {}
   1630         }
   1631     }
   1632 
   1633     public static class TrackedMediumRunnable implements Runnable {
   1634         public volatile boolean done = false;
   1635         public void run() {
   1636             try {
   1637                 delay(MEDIUM_DELAY_MS);
   1638                 done = true;
   1639             } catch (InterruptedException ok) {}
   1640         }
   1641     }
   1642 
   1643     public static class TrackedLongRunnable implements Runnable {
   1644         public volatile boolean done = false;
   1645         public void run() {
   1646             try {
   1647                 delay(LONG_DELAY_MS);
   1648                 done = true;
   1649             } catch (InterruptedException ok) {}
   1650         }
   1651     }
   1652 
   1653     public static class TrackedNoOpRunnable implements Runnable {
   1654         public volatile boolean done = false;
   1655         public void run() {
   1656             done = true;
   1657         }
   1658     }
   1659 
   1660     public static class TrackedCallable implements Callable {
   1661         public volatile boolean done = false;
   1662         public Object call() {
   1663             try {
   1664                 delay(SMALL_DELAY_MS);
   1665                 done = true;
   1666             } catch (InterruptedException ok) {}
   1667             return Boolean.TRUE;
   1668         }
   1669     }
   1670 
   1671     /**
   1672      * Analog of CheckedRunnable for RecursiveAction
   1673      */
   1674     public abstract class CheckedRecursiveAction extends RecursiveAction {
   1675         protected abstract void realCompute() throws Throwable;
   1676 
   1677         @Override protected final void compute() {
   1678             try {
   1679                 realCompute();
   1680             } catch (Throwable fail) {
   1681                 threadUnexpectedException(fail);
   1682             }
   1683         }
   1684     }
   1685 
   1686     /**
   1687      * Analog of CheckedCallable for RecursiveTask
   1688      */
   1689     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
   1690         protected abstract T realCompute() throws Throwable;
   1691 
   1692         @Override protected final T compute() {
   1693             try {
   1694                 return realCompute();
   1695             } catch (Throwable fail) {
   1696                 threadUnexpectedException(fail);
   1697                 return null;
   1698             }
   1699         }
   1700     }
   1701 
   1702     /**
   1703      * For use as RejectedExecutionHandler in constructors
   1704      */
   1705     public static class NoOpREHandler implements RejectedExecutionHandler {
   1706         public void rejectedExecution(Runnable r,
   1707                                       ThreadPoolExecutor executor) {}
   1708     }
   1709 
   1710     /**
   1711      * A CyclicBarrier that uses timed await and fails with
   1712      * AssertionFailedErrors instead of throwing checked exceptions.
   1713      */
   1714     public class CheckedBarrier extends CyclicBarrier {
   1715         public CheckedBarrier(int parties) { super(parties); }
   1716 
   1717         public int await() {
   1718             try {
   1719                 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
   1720             } catch (TimeoutException timedOut) {
   1721                 throw new AssertionFailedError("timed out");
   1722             } catch (Exception fail) {
   1723                 AssertionFailedError afe =
   1724                     new AssertionFailedError("Unexpected exception: " + fail);
   1725                 afe.initCause(fail);
   1726                 throw afe;
   1727             }
   1728         }
   1729     }
   1730 
   1731     void checkEmpty(BlockingQueue q) {
   1732         try {
   1733             assertTrue(q.isEmpty());
   1734             assertEquals(0, q.size());
   1735             assertNull(q.peek());
   1736             assertNull(q.poll());
   1737             assertNull(q.poll(0, MILLISECONDS));
   1738             assertEquals(q.toString(), "[]");
   1739             assertTrue(Arrays.equals(q.toArray(), new Object[0]));
   1740             assertFalse(q.iterator().hasNext());
   1741             try {
   1742                 q.element();
   1743                 shouldThrow();
   1744             } catch (NoSuchElementException success) {}
   1745             try {
   1746                 q.iterator().next();
   1747                 shouldThrow();
   1748             } catch (NoSuchElementException success) {}
   1749             try {
   1750                 q.remove();
   1751                 shouldThrow();
   1752             } catch (NoSuchElementException success) {}
   1753         } catch (InterruptedException fail) { threadUnexpectedException(fail); }
   1754     }
   1755 
   1756     void assertSerialEquals(Object x, Object y) {
   1757         assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
   1758     }
   1759 
   1760     void assertNotSerialEquals(Object x, Object y) {
   1761         assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
   1762     }
   1763 
   1764     byte[] serialBytes(Object o) {
   1765         try {
   1766             ByteArrayOutputStream bos = new ByteArrayOutputStream();
   1767             ObjectOutputStream oos = new ObjectOutputStream(bos);
   1768             oos.writeObject(o);
   1769             oos.flush();
   1770             oos.close();
   1771             return bos.toByteArray();
   1772         } catch (Throwable fail) {
   1773             threadUnexpectedException(fail);
   1774             return new byte[0];
   1775         }
   1776     }
   1777 
   1778     @SuppressWarnings("unchecked")
   1779     <T> T serialClone(T o) {
   1780         try {
   1781             ObjectInputStream ois = new ObjectInputStream
   1782                 (new ByteArrayInputStream(serialBytes(o)));
   1783             T clone = (T) ois.readObject();
   1784             assertSame(o.getClass(), clone.getClass());
   1785             return clone;
   1786         } catch (Throwable fail) {
   1787             threadUnexpectedException(fail);
   1788             return null;
   1789         }
   1790     }
   1791 
   1792     public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
   1793                              Runnable... throwingActions) {
   1794         for (Runnable throwingAction : throwingActions) {
   1795             boolean threw = false;
   1796             try { throwingAction.run(); }
   1797             catch (Throwable t) {
   1798                 threw = true;
   1799                 if (!expectedExceptionClass.isInstance(t)) {
   1800                     AssertionFailedError afe =
   1801                         new AssertionFailedError
   1802                         ("Expected " + expectedExceptionClass.getName() +
   1803                          ", got " + t.getClass().getName());
   1804                     afe.initCause(t);
   1805                     threadUnexpectedException(afe);
   1806                 }
   1807             }
   1808             if (!threw)
   1809                 shouldThrow(expectedExceptionClass.getName());
   1810         }
   1811     }
   1812 
   1813     public void assertIteratorExhausted(Iterator<?> it) {
   1814         try {
   1815             it.next();
   1816             shouldThrow();
   1817         } catch (NoSuchElementException success) {}
   1818         assertFalse(it.hasNext());
   1819     }
   1820 }
   1821