ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.162
Committed: Sun Oct 4 04:40:00 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.161: +4 -4 lines
Log Message:
modifier order

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     }
205     lastTestCase = currentTestCase;
206     }}};
207     Thread thread = new Thread(checkForWedgedTest, "checkForWedgedTest");
208     thread.setDaemon(true);
209     thread.start();
210     }
211    
212 jsr166 1.147 public void runBare() throws Throwable {
213 jsr166 1.156 currentTestCase = this;
214 jsr166 1.147 if (methodFilter == null
215     || methodFilter.matcher(toString()).find())
216     super.runBare();
217     }
218    
219 jsr166 1.61 protected void runTest() throws Throwable {
220 jsr166 1.147 for (int i = 0; i < runsPerTest; i++) {
221     if (profileTests)
222     runTestProfiled();
223     else
224     super.runTest();
225 jsr166 1.107 }
226 jsr166 1.61 }
227    
228     protected void runTestProfiled() throws Throwable {
229 jsr166 1.145 for (int i = 0; i < 2; i++) {
230     long startTime = System.nanoTime();
231 jsr166 1.61 super.runTest();
232 jsr166 1.145 long elapsedMillis = millisElapsedSince(startTime);
233     if (elapsedMillis < profileThreshold)
234     break;
235     // Never report first run of any test; treat it as a
236     // warmup run, notably to trigger all needed classloading,
237     if (i > 0)
238 jsr166 1.61 System.out.printf("%n%s: %d%n", toString(), elapsedMillis);
239     }
240     }
241 jsr166 1.63
242 jsr166 1.61 /**
243 jsr166 1.94 * Runs all JSR166 unit tests using junit.textui.TestRunner.
244 jsr166 1.27 */
245 jsr166 1.41 public static void main(String[] args) {
246 jsr166 1.131 main(suite(), args);
247     }
248    
249     /**
250     * Runs all unit tests in the given test suite.
251 jsr166 1.132 * Actual behavior influenced by jsr166.* system properties.
252 jsr166 1.131 */
253     static void main(Test suite, String[] args) {
254 jsr166 1.49 if (useSecurityManager) {
255     System.err.println("Setting a permissive security manager");
256     Policy.setPolicy(permissivePolicy());
257     System.setSecurityManager(new SecurityManager());
258     }
259 jsr166 1.131 for (int i = 0; i < suiteRuns; i++) {
260     TestResult result = junit.textui.TestRunner.run(suite);
261     if (!result.wasSuccessful())
262     System.exit(1);
263 dl 1.22 System.gc();
264     System.runFinalization();
265     }
266 dl 1.6 }
267    
268 jsr166 1.60 public static TestSuite newTestSuite(Object... suiteOrClasses) {
269     TestSuite suite = new TestSuite();
270     for (Object suiteOrClass : suiteOrClasses) {
271     if (suiteOrClass instanceof TestSuite)
272     suite.addTest((TestSuite) suiteOrClass);
273     else if (suiteOrClass instanceof Class)
274     suite.addTest(new TestSuite((Class<?>) suiteOrClass));
275     else
276     throw new ClassCastException("not a test suite or class");
277     }
278     return suite;
279     }
280    
281 jsr166 1.98 public static void addNamedTestClasses(TestSuite suite,
282     String... testClassNames) {
283     for (String testClassName : testClassNames) {
284     try {
285     Class<?> testClass = Class.forName(testClassName);
286     Method m = testClass.getDeclaredMethod("suite",
287     new Class<?>[0]);
288     suite.addTest(newTestSuite((Test)m.invoke(null)));
289     } catch (Exception e) {
290     throw new Error("Missing test class", e);
291     }
292 jsr166 1.97 }
293     }
294    
295     public static final double JAVA_CLASS_VERSION;
296 jsr166 1.115 public static final String JAVA_SPECIFICATION_VERSION;
297 jsr166 1.97 static {
298     try {
299     JAVA_CLASS_VERSION = java.security.AccessController.doPrivileged(
300     new java.security.PrivilegedAction<Double>() {
301     public Double run() {
302     return Double.valueOf(System.getProperty("java.class.version"));}});
303 jsr166 1.115 JAVA_SPECIFICATION_VERSION = java.security.AccessController.doPrivileged(
304     new java.security.PrivilegedAction<String>() {
305     public String run() {
306     return System.getProperty("java.specification.version");}});
307 jsr166 1.97 } catch (Throwable t) {
308     throw new Error(t);
309     }
310     }
311    
312 jsr166 1.98 public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
313     public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
314     public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
315 jsr166 1.136 public static boolean atLeastJava9() {
316 jsr166 1.137 return JAVA_CLASS_VERSION >= 53.0
317     // As of 2015-09, java9 still uses 52.0 class file version
318     || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?(9|[0-9][0-9])$");
319 jsr166 1.136 }
320     public static boolean atLeastJava10() {
321 jsr166 1.137 return JAVA_CLASS_VERSION >= 54.0
322     || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?[0-9][0-9]$");
323 jsr166 1.136 }
324 jsr166 1.97
325 dl 1.6 /**
326 jsr166 1.60 * Collects all JSR166 unit tests as one suite.
327 jsr166 1.27 */
328 jsr166 1.41 public static Test suite() {
329 jsr166 1.98 // Java7+ test classes
330 jsr166 1.97 TestSuite suite = newTestSuite(
331 jsr166 1.60 ForkJoinPoolTest.suite(),
332     ForkJoinTaskTest.suite(),
333     RecursiveActionTest.suite(),
334     RecursiveTaskTest.suite(),
335     LinkedTransferQueueTest.suite(),
336     PhaserTest.suite(),
337     ThreadLocalRandomTest.suite(),
338     AbstractExecutorServiceTest.suite(),
339     AbstractQueueTest.suite(),
340     AbstractQueuedSynchronizerTest.suite(),
341     AbstractQueuedLongSynchronizerTest.suite(),
342     ArrayBlockingQueueTest.suite(),
343     ArrayDequeTest.suite(),
344     AtomicBooleanTest.suite(),
345     AtomicIntegerArrayTest.suite(),
346     AtomicIntegerFieldUpdaterTest.suite(),
347     AtomicIntegerTest.suite(),
348     AtomicLongArrayTest.suite(),
349     AtomicLongFieldUpdaterTest.suite(),
350     AtomicLongTest.suite(),
351     AtomicMarkableReferenceTest.suite(),
352     AtomicReferenceArrayTest.suite(),
353     AtomicReferenceFieldUpdaterTest.suite(),
354     AtomicReferenceTest.suite(),
355     AtomicStampedReferenceTest.suite(),
356     ConcurrentHashMapTest.suite(),
357     ConcurrentLinkedDequeTest.suite(),
358     ConcurrentLinkedQueueTest.suite(),
359     ConcurrentSkipListMapTest.suite(),
360     ConcurrentSkipListSubMapTest.suite(),
361     ConcurrentSkipListSetTest.suite(),
362     ConcurrentSkipListSubSetTest.suite(),
363     CopyOnWriteArrayListTest.suite(),
364     CopyOnWriteArraySetTest.suite(),
365     CountDownLatchTest.suite(),
366     CyclicBarrierTest.suite(),
367     DelayQueueTest.suite(),
368     EntryTest.suite(),
369     ExchangerTest.suite(),
370     ExecutorsTest.suite(),
371     ExecutorCompletionServiceTest.suite(),
372     FutureTaskTest.suite(),
373     LinkedBlockingDequeTest.suite(),
374     LinkedBlockingQueueTest.suite(),
375     LinkedListTest.suite(),
376     LockSupportTest.suite(),
377     PriorityBlockingQueueTest.suite(),
378     PriorityQueueTest.suite(),
379     ReentrantLockTest.suite(),
380     ReentrantReadWriteLockTest.suite(),
381     ScheduledExecutorTest.suite(),
382     ScheduledExecutorSubclassTest.suite(),
383     SemaphoreTest.suite(),
384     SynchronousQueueTest.suite(),
385     SystemTest.suite(),
386     ThreadLocalTest.suite(),
387     ThreadPoolExecutorTest.suite(),
388     ThreadPoolExecutorSubclassTest.suite(),
389     ThreadTest.suite(),
390     TimeUnitTest.suite(),
391     TreeMapTest.suite(),
392     TreeSetTest.suite(),
393     TreeSubMapTest.suite(),
394     TreeSubSetTest.suite());
395 jsr166 1.98
396     // Java8+ test classes
397     if (atLeastJava8()) {
398     String[] java8TestClassNames = {
399 dl 1.113 "Atomic8Test",
400 dl 1.104 "CompletableFutureTest",
401 dl 1.105 "ConcurrentHashMap8Test",
402 dl 1.104 "CountedCompleterTest",
403     "DoubleAccumulatorTest",
404 dl 1.103 "DoubleAdderTest",
405 jsr166 1.102 "ForkJoinPool8Test",
406 dl 1.111 "ForkJoinTask8Test",
407 dl 1.104 "LongAccumulatorTest",
408     "LongAdderTest",
409 jsr166 1.110 "SplittableRandomTest",
410 jsr166 1.98 "StampedLockTest",
411 dl 1.140 "SubmissionPublisherTest",
412 jsr166 1.112 "ThreadLocalRandom8Test",
413 jsr166 1.98 };
414     addNamedTestClasses(suite, java8TestClassNames);
415 jsr166 1.97 }
416 jsr166 1.98
417 jsr166 1.115 // Java9+ test classes
418     if (atLeastJava9()) {
419     String[] java9TestClassNames = {
420 jsr166 1.142 // Currently empty, but expecting varhandle tests
421 jsr166 1.115 };
422     addNamedTestClasses(suite, java9TestClassNames);
423     }
424    
425 jsr166 1.97 return suite;
426 dl 1.6 }
427    
428 jsr166 1.134 /** Returns list of junit-style test method names in given class. */
429     public static ArrayList<String> testMethodNames(Class<?> testClass) {
430     Method[] methods = testClass.getDeclaredMethods();
431     ArrayList<String> names = new ArrayList<String>(methods.length);
432     for (Method method : methods) {
433     if (method.getName().startsWith("test")
434     && Modifier.isPublic(method.getModifiers())
435     // method.getParameterCount() requires jdk8+
436     && method.getParameterTypes().length == 0) {
437     names.add(method.getName());
438     }
439     }
440     return names;
441     }
442    
443     /**
444     * Returns junit-style testSuite for the given test class, but
445     * parameterized by passing extra data to each test.
446     */
447     public static <ExtraData> Test parameterizedTestSuite
448     (Class<? extends JSR166TestCase> testClass,
449     Class<ExtraData> dataClass,
450     ExtraData data) {
451     try {
452     TestSuite suite = new TestSuite();
453     Constructor c =
454     testClass.getDeclaredConstructor(dataClass, String.class);
455     for (String methodName : testMethodNames(testClass))
456     suite.addTest((Test) c.newInstance(data, methodName));
457     return suite;
458     } catch (Exception e) {
459     throw new Error(e);
460     }
461     }
462    
463     /**
464     * Returns junit-style testSuite for the jdk8 extension of the
465     * given test class, but parameterized by passing extra data to
466     * each test. Uses reflection to allow compilation in jdk7.
467     */
468     public static <ExtraData> Test jdk8ParameterizedTestSuite
469     (Class<? extends JSR166TestCase> testClass,
470     Class<ExtraData> dataClass,
471     ExtraData data) {
472     if (atLeastJava8()) {
473     String name = testClass.getName();
474     String name8 = name.replaceAll("Test$", "8Test");
475     if (name.equals(name8)) throw new Error(name);
476     try {
477     return (Test)
478     Class.forName(name8)
479     .getMethod("testSuite", new Class[] { dataClass })
480     .invoke(null, data);
481     } catch (Exception e) {
482     throw new Error(e);
483     }
484     } else {
485     return new TestSuite();
486     }
487     }
488    
489 jsr166 1.109 // Delays for timing-dependent tests, in milliseconds.
490 dl 1.1
491 dl 1.2 public static long SHORT_DELAY_MS;
492     public static long SMALL_DELAY_MS;
493     public static long MEDIUM_DELAY_MS;
494     public static long LONG_DELAY_MS;
495    
496     /**
497 jsr166 1.27 * Returns the shortest timed delay. This could
498 dl 1.15 * be reimplemented to use for example a Property.
499 jsr166 1.27 */
500 dl 1.2 protected long getShortDelay() {
501 dl 1.21 return 50;
502 dl 1.2 }
503    
504     /**
505 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
506 dl 1.2 */
507 jsr166 1.43 protected void setDelays() {
508 dl 1.2 SHORT_DELAY_MS = getShortDelay();
509 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
510 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
511 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
512 dl 1.2 }
513    
514 dl 1.1 /**
515 jsr166 1.81 * Returns a timeout in milliseconds to be used in tests that
516     * verify that operations block or time out.
517     */
518     long timeoutMillis() {
519     return SHORT_DELAY_MS / 4;
520     }
521    
522     /**
523 jsr166 1.135 * Returns a new Date instance representing a time at least
524     * delayMillis milliseconds in the future.
525 jsr166 1.81 */
526     Date delayedDate(long delayMillis) {
527 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
528     return new Date(System.currentTimeMillis() + delayMillis + 1);
529 jsr166 1.81 }
530    
531     /**
532 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
533 dl 1.1 */
534 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
535     = new AtomicReference<Throwable>(null);
536 dl 1.1
537     /**
538 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
539     * harness thread, triggering a test case failure. Only the first
540     * failure is recorded; subsequent calls to this method from within
541     * the same test have no effect.
542 dl 1.1 */
543 jsr166 1.53 public void threadRecordFailure(Throwable t) {
544 jsr166 1.158 System.err.println(t);
545 jsr166 1.156 dumpTestThreads();
546 jsr166 1.53 threadFailure.compareAndSet(null, t);
547     }
548    
549 jsr166 1.27 public void setUp() {
550 dl 1.2 setDelays();
551 dl 1.1 }
552    
553 jsr166 1.146 void tearDownFail(String format, Object... args) {
554     String msg = toString() + ": " + String.format(format, args);
555     System.err.println(msg);
556 jsr166 1.156 dumpTestThreads();
557 jsr166 1.146 throw new AssertionFailedError(msg);
558     }
559    
560 dl 1.1 /**
561 jsr166 1.85 * Extra checks that get done for all test cases.
562     *
563 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
564     * by rethrowing, in the test harness thread, any exception recorded
565     * earlier by threadRecordFailure.
566 jsr166 1.85 *
567     * Triggers test case failure if interrupt status is set in the main thread.
568 jsr166 1.53 */
569     public void tearDown() throws Exception {
570 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
571 jsr166 1.53 if (t != null) {
572     if (t instanceof Error)
573     throw (Error) t;
574     else if (t instanceof RuntimeException)
575     throw (RuntimeException) t;
576     else if (t instanceof Exception)
577     throw (Exception) t;
578 jsr166 1.57 else {
579     AssertionFailedError afe =
580     new AssertionFailedError(t.toString());
581     afe.initCause(t);
582     throw afe;
583     }
584 jsr166 1.53 }
585 jsr166 1.85
586     if (Thread.interrupted())
587 jsr166 1.146 tearDownFail("interrupt status set in main thread");
588 jsr166 1.100
589     checkForkJoinPoolThreadLeaks();
590 dl 1.1 }
591    
592 dl 1.5 /**
593 jsr166 1.125 * Finds missing try { ... } finally { joinPool(e); }
594 jsr166 1.100 */
595     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
596 jsr166 1.146 Thread[] survivors = new Thread[7];
597 jsr166 1.100 int count = Thread.enumerate(survivors);
598     for (int i = 0; i < count; i++) {
599     Thread thread = survivors[i];
600     String name = thread.getName();
601     if (name.startsWith("ForkJoinPool-")) {
602     // give thread some time to terminate
603     thread.join(LONG_DELAY_MS);
604 jsr166 1.146 if (thread.isAlive())
605     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
606     thread);
607 jsr166 1.100 }
608     }
609 jsr166 1.146
610     if (!ForkJoinPool.commonPool()
611     .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
612     tearDownFail("ForkJoin common pool thread stuck");
613 jsr166 1.100 }
614 jsr166 1.101
615 jsr166 1.100 /**
616 jsr166 1.53 * Just like fail(reason), but additionally recording (using
617 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
618     * the current testcase will fail.
619 jsr166 1.27 */
620 dl 1.1 public void threadFail(String reason) {
621 jsr166 1.53 try {
622     fail(reason);
623 jsr166 1.57 } catch (AssertionFailedError t) {
624 jsr166 1.53 threadRecordFailure(t);
625 jsr166 1.152 throw t;
626 jsr166 1.53 }
627 dl 1.1 }
628    
629 dl 1.5 /**
630 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
631 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
632     * the current testcase will fail.
633 jsr166 1.27 */
634 dl 1.1 public void threadAssertTrue(boolean b) {
635 jsr166 1.53 try {
636 dl 1.1 assertTrue(b);
637 jsr166 1.57 } catch (AssertionFailedError t) {
638 jsr166 1.53 threadRecordFailure(t);
639     throw t;
640 dl 1.1 }
641     }
642 dl 1.5
643     /**
644 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
645 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
646     * the current testcase will fail.
647 jsr166 1.27 */
648 dl 1.1 public void threadAssertFalse(boolean b) {
649 jsr166 1.53 try {
650 dl 1.1 assertFalse(b);
651 jsr166 1.57 } catch (AssertionFailedError t) {
652 jsr166 1.53 threadRecordFailure(t);
653     throw t;
654 dl 1.1 }
655     }
656 dl 1.5
657     /**
658 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
659 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
660     * the current testcase will fail.
661 jsr166 1.27 */
662 dl 1.1 public void threadAssertNull(Object x) {
663 jsr166 1.53 try {
664 dl 1.1 assertNull(x);
665 jsr166 1.57 } catch (AssertionFailedError t) {
666 jsr166 1.53 threadRecordFailure(t);
667     throw t;
668 dl 1.1 }
669     }
670 dl 1.5
671     /**
672 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
673 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
674     * the current testcase will fail.
675 jsr166 1.27 */
676 dl 1.1 public void threadAssertEquals(long x, long y) {
677 jsr166 1.53 try {
678 dl 1.1 assertEquals(x, y);
679 jsr166 1.57 } catch (AssertionFailedError t) {
680 jsr166 1.53 threadRecordFailure(t);
681     throw t;
682 dl 1.1 }
683     }
684 dl 1.5
685     /**
686 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
687 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
688     * the current testcase will fail.
689 jsr166 1.27 */
690 dl 1.1 public void threadAssertEquals(Object x, Object y) {
691 jsr166 1.53 try {
692 dl 1.1 assertEquals(x, y);
693 jsr166 1.129 } catch (AssertionFailedError fail) {
694     threadRecordFailure(fail);
695     throw fail;
696     } catch (Throwable fail) {
697     threadUnexpectedException(fail);
698 dl 1.1 }
699     }
700    
701 dl 1.5 /**
702 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
703 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
704     * the current testcase will fail.
705 jsr166 1.52 */
706     public void threadAssertSame(Object x, Object y) {
707 jsr166 1.53 try {
708 jsr166 1.52 assertSame(x, y);
709 jsr166 1.129 } catch (AssertionFailedError fail) {
710     threadRecordFailure(fail);
711     throw fail;
712 jsr166 1.52 }
713     }
714    
715     /**
716 jsr166 1.53 * Calls threadFail with message "should throw exception".
717 jsr166 1.33 */
718 dl 1.3 public void threadShouldThrow() {
719 jsr166 1.53 threadFail("should throw exception");
720 dl 1.3 }
721    
722 dl 1.5 /**
723 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
724 jsr166 1.40 */
725     public void threadShouldThrow(String exceptionName) {
726 jsr166 1.53 threadFail("should throw " + exceptionName);
727 dl 1.3 }
728    
729 dl 1.31 /**
730 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
731     * then rethrows the exception, wrapping it in an
732     * AssertionFailedError if necessary.
733 dl 1.31 */
734 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
735     threadRecordFailure(t);
736     t.printStackTrace();
737     if (t instanceof RuntimeException)
738     throw (RuntimeException) t;
739     else if (t instanceof Error)
740     throw (Error) t;
741     else {
742 jsr166 1.57 AssertionFailedError afe =
743     new AssertionFailedError("unexpected exception: " + t);
744 jsr166 1.82 afe.initCause(t);
745 jsr166 1.57 throw afe;
746 jsr166 1.55 }
747 dl 1.31 }
748 dl 1.3
749 dl 1.1 /**
750 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
751 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
752     * until time elapses.
753     */
754 jsr166 1.81 static void delay(long millis) throws InterruptedException {
755 dl 1.76 long startTime = System.nanoTime();
756 jsr166 1.80 long ns = millis * 1000 * 1000;
757 dl 1.76 for (;;) {
758 jsr166 1.80 if (millis > 0L)
759     Thread.sleep(millis);
760 dl 1.76 else // too short to sleep
761     Thread.yield();
762     long d = ns - (System.nanoTime() - startTime);
763     if (d > 0L)
764 jsr166 1.80 millis = d / (1000 * 1000);
765 dl 1.76 else
766     break;
767     }
768     }
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 }