ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.156
Committed: Sat Oct 3 21:09:42 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.155: +27 -4 lines
Log Message:
add a watchdog thread to hunt down elusive wedged tests

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