ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.169
Committed: Thu Oct 8 21:50:26 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.168: +2 -0 lines
Log Message:
record availableProcessors in case of wedged test

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