ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.166
Committed: Mon Oct 5 21:39:39 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.165: +33 -0 lines
Log Message:
allow PoolCleaners to have optional "release" actions

File Contents

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