ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.165
Committed: Mon Oct 5 01:10:09 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.164: +2 -0 lines
Log Message:
only dump all threads once if we're stuck

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