ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.268
Committed: Sun Sep 22 01:59:57 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.267: +31 -2 lines
Log Message:
add testBlockers methods to check management interface

File Contents

# User Rev Content
1 dl 1.1 /*
2 jsr166 1.221 * Written by Doug Lea and Martin Buchholz with assistance from
3     * members of JCP JSR-166 Expert Group and released to the public
4     * domain, as explained at
5 jsr166 1.74 * http://creativecommons.org/publicdomain/zero/1.0/
6 jsr166 1.27 * Other contributors include Andrew Wright, Jeffrey Hayes,
7     * Pat Fisher, Mike Judd.
8 dl 1.1 */
9    
10 jsr166 1.182 /*
11     * @test
12 jsr166 1.221 * @summary JSR-166 tck tests, in a number of variations.
13     * The first is the conformance testing variant,
14     * while others also test implementation details.
15 jsr166 1.213 * @build *
16     * @modules java.management
17     * @run junit/othervm/timeout=1000 JSR166TestCase
18 jsr166 1.214 * @run junit/othervm/timeout=1000
19 jsr166 1.221 * --add-opens java.base/java.util.concurrent=ALL-UNNAMED
20     * --add-opens java.base/java.lang=ALL-UNNAMED
21 jsr166 1.214 * -Djsr166.testImplementationDetails=true
22     * JSR166TestCase
23     * @run junit/othervm/timeout=1000
24 jsr166 1.221 * --add-opens java.base/java.util.concurrent=ALL-UNNAMED
25     * --add-opens java.base/java.lang=ALL-UNNAMED
26 jsr166 1.214 * -Djsr166.testImplementationDetails=true
27     * -Djava.util.concurrent.ForkJoinPool.common.parallelism=0
28     * JSR166TestCase
29     * @run junit/othervm/timeout=1000
30 jsr166 1.221 * --add-opens java.base/java.util.concurrent=ALL-UNNAMED
31     * --add-opens java.base/java.lang=ALL-UNNAMED
32 jsr166 1.214 * -Djsr166.testImplementationDetails=true
33     * -Djava.util.concurrent.ForkJoinPool.common.parallelism=1
34     * -Djava.util.secureRandomSeed=true
35     * JSR166TestCase
36 jsr166 1.217 * @run junit/othervm/timeout=1000/policy=tck.policy
37 jsr166 1.221 * --add-opens java.base/java.util.concurrent=ALL-UNNAMED
38     * --add-opens java.base/java.lang=ALL-UNNAMED
39 jsr166 1.217 * -Djsr166.testImplementationDetails=true
40     * JSR166TestCase
41 jsr166 1.182 */
42    
43 jsr166 1.123 import static java.util.concurrent.TimeUnit.MILLISECONDS;
44 jsr166 1.156 import static java.util.concurrent.TimeUnit.MINUTES;
45 jsr166 1.123 import static java.util.concurrent.TimeUnit.NANOSECONDS;
46    
47 jsr166 1.79 import java.io.ByteArrayInputStream;
48     import java.io.ByteArrayOutputStream;
49     import java.io.ObjectInputStream;
50     import java.io.ObjectOutputStream;
51 jsr166 1.96 import java.lang.management.ManagementFactory;
52 jsr166 1.268 import java.lang.management.LockInfo;
53 jsr166 1.96 import java.lang.management.ThreadInfo;
54 jsr166 1.150 import java.lang.management.ThreadMXBean;
55 jsr166 1.134 import java.lang.reflect.Constructor;
56 jsr166 1.97 import java.lang.reflect.Method;
57 jsr166 1.134 import java.lang.reflect.Modifier;
58 jsr166 1.123 import java.security.CodeSource;
59     import java.security.Permission;
60     import java.security.PermissionCollection;
61     import java.security.Permissions;
62     import java.security.Policy;
63     import java.security.ProtectionDomain;
64     import java.security.SecurityPermission;
65 jsr166 1.93 import java.util.ArrayList;
66 jsr166 1.72 import java.util.Arrays;
67 jsr166 1.208 import java.util.Collection;
68 jsr166 1.200 import java.util.Collections;
69 jsr166 1.81 import java.util.Date;
70 jsr166 1.243 import java.util.Deque;
71 jsr166 1.93 import java.util.Enumeration;
72 jsr166 1.243 import java.util.HashSet;
73 jsr166 1.126 import java.util.Iterator;
74 jsr166 1.93 import java.util.List;
75 jsr166 1.72 import java.util.NoSuchElementException;
76 jsr166 1.53 import java.util.PropertyPermission;
77 jsr166 1.243 import java.util.Set;
78 jsr166 1.123 import java.util.concurrent.BlockingQueue;
79     import java.util.concurrent.Callable;
80     import java.util.concurrent.CountDownLatch;
81     import java.util.concurrent.CyclicBarrier;
82 jsr166 1.139 import java.util.concurrent.ExecutionException;
83 jsr166 1.234 import java.util.concurrent.Executor;
84 jsr166 1.139 import java.util.concurrent.Executors;
85 jsr166 1.123 import java.util.concurrent.ExecutorService;
86 jsr166 1.146 import java.util.concurrent.ForkJoinPool;
87 jsr166 1.123 import java.util.concurrent.Future;
88 jsr166 1.234 import java.util.concurrent.FutureTask;
89 jsr166 1.123 import java.util.concurrent.RecursiveAction;
90     import java.util.concurrent.RecursiveTask;
91 jsr166 1.234 import java.util.concurrent.RejectedExecutionException;
92 jsr166 1.123 import java.util.concurrent.RejectedExecutionHandler;
93     import java.util.concurrent.Semaphore;
94 jsr166 1.234 import java.util.concurrent.ScheduledExecutorService;
95     import java.util.concurrent.ScheduledFuture;
96 jsr166 1.193 import java.util.concurrent.SynchronousQueue;
97 jsr166 1.123 import java.util.concurrent.ThreadFactory;
98 jsr166 1.200 import java.util.concurrent.ThreadLocalRandom;
99 jsr166 1.123 import java.util.concurrent.ThreadPoolExecutor;
100 jsr166 1.232 import java.util.concurrent.TimeUnit;
101 jsr166 1.123 import java.util.concurrent.TimeoutException;
102 jsr166 1.185 import java.util.concurrent.atomic.AtomicBoolean;
103 jsr166 1.53 import java.util.concurrent.atomic.AtomicReference;
104 jsr166 1.114 import java.util.regex.Pattern;
105 jsr166 1.123
106     import junit.framework.Test;
107     import junit.framework.TestCase;
108 jsr166 1.131 import junit.framework.TestResult;
109 jsr166 1.123 import junit.framework.TestSuite;
110 dl 1.1
111     /**
112 dl 1.5 * Base class for JSR166 Junit TCK tests. Defines some constants,
113     * utility methods and classes, as well as a simple framework for
114     * helping to make sure that assertions failing in generated threads
115     * cause the associated test that generated them to itself fail (which
116 jsr166 1.27 * JUnit does not otherwise arrange). The rules for creating such
117 dl 1.5 * tests are:
118 dl 1.1 *
119     * <ol>
120     *
121 jsr166 1.248 * <li>All code not running in the main test thread (manually spawned threads
122     * or the common fork join pool) must be checked for failure (and completion!).
123     * Mechanisms that can be used to ensure this are:
124     * <ol>
125     * <li>Signalling via a synchronizer like AtomicInteger or CountDownLatch
126     * that the task completed normally, which is checked before returning from
127     * the test method in the main thread.
128     * <li>Using the forms {@link #threadFail}, {@link #threadAssertTrue},
129     * or {@link #threadAssertNull}, (not {@code fail}, {@code assertTrue}, etc.)
130     * Only the most typically used JUnit assertion methods are defined
131     * this way, but enough to live with.
132     * <li>Recording failure explicitly using {@link #threadUnexpectedException}
133     * or {@link #threadRecordFailure}.
134     * <li>Using a wrapper like CheckedRunnable that uses one the mechanisms above.
135     * </ol>
136 dl 1.1 *
137 jsr166 1.143 * <li>If you override {@link #setUp} or {@link #tearDown}, make sure
138 jsr166 1.50 * to invoke {@code super.setUp} and {@code super.tearDown} within
139 dl 1.1 * them. These methods are used to clear and check for thread
140 jsr166 1.143 * assertion failures.
141 dl 1.1 *
142 jsr166 1.51 * <li>All delays and timeouts must use one of the constants {@code
143 jsr166 1.50 * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
144     * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
145 dl 1.5 * discriminable from zero time, and always allows enough time for the
146     * small amounts of computation (creating a thread, calling a few
147 dl 1.1 * methods, etc) needed to reach a timeout point. Similarly, a SMALL
148     * is always discriminable as larger than SHORT and smaller than
149     * MEDIUM. And so on. These constants are set to conservative values,
150 dl 1.2 * but even so, if there is ever any doubt, they can all be increased
151 jsr166 1.143 * in one spot to rerun tests on slower platforms.
152 dl 1.1 *
153 jsr166 1.143 * <li>All threads generated must be joined inside each test case
154 jsr166 1.50 * method (or {@code fail} to do so) before returning from the
155     * method. The {@code joinPool} method can be used to do this when
156 jsr166 1.143 * using Executors.
157 dl 1.1 *
158     * </ol>
159 dl 1.6 *
160 jsr166 1.92 * <p><b>Other notes</b>
161 dl 1.6 * <ul>
162     *
163 jsr166 1.143 * <li>Usually, there is one testcase method per JSR166 method
164 dl 1.6 * covering "normal" operation, and then as many exception-testing
165     * methods as there are exceptions the method can throw. Sometimes
166     * there are multiple tests per JSR166 method when the different
167     * "normal" behaviors differ significantly. And sometimes testcases
168 jsr166 1.180 * cover multiple methods when they cannot be tested in isolation.
169 jsr166 1.27 *
170 jsr166 1.143 * <li>The documentation style for testcases is to provide as javadoc
171 dl 1.6 * a simple sentence or two describing the property that the testcase
172     * method purports to test. The javadocs do not say anything about how
173 jsr166 1.143 * the property is tested. To find out, read the code.
174 dl 1.6 *
175 jsr166 1.143 * <li>These tests are "conformance tests", and do not attempt to
176 dl 1.6 * test throughput, latency, scalability or other performance factors
177     * (see the separate "jtreg" tests for a set intended to check these
178     * for the most central aspects of functionality.) So, most tests use
179     * the smallest sensible numbers of threads, collection sizes, etc
180 jsr166 1.143 * needed to check basic conformance.
181 dl 1.6 *
182     * <li>The test classes currently do not declare inclusion in
183     * any particular package to simplify things for people integrating
184 jsr166 1.143 * them in TCK test suites.
185 dl 1.6 *
186 jsr166 1.143 * <li>As a convenience, the {@code main} of this class (JSR166TestCase)
187     * runs all JSR166 unit tests.
188 dl 1.6 *
189     * </ul>
190 dl 1.1 */
191     public class JSR166TestCase extends TestCase {
192 jsr166 1.49 private static final boolean useSecurityManager =
193     Boolean.getBoolean("jsr166.useSecurityManager");
194    
195 jsr166 1.62 protected static final boolean expensiveTests =
196     Boolean.getBoolean("jsr166.expensiveTests");
197    
198 jsr166 1.119 /**
199     * If true, also run tests that are not part of the official tck
200     * because they test unspecified implementation details.
201     */
202 jsr166 1.118 protected static final boolean testImplementationDetails =
203     Boolean.getBoolean("jsr166.testImplementationDetails");
204    
205 dl 1.6 /**
206 jsr166 1.61 * If true, report on stdout all "slow" tests, that is, ones that
207     * take more than profileThreshold milliseconds to execute.
208     */
209     private static final boolean profileTests =
210     Boolean.getBoolean("jsr166.profileTests");
211    
212     /**
213     * The number of milliseconds that tests are permitted for
214     * execution without being reported, when profileTests is set.
215     */
216     private static final long profileThreshold =
217     Long.getLong("jsr166.profileThreshold", 100);
218    
219 jsr166 1.107 /**
220     * The number of repetitions per test (for tickling rare bugs).
221     */
222     private static final int runsPerTest =
223     Integer.getInteger("jsr166.runsPerTest", 1);
224    
225 jsr166 1.114 /**
226 jsr166 1.131 * The number of repetitions of the test suite (for finding leaks?).
227     */
228     private static final int suiteRuns =
229     Integer.getInteger("jsr166.suiteRuns", 1);
230    
231 jsr166 1.189 /**
232     * Returns the value of the system property, or NaN if not defined.
233     */
234     private static float systemPropertyValue(String name) {
235 jsr166 1.185 String floatString = System.getProperty(name);
236     if (floatString == null)
237 jsr166 1.189 return Float.NaN;
238 jsr166 1.185 try {
239     return Float.parseFloat(floatString);
240     } catch (NumberFormatException ex) {
241     throw new IllegalArgumentException(
242     String.format("Bad float value in system property %s=%s",
243     name, floatString));
244     }
245     }
246    
247 jsr166 1.268 private static final ThreadMXBean THREAD_MXBEAN
248     = ManagementFactory.getThreadMXBean();
249    
250 jsr166 1.181 /**
251     * The scaling factor to apply to standard delays used in tests.
252 jsr166 1.189 * May be initialized from any of:
253     * - the "jsr166.delay.factor" system property
254     * - the "test.timeout.factor" system property (as used by jtreg)
255     * See: http://openjdk.java.net/jtreg/tag-spec.html
256     * - hard-coded fuzz factor when using a known slowpoke VM
257     */
258     private static final float delayFactor = delayFactor();
259    
260     private static float delayFactor() {
261     float x;
262     if (!Float.isNaN(x = systemPropertyValue("jsr166.delay.factor")))
263     return x;
264     if (!Float.isNaN(x = systemPropertyValue("test.timeout.factor")))
265     return x;
266     String prop = System.getProperty("java.vm.version");
267     if (prop != null && prop.matches(".*debug.*"))
268     return 4.0f; // How much slower is fastdebug than product?!
269     return 1.0f;
270     }
271 jsr166 1.181
272 jsr166 1.134 public JSR166TestCase() { super(); }
273     public JSR166TestCase(String name) { super(name); }
274    
275 jsr166 1.131 /**
276 jsr166 1.114 * A filter for tests to run, matching strings of the form
277     * methodName(className), e.g. "testInvokeAll5(ForkJoinPoolTest)"
278     * Usefully combined with jsr166.runsPerTest.
279     */
280     private static final Pattern methodFilter = methodFilter();
281    
282     private static Pattern methodFilter() {
283     String regex = System.getProperty("jsr166.methodFilter");
284     return (regex == null) ? null : Pattern.compile(regex);
285     }
286    
287 jsr166 1.170 // Instrumentation to debug very rare, but very annoying hung test runs.
288 jsr166 1.156 static volatile TestCase currentTestCase;
289 jsr166 1.173 // static volatile int currentRun = 0;
290 jsr166 1.156 static {
291 jsr166 1.265 Runnable wedgedTestDetector = new Runnable() { public void run() {
292 jsr166 1.174 // Avoid spurious reports with enormous runsPerTest.
293     // A single test case run should never take more than 1 second.
294     // But let's cap it at the high end too ...
295 jsr166 1.255 final int timeoutMinutesMin = Math.max(runsPerTest / 60, 1)
296     * Math.max((int) delayFactor, 1);
297     final int timeoutMinutes = Math.min(15, timeoutMinutesMin);
298 jsr166 1.156 for (TestCase lastTestCase = currentTestCase;;) {
299 jsr166 1.157 try { MINUTES.sleep(timeoutMinutes); }
300 jsr166 1.156 catch (InterruptedException unexpected) { break; }
301     if (lastTestCase == currentTestCase) {
302 jsr166 1.170 System.err.printf(
303 jsr166 1.173 "Looks like we're stuck running test: %s%n",
304     lastTestCase);
305     // System.err.printf(
306     // "Looks like we're stuck running test: %s (%d/%d)%n",
307     // lastTestCase, currentRun, runsPerTest);
308 jsr166 1.175 // System.err.println("availableProcessors=" +
309     // Runtime.getRuntime().availableProcessors());
310     // System.err.printf("cpu model = %s%n", cpuModel());
311 jsr166 1.156 dumpTestThreads();
312 jsr166 1.165 // one stack dump is probably enough; more would be spam
313     break;
314 jsr166 1.156 }
315     lastTestCase = currentTestCase;
316     }}};
317 jsr166 1.265 Thread thread = new Thread(wedgedTestDetector, "WedgedTestDetector");
318 jsr166 1.156 thread.setDaemon(true);
319     thread.start();
320     }
321    
322 jsr166 1.175 // public static String cpuModel() {
323     // try {
324 jsr166 1.220 // java.util.regex.Matcher matcher
325     // = Pattern.compile("model name\\s*: (.*)")
326 jsr166 1.175 // .matcher(new String(
327 jsr166 1.220 // java.nio.file.Files.readAllBytes(
328     // java.nio.file.Paths.get("/proc/cpuinfo")), "UTF-8"));
329 jsr166 1.175 // matcher.find();
330     // return matcher.group(1);
331     // } catch (Exception ex) { return null; }
332     // }
333 jsr166 1.171
334 jsr166 1.147 public void runBare() throws Throwable {
335 jsr166 1.156 currentTestCase = this;
336 jsr166 1.147 if (methodFilter == null
337     || methodFilter.matcher(toString()).find())
338     super.runBare();
339     }
340    
341 jsr166 1.61 protected void runTest() throws Throwable {
342 jsr166 1.147 for (int i = 0; i < runsPerTest; i++) {
343 jsr166 1.173 // currentRun = i;
344 jsr166 1.147 if (profileTests)
345     runTestProfiled();
346     else
347     super.runTest();
348 jsr166 1.107 }
349 jsr166 1.61 }
350    
351     protected void runTestProfiled() throws Throwable {
352 jsr166 1.145 for (int i = 0; i < 2; i++) {
353     long startTime = System.nanoTime();
354 jsr166 1.61 super.runTest();
355 jsr166 1.145 long elapsedMillis = millisElapsedSince(startTime);
356     if (elapsedMillis < profileThreshold)
357     break;
358     // Never report first run of any test; treat it as a
359     // warmup run, notably to trigger all needed classloading,
360     if (i > 0)
361 jsr166 1.267 System.out.printf("%s: %d%n", toString(), elapsedMillis);
362 jsr166 1.61 }
363     }
364 jsr166 1.63
365 jsr166 1.61 /**
366 jsr166 1.94 * Runs all JSR166 unit tests using junit.textui.TestRunner.
367 jsr166 1.27 */
368 jsr166 1.41 public static void main(String[] args) {
369 jsr166 1.131 main(suite(), args);
370     }
371    
372 jsr166 1.178 static class PithyResultPrinter extends junit.textui.ResultPrinter {
373     PithyResultPrinter(java.io.PrintStream writer) { super(writer); }
374     long runTime;
375     public void startTest(Test test) {}
376 jsr166 1.179 protected void printHeader(long runTime) {
377 jsr166 1.178 this.runTime = runTime; // defer printing for later
378 jsr166 1.179 }
379     protected void printFooter(TestResult result) {
380 jsr166 1.178 if (result.wasSuccessful()) {
381     getWriter().println("OK (" + result.runCount() + " tests)"
382     + " Time: " + elapsedTimeAsString(runTime));
383     } else {
384     getWriter().println("Time: " + elapsedTimeAsString(runTime));
385     super.printFooter(result);
386     }
387     }
388     }
389    
390     /**
391     * Returns a TestRunner that doesn't bother with unnecessary
392     * fluff, like printing a "." for each test case.
393     */
394     static junit.textui.TestRunner newPithyTestRunner() {
395     junit.textui.TestRunner runner = new junit.textui.TestRunner();
396     runner.setPrinter(new PithyResultPrinter(System.out));
397     return runner;
398     }
399    
400 jsr166 1.131 /**
401     * Runs all unit tests in the given test suite.
402 jsr166 1.132 * Actual behavior influenced by jsr166.* system properties.
403 jsr166 1.131 */
404     static void main(Test suite, String[] args) {
405 jsr166 1.49 if (useSecurityManager) {
406     System.err.println("Setting a permissive security manager");
407     Policy.setPolicy(permissivePolicy());
408     System.setSecurityManager(new SecurityManager());
409     }
410 jsr166 1.131 for (int i = 0; i < suiteRuns; i++) {
411 jsr166 1.178 TestResult result = newPithyTestRunner().doRun(suite);
412 jsr166 1.131 if (!result.wasSuccessful())
413     System.exit(1);
414 dl 1.22 System.gc();
415     System.runFinalization();
416     }
417 dl 1.6 }
418    
419 jsr166 1.60 public static TestSuite newTestSuite(Object... suiteOrClasses) {
420     TestSuite suite = new TestSuite();
421     for (Object suiteOrClass : suiteOrClasses) {
422     if (suiteOrClass instanceof TestSuite)
423     suite.addTest((TestSuite) suiteOrClass);
424     else if (suiteOrClass instanceof Class)
425     suite.addTest(new TestSuite((Class<?>) suiteOrClass));
426     else
427     throw new ClassCastException("not a test suite or class");
428     }
429     return suite;
430     }
431    
432 jsr166 1.98 public static void addNamedTestClasses(TestSuite suite,
433     String... testClassNames) {
434     for (String testClassName : testClassNames) {
435     try {
436     Class<?> testClass = Class.forName(testClassName);
437 jsr166 1.241 Method m = testClass.getDeclaredMethod("suite");
438 jsr166 1.98 suite.addTest(newTestSuite((Test)m.invoke(null)));
439 jsr166 1.241 } catch (ReflectiveOperationException e) {
440     throw new AssertionError("Missing test class", e);
441 jsr166 1.98 }
442 jsr166 1.97 }
443     }
444    
445     public static final double JAVA_CLASS_VERSION;
446 jsr166 1.115 public static final String JAVA_SPECIFICATION_VERSION;
447 jsr166 1.97 static {
448     try {
449     JAVA_CLASS_VERSION = java.security.AccessController.doPrivileged(
450     new java.security.PrivilegedAction<Double>() {
451     public Double run() {
452     return Double.valueOf(System.getProperty("java.class.version"));}});
453 jsr166 1.115 JAVA_SPECIFICATION_VERSION = java.security.AccessController.doPrivileged(
454     new java.security.PrivilegedAction<String>() {
455     public String run() {
456     return System.getProperty("java.specification.version");}});
457 jsr166 1.97 } catch (Throwable t) {
458     throw new Error(t);
459     }
460     }
461    
462 jsr166 1.238 public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
463     public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
464     public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
465     public static boolean atLeastJava9() { return JAVA_CLASS_VERSION >= 53.0; }
466     public static boolean atLeastJava10() { return JAVA_CLASS_VERSION >= 54.0; }
467 jsr166 1.244 public static boolean atLeastJava11() { return JAVA_CLASS_VERSION >= 55.0; }
468 jsr166 1.252 public static boolean atLeastJava12() { return JAVA_CLASS_VERSION >= 56.0; }
469     public static boolean atLeastJava13() { return JAVA_CLASS_VERSION >= 57.0; }
470     public static boolean atLeastJava14() { return JAVA_CLASS_VERSION >= 58.0; }
471     public static boolean atLeastJava15() { return JAVA_CLASS_VERSION >= 59.0; }
472     public static boolean atLeastJava16() { return JAVA_CLASS_VERSION >= 60.0; }
473     public static boolean atLeastJava17() { return JAVA_CLASS_VERSION >= 61.0; }
474 jsr166 1.97
475 dl 1.6 /**
476 jsr166 1.60 * Collects all JSR166 unit tests as one suite.
477 jsr166 1.27 */
478 jsr166 1.41 public static Test suite() {
479 jsr166 1.98 // Java7+ test classes
480 jsr166 1.97 TestSuite suite = newTestSuite(
481 jsr166 1.60 ForkJoinPoolTest.suite(),
482     ForkJoinTaskTest.suite(),
483     RecursiveActionTest.suite(),
484     RecursiveTaskTest.suite(),
485     LinkedTransferQueueTest.suite(),
486     PhaserTest.suite(),
487     ThreadLocalRandomTest.suite(),
488     AbstractExecutorServiceTest.suite(),
489     AbstractQueueTest.suite(),
490     AbstractQueuedSynchronizerTest.suite(),
491     AbstractQueuedLongSynchronizerTest.suite(),
492     ArrayBlockingQueueTest.suite(),
493     ArrayDequeTest.suite(),
494 jsr166 1.205 ArrayListTest.suite(),
495 jsr166 1.60 AtomicBooleanTest.suite(),
496     AtomicIntegerArrayTest.suite(),
497     AtomicIntegerFieldUpdaterTest.suite(),
498     AtomicIntegerTest.suite(),
499     AtomicLongArrayTest.suite(),
500     AtomicLongFieldUpdaterTest.suite(),
501     AtomicLongTest.suite(),
502     AtomicMarkableReferenceTest.suite(),
503     AtomicReferenceArrayTest.suite(),
504     AtomicReferenceFieldUpdaterTest.suite(),
505     AtomicReferenceTest.suite(),
506     AtomicStampedReferenceTest.suite(),
507     ConcurrentHashMapTest.suite(),
508     ConcurrentLinkedDequeTest.suite(),
509     ConcurrentLinkedQueueTest.suite(),
510     ConcurrentSkipListMapTest.suite(),
511     ConcurrentSkipListSubMapTest.suite(),
512     ConcurrentSkipListSetTest.suite(),
513     ConcurrentSkipListSubSetTest.suite(),
514     CopyOnWriteArrayListTest.suite(),
515     CopyOnWriteArraySetTest.suite(),
516     CountDownLatchTest.suite(),
517 jsr166 1.204 CountedCompleterTest.suite(),
518 jsr166 1.60 CyclicBarrierTest.suite(),
519     DelayQueueTest.suite(),
520     EntryTest.suite(),
521     ExchangerTest.suite(),
522     ExecutorsTest.suite(),
523     ExecutorCompletionServiceTest.suite(),
524     FutureTaskTest.suite(),
525 jsr166 1.254 HashtableTest.suite(),
526 jsr166 1.60 LinkedBlockingDequeTest.suite(),
527     LinkedBlockingQueueTest.suite(),
528     LinkedListTest.suite(),
529     LockSupportTest.suite(),
530     PriorityBlockingQueueTest.suite(),
531     PriorityQueueTest.suite(),
532     ReentrantLockTest.suite(),
533     ReentrantReadWriteLockTest.suite(),
534     ScheduledExecutorTest.suite(),
535     ScheduledExecutorSubclassTest.suite(),
536     SemaphoreTest.suite(),
537     SynchronousQueueTest.suite(),
538     SystemTest.suite(),
539     ThreadLocalTest.suite(),
540     ThreadPoolExecutorTest.suite(),
541     ThreadPoolExecutorSubclassTest.suite(),
542     ThreadTest.suite(),
543     TimeUnitTest.suite(),
544     TreeMapTest.suite(),
545     TreeSetTest.suite(),
546     TreeSubMapTest.suite(),
547 jsr166 1.207 TreeSubSetTest.suite(),
548     VectorTest.suite());
549 jsr166 1.98
550     // Java8+ test classes
551     if (atLeastJava8()) {
552     String[] java8TestClassNames = {
553 jsr166 1.206 "ArrayDeque8Test",
554 dl 1.113 "Atomic8Test",
555 dl 1.104 "CompletableFutureTest",
556 dl 1.105 "ConcurrentHashMap8Test",
557 jsr166 1.204 "CountedCompleter8Test",
558 dl 1.104 "DoubleAccumulatorTest",
559 dl 1.103 "DoubleAdderTest",
560 jsr166 1.102 "ForkJoinPool8Test",
561 dl 1.111 "ForkJoinTask8Test",
562 jsr166 1.237 "HashMapTest",
563 jsr166 1.215 "LinkedBlockingDeque8Test",
564     "LinkedBlockingQueue8Test",
565 jsr166 1.251 "LinkedHashMapTest",
566 dl 1.104 "LongAccumulatorTest",
567     "LongAdderTest",
568 jsr166 1.110 "SplittableRandomTest",
569 jsr166 1.98 "StampedLockTest",
570 dl 1.140 "SubmissionPublisherTest",
571 jsr166 1.112 "ThreadLocalRandom8Test",
572 jsr166 1.190 "TimeUnit8Test",
573 jsr166 1.98 };
574     addNamedTestClasses(suite, java8TestClassNames);
575 jsr166 1.97 }
576 jsr166 1.98
577 jsr166 1.115 // Java9+ test classes
578     if (atLeastJava9()) {
579     String[] java9TestClassNames = {
580 jsr166 1.196 "AtomicBoolean9Test",
581     "AtomicInteger9Test",
582     "AtomicIntegerArray9Test",
583     "AtomicLong9Test",
584     "AtomicLongArray9Test",
585     "AtomicReference9Test",
586     "AtomicReferenceArray9Test",
587 jsr166 1.192 "ExecutorCompletionService9Test",
588 jsr166 1.218 "ForkJoinPool9Test",
589 jsr166 1.115 };
590     addNamedTestClasses(suite, java9TestClassNames);
591     }
592    
593 jsr166 1.97 return suite;
594 dl 1.6 }
595    
596 jsr166 1.134 /** Returns list of junit-style test method names in given class. */
597     public static ArrayList<String> testMethodNames(Class<?> testClass) {
598     Method[] methods = testClass.getDeclaredMethods();
599 jsr166 1.216 ArrayList<String> names = new ArrayList<>(methods.length);
600 jsr166 1.134 for (Method method : methods) {
601     if (method.getName().startsWith("test")
602     && Modifier.isPublic(method.getModifiers())
603     // method.getParameterCount() requires jdk8+
604     && method.getParameterTypes().length == 0) {
605     names.add(method.getName());
606     }
607     }
608     return names;
609     }
610    
611     /**
612     * Returns junit-style testSuite for the given test class, but
613     * parameterized by passing extra data to each test.
614     */
615     public static <ExtraData> Test parameterizedTestSuite
616     (Class<? extends JSR166TestCase> testClass,
617     Class<ExtraData> dataClass,
618     ExtraData data) {
619     try {
620     TestSuite suite = new TestSuite();
621     Constructor c =
622     testClass.getDeclaredConstructor(dataClass, String.class);
623     for (String methodName : testMethodNames(testClass))
624     suite.addTest((Test) c.newInstance(data, methodName));
625     return suite;
626 jsr166 1.241 } catch (ReflectiveOperationException e) {
627     throw new AssertionError(e);
628 jsr166 1.134 }
629     }
630    
631     /**
632     * Returns junit-style testSuite for the jdk8 extension of the
633     * given test class, but parameterized by passing extra data to
634     * each test. Uses reflection to allow compilation in jdk7.
635     */
636     public static <ExtraData> Test jdk8ParameterizedTestSuite
637     (Class<? extends JSR166TestCase> testClass,
638     Class<ExtraData> dataClass,
639     ExtraData data) {
640     if (atLeastJava8()) {
641     String name = testClass.getName();
642     String name8 = name.replaceAll("Test$", "8Test");
643 jsr166 1.241 if (name.equals(name8)) throw new AssertionError(name);
644 jsr166 1.134 try {
645     return (Test)
646     Class.forName(name8)
647 jsr166 1.241 .getMethod("testSuite", dataClass)
648 jsr166 1.134 .invoke(null, data);
649 jsr166 1.241 } catch (ReflectiveOperationException e) {
650     throw new AssertionError(e);
651 jsr166 1.134 }
652     } else {
653     return new TestSuite();
654     }
655     }
656    
657 jsr166 1.109 // Delays for timing-dependent tests, in milliseconds.
658 dl 1.1
659 dl 1.2 public static long SHORT_DELAY_MS;
660     public static long SMALL_DELAY_MS;
661     public static long MEDIUM_DELAY_MS;
662     public static long LONG_DELAY_MS;
663    
664 jsr166 1.261 /**
665     * A delay significantly longer than LONG_DELAY_MS.
666     * Use this in a thread that is waited for via awaitTermination(Thread).
667     */
668     public static long LONGER_DELAY_MS;
669    
670 jsr166 1.232 private static final long RANDOM_TIMEOUT;
671     private static final long RANDOM_EXPIRED_TIMEOUT;
672     private static final TimeUnit RANDOM_TIMEUNIT;
673     static {
674     ThreadLocalRandom rnd = ThreadLocalRandom.current();
675     long[] timeouts = { Long.MIN_VALUE, -1, 0, 1, Long.MAX_VALUE };
676     RANDOM_TIMEOUT = timeouts[rnd.nextInt(timeouts.length)];
677     RANDOM_EXPIRED_TIMEOUT = timeouts[rnd.nextInt(3)];
678     TimeUnit[] timeUnits = TimeUnit.values();
679     RANDOM_TIMEUNIT = timeUnits[rnd.nextInt(timeUnits.length)];
680     }
681    
682     /**
683     * Returns a timeout for use when any value at all will do.
684     */
685     static long randomTimeout() { return RANDOM_TIMEOUT; }
686    
687     /**
688     * Returns a timeout that means "no waiting", i.e. not positive.
689     */
690     static long randomExpiredTimeout() { return RANDOM_EXPIRED_TIMEOUT; }
691    
692     /**
693     * Returns a random non-null TimeUnit.
694     */
695     static TimeUnit randomTimeUnit() { return RANDOM_TIMEUNIT; }
696    
697 dl 1.2 /**
698 jsr166 1.256 * Returns a random boolean; a "coin flip".
699     */
700     static boolean randomBoolean() {
701     return ThreadLocalRandom.current().nextBoolean();
702     }
703    
704     /**
705 jsr166 1.257 * Returns a random element from given choices.
706     */
707     <T> T chooseRandomly(T... choices) {
708     return choices[ThreadLocalRandom.current().nextInt(choices.length)];
709     }
710    
711     /**
712 jsr166 1.181 * Returns the shortest timed delay. This can be scaled up for
713 jsr166 1.185 * slow machines using the jsr166.delay.factor system property,
714 jsr166 1.187 * or via jtreg's -timeoutFactor: flag.
715 jsr166 1.185 * http://openjdk.java.net/jtreg/command-help.html
716 jsr166 1.27 */
717 dl 1.2 protected long getShortDelay() {
718 jsr166 1.189 return (long) (50 * delayFactor);
719 dl 1.2 }
720    
721     /**
722 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
723 dl 1.2 */
724 jsr166 1.43 protected void setDelays() {
725 dl 1.2 SHORT_DELAY_MS = getShortDelay();
726 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
727 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
728 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
729 jsr166 1.261 LONGER_DELAY_MS = 2 * LONG_DELAY_MS;
730 dl 1.2 }
731    
732 jsr166 1.223 private static final long TIMEOUT_DELAY_MS
733     = (long) (12.0 * Math.cbrt(delayFactor));
734    
735 dl 1.1 /**
736 jsr166 1.223 * Returns a timeout in milliseconds to be used in tests that verify
737     * that operations block or time out. We want this to be longer
738     * than the OS scheduling quantum, but not too long, so don't scale
739     * linearly with delayFactor; we use "crazy" cube root instead.
740 jsr166 1.81 */
741 jsr166 1.223 static long timeoutMillis() {
742     return TIMEOUT_DELAY_MS;
743 jsr166 1.81 }
744    
745     /**
746 jsr166 1.135 * Returns a new Date instance representing a time at least
747     * delayMillis milliseconds in the future.
748 jsr166 1.81 */
749     Date delayedDate(long delayMillis) {
750 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
751     return new Date(System.currentTimeMillis() + delayMillis + 1);
752 jsr166 1.81 }
753    
754     /**
755 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
756 dl 1.1 */
757 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
758 jsr166 1.216 = new AtomicReference<>(null);
759 dl 1.1
760     /**
761 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
762     * harness thread, triggering a test case failure. Only the first
763     * failure is recorded; subsequent calls to this method from within
764     * the same test have no effect.
765 dl 1.1 */
766 jsr166 1.53 public void threadRecordFailure(Throwable t) {
767 jsr166 1.158 System.err.println(t);
768 jsr166 1.260 if (threadFailure.compareAndSet(null, t))
769     dumpTestThreads();
770 jsr166 1.53 }
771    
772 jsr166 1.27 public void setUp() {
773 dl 1.2 setDelays();
774 dl 1.1 }
775    
776 jsr166 1.146 void tearDownFail(String format, Object... args) {
777     String msg = toString() + ": " + String.format(format, args);
778     System.err.println(msg);
779 jsr166 1.156 dumpTestThreads();
780 jsr166 1.239 throw new AssertionError(msg);
781 jsr166 1.146 }
782    
783 dl 1.1 /**
784 jsr166 1.85 * Extra checks that get done for all test cases.
785     *
786 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
787     * by rethrowing, in the test harness thread, any exception recorded
788     * earlier by threadRecordFailure.
789 jsr166 1.85 *
790     * Triggers test case failure if interrupt status is set in the main thread.
791 jsr166 1.53 */
792     public void tearDown() throws Exception {
793 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
794 jsr166 1.53 if (t != null) {
795     if (t instanceof Error)
796     throw (Error) t;
797     else if (t instanceof RuntimeException)
798     throw (RuntimeException) t;
799     else if (t instanceof Exception)
800     throw (Exception) t;
801 jsr166 1.239 else
802     throw new AssertionError(t.toString(), t);
803 jsr166 1.53 }
804 jsr166 1.85
805     if (Thread.interrupted())
806 jsr166 1.146 tearDownFail("interrupt status set in main thread");
807 jsr166 1.100
808     checkForkJoinPoolThreadLeaks();
809 dl 1.1 }
810    
811 dl 1.5 /**
812 jsr166 1.164 * Finds missing PoolCleaners
813 jsr166 1.100 */
814     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
815 jsr166 1.146 Thread[] survivors = new Thread[7];
816 jsr166 1.100 int count = Thread.enumerate(survivors);
817     for (int i = 0; i < count; i++) {
818     Thread thread = survivors[i];
819     String name = thread.getName();
820     if (name.startsWith("ForkJoinPool-")) {
821     // give thread some time to terminate
822     thread.join(LONG_DELAY_MS);
823 jsr166 1.146 if (thread.isAlive())
824     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
825     thread);
826 jsr166 1.100 }
827     }
828 jsr166 1.146
829     if (!ForkJoinPool.commonPool()
830     .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
831     tearDownFail("ForkJoin common pool thread stuck");
832 jsr166 1.100 }
833 jsr166 1.101
834 jsr166 1.100 /**
835 jsr166 1.53 * Just like fail(reason), but additionally recording (using
836 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
837     * current testcase will fail.
838 jsr166 1.27 */
839 dl 1.1 public void threadFail(String reason) {
840 jsr166 1.53 try {
841     fail(reason);
842 jsr166 1.239 } catch (AssertionError fail) {
843     threadRecordFailure(fail);
844     throw fail;
845 jsr166 1.53 }
846 dl 1.1 }
847    
848 dl 1.5 /**
849 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
850 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
851     * current testcase will fail.
852 jsr166 1.27 */
853 dl 1.1 public void threadAssertTrue(boolean b) {
854 jsr166 1.53 try {
855 dl 1.1 assertTrue(b);
856 jsr166 1.239 } catch (AssertionError fail) {
857     threadRecordFailure(fail);
858     throw fail;
859 dl 1.1 }
860     }
861 dl 1.5
862     /**
863 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
864 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
865     * current testcase will fail.
866 jsr166 1.27 */
867 dl 1.1 public void threadAssertFalse(boolean b) {
868 jsr166 1.53 try {
869 dl 1.1 assertFalse(b);
870 jsr166 1.239 } catch (AssertionError fail) {
871     threadRecordFailure(fail);
872     throw fail;
873 dl 1.1 }
874     }
875 dl 1.5
876     /**
877 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
878 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
879     * current testcase will fail.
880 jsr166 1.27 */
881 dl 1.1 public void threadAssertNull(Object x) {
882 jsr166 1.53 try {
883 dl 1.1 assertNull(x);
884 jsr166 1.239 } catch (AssertionError fail) {
885     threadRecordFailure(fail);
886     throw fail;
887 dl 1.1 }
888     }
889 dl 1.5
890     /**
891 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
892 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
893     * current testcase will fail.
894 jsr166 1.27 */
895 dl 1.1 public void threadAssertEquals(long x, long y) {
896 jsr166 1.53 try {
897 dl 1.1 assertEquals(x, y);
898 jsr166 1.239 } catch (AssertionError fail) {
899     threadRecordFailure(fail);
900     throw fail;
901 dl 1.1 }
902     }
903 dl 1.5
904     /**
905 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
906 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
907     * current testcase will fail.
908 jsr166 1.27 */
909 dl 1.1 public void threadAssertEquals(Object x, Object y) {
910 jsr166 1.53 try {
911 dl 1.1 assertEquals(x, y);
912 jsr166 1.239 } catch (AssertionError fail) {
913 jsr166 1.129 threadRecordFailure(fail);
914     throw fail;
915     } catch (Throwable fail) {
916     threadUnexpectedException(fail);
917 dl 1.1 }
918     }
919    
920 dl 1.5 /**
921 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
922 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
923     * current testcase will fail.
924 jsr166 1.52 */
925     public void threadAssertSame(Object x, Object y) {
926 jsr166 1.53 try {
927 jsr166 1.52 assertSame(x, y);
928 jsr166 1.239 } catch (AssertionError fail) {
929 jsr166 1.129 threadRecordFailure(fail);
930     throw fail;
931 jsr166 1.52 }
932     }
933    
934     /**
935 jsr166 1.53 * Calls threadFail with message "should throw exception".
936 jsr166 1.33 */
937 dl 1.3 public void threadShouldThrow() {
938 jsr166 1.53 threadFail("should throw exception");
939 dl 1.3 }
940    
941 dl 1.5 /**
942 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
943 jsr166 1.40 */
944     public void threadShouldThrow(String exceptionName) {
945 jsr166 1.53 threadFail("should throw " + exceptionName);
946 dl 1.3 }
947    
948 dl 1.31 /**
949 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
950 jsr166 1.239 * then rethrows the exception, wrapping it in an AssertionError
951     * if necessary.
952 dl 1.31 */
953 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
954     threadRecordFailure(t);
955     t.printStackTrace();
956     if (t instanceof RuntimeException)
957     throw (RuntimeException) t;
958     else if (t instanceof Error)
959     throw (Error) t;
960 jsr166 1.239 else
961     throw new AssertionError("unexpected exception: " + t, t);
962 dl 1.31 }
963 dl 1.3
964 dl 1.1 /**
965 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
966 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
967 jsr166 1.163 * until time elapses. Ensures that the given time, as measured
968     * by System.nanoTime(), has elapsed.
969 dl 1.76 */
970 jsr166 1.81 static void delay(long millis) throws InterruptedException {
971 jsr166 1.163 long nanos = millis * (1000 * 1000);
972     final long wakeupTime = System.nanoTime() + nanos;
973     do {
974 jsr166 1.80 if (millis > 0L)
975     Thread.sleep(millis);
976 dl 1.76 else // too short to sleep
977     Thread.yield();
978 jsr166 1.163 nanos = wakeupTime - System.nanoTime();
979     millis = nanos / (1000 * 1000);
980     } while (nanos >= 0L);
981 dl 1.76 }
982    
983     /**
984 jsr166 1.149 * Allows use of try-with-resources with per-test thread pools.
985     */
986 jsr166 1.160 class PoolCleaner implements AutoCloseable {
987     private final ExecutorService pool;
988     public PoolCleaner(ExecutorService pool) { this.pool = pool; }
989 jsr166 1.149 public void close() { joinPool(pool); }
990     }
991    
992 jsr166 1.166 /**
993     * An extension of PoolCleaner that has an action to release the pool.
994     */
995     class PoolCleanerWithReleaser extends PoolCleaner {
996     private final Runnable releaser;
997     public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
998     super(pool);
999     this.releaser = releaser;
1000     }
1001     public void close() {
1002     try {
1003     releaser.run();
1004     } finally {
1005     super.close();
1006     }
1007     }
1008     }
1009    
1010 jsr166 1.160 PoolCleaner cleaner(ExecutorService pool) {
1011     return new PoolCleaner(pool);
1012 jsr166 1.159 }
1013    
1014 jsr166 1.166 PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
1015     return new PoolCleanerWithReleaser(pool, releaser);
1016     }
1017    
1018     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
1019     return new PoolCleanerWithReleaser(pool, releaser(latch));
1020     }
1021    
1022     Runnable releaser(final CountDownLatch latch) {
1023     return new Runnable() { public void run() {
1024     do { latch.countDown(); }
1025     while (latch.getCount() > 0);
1026     }};
1027     }
1028    
1029 jsr166 1.185 PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
1030     return new PoolCleanerWithReleaser(pool, releaser(flag));
1031     }
1032    
1033     Runnable releaser(final AtomicBoolean flag) {
1034     return new Runnable() { public void run() { flag.set(true); }};
1035     }
1036    
1037 jsr166 1.149 /**
1038 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
1039 dl 1.1 */
1040 jsr166 1.158 void joinPool(ExecutorService pool) {
1041 dl 1.1 try {
1042 jsr166 1.139 pool.shutdown();
1043 jsr166 1.158 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
1044     try {
1045     threadFail("ExecutorService " + pool +
1046     " did not terminate in a timely manner");
1047     } finally {
1048     // last resort, for the benefit of subsequent tests
1049     pool.shutdownNow();
1050 jsr166 1.167 pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
1051 jsr166 1.158 }
1052     }
1053 jsr166 1.33 } catch (SecurityException ok) {
1054 dl 1.22 // Allowed in case test doesn't have privs
1055 jsr166 1.128 } catch (InterruptedException fail) {
1056 jsr166 1.158 threadFail("Unexpected InterruptedException");
1057 dl 1.1 }
1058     }
1059    
1060 jsr166 1.197 /**
1061     * Like Runnable, but with the freedom to throw anything.
1062     * junit folks had the same idea:
1063     * http://junit.org/junit5/docs/snapshot/api/org/junit/gen5/api/Executable.html
1064     */
1065 jsr166 1.141 interface Action { public void run() throws Throwable; }
1066 jsr166 1.139
1067     /**
1068 jsr166 1.141 * Runs all the given actions in parallel, failing if any fail.
1069 jsr166 1.139 * Useful for running multiple variants of tests that are
1070     * necessarily individually slow because they must block.
1071     */
1072 jsr166 1.141 void testInParallel(Action ... actions) {
1073 jsr166 1.160 ExecutorService pool = Executors.newCachedThreadPool();
1074     try (PoolCleaner cleaner = cleaner(pool)) {
1075 jsr166 1.141 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
1076     for (final Action action : actions)
1077 jsr166 1.139 futures.add(pool.submit(new CheckedRunnable() {
1078 jsr166 1.141 public void realRun() throws Throwable { action.run();}}));
1079 jsr166 1.139 for (Future<?> future : futures)
1080     try {
1081     assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
1082     } catch (ExecutionException ex) {
1083     threadUnexpectedException(ex.getCause());
1084     } catch (Exception ex) {
1085     threadUnexpectedException(ex);
1086     }
1087     }
1088     }
1089    
1090 jsr166 1.266 /** Returns true if thread info might be useful in a thread dump. */
1091     static boolean threadOfInterest(ThreadInfo info) {
1092     final String name = info.getThreadName();
1093     String lockName;
1094     if (name == null)
1095     return true;
1096     if (name.equals("Signal Dispatcher")
1097     || name.equals("WedgedTestDetector"))
1098     return false;
1099     if (name.equals("Reference Handler")) {
1100     // Reference Handler stacktrace changed in JDK-8156500
1101     StackTraceElement[] stackTrace; String methodName;
1102     if ((stackTrace = info.getStackTrace()) != null
1103     && stackTrace.length > 0
1104     && (methodName = stackTrace[0].getMethodName()) != null
1105     && methodName.equals("waitForReferencePendingList"))
1106     return false;
1107     // jdk8 Reference Handler stacktrace
1108     if ((lockName = info.getLockName()) != null
1109     && lockName.startsWith("java.lang.ref"))
1110     return false;
1111     }
1112     if ((name.equals("Finalizer") || name.equals("Common-Cleaner"))
1113     && (lockName = info.getLockName()) != null
1114     && lockName.startsWith("java.lang.ref"))
1115     return false;
1116     if (name.startsWith("ForkJoinPool.commonPool-worker")
1117     && (lockName = info.getLockName()) != null
1118     && lockName.startsWith("java.util.concurrent.ForkJoinPool"))
1119     return false;
1120     return true;
1121     }
1122    
1123 jsr166 1.78 /**
1124 jsr166 1.156 * A debugging tool to print stack traces of most threads, as jstack does.
1125 jsr166 1.150 * Uninteresting threads are filtered out.
1126 jsr166 1.95 */
1127 jsr166 1.156 static void dumpTestThreads() {
1128 jsr166 1.195 SecurityManager sm = System.getSecurityManager();
1129     if (sm != null) {
1130     try {
1131     System.setSecurityManager(null);
1132     } catch (SecurityException giveUp) {
1133     return;
1134     }
1135     }
1136    
1137 jsr166 1.150 System.err.println("------ stacktrace dump start ------");
1138 jsr166 1.268 for (ThreadInfo info : THREAD_MXBEAN.dumpAllThreads(true, true))
1139 jsr166 1.266 if (threadOfInterest(info))
1140     System.err.print(info);
1141 jsr166 1.150 System.err.println("------ stacktrace dump end ------");
1142 jsr166 1.195
1143     if (sm != null) System.setSecurityManager(sm);
1144 jsr166 1.95 }
1145    
1146     /**
1147 jsr166 1.224 * Checks that thread eventually enters the expected blocked thread state.
1148     */
1149     void assertThreadBlocks(Thread thread, Thread.State expected) {
1150 jsr166 1.228 // always sleep at least 1 ms, with high probability avoiding
1151     // transitory states
1152 jsr166 1.225 for (long retries = LONG_DELAY_MS * 3 / 4; retries-->0; ) {
1153 jsr166 1.224 try { delay(1); }
1154     catch (InterruptedException fail) {
1155 jsr166 1.240 throw new AssertionError("Unexpected InterruptedException", fail);
1156 jsr166 1.224 }
1157     Thread.State s = thread.getState();
1158     if (s == expected)
1159     return;
1160     else if (s == Thread.State.TERMINATED)
1161     fail("Unexpected thread termination");
1162     }
1163     fail("timed out waiting for thread to enter thread state " + expected);
1164     }
1165    
1166     /**
1167 jsr166 1.268 * Returns the thread's blocker's class name, if any, else null.
1168     */
1169     String blockerClassName(Thread thread) {
1170     ThreadInfo threadInfo; LockInfo lockInfo;
1171     if ((threadInfo = THREAD_MXBEAN.getThreadInfo(thread.getId(), 0)) != null
1172     && (lockInfo = threadInfo.getLockInfo()) != null)
1173     return lockInfo.getClassName();
1174     return null;
1175     }
1176    
1177     /**
1178 jsr166 1.83 * Checks that future.get times out, with the default timeout of
1179     * {@code timeoutMillis()}.
1180     */
1181     void assertFutureTimesOut(Future future) {
1182     assertFutureTimesOut(future, timeoutMillis());
1183     }
1184    
1185     /**
1186     * Checks that future.get times out, with the given millisecond timeout.
1187     */
1188     void assertFutureTimesOut(Future future, long timeoutMillis) {
1189     long startTime = System.nanoTime();
1190     try {
1191     future.get(timeoutMillis, MILLISECONDS);
1192     shouldThrow();
1193     } catch (TimeoutException success) {
1194 jsr166 1.128 } catch (Exception fail) {
1195     threadUnexpectedException(fail);
1196 jsr166 1.83 } finally { future.cancel(true); }
1197     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1198     }
1199    
1200     /**
1201 jsr166 1.53 * Fails with message "should throw exception".
1202 jsr166 1.27 */
1203 dl 1.3 public void shouldThrow() {
1204     fail("Should throw exception");
1205     }
1206    
1207 dl 1.5 /**
1208 jsr166 1.53 * Fails with message "should throw " + exceptionName.
1209 jsr166 1.40 */
1210     public void shouldThrow(String exceptionName) {
1211     fail("Should throw " + exceptionName);
1212     }
1213    
1214     /**
1215 jsr166 1.222 * The maximum number of consecutive spurious wakeups we should
1216     * tolerate (from APIs like LockSupport.park) before failing a test.
1217     */
1218     static final int MAX_SPURIOUS_WAKEUPS = 10;
1219    
1220     /**
1221 dl 1.1 * The number of elements to place in collections, arrays, etc.
1222     */
1223 jsr166 1.45 public static final int SIZE = 20;
1224 dl 1.1
1225     // Some convenient Integer constants
1226    
1227 jsr166 1.47 public static final Integer zero = new Integer(0);
1228     public static final Integer one = new Integer(1);
1229     public static final Integer two = new Integer(2);
1230     public static final Integer three = new Integer(3);
1231 jsr166 1.45 public static final Integer four = new Integer(4);
1232     public static final Integer five = new Integer(5);
1233 jsr166 1.47 public static final Integer six = new Integer(6);
1234 jsr166 1.45 public static final Integer seven = new Integer(7);
1235     public static final Integer eight = new Integer(8);
1236 jsr166 1.47 public static final Integer nine = new Integer(9);
1237 jsr166 1.45 public static final Integer m1 = new Integer(-1);
1238     public static final Integer m2 = new Integer(-2);
1239     public static final Integer m3 = new Integer(-3);
1240 jsr166 1.47 public static final Integer m4 = new Integer(-4);
1241     public static final Integer m5 = new Integer(-5);
1242     public static final Integer m6 = new Integer(-6);
1243 jsr166 1.45 public static final Integer m10 = new Integer(-10);
1244 dl 1.7
1245     /**
1246 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
1247     * the specified permissions. If there is no current security
1248     * manager, the runnable is run twice, both with and without a
1249     * security manager. We require that any security manager permit
1250     * getPolicy/setPolicy.
1251     */
1252     public void runWithPermissions(Runnable r, Permission... permissions) {
1253     SecurityManager sm = System.getSecurityManager();
1254     if (sm == null) {
1255     r.run();
1256 jsr166 1.93 }
1257     runWithSecurityManagerWithPermissions(r, permissions);
1258     }
1259    
1260     /**
1261     * Runs Runnable r with a security policy that permits precisely
1262     * the specified permissions. If there is no current security
1263     * manager, a temporary one is set for the duration of the
1264     * Runnable. We require that any security manager permit
1265     * getPolicy/setPolicy.
1266     */
1267     public void runWithSecurityManagerWithPermissions(Runnable r,
1268     Permission... permissions) {
1269     SecurityManager sm = System.getSecurityManager();
1270     if (sm == null) {
1271 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
1272     try {
1273     Policy.setPolicy(permissivePolicy());
1274     System.setSecurityManager(new SecurityManager());
1275 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
1276 jsr166 1.49 } finally {
1277     System.setSecurityManager(null);
1278     Policy.setPolicy(savedPolicy);
1279     }
1280     } else {
1281     Policy savedPolicy = Policy.getPolicy();
1282     AdjustablePolicy policy = new AdjustablePolicy(permissions);
1283     Policy.setPolicy(policy);
1284    
1285     try {
1286     r.run();
1287     } finally {
1288     policy.addPermission(new SecurityPermission("setPolicy"));
1289     Policy.setPolicy(savedPolicy);
1290     }
1291     }
1292     }
1293    
1294     /**
1295     * Runs a runnable without any permissions.
1296     */
1297     public void runWithoutPermissions(Runnable r) {
1298     runWithPermissions(r);
1299     }
1300    
1301     /**
1302 dl 1.7 * A security policy where new permissions can be dynamically added
1303     * or all cleared.
1304     */
1305 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1306 dl 1.7 Permissions perms = new Permissions();
1307 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1308     for (Permission permission : permissions)
1309     perms.add(permission);
1310     }
1311 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1312     void clearPermissions() { perms = new Permissions(); }
1313 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1314     return perms;
1315     }
1316     public PermissionCollection getPermissions(ProtectionDomain pd) {
1317     return perms;
1318     }
1319     public boolean implies(ProtectionDomain pd, Permission p) {
1320     return perms.implies(p);
1321     }
1322     public void refresh() {}
1323 jsr166 1.93 public String toString() {
1324 jsr166 1.216 List<Permission> ps = new ArrayList<>();
1325 jsr166 1.93 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1326     ps.add(e.nextElement());
1327     return "AdjustablePolicy with permissions " + ps;
1328     }
1329 dl 1.7 }
1330 dl 1.1
1331 jsr166 1.38 /**
1332 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1333     */
1334     public static Policy permissivePolicy() {
1335     return new AdjustablePolicy
1336     // Permissions j.u.c. needs directly
1337     (new RuntimePermission("modifyThread"),
1338     new RuntimePermission("getClassLoader"),
1339     new RuntimePermission("setContextClassLoader"),
1340     // Permissions needed to change permissions!
1341     new SecurityPermission("getPolicy"),
1342     new SecurityPermission("setPolicy"),
1343     new RuntimePermission("setSecurityManager"),
1344     // Permissions needed by the junit test harness
1345     new RuntimePermission("accessDeclaredMembers"),
1346     new PropertyPermission("*", "read"),
1347     new java.io.FilePermission("<<ALL FILES>>", "read"));
1348     }
1349    
1350     /**
1351 jsr166 1.60 * Sleeps until the given time has elapsed.
1352 jsr166 1.239 * Throws AssertionError if interrupted.
1353 jsr166 1.60 */
1354 jsr166 1.201 static void sleep(long millis) {
1355 jsr166 1.60 try {
1356 dl 1.76 delay(millis);
1357 jsr166 1.128 } catch (InterruptedException fail) {
1358 jsr166 1.239 throw new AssertionError("Unexpected InterruptedException", fail);
1359 jsr166 1.60 }
1360     }
1361    
1362     /**
1363 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1364 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1365 jsr166 1.248 * @param waitingForGodot if non-null, an additional condition to satisfy
1366 jsr166 1.65 */
1367 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis,
1368     Callable<Boolean> waitingForGodot) {
1369     for (long startTime = 0L;;) {
1370     switch (thread.getState()) {
1371 jsr166 1.250 default: break;
1372 jsr166 1.248 case BLOCKED: case WAITING: case TIMED_WAITING:
1373     try {
1374     if (waitingForGodot == null || waitingForGodot.call())
1375     return;
1376     } catch (Throwable fail) { threadUnexpectedException(fail); }
1377     break;
1378     case TERMINATED:
1379 jsr166 1.67 fail("Unexpected thread termination");
1380 jsr166 1.248 }
1381    
1382     if (startTime == 0L)
1383 jsr166 1.199 startTime = System.nanoTime();
1384 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1385 jsr166 1.248 assertTrue(thread.isAlive());
1386     if (waitingForGodot == null
1387     || thread.getState() == Thread.State.RUNNABLE)
1388     fail("timed out waiting for thread to enter wait state");
1389     else
1390     fail("timed out waiting for condition, thread state="
1391     + thread.getState());
1392 jsr166 1.67 }
1393 jsr166 1.65 Thread.yield();
1394     }
1395     }
1396    
1397     /**
1398 jsr166 1.219 * Spin-waits up to the specified number of milliseconds for the given
1399 jsr166 1.248 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1400 jsr166 1.219 */
1401 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1402     waitForThreadToEnterWaitState(thread, timeoutMillis, null);
1403 jsr166 1.219 }
1404    
1405     /**
1406     * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1407     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1408 jsr166 1.75 */
1409     void waitForThreadToEnterWaitState(Thread thread) {
1410 jsr166 1.248 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, null);
1411 jsr166 1.75 }
1412    
1413     /**
1414 jsr166 1.219 * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1415     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
1416     * and additionally satisfy the given condition.
1417     */
1418 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread,
1419     Callable<Boolean> waitingForGodot) {
1420 jsr166 1.219 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, waitingForGodot);
1421     }
1422    
1423     /**
1424 jsr166 1.257 * Spin-waits up to LONG_DELAY_MS milliseconds for the current thread to
1425     * be interrupted. Clears the interrupt status before returning.
1426     */
1427     void awaitInterrupted() {
1428     for (long startTime = 0L; !Thread.interrupted(); ) {
1429     if (startTime == 0L)
1430     startTime = System.nanoTime();
1431     else if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1432     fail("timed out waiting for thread interrupt");
1433     Thread.yield();
1434     }
1435     }
1436    
1437     /**
1438 jsr166 1.66 * Returns the number of milliseconds since time given by
1439     * startNanoTime, which must have been previously returned from a
1440 jsr166 1.124 * call to {@link System#nanoTime()}.
1441 jsr166 1.66 */
1442 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1443 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1444     }
1445 jsr166 1.68
1446 jsr166 1.120 /**
1447     * Checks that timed f.get() returns the expected value, and does not
1448     * wait for the timeout to elapse before returning.
1449     */
1450     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1451     long startTime = System.nanoTime();
1452 jsr166 1.245 T actual = null;
1453 jsr166 1.120 try {
1454 jsr166 1.245 actual = f.get(timeoutMillis, MILLISECONDS);
1455 jsr166 1.120 } catch (Throwable fail) { threadUnexpectedException(fail); }
1456 jsr166 1.245 assertEquals(expectedValue, actual);
1457 jsr166 1.120 if (millisElapsedSince(startTime) > timeoutMillis/2)
1458 jsr166 1.239 throw new AssertionError("timed get did not return promptly");
1459 jsr166 1.120 }
1460    
1461     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1462     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1463     }
1464    
1465 jsr166 1.66 /**
1466 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1467 jsr166 1.38 */
1468     Thread newStartedThread(Runnable runnable) {
1469     Thread t = new Thread(runnable);
1470 jsr166 1.58 t.setDaemon(true);
1471 jsr166 1.38 t.start();
1472     return t;
1473     }
1474 dl 1.1
1475 jsr166 1.59 /**
1476 jsr166 1.268 * Returns a new started daemon Thread running the given action,
1477     * wrapped in a CheckedRunnable.
1478     */
1479     Thread newStartedThread(Action action) {
1480     return newStartedThread(checkedRunnable(action));
1481     }
1482    
1483     /**
1484 jsr166 1.59 * Waits for the specified time (in milliseconds) for the thread
1485     * to terminate (using {@link Thread#join(long)}), else interrupts
1486     * the thread (in the hope that it may terminate later) and fails.
1487     */
1488 jsr166 1.261 void awaitTermination(Thread thread, long timeoutMillis) {
1489 jsr166 1.59 try {
1490 jsr166 1.261 thread.join(timeoutMillis);
1491 jsr166 1.128 } catch (InterruptedException fail) {
1492     threadUnexpectedException(fail);
1493 jsr166 1.258 }
1494 jsr166 1.261 if (thread.getState() != Thread.State.TERMINATED) {
1495     String detail = String.format(
1496     "timed out waiting for thread to terminate, thread=%s, state=%s" ,
1497     thread, thread.getState());
1498     try {
1499     threadFail(detail);
1500     } finally {
1501 jsr166 1.262 // Interrupt thread __after__ having reported its stack trace
1502 jsr166 1.261 thread.interrupt();
1503     }
1504 jsr166 1.59 }
1505     }
1506    
1507 jsr166 1.75 /**
1508     * Waits for LONG_DELAY_MS milliseconds for the thread to
1509     * terminate (using {@link Thread#join(long)}), else interrupts
1510     * the thread (in the hope that it may terminate later) and fails.
1511     */
1512     void awaitTermination(Thread t) {
1513     awaitTermination(t, LONG_DELAY_MS);
1514     }
1515    
1516 dl 1.1 // Some convenient Runnable classes
1517    
1518 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1519     protected abstract void realRun() throws Throwable;
1520 jsr166 1.35
1521     public final void run() {
1522     try {
1523     realRun();
1524 jsr166 1.128 } catch (Throwable fail) {
1525     threadUnexpectedException(fail);
1526 jsr166 1.35 }
1527     }
1528     }
1529    
1530 jsr166 1.268 Runnable checkedRunnable(Action action) {
1531     return new CheckedRunnable() {
1532     public void realRun() throws Throwable {
1533     action.run();
1534     }};
1535     }
1536    
1537 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1538     protected abstract void realRun() throws Throwable;
1539 jsr166 1.40
1540     final Class<?> exceptionClass;
1541    
1542     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1543     this.exceptionClass = exceptionClass;
1544     }
1545    
1546     public final void run() {
1547     try {
1548     realRun();
1549     } catch (Throwable t) {
1550     if (! exceptionClass.isInstance(t))
1551     threadUnexpectedException(t);
1552 jsr166 1.248 return;
1553 jsr166 1.40 }
1554 jsr166 1.248 threadShouldThrow(exceptionClass.getSimpleName());
1555 jsr166 1.40 }
1556     }
1557    
1558 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1559     protected abstract void realRun() throws Throwable;
1560 jsr166 1.35
1561     public final void run() {
1562     try {
1563     realRun();
1564     } catch (InterruptedException success) {
1565 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1566 jsr166 1.248 return;
1567 jsr166 1.128 } catch (Throwable fail) {
1568     threadUnexpectedException(fail);
1569 jsr166 1.35 }
1570 jsr166 1.248 threadShouldThrow("InterruptedException");
1571 jsr166 1.35 }
1572     }
1573    
1574 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1575     protected abstract T realCall() throws Throwable;
1576 jsr166 1.35
1577     public final T call() {
1578     try {
1579     return realCall();
1580 jsr166 1.128 } catch (Throwable fail) {
1581     threadUnexpectedException(fail);
1582 jsr166 1.40 }
1583 jsr166 1.248 throw new AssertionError("unreached");
1584 jsr166 1.35 }
1585     }
1586    
1587 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1588 dl 1.1 public void run() {}
1589     }
1590    
1591 jsr166 1.45 public static class NoOpCallable implements Callable {
1592 dl 1.1 public Object call() { return Boolean.TRUE; }
1593 dl 1.10 }
1594    
1595 jsr166 1.45 public static final String TEST_STRING = "a test string";
1596 dl 1.10
1597 jsr166 1.45 public static class StringTask implements Callable<String> {
1598 jsr166 1.144 final String value;
1599     public StringTask() { this(TEST_STRING); }
1600     public StringTask(String value) { this.value = value; }
1601     public String call() { return value; }
1602 dl 1.10 }
1603    
1604 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1605     return new CheckedCallable<String>() {
1606 jsr166 1.64 protected String realCall() {
1607 jsr166 1.48 try {
1608     latch.await();
1609     } catch (InterruptedException quittingTime) {}
1610     return TEST_STRING;
1611     }};
1612     }
1613    
1614 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1615     return new CheckedRunnable() {
1616     public void realRun() throws InterruptedException {
1617     latch.countDown();
1618     }};
1619     }
1620    
1621 jsr166 1.161 class LatchAwaiter extends CheckedRunnable {
1622 jsr166 1.162 static final int NEW = 0;
1623     static final int RUNNING = 1;
1624     static final int DONE = 2;
1625 jsr166 1.161 final CountDownLatch latch;
1626     int state = NEW;
1627     LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1628     public void realRun() throws InterruptedException {
1629     state = 1;
1630     await(latch);
1631     state = 2;
1632     }
1633     }
1634 jsr166 1.162
1635 jsr166 1.161 public LatchAwaiter awaiter(CountDownLatch latch) {
1636     return new LatchAwaiter(latch);
1637 jsr166 1.73 }
1638    
1639 jsr166 1.188 public void await(CountDownLatch latch, long timeoutMillis) {
1640 jsr166 1.246 boolean timedOut = false;
1641 jsr166 1.79 try {
1642 jsr166 1.246 timedOut = !latch.await(timeoutMillis, MILLISECONDS);
1643 jsr166 1.128 } catch (Throwable fail) {
1644     threadUnexpectedException(fail);
1645 jsr166 1.79 }
1646 jsr166 1.246 if (timedOut)
1647     fail("timed out waiting for CountDownLatch for "
1648     + (timeoutMillis/1000) + " sec");
1649 jsr166 1.79 }
1650    
1651 jsr166 1.188 public void await(CountDownLatch latch) {
1652     await(latch, LONG_DELAY_MS);
1653     }
1654    
1655 jsr166 1.89 public void await(Semaphore semaphore) {
1656 jsr166 1.246 boolean timedOut = false;
1657 jsr166 1.89 try {
1658 jsr166 1.246 timedOut = !semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS);
1659 jsr166 1.128 } catch (Throwable fail) {
1660     threadUnexpectedException(fail);
1661 jsr166 1.89 }
1662 jsr166 1.246 if (timedOut)
1663     fail("timed out waiting for Semaphore for "
1664     + (LONG_DELAY_MS/1000) + " sec");
1665 jsr166 1.89 }
1666    
1667 jsr166 1.226 public void await(CyclicBarrier barrier) {
1668     try {
1669     barrier.await(LONG_DELAY_MS, MILLISECONDS);
1670     } catch (Throwable fail) {
1671     threadUnexpectedException(fail);
1672     }
1673     }
1674    
1675 jsr166 1.81 // /**
1676     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1677     // */
1678     // public void await(AtomicBoolean flag) {
1679     // await(flag, LONG_DELAY_MS);
1680     // }
1681    
1682     // /**
1683     // * Spin-waits up to the specified timeout until flag becomes true.
1684     // */
1685     // public void await(AtomicBoolean flag, long timeoutMillis) {
1686     // long startTime = System.nanoTime();
1687     // while (!flag.get()) {
1688     // if (millisElapsedSince(startTime) > timeoutMillis)
1689 jsr166 1.239 // throw new AssertionError("timed out");
1690 jsr166 1.81 // Thread.yield();
1691     // }
1692     // }
1693    
1694 jsr166 1.45 public static class NPETask implements Callable<String> {
1695 dl 1.10 public String call() { throw new NullPointerException(); }
1696     }
1697    
1698 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1699     return new CheckedRunnable() {
1700     protected void realRun() {
1701     try {
1702 dl 1.76 delay(timeoutMillis);
1703 jsr166 1.63 } catch (InterruptedException ok) {}
1704     }};
1705     }
1706    
1707 dl 1.5 /**
1708     * For use as ThreadFactory in constructors
1709     */
1710 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1711 jsr166 1.33 public Thread newThread(Runnable r) {
1712 dl 1.5 return new Thread(r);
1713 jsr166 1.27 }
1714 dl 1.5 }
1715    
1716 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1717     boolean isDone();
1718     }
1719    
1720 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1721     public volatile boolean done = false;
1722 dl 1.6 public void run() {
1723     done = true;
1724 dl 1.5 }
1725     }
1726    
1727 jsr166 1.53 /**
1728     * Analog of CheckedRunnable for RecursiveAction
1729     */
1730     public abstract class CheckedRecursiveAction extends RecursiveAction {
1731     protected abstract void realCompute() throws Throwable;
1732    
1733 jsr166 1.108 @Override protected final void compute() {
1734 jsr166 1.53 try {
1735     realCompute();
1736 jsr166 1.128 } catch (Throwable fail) {
1737     threadUnexpectedException(fail);
1738 jsr166 1.53 }
1739     }
1740     }
1741    
1742     /**
1743     * Analog of CheckedCallable for RecursiveTask
1744     */
1745     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1746     protected abstract T realCompute() throws Throwable;
1747    
1748 jsr166 1.108 @Override protected final T compute() {
1749 jsr166 1.53 try {
1750     return realCompute();
1751 jsr166 1.128 } catch (Throwable fail) {
1752     threadUnexpectedException(fail);
1753 jsr166 1.53 }
1754 jsr166 1.248 throw new AssertionError("unreached");
1755 jsr166 1.53 }
1756     }
1757 dl 1.5
1758     /**
1759     * For use as RejectedExecutionHandler in constructors
1760     */
1761 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1762 jsr166 1.35 public void rejectedExecution(Runnable r,
1763     ThreadPoolExecutor executor) {}
1764 dl 1.5 }
1765 jsr166 1.27
1766 jsr166 1.60 /**
1767 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1768 jsr166 1.239 * AssertionErrors instead of throwing checked exceptions.
1769 jsr166 1.60 */
1770 jsr166 1.202 public static class CheckedBarrier extends CyclicBarrier {
1771 jsr166 1.60 public CheckedBarrier(int parties) { super(parties); }
1772    
1773     public int await() {
1774     try {
1775 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1776 jsr166 1.128 } catch (TimeoutException timedOut) {
1777 jsr166 1.239 throw new AssertionError("timed out");
1778 jsr166 1.128 } catch (Exception fail) {
1779 jsr166 1.239 throw new AssertionError("Unexpected exception: " + fail, fail);
1780 jsr166 1.60 }
1781     }
1782     }
1783    
1784 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1785 jsr166 1.72 try {
1786     assertTrue(q.isEmpty());
1787     assertEquals(0, q.size());
1788     assertNull(q.peek());
1789     assertNull(q.poll());
1790 jsr166 1.232 assertNull(q.poll(randomExpiredTimeout(), randomTimeUnit()));
1791 jsr166 1.72 assertEquals(q.toString(), "[]");
1792     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1793     assertFalse(q.iterator().hasNext());
1794     try {
1795     q.element();
1796     shouldThrow();
1797     } catch (NoSuchElementException success) {}
1798     try {
1799     q.iterator().next();
1800     shouldThrow();
1801     } catch (NoSuchElementException success) {}
1802     try {
1803     q.remove();
1804     shouldThrow();
1805     } catch (NoSuchElementException success) {}
1806 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1807 jsr166 1.72 }
1808    
1809 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1810     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1811     }
1812    
1813     void assertNotSerialEquals(Object x, Object y) {
1814     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1815     }
1816    
1817     byte[] serialBytes(Object o) {
1818 jsr166 1.79 try {
1819     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1820     ObjectOutputStream oos = new ObjectOutputStream(bos);
1821     oos.writeObject(o);
1822     oos.flush();
1823     oos.close();
1824 jsr166 1.91 return bos.toByteArray();
1825 jsr166 1.128 } catch (Throwable fail) {
1826     threadUnexpectedException(fail);
1827 jsr166 1.91 return new byte[0];
1828     }
1829     }
1830    
1831 jsr166 1.253 void assertImmutable(Object o) {
1832 jsr166 1.208 if (o instanceof Collection) {
1833     assertThrows(
1834     UnsupportedOperationException.class,
1835 jsr166 1.253 () -> ((Collection) o).add(null));
1836 jsr166 1.208 }
1837     }
1838 jsr166 1.209
1839 jsr166 1.91 @SuppressWarnings("unchecked")
1840     <T> T serialClone(T o) {
1841 jsr166 1.247 T clone = null;
1842 jsr166 1.91 try {
1843 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1844 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1845 jsr166 1.247 clone = (T) ois.readObject();
1846 jsr166 1.128 } catch (Throwable fail) {
1847     threadUnexpectedException(fail);
1848 jsr166 1.79 }
1849 jsr166 1.247 if (o == clone) assertImmutable(o);
1850     else assertSame(o.getClass(), clone.getClass());
1851     return clone;
1852 jsr166 1.79 }
1853 jsr166 1.106
1854 jsr166 1.208 /**
1855 jsr166 1.211 * A version of serialClone that leaves error handling (for
1856     * e.g. NotSerializableException) up to the caller.
1857     */
1858     @SuppressWarnings("unchecked")
1859     <T> T serialClonePossiblyFailing(T o)
1860     throws ReflectiveOperationException, java.io.IOException {
1861     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1862     ObjectOutputStream oos = new ObjectOutputStream(bos);
1863     oos.writeObject(o);
1864     oos.flush();
1865     oos.close();
1866     ObjectInputStream ois = new ObjectInputStream
1867     (new ByteArrayInputStream(bos.toByteArray()));
1868     T clone = (T) ois.readObject();
1869     if (o == clone) assertImmutable(o);
1870 jsr166 1.247 else assertSame(o.getClass(), clone.getClass());
1871 jsr166 1.211 return clone;
1872     }
1873    
1874     /**
1875 jsr166 1.208 * If o implements Cloneable and has a public clone method,
1876     * returns a clone of o, else null.
1877     */
1878     @SuppressWarnings("unchecked")
1879     <T> T cloneableClone(T o) {
1880     if (!(o instanceof Cloneable)) return null;
1881     final T clone;
1882     try {
1883     clone = (T) o.getClass().getMethod("clone").invoke(o);
1884     } catch (NoSuchMethodException ok) {
1885     return null;
1886     } catch (ReflectiveOperationException unexpected) {
1887     throw new Error(unexpected);
1888     }
1889     assertNotSame(o, clone); // not 100% guaranteed by spec
1890     assertSame(o.getClass(), clone.getClass());
1891     return clone;
1892     }
1893    
1894 jsr166 1.106 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1895 jsr166 1.253 Action... throwingActions) {
1896     for (Action throwingAction : throwingActions) {
1897 jsr166 1.106 boolean threw = false;
1898     try { throwingAction.run(); }
1899     catch (Throwable t) {
1900     threw = true;
1901 jsr166 1.239 if (!expectedExceptionClass.isInstance(t))
1902     throw new AssertionError(
1903     "Expected " + expectedExceptionClass.getName() +
1904     ", got " + t.getClass().getName(),
1905     t);
1906 jsr166 1.106 }
1907     if (!threw)
1908     shouldThrow(expectedExceptionClass.getName());
1909     }
1910     }
1911 jsr166 1.126
1912     public void assertIteratorExhausted(Iterator<?> it) {
1913     try {
1914     it.next();
1915     shouldThrow();
1916     } catch (NoSuchElementException success) {}
1917     assertFalse(it.hasNext());
1918 jsr166 1.127 }
1919 jsr166 1.191
1920     public <T> Callable<T> callableThrowing(final Exception ex) {
1921     return new Callable<T>() { public T call() throws Exception { throw ex; }};
1922     }
1923    
1924     public Runnable runnableThrowing(final RuntimeException ex) {
1925     return new Runnable() { public void run() { throw ex; }};
1926     }
1927 jsr166 1.193
1928     /** A reusable thread pool to be shared by tests. */
1929     static final ExecutorService cachedThreadPool =
1930     new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1931     1000L, MILLISECONDS,
1932     new SynchronousQueue<Runnable>());
1933    
1934 jsr166 1.234 static <T> void shuffle(T[] array) {
1935     Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1936     }
1937    
1938 jsr166 1.236 /**
1939     * Returns the same String as would be returned by {@link
1940     * Object#toString}, whether or not the given object's class
1941     * overrides toString().
1942     *
1943     * @see System#identityHashCode
1944     */
1945     static String identityString(Object x) {
1946     return x.getClass().getName()
1947     + "@" + Integer.toHexString(System.identityHashCode(x));
1948     }
1949    
1950 jsr166 1.234 // --- Shared assertions for Executor tests ---
1951    
1952 jsr166 1.233 /**
1953     * Returns maximum number of tasks that can be submitted to given
1954     * pool (with bounded queue) before saturation (when submission
1955     * throws RejectedExecutionException).
1956     */
1957     static final int saturatedSize(ThreadPoolExecutor pool) {
1958     BlockingQueue<Runnable> q = pool.getQueue();
1959     return pool.getMaximumPoolSize() + q.size() + q.remainingCapacity();
1960     }
1961    
1962 jsr166 1.234 @SuppressWarnings("FutureReturnValueIgnored")
1963     void assertNullTaskSubmissionThrowsNullPointerException(Executor e) {
1964     try {
1965     e.execute((Runnable) null);
1966     shouldThrow();
1967     } catch (NullPointerException success) {}
1968    
1969     if (! (e instanceof ExecutorService)) return;
1970     ExecutorService es = (ExecutorService) e;
1971     try {
1972     es.submit((Runnable) null);
1973     shouldThrow();
1974     } catch (NullPointerException success) {}
1975     try {
1976     es.submit((Runnable) null, Boolean.TRUE);
1977     shouldThrow();
1978     } catch (NullPointerException success) {}
1979     try {
1980     es.submit((Callable) null);
1981     shouldThrow();
1982     } catch (NullPointerException success) {}
1983    
1984     if (! (e instanceof ScheduledExecutorService)) return;
1985     ScheduledExecutorService ses = (ScheduledExecutorService) e;
1986     try {
1987     ses.schedule((Runnable) null,
1988     randomTimeout(), randomTimeUnit());
1989     shouldThrow();
1990     } catch (NullPointerException success) {}
1991     try {
1992     ses.schedule((Callable) null,
1993     randomTimeout(), randomTimeUnit());
1994     shouldThrow();
1995     } catch (NullPointerException success) {}
1996     try {
1997     ses.scheduleAtFixedRate((Runnable) null,
1998     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1999     shouldThrow();
2000     } catch (NullPointerException success) {}
2001     try {
2002     ses.scheduleWithFixedDelay((Runnable) null,
2003     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2004     shouldThrow();
2005     } catch (NullPointerException success) {}
2006     }
2007    
2008     void setRejectedExecutionHandler(
2009     ThreadPoolExecutor p, RejectedExecutionHandler handler) {
2010     p.setRejectedExecutionHandler(handler);
2011     assertSame(handler, p.getRejectedExecutionHandler());
2012     }
2013    
2014     void assertTaskSubmissionsAreRejected(ThreadPoolExecutor p) {
2015     final RejectedExecutionHandler savedHandler = p.getRejectedExecutionHandler();
2016     final long savedTaskCount = p.getTaskCount();
2017     final long savedCompletedTaskCount = p.getCompletedTaskCount();
2018     final int savedQueueSize = p.getQueue().size();
2019     final boolean stock = (p.getClass().getClassLoader() == null);
2020    
2021     Runnable r = () -> {};
2022     Callable<Boolean> c = () -> Boolean.TRUE;
2023    
2024     class Recorder implements RejectedExecutionHandler {
2025     public volatile Runnable r = null;
2026     public volatile ThreadPoolExecutor p = null;
2027     public void reset() { r = null; p = null; }
2028     public void rejectedExecution(Runnable r, ThreadPoolExecutor p) {
2029     assertNull(this.r);
2030     assertNull(this.p);
2031     this.r = r;
2032     this.p = p;
2033     }
2034     }
2035    
2036     // check custom handler is invoked exactly once per task
2037     Recorder recorder = new Recorder();
2038     setRejectedExecutionHandler(p, recorder);
2039     for (int i = 2; i--> 0; ) {
2040     recorder.reset();
2041     p.execute(r);
2042     if (stock && p.getClass() == ThreadPoolExecutor.class)
2043     assertSame(r, recorder.r);
2044     assertSame(p, recorder.p);
2045    
2046     recorder.reset();
2047     assertFalse(p.submit(r).isDone());
2048     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2049     assertSame(p, recorder.p);
2050    
2051     recorder.reset();
2052     assertFalse(p.submit(r, Boolean.TRUE).isDone());
2053     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2054     assertSame(p, recorder.p);
2055    
2056     recorder.reset();
2057     assertFalse(p.submit(c).isDone());
2058     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2059     assertSame(p, recorder.p);
2060    
2061     if (p instanceof ScheduledExecutorService) {
2062     ScheduledExecutorService s = (ScheduledExecutorService) p;
2063     ScheduledFuture<?> future;
2064    
2065     recorder.reset();
2066     future = s.schedule(r, randomTimeout(), randomTimeUnit());
2067     assertFalse(future.isDone());
2068     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2069     assertSame(p, recorder.p);
2070    
2071     recorder.reset();
2072     future = s.schedule(c, randomTimeout(), randomTimeUnit());
2073     assertFalse(future.isDone());
2074     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2075     assertSame(p, recorder.p);
2076    
2077     recorder.reset();
2078     future = s.scheduleAtFixedRate(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2079     assertFalse(future.isDone());
2080     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2081     assertSame(p, recorder.p);
2082    
2083     recorder.reset();
2084     future = s.scheduleWithFixedDelay(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2085     assertFalse(future.isDone());
2086     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2087     assertSame(p, recorder.p);
2088     }
2089     }
2090    
2091     // Checking our custom handler above should be sufficient, but
2092     // we add some integration tests of standard handlers.
2093     final AtomicReference<Thread> thread = new AtomicReference<>();
2094     final Runnable setThread = () -> thread.set(Thread.currentThread());
2095    
2096     setRejectedExecutionHandler(p, new ThreadPoolExecutor.AbortPolicy());
2097     try {
2098     p.execute(setThread);
2099     shouldThrow();
2100     } catch (RejectedExecutionException success) {}
2101     assertNull(thread.get());
2102    
2103     setRejectedExecutionHandler(p, new ThreadPoolExecutor.DiscardPolicy());
2104     p.execute(setThread);
2105     assertNull(thread.get());
2106    
2107     setRejectedExecutionHandler(p, new ThreadPoolExecutor.CallerRunsPolicy());
2108     p.execute(setThread);
2109     if (p.isShutdown())
2110     assertNull(thread.get());
2111     else
2112     assertSame(Thread.currentThread(), thread.get());
2113    
2114     setRejectedExecutionHandler(p, savedHandler);
2115    
2116     // check that pool was not perturbed by handlers
2117     assertEquals(savedTaskCount, p.getTaskCount());
2118     assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
2119     assertEquals(savedQueueSize, p.getQueue().size());
2120 jsr166 1.200 }
2121 jsr166 1.243
2122     void assertCollectionsEquals(Collection<?> x, Collection<?> y) {
2123     assertEquals(x, y);
2124     assertEquals(y, x);
2125     assertEquals(x.isEmpty(), y.isEmpty());
2126     assertEquals(x.size(), y.size());
2127     if (x instanceof List) {
2128     assertEquals(x.toString(), y.toString());
2129     }
2130     if (x instanceof List || x instanceof Set) {
2131     assertEquals(x.hashCode(), y.hashCode());
2132     }
2133     if (x instanceof List || x instanceof Deque) {
2134     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2135     assertTrue(Arrays.equals(x.toArray(new Object[0]),
2136     y.toArray(new Object[0])));
2137     }
2138     }
2139    
2140     /**
2141     * A weaker form of assertCollectionsEquals which does not insist
2142     * that the two collections satisfy Object#equals(Object), since
2143     * they may use identity semantics as Deques do.
2144     */
2145     void assertCollectionsEquivalent(Collection<?> x, Collection<?> y) {
2146     if (x instanceof List || x instanceof Set)
2147     assertCollectionsEquals(x, y);
2148     else {
2149     assertEquals(x.isEmpty(), y.isEmpty());
2150     assertEquals(x.size(), y.size());
2151     assertEquals(new HashSet(x), new HashSet(y));
2152     if (x instanceof Deque) {
2153     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2154     assertTrue(Arrays.equals(x.toArray(new Object[0]),
2155     y.toArray(new Object[0])));
2156     }
2157     }
2158     }
2159 dl 1.1 }