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 
systemPropertyValue(String name, float defaultValue)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 
JSR166TestCase()203     public JSR166TestCase() { super(); }
JSR166TestCase(String name)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 
methodFilter()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);
thread.start()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 
runBare()262     public void runBare() throws Throwable {
263         currentTestCase = this;
264         if (methodFilter == null
265             || methodFilter.matcher(toString()).find())
266             super.runBare();
267     }
268 
runTest()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 
runTestProfiled()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 
newTestSuite(Object... suiteOrClasses)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 
addNamedTestClasses(TestSuite suite, String... testClassNames)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 
atLeastJava6()392     public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
atLeastJava7()393     public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
atLeastJava8()394     public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
atLeastJava9()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     }
atLeastJava10()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. */
testMethodNames(Class<?> testClass)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      */
parameterizedTestSuite(Class<? extends JSR166TestCase> testClass, Class<ExtraData> dataClass, ExtraData data)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      */
jdk8ParameterizedTestSuite(Class<? extends JSR166TestCase> testClass, Class<ExtraData> dataClass, ExtraData data)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      */
getShortDelay()583     protected long getShortDelay() {
584         return (long) (50 * delayFactor * jtregTestTimeoutFactor);
585     }
586 
587     /**
588      * Sets delays as multiples of SHORT_DELAY.
589      */
setDelays()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      */
timeoutMillis()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      */
delayedDate(long delayMillis)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      */
threadRecordFailure(Throwable t)626     public void threadRecordFailure(Throwable t) {
627         System.err.println(t);
628         dumpTestThreads();
629         threadFailure.compareAndSet(null, t);
630     }
631 
setUp()632     public void setUp() {
633         setDelays();
634     }
635 
tearDownFail(String format, Object... args)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      */
tearDown()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      */
checkForkJoinPoolThreadLeaks()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      */
threadFail(String reason)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      */
threadAssertTrue(boolean b)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      */
threadAssertFalse(boolean b)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      */
threadAssertNull(Object x)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      */
threadAssertEquals(long x, long y)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      */
threadAssertEquals(Object x, Object y)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      */
threadAssertSame(Object x, Object y)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      */
threadShouldThrow()801     public void threadShouldThrow() {
802         threadFail("should throw exception");
803     }
804 
805     /**
806      * Calls threadFail with message "should throw" + exceptionName.
807      */
threadShouldThrow(String exceptionName)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      */
threadUnexpectedException(Throwable t)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      */
delay(long millis)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;
PoolCleaner(ExecutorService pool)856         public PoolCleaner(ExecutorService pool) { this.pool = pool; }
close()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;
PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser)865         public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
866             super(pool);
867             this.releaser = releaser;
868         }
close()869         public void close() {
870             try {
871                 releaser.run();
872             } finally {
873                 super.close();
874             }
875         }
876     }
877 
cleaner(ExecutorService pool)878     PoolCleaner cleaner(ExecutorService pool) {
879         return new PoolCleaner(pool);
880     }
881 
cleaner(ExecutorService pool, Runnable releaser)882     PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
883         return new PoolCleanerWithReleaser(pool, releaser);
884     }
885 
cleaner(ExecutorService pool, CountDownLatch latch)886     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
887         return new PoolCleanerWithReleaser(pool, releaser(latch));
888     }
889 
releaser(final CountDownLatch latch)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