ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.170
Committed: Thu Oct 8 22:39:57 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.169: +7 -1 lines
Log Message:
add even more debugging info to wedged test detection

File Contents

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