ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.271
Committed: Sat Feb 1 18:52:17 2020 UTC (4 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.270: +2 -1 lines
Log Message:
testTimedCallable: make test independent of cancel(true) interrupt behavior

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 jsr166 1.270 <T> T chooseRandomly(List<T> choices) {
708     return choices.get(ThreadLocalRandom.current().nextInt(choices.size()));
709     }
710    
711     /**
712     * Returns a random element from given choices.
713     */
714 jsr166 1.257 <T> T chooseRandomly(T... choices) {
715     return choices[ThreadLocalRandom.current().nextInt(choices.length)];
716     }
717    
718     /**
719 jsr166 1.181 * Returns the shortest timed delay. This can be scaled up for
720 jsr166 1.185 * slow machines using the jsr166.delay.factor system property,
721 jsr166 1.187 * or via jtreg's -timeoutFactor: flag.
722 jsr166 1.185 * http://openjdk.java.net/jtreg/command-help.html
723 jsr166 1.27 */
724 dl 1.2 protected long getShortDelay() {
725 jsr166 1.189 return (long) (50 * delayFactor);
726 dl 1.2 }
727    
728     /**
729 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
730 dl 1.2 */
731 jsr166 1.43 protected void setDelays() {
732 dl 1.2 SHORT_DELAY_MS = getShortDelay();
733 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
734 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
735 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
736 jsr166 1.261 LONGER_DELAY_MS = 2 * LONG_DELAY_MS;
737 dl 1.2 }
738    
739 jsr166 1.223 private static final long TIMEOUT_DELAY_MS
740     = (long) (12.0 * Math.cbrt(delayFactor));
741    
742 dl 1.1 /**
743 jsr166 1.223 * Returns a timeout in milliseconds to be used in tests that verify
744     * that operations block or time out. We want this to be longer
745     * than the OS scheduling quantum, but not too long, so don't scale
746     * linearly with delayFactor; we use "crazy" cube root instead.
747 jsr166 1.81 */
748 jsr166 1.223 static long timeoutMillis() {
749     return TIMEOUT_DELAY_MS;
750 jsr166 1.81 }
751    
752     /**
753 jsr166 1.135 * Returns a new Date instance representing a time at least
754     * delayMillis milliseconds in the future.
755 jsr166 1.81 */
756     Date delayedDate(long delayMillis) {
757 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
758     return new Date(System.currentTimeMillis() + delayMillis + 1);
759 jsr166 1.81 }
760    
761     /**
762 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
763 dl 1.1 */
764 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
765 jsr166 1.216 = new AtomicReference<>(null);
766 dl 1.1
767     /**
768 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
769     * harness thread, triggering a test case failure. Only the first
770     * failure is recorded; subsequent calls to this method from within
771     * the same test have no effect.
772 dl 1.1 */
773 jsr166 1.53 public void threadRecordFailure(Throwable t) {
774 jsr166 1.158 System.err.println(t);
775 jsr166 1.260 if (threadFailure.compareAndSet(null, t))
776     dumpTestThreads();
777 jsr166 1.53 }
778    
779 jsr166 1.27 public void setUp() {
780 dl 1.2 setDelays();
781 dl 1.1 }
782    
783 jsr166 1.146 void tearDownFail(String format, Object... args) {
784     String msg = toString() + ": " + String.format(format, args);
785     System.err.println(msg);
786 jsr166 1.156 dumpTestThreads();
787 jsr166 1.239 throw new AssertionError(msg);
788 jsr166 1.146 }
789    
790 dl 1.1 /**
791 jsr166 1.85 * Extra checks that get done for all test cases.
792     *
793 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
794     * by rethrowing, in the test harness thread, any exception recorded
795     * earlier by threadRecordFailure.
796 jsr166 1.85 *
797     * Triggers test case failure if interrupt status is set in the main thread.
798 jsr166 1.53 */
799     public void tearDown() throws Exception {
800 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
801 jsr166 1.53 if (t != null) {
802     if (t instanceof Error)
803     throw (Error) t;
804     else if (t instanceof RuntimeException)
805     throw (RuntimeException) t;
806     else if (t instanceof Exception)
807     throw (Exception) t;
808 jsr166 1.239 else
809     throw new AssertionError(t.toString(), t);
810 jsr166 1.53 }
811 jsr166 1.85
812     if (Thread.interrupted())
813 jsr166 1.146 tearDownFail("interrupt status set in main thread");
814 jsr166 1.100
815     checkForkJoinPoolThreadLeaks();
816 dl 1.1 }
817    
818 dl 1.5 /**
819 jsr166 1.164 * Finds missing PoolCleaners
820 jsr166 1.100 */
821     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
822 jsr166 1.146 Thread[] survivors = new Thread[7];
823 jsr166 1.100 int count = Thread.enumerate(survivors);
824     for (int i = 0; i < count; i++) {
825     Thread thread = survivors[i];
826     String name = thread.getName();
827     if (name.startsWith("ForkJoinPool-")) {
828     // give thread some time to terminate
829     thread.join(LONG_DELAY_MS);
830 jsr166 1.146 if (thread.isAlive())
831     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
832     thread);
833 jsr166 1.100 }
834     }
835 jsr166 1.146
836     if (!ForkJoinPool.commonPool()
837     .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
838     tearDownFail("ForkJoin common pool thread stuck");
839 jsr166 1.100 }
840 jsr166 1.101
841 jsr166 1.100 /**
842 jsr166 1.53 * Just like fail(reason), but additionally recording (using
843 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
844     * current testcase will fail.
845 jsr166 1.27 */
846 dl 1.1 public void threadFail(String reason) {
847 jsr166 1.53 try {
848     fail(reason);
849 jsr166 1.239 } catch (AssertionError fail) {
850     threadRecordFailure(fail);
851     throw fail;
852 jsr166 1.53 }
853 dl 1.1 }
854    
855 dl 1.5 /**
856 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
857 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
858     * current testcase will fail.
859 jsr166 1.27 */
860 dl 1.1 public void threadAssertTrue(boolean b) {
861 jsr166 1.53 try {
862 dl 1.1 assertTrue(b);
863 jsr166 1.239 } catch (AssertionError fail) {
864     threadRecordFailure(fail);
865     throw fail;
866 dl 1.1 }
867     }
868 dl 1.5
869     /**
870 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
871 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
872     * current testcase will fail.
873 jsr166 1.27 */
874 dl 1.1 public void threadAssertFalse(boolean b) {
875 jsr166 1.53 try {
876 dl 1.1 assertFalse(b);
877 jsr166 1.239 } catch (AssertionError fail) {
878     threadRecordFailure(fail);
879     throw fail;
880 dl 1.1 }
881     }
882 dl 1.5
883     /**
884 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
885 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
886     * current testcase will fail.
887 jsr166 1.27 */
888 dl 1.1 public void threadAssertNull(Object x) {
889 jsr166 1.53 try {
890 dl 1.1 assertNull(x);
891 jsr166 1.239 } catch (AssertionError fail) {
892     threadRecordFailure(fail);
893     throw fail;
894 dl 1.1 }
895     }
896 dl 1.5
897     /**
898 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
899 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
900     * current testcase will fail.
901 jsr166 1.27 */
902 dl 1.1 public void threadAssertEquals(long x, long y) {
903 jsr166 1.53 try {
904 dl 1.1 assertEquals(x, y);
905 jsr166 1.239 } catch (AssertionError fail) {
906     threadRecordFailure(fail);
907     throw fail;
908 dl 1.1 }
909     }
910 dl 1.5
911     /**
912 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
913 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
914     * current testcase will fail.
915 jsr166 1.27 */
916 dl 1.1 public void threadAssertEquals(Object x, Object y) {
917 jsr166 1.53 try {
918 dl 1.1 assertEquals(x, y);
919 jsr166 1.239 } catch (AssertionError fail) {
920 jsr166 1.129 threadRecordFailure(fail);
921     throw fail;
922     } catch (Throwable fail) {
923     threadUnexpectedException(fail);
924 dl 1.1 }
925     }
926    
927 dl 1.5 /**
928 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
929 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
930     * current testcase will fail.
931 jsr166 1.52 */
932     public void threadAssertSame(Object x, Object y) {
933 jsr166 1.53 try {
934 jsr166 1.52 assertSame(x, y);
935 jsr166 1.239 } catch (AssertionError fail) {
936 jsr166 1.129 threadRecordFailure(fail);
937     throw fail;
938 jsr166 1.52 }
939     }
940    
941     /**
942 jsr166 1.53 * Calls threadFail with message "should throw exception".
943 jsr166 1.33 */
944 dl 1.3 public void threadShouldThrow() {
945 jsr166 1.53 threadFail("should throw exception");
946 dl 1.3 }
947    
948 dl 1.5 /**
949 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
950 jsr166 1.40 */
951     public void threadShouldThrow(String exceptionName) {
952 jsr166 1.53 threadFail("should throw " + exceptionName);
953 dl 1.3 }
954    
955 dl 1.31 /**
956 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
957 jsr166 1.239 * then rethrows the exception, wrapping it in an AssertionError
958     * if necessary.
959 dl 1.31 */
960 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
961     threadRecordFailure(t);
962     t.printStackTrace();
963     if (t instanceof RuntimeException)
964     throw (RuntimeException) t;
965     else if (t instanceof Error)
966     throw (Error) t;
967 jsr166 1.239 else
968     throw new AssertionError("unexpected exception: " + t, t);
969 dl 1.31 }
970 dl 1.3
971 dl 1.1 /**
972 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
973 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
974 jsr166 1.163 * until time elapses. Ensures that the given time, as measured
975     * by System.nanoTime(), has elapsed.
976 dl 1.76 */
977 jsr166 1.81 static void delay(long millis) throws InterruptedException {
978 jsr166 1.163 long nanos = millis * (1000 * 1000);
979     final long wakeupTime = System.nanoTime() + nanos;
980     do {
981 jsr166 1.80 if (millis > 0L)
982     Thread.sleep(millis);
983 dl 1.76 else // too short to sleep
984     Thread.yield();
985 jsr166 1.163 nanos = wakeupTime - System.nanoTime();
986     millis = nanos / (1000 * 1000);
987     } while (nanos >= 0L);
988 dl 1.76 }
989    
990     /**
991 jsr166 1.149 * Allows use of try-with-resources with per-test thread pools.
992     */
993 jsr166 1.160 class PoolCleaner implements AutoCloseable {
994     private final ExecutorService pool;
995     public PoolCleaner(ExecutorService pool) { this.pool = pool; }
996 jsr166 1.149 public void close() { joinPool(pool); }
997     }
998    
999 jsr166 1.166 /**
1000     * An extension of PoolCleaner that has an action to release the pool.
1001     */
1002     class PoolCleanerWithReleaser extends PoolCleaner {
1003     private final Runnable releaser;
1004     public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
1005     super(pool);
1006     this.releaser = releaser;
1007     }
1008     public void close() {
1009     try {
1010     releaser.run();
1011     } finally {
1012     super.close();
1013     }
1014     }
1015     }
1016    
1017 jsr166 1.160 PoolCleaner cleaner(ExecutorService pool) {
1018     return new PoolCleaner(pool);
1019 jsr166 1.159 }
1020    
1021 jsr166 1.166 PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
1022     return new PoolCleanerWithReleaser(pool, releaser);
1023     }
1024    
1025     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
1026     return new PoolCleanerWithReleaser(pool, releaser(latch));
1027     }
1028    
1029     Runnable releaser(final CountDownLatch latch) {
1030     return new Runnable() { public void run() {
1031     do { latch.countDown(); }
1032     while (latch.getCount() > 0);
1033     }};
1034     }
1035    
1036 jsr166 1.185 PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
1037     return new PoolCleanerWithReleaser(pool, releaser(flag));
1038     }
1039    
1040     Runnable releaser(final AtomicBoolean flag) {
1041     return new Runnable() { public void run() { flag.set(true); }};
1042     }
1043    
1044 jsr166 1.149 /**
1045 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
1046 dl 1.1 */
1047 jsr166 1.158 void joinPool(ExecutorService pool) {
1048 dl 1.1 try {
1049 jsr166 1.139 pool.shutdown();
1050 jsr166 1.158 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
1051     try {
1052     threadFail("ExecutorService " + pool +
1053     " did not terminate in a timely manner");
1054     } finally {
1055     // last resort, for the benefit of subsequent tests
1056     pool.shutdownNow();
1057 jsr166 1.167 pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
1058 jsr166 1.158 }
1059     }
1060 jsr166 1.33 } catch (SecurityException ok) {
1061 dl 1.22 // Allowed in case test doesn't have privs
1062 jsr166 1.128 } catch (InterruptedException fail) {
1063 jsr166 1.158 threadFail("Unexpected InterruptedException");
1064 dl 1.1 }
1065     }
1066    
1067 jsr166 1.197 /**
1068     * Like Runnable, but with the freedom to throw anything.
1069     * junit folks had the same idea:
1070     * http://junit.org/junit5/docs/snapshot/api/org/junit/gen5/api/Executable.html
1071     */
1072 jsr166 1.141 interface Action { public void run() throws Throwable; }
1073 jsr166 1.139
1074     /**
1075 jsr166 1.141 * Runs all the given actions in parallel, failing if any fail.
1076 jsr166 1.139 * Useful for running multiple variants of tests that are
1077     * necessarily individually slow because they must block.
1078     */
1079 jsr166 1.141 void testInParallel(Action ... actions) {
1080 jsr166 1.160 ExecutorService pool = Executors.newCachedThreadPool();
1081     try (PoolCleaner cleaner = cleaner(pool)) {
1082 jsr166 1.141 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
1083     for (final Action action : actions)
1084 jsr166 1.139 futures.add(pool.submit(new CheckedRunnable() {
1085 jsr166 1.141 public void realRun() throws Throwable { action.run();}}));
1086 jsr166 1.139 for (Future<?> future : futures)
1087     try {
1088     assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
1089     } catch (ExecutionException ex) {
1090     threadUnexpectedException(ex.getCause());
1091     } catch (Exception ex) {
1092     threadUnexpectedException(ex);
1093     }
1094     }
1095     }
1096    
1097 jsr166 1.266 /** Returns true if thread info might be useful in a thread dump. */
1098     static boolean threadOfInterest(ThreadInfo info) {
1099     final String name = info.getThreadName();
1100     String lockName;
1101     if (name == null)
1102     return true;
1103     if (name.equals("Signal Dispatcher")
1104     || name.equals("WedgedTestDetector"))
1105     return false;
1106     if (name.equals("Reference Handler")) {
1107     // Reference Handler stacktrace changed in JDK-8156500
1108     StackTraceElement[] stackTrace; String methodName;
1109     if ((stackTrace = info.getStackTrace()) != null
1110     && stackTrace.length > 0
1111     && (methodName = stackTrace[0].getMethodName()) != null
1112     && methodName.equals("waitForReferencePendingList"))
1113     return false;
1114     // jdk8 Reference Handler stacktrace
1115     if ((lockName = info.getLockName()) != null
1116     && lockName.startsWith("java.lang.ref"))
1117     return false;
1118     }
1119     if ((name.equals("Finalizer") || name.equals("Common-Cleaner"))
1120     && (lockName = info.getLockName()) != null
1121     && lockName.startsWith("java.lang.ref"))
1122     return false;
1123     if (name.startsWith("ForkJoinPool.commonPool-worker")
1124     && (lockName = info.getLockName()) != null
1125     && lockName.startsWith("java.util.concurrent.ForkJoinPool"))
1126     return false;
1127     return true;
1128     }
1129    
1130 jsr166 1.78 /**
1131 jsr166 1.156 * A debugging tool to print stack traces of most threads, as jstack does.
1132 jsr166 1.150 * Uninteresting threads are filtered out.
1133 jsr166 1.95 */
1134 jsr166 1.156 static void dumpTestThreads() {
1135 jsr166 1.195 SecurityManager sm = System.getSecurityManager();
1136     if (sm != null) {
1137     try {
1138     System.setSecurityManager(null);
1139     } catch (SecurityException giveUp) {
1140     return;
1141     }
1142     }
1143    
1144 jsr166 1.150 System.err.println("------ stacktrace dump start ------");
1145 jsr166 1.268 for (ThreadInfo info : THREAD_MXBEAN.dumpAllThreads(true, true))
1146 jsr166 1.266 if (threadOfInterest(info))
1147     System.err.print(info);
1148 jsr166 1.150 System.err.println("------ stacktrace dump end ------");
1149 jsr166 1.195
1150     if (sm != null) System.setSecurityManager(sm);
1151 jsr166 1.95 }
1152    
1153     /**
1154 jsr166 1.224 * Checks that thread eventually enters the expected blocked thread state.
1155     */
1156     void assertThreadBlocks(Thread thread, Thread.State expected) {
1157 jsr166 1.228 // always sleep at least 1 ms, with high probability avoiding
1158     // transitory states
1159 jsr166 1.225 for (long retries = LONG_DELAY_MS * 3 / 4; retries-->0; ) {
1160 jsr166 1.224 try { delay(1); }
1161     catch (InterruptedException fail) {
1162 jsr166 1.240 throw new AssertionError("Unexpected InterruptedException", fail);
1163 jsr166 1.224 }
1164     Thread.State s = thread.getState();
1165     if (s == expected)
1166     return;
1167     else if (s == Thread.State.TERMINATED)
1168     fail("Unexpected thread termination");
1169     }
1170     fail("timed out waiting for thread to enter thread state " + expected);
1171     }
1172    
1173     /**
1174 jsr166 1.268 * Returns the thread's blocker's class name, if any, else null.
1175     */
1176     String blockerClassName(Thread thread) {
1177     ThreadInfo threadInfo; LockInfo lockInfo;
1178     if ((threadInfo = THREAD_MXBEAN.getThreadInfo(thread.getId(), 0)) != null
1179     && (lockInfo = threadInfo.getLockInfo()) != null)
1180     return lockInfo.getClassName();
1181     return null;
1182     }
1183    
1184     /**
1185 jsr166 1.83 * Checks that future.get times out, with the default timeout of
1186     * {@code timeoutMillis()}.
1187     */
1188     void assertFutureTimesOut(Future future) {
1189     assertFutureTimesOut(future, timeoutMillis());
1190     }
1191    
1192     /**
1193     * Checks that future.get times out, with the given millisecond timeout.
1194     */
1195     void assertFutureTimesOut(Future future, long timeoutMillis) {
1196     long startTime = System.nanoTime();
1197     try {
1198     future.get(timeoutMillis, MILLISECONDS);
1199     shouldThrow();
1200     } catch (TimeoutException success) {
1201 jsr166 1.128 } catch (Exception fail) {
1202     threadUnexpectedException(fail);
1203 jsr166 1.271 }
1204 jsr166 1.83 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1205 jsr166 1.271 assertFalse(future.isDone());
1206 jsr166 1.83 }
1207    
1208     /**
1209 jsr166 1.53 * Fails with message "should throw exception".
1210 jsr166 1.27 */
1211 dl 1.3 public void shouldThrow() {
1212     fail("Should throw exception");
1213     }
1214    
1215 dl 1.5 /**
1216 jsr166 1.53 * Fails with message "should throw " + exceptionName.
1217 jsr166 1.40 */
1218     public void shouldThrow(String exceptionName) {
1219     fail("Should throw " + exceptionName);
1220     }
1221    
1222     /**
1223 jsr166 1.222 * The maximum number of consecutive spurious wakeups we should
1224     * tolerate (from APIs like LockSupport.park) before failing a test.
1225     */
1226     static final int MAX_SPURIOUS_WAKEUPS = 10;
1227    
1228     /**
1229 dl 1.1 * The number of elements to place in collections, arrays, etc.
1230     */
1231 jsr166 1.45 public static final int SIZE = 20;
1232 dl 1.1
1233     // Some convenient Integer constants
1234    
1235 jsr166 1.47 public static final Integer zero = new Integer(0);
1236     public static final Integer one = new Integer(1);
1237     public static final Integer two = new Integer(2);
1238     public static final Integer three = new Integer(3);
1239 jsr166 1.45 public static final Integer four = new Integer(4);
1240     public static final Integer five = new Integer(5);
1241 jsr166 1.47 public static final Integer six = new Integer(6);
1242 jsr166 1.45 public static final Integer seven = new Integer(7);
1243     public static final Integer eight = new Integer(8);
1244 jsr166 1.47 public static final Integer nine = new Integer(9);
1245 jsr166 1.45 public static final Integer m1 = new Integer(-1);
1246     public static final Integer m2 = new Integer(-2);
1247     public static final Integer m3 = new Integer(-3);
1248 jsr166 1.47 public static final Integer m4 = new Integer(-4);
1249     public static final Integer m5 = new Integer(-5);
1250     public static final Integer m6 = new Integer(-6);
1251 jsr166 1.45 public static final Integer m10 = new Integer(-10);
1252 dl 1.7
1253     /**
1254 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
1255     * the specified permissions. If there is no current security
1256     * manager, the runnable is run twice, both with and without a
1257     * security manager. We require that any security manager permit
1258     * getPolicy/setPolicy.
1259     */
1260     public void runWithPermissions(Runnable r, Permission... permissions) {
1261     SecurityManager sm = System.getSecurityManager();
1262     if (sm == null) {
1263     r.run();
1264 jsr166 1.93 }
1265     runWithSecurityManagerWithPermissions(r, permissions);
1266     }
1267    
1268     /**
1269     * Runs Runnable r with a security policy that permits precisely
1270     * the specified permissions. If there is no current security
1271     * manager, a temporary one is set for the duration of the
1272     * Runnable. We require that any security manager permit
1273     * getPolicy/setPolicy.
1274     */
1275     public void runWithSecurityManagerWithPermissions(Runnable r,
1276     Permission... permissions) {
1277     SecurityManager sm = System.getSecurityManager();
1278     if (sm == null) {
1279 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
1280     try {
1281     Policy.setPolicy(permissivePolicy());
1282     System.setSecurityManager(new SecurityManager());
1283 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
1284 jsr166 1.49 } finally {
1285     System.setSecurityManager(null);
1286     Policy.setPolicy(savedPolicy);
1287     }
1288     } else {
1289     Policy savedPolicy = Policy.getPolicy();
1290     AdjustablePolicy policy = new AdjustablePolicy(permissions);
1291     Policy.setPolicy(policy);
1292    
1293     try {
1294     r.run();
1295     } finally {
1296     policy.addPermission(new SecurityPermission("setPolicy"));
1297     Policy.setPolicy(savedPolicy);
1298     }
1299     }
1300     }
1301    
1302     /**
1303     * Runs a runnable without any permissions.
1304     */
1305     public void runWithoutPermissions(Runnable r) {
1306     runWithPermissions(r);
1307     }
1308    
1309     /**
1310 dl 1.7 * A security policy where new permissions can be dynamically added
1311     * or all cleared.
1312     */
1313 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1314 dl 1.7 Permissions perms = new Permissions();
1315 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1316     for (Permission permission : permissions)
1317     perms.add(permission);
1318     }
1319 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1320     void clearPermissions() { perms = new Permissions(); }
1321 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1322     return perms;
1323     }
1324     public PermissionCollection getPermissions(ProtectionDomain pd) {
1325     return perms;
1326     }
1327     public boolean implies(ProtectionDomain pd, Permission p) {
1328     return perms.implies(p);
1329     }
1330     public void refresh() {}
1331 jsr166 1.93 public String toString() {
1332 jsr166 1.216 List<Permission> ps = new ArrayList<>();
1333 jsr166 1.93 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1334     ps.add(e.nextElement());
1335     return "AdjustablePolicy with permissions " + ps;
1336     }
1337 dl 1.7 }
1338 dl 1.1
1339 jsr166 1.38 /**
1340 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1341     */
1342     public static Policy permissivePolicy() {
1343     return new AdjustablePolicy
1344     // Permissions j.u.c. needs directly
1345     (new RuntimePermission("modifyThread"),
1346     new RuntimePermission("getClassLoader"),
1347     new RuntimePermission("setContextClassLoader"),
1348     // Permissions needed to change permissions!
1349     new SecurityPermission("getPolicy"),
1350     new SecurityPermission("setPolicy"),
1351     new RuntimePermission("setSecurityManager"),
1352     // Permissions needed by the junit test harness
1353     new RuntimePermission("accessDeclaredMembers"),
1354     new PropertyPermission("*", "read"),
1355     new java.io.FilePermission("<<ALL FILES>>", "read"));
1356     }
1357    
1358     /**
1359 jsr166 1.60 * Sleeps until the given time has elapsed.
1360 jsr166 1.239 * Throws AssertionError if interrupted.
1361 jsr166 1.60 */
1362 jsr166 1.201 static void sleep(long millis) {
1363 jsr166 1.60 try {
1364 dl 1.76 delay(millis);
1365 jsr166 1.128 } catch (InterruptedException fail) {
1366 jsr166 1.239 throw new AssertionError("Unexpected InterruptedException", fail);
1367 jsr166 1.60 }
1368     }
1369    
1370     /**
1371 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1372 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1373 jsr166 1.248 * @param waitingForGodot if non-null, an additional condition to satisfy
1374 jsr166 1.65 */
1375 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis,
1376     Callable<Boolean> waitingForGodot) {
1377     for (long startTime = 0L;;) {
1378     switch (thread.getState()) {
1379 jsr166 1.250 default: break;
1380 jsr166 1.248 case BLOCKED: case WAITING: case TIMED_WAITING:
1381     try {
1382     if (waitingForGodot == null || waitingForGodot.call())
1383     return;
1384     } catch (Throwable fail) { threadUnexpectedException(fail); }
1385     break;
1386     case TERMINATED:
1387 jsr166 1.67 fail("Unexpected thread termination");
1388 jsr166 1.248 }
1389    
1390     if (startTime == 0L)
1391 jsr166 1.199 startTime = System.nanoTime();
1392 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1393 jsr166 1.248 assertTrue(thread.isAlive());
1394     if (waitingForGodot == null
1395     || thread.getState() == Thread.State.RUNNABLE)
1396     fail("timed out waiting for thread to enter wait state");
1397     else
1398     fail("timed out waiting for condition, thread state="
1399     + thread.getState());
1400 jsr166 1.67 }
1401 jsr166 1.65 Thread.yield();
1402     }
1403     }
1404    
1405     /**
1406 jsr166 1.219 * Spin-waits up to the specified number of milliseconds for the given
1407 jsr166 1.248 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1408 jsr166 1.219 */
1409 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1410     waitForThreadToEnterWaitState(thread, timeoutMillis, null);
1411 jsr166 1.219 }
1412    
1413     /**
1414     * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1415     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1416 jsr166 1.75 */
1417     void waitForThreadToEnterWaitState(Thread thread) {
1418 jsr166 1.248 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, null);
1419 jsr166 1.75 }
1420    
1421     /**
1422 jsr166 1.219 * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1423     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
1424     * and additionally satisfy the given condition.
1425     */
1426 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread,
1427     Callable<Boolean> waitingForGodot) {
1428 jsr166 1.219 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, waitingForGodot);
1429     }
1430    
1431     /**
1432 jsr166 1.257 * Spin-waits up to LONG_DELAY_MS milliseconds for the current thread to
1433     * be interrupted. Clears the interrupt status before returning.
1434     */
1435     void awaitInterrupted() {
1436     for (long startTime = 0L; !Thread.interrupted(); ) {
1437     if (startTime == 0L)
1438     startTime = System.nanoTime();
1439     else if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1440     fail("timed out waiting for thread interrupt");
1441     Thread.yield();
1442     }
1443     }
1444    
1445     /**
1446 jsr166 1.66 * Returns the number of milliseconds since time given by
1447     * startNanoTime, which must have been previously returned from a
1448 jsr166 1.124 * call to {@link System#nanoTime()}.
1449 jsr166 1.66 */
1450 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1451 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1452     }
1453 jsr166 1.68
1454 jsr166 1.120 /**
1455     * Checks that timed f.get() returns the expected value, and does not
1456     * wait for the timeout to elapse before returning.
1457     */
1458     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1459     long startTime = System.nanoTime();
1460 jsr166 1.245 T actual = null;
1461 jsr166 1.120 try {
1462 jsr166 1.245 actual = f.get(timeoutMillis, MILLISECONDS);
1463 jsr166 1.120 } catch (Throwable fail) { threadUnexpectedException(fail); }
1464 jsr166 1.245 assertEquals(expectedValue, actual);
1465 jsr166 1.120 if (millisElapsedSince(startTime) > timeoutMillis/2)
1466 jsr166 1.239 throw new AssertionError("timed get did not return promptly");
1467 jsr166 1.120 }
1468    
1469     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1470     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1471     }
1472    
1473 jsr166 1.66 /**
1474 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1475 jsr166 1.38 */
1476     Thread newStartedThread(Runnable runnable) {
1477     Thread t = new Thread(runnable);
1478 jsr166 1.58 t.setDaemon(true);
1479 jsr166 1.38 t.start();
1480     return t;
1481     }
1482 dl 1.1
1483 jsr166 1.59 /**
1484 jsr166 1.268 * Returns a new started daemon Thread running the given action,
1485     * wrapped in a CheckedRunnable.
1486     */
1487     Thread newStartedThread(Action action) {
1488 jsr166 1.269 return newStartedThread(checkedRunnable(action));
1489 jsr166 1.268 }
1490    
1491     /**
1492 jsr166 1.59 * Waits for the specified time (in milliseconds) for the thread
1493     * to terminate (using {@link Thread#join(long)}), else interrupts
1494     * the thread (in the hope that it may terminate later) and fails.
1495     */
1496 jsr166 1.261 void awaitTermination(Thread thread, long timeoutMillis) {
1497 jsr166 1.59 try {
1498 jsr166 1.261 thread.join(timeoutMillis);
1499 jsr166 1.128 } catch (InterruptedException fail) {
1500     threadUnexpectedException(fail);
1501 jsr166 1.258 }
1502 jsr166 1.261 if (thread.getState() != Thread.State.TERMINATED) {
1503     String detail = String.format(
1504     "timed out waiting for thread to terminate, thread=%s, state=%s" ,
1505     thread, thread.getState());
1506     try {
1507     threadFail(detail);
1508     } finally {
1509 jsr166 1.262 // Interrupt thread __after__ having reported its stack trace
1510 jsr166 1.261 thread.interrupt();
1511     }
1512 jsr166 1.59 }
1513     }
1514    
1515 jsr166 1.75 /**
1516     * Waits for LONG_DELAY_MS milliseconds for the thread to
1517     * terminate (using {@link Thread#join(long)}), else interrupts
1518     * the thread (in the hope that it may terminate later) and fails.
1519     */
1520     void awaitTermination(Thread t) {
1521     awaitTermination(t, LONG_DELAY_MS);
1522     }
1523    
1524 dl 1.1 // Some convenient Runnable classes
1525    
1526 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1527     protected abstract void realRun() throws Throwable;
1528 jsr166 1.35
1529     public final void run() {
1530     try {
1531     realRun();
1532 jsr166 1.128 } catch (Throwable fail) {
1533     threadUnexpectedException(fail);
1534 jsr166 1.35 }
1535     }
1536     }
1537    
1538 jsr166 1.268 Runnable checkedRunnable(Action action) {
1539     return new CheckedRunnable() {
1540     public void realRun() throws Throwable {
1541     action.run();
1542     }};
1543     }
1544    
1545 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1546     protected abstract void realRun() throws Throwable;
1547 jsr166 1.40
1548     final Class<?> exceptionClass;
1549    
1550     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1551     this.exceptionClass = exceptionClass;
1552     }
1553    
1554     public final void run() {
1555     try {
1556     realRun();
1557     } catch (Throwable t) {
1558     if (! exceptionClass.isInstance(t))
1559     threadUnexpectedException(t);
1560 jsr166 1.248 return;
1561 jsr166 1.40 }
1562 jsr166 1.248 threadShouldThrow(exceptionClass.getSimpleName());
1563 jsr166 1.40 }
1564     }
1565    
1566 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1567     protected abstract void realRun() throws Throwable;
1568 jsr166 1.35
1569     public final void run() {
1570     try {
1571     realRun();
1572     } catch (InterruptedException success) {
1573 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1574 jsr166 1.248 return;
1575 jsr166 1.128 } catch (Throwable fail) {
1576     threadUnexpectedException(fail);
1577 jsr166 1.35 }
1578 jsr166 1.248 threadShouldThrow("InterruptedException");
1579 jsr166 1.35 }
1580     }
1581    
1582 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1583     protected abstract T realCall() throws Throwable;
1584 jsr166 1.35
1585     public final T call() {
1586     try {
1587     return realCall();
1588 jsr166 1.128 } catch (Throwable fail) {
1589     threadUnexpectedException(fail);
1590 jsr166 1.40 }
1591 jsr166 1.248 throw new AssertionError("unreached");
1592 jsr166 1.35 }
1593     }
1594    
1595 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1596 dl 1.1 public void run() {}
1597     }
1598    
1599 jsr166 1.45 public static class NoOpCallable implements Callable {
1600 dl 1.1 public Object call() { return Boolean.TRUE; }
1601 dl 1.10 }
1602    
1603 jsr166 1.45 public static final String TEST_STRING = "a test string";
1604 dl 1.10
1605 jsr166 1.45 public static class StringTask implements Callable<String> {
1606 jsr166 1.144 final String value;
1607     public StringTask() { this(TEST_STRING); }
1608     public StringTask(String value) { this.value = value; }
1609     public String call() { return value; }
1610 dl 1.10 }
1611    
1612 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1613     return new CheckedCallable<String>() {
1614 jsr166 1.64 protected String realCall() {
1615 jsr166 1.48 try {
1616     latch.await();
1617     } catch (InterruptedException quittingTime) {}
1618     return TEST_STRING;
1619     }};
1620     }
1621    
1622 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1623     return new CheckedRunnable() {
1624     public void realRun() throws InterruptedException {
1625     latch.countDown();
1626     }};
1627     }
1628    
1629 jsr166 1.161 class LatchAwaiter extends CheckedRunnable {
1630 jsr166 1.162 static final int NEW = 0;
1631     static final int RUNNING = 1;
1632     static final int DONE = 2;
1633 jsr166 1.161 final CountDownLatch latch;
1634     int state = NEW;
1635     LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1636     public void realRun() throws InterruptedException {
1637     state = 1;
1638     await(latch);
1639     state = 2;
1640     }
1641     }
1642 jsr166 1.162
1643 jsr166 1.161 public LatchAwaiter awaiter(CountDownLatch latch) {
1644     return new LatchAwaiter(latch);
1645 jsr166 1.73 }
1646    
1647 jsr166 1.188 public void await(CountDownLatch latch, long timeoutMillis) {
1648 jsr166 1.246 boolean timedOut = false;
1649 jsr166 1.79 try {
1650 jsr166 1.246 timedOut = !latch.await(timeoutMillis, MILLISECONDS);
1651 jsr166 1.128 } catch (Throwable fail) {
1652     threadUnexpectedException(fail);
1653 jsr166 1.79 }
1654 jsr166 1.246 if (timedOut)
1655     fail("timed out waiting for CountDownLatch for "
1656     + (timeoutMillis/1000) + " sec");
1657 jsr166 1.79 }
1658    
1659 jsr166 1.188 public void await(CountDownLatch latch) {
1660     await(latch, LONG_DELAY_MS);
1661     }
1662    
1663 jsr166 1.89 public void await(Semaphore semaphore) {
1664 jsr166 1.246 boolean timedOut = false;
1665 jsr166 1.89 try {
1666 jsr166 1.246 timedOut = !semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS);
1667 jsr166 1.128 } catch (Throwable fail) {
1668     threadUnexpectedException(fail);
1669 jsr166 1.89 }
1670 jsr166 1.246 if (timedOut)
1671     fail("timed out waiting for Semaphore for "
1672     + (LONG_DELAY_MS/1000) + " sec");
1673 jsr166 1.89 }
1674    
1675 jsr166 1.226 public void await(CyclicBarrier barrier) {
1676     try {
1677     barrier.await(LONG_DELAY_MS, MILLISECONDS);
1678     } catch (Throwable fail) {
1679     threadUnexpectedException(fail);
1680     }
1681     }
1682    
1683 jsr166 1.81 // /**
1684     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1685     // */
1686     // public void await(AtomicBoolean flag) {
1687     // await(flag, LONG_DELAY_MS);
1688     // }
1689    
1690     // /**
1691     // * Spin-waits up to the specified timeout until flag becomes true.
1692     // */
1693     // public void await(AtomicBoolean flag, long timeoutMillis) {
1694     // long startTime = System.nanoTime();
1695     // while (!flag.get()) {
1696     // if (millisElapsedSince(startTime) > timeoutMillis)
1697 jsr166 1.239 // throw new AssertionError("timed out");
1698 jsr166 1.81 // Thread.yield();
1699     // }
1700     // }
1701    
1702 jsr166 1.45 public static class NPETask implements Callable<String> {
1703 dl 1.10 public String call() { throw new NullPointerException(); }
1704     }
1705    
1706 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1707     return new CheckedRunnable() {
1708     protected void realRun() {
1709     try {
1710 dl 1.76 delay(timeoutMillis);
1711 jsr166 1.63 } catch (InterruptedException ok) {}
1712     }};
1713     }
1714    
1715 dl 1.5 /**
1716     * For use as ThreadFactory in constructors
1717     */
1718 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1719 jsr166 1.33 public Thread newThread(Runnable r) {
1720 dl 1.5 return new Thread(r);
1721 jsr166 1.27 }
1722 dl 1.5 }
1723    
1724 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1725     boolean isDone();
1726     }
1727    
1728 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1729     public volatile boolean done = false;
1730 dl 1.6 public void run() {
1731     done = true;
1732 dl 1.5 }
1733     }
1734    
1735 jsr166 1.53 /**
1736     * Analog of CheckedRunnable for RecursiveAction
1737     */
1738     public abstract class CheckedRecursiveAction extends RecursiveAction {
1739     protected abstract void realCompute() throws Throwable;
1740    
1741 jsr166 1.108 @Override protected final void compute() {
1742 jsr166 1.53 try {
1743     realCompute();
1744 jsr166 1.128 } catch (Throwable fail) {
1745     threadUnexpectedException(fail);
1746 jsr166 1.53 }
1747     }
1748     }
1749    
1750     /**
1751     * Analog of CheckedCallable for RecursiveTask
1752     */
1753     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1754     protected abstract T realCompute() throws Throwable;
1755    
1756 jsr166 1.108 @Override protected final T compute() {
1757 jsr166 1.53 try {
1758     return realCompute();
1759 jsr166 1.128 } catch (Throwable fail) {
1760     threadUnexpectedException(fail);
1761 jsr166 1.53 }
1762 jsr166 1.248 throw new AssertionError("unreached");
1763 jsr166 1.53 }
1764     }
1765 dl 1.5
1766     /**
1767     * For use as RejectedExecutionHandler in constructors
1768     */
1769 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1770 jsr166 1.35 public void rejectedExecution(Runnable r,
1771     ThreadPoolExecutor executor) {}
1772 dl 1.5 }
1773 jsr166 1.27
1774 jsr166 1.60 /**
1775 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1776 jsr166 1.239 * AssertionErrors instead of throwing checked exceptions.
1777 jsr166 1.60 */
1778 jsr166 1.202 public static class CheckedBarrier extends CyclicBarrier {
1779 jsr166 1.60 public CheckedBarrier(int parties) { super(parties); }
1780    
1781     public int await() {
1782     try {
1783 jsr166 1.270 return super.await(LONGER_DELAY_MS, MILLISECONDS);
1784 jsr166 1.128 } catch (TimeoutException timedOut) {
1785 jsr166 1.239 throw new AssertionError("timed out");
1786 jsr166 1.128 } catch (Exception fail) {
1787 jsr166 1.239 throw new AssertionError("Unexpected exception: " + fail, fail);
1788 jsr166 1.60 }
1789     }
1790     }
1791    
1792 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1793 jsr166 1.72 try {
1794     assertTrue(q.isEmpty());
1795     assertEquals(0, q.size());
1796     assertNull(q.peek());
1797     assertNull(q.poll());
1798 jsr166 1.232 assertNull(q.poll(randomExpiredTimeout(), randomTimeUnit()));
1799 jsr166 1.72 assertEquals(q.toString(), "[]");
1800     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1801     assertFalse(q.iterator().hasNext());
1802     try {
1803     q.element();
1804     shouldThrow();
1805     } catch (NoSuchElementException success) {}
1806     try {
1807     q.iterator().next();
1808     shouldThrow();
1809     } catch (NoSuchElementException success) {}
1810     try {
1811     q.remove();
1812     shouldThrow();
1813     } catch (NoSuchElementException success) {}
1814 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1815 jsr166 1.72 }
1816    
1817 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1818     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1819     }
1820    
1821     void assertNotSerialEquals(Object x, Object y) {
1822     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1823     }
1824    
1825     byte[] serialBytes(Object o) {
1826 jsr166 1.79 try {
1827     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1828     ObjectOutputStream oos = new ObjectOutputStream(bos);
1829     oos.writeObject(o);
1830     oos.flush();
1831     oos.close();
1832 jsr166 1.91 return bos.toByteArray();
1833 jsr166 1.128 } catch (Throwable fail) {
1834     threadUnexpectedException(fail);
1835 jsr166 1.91 return new byte[0];
1836     }
1837     }
1838    
1839 jsr166 1.253 void assertImmutable(Object o) {
1840 jsr166 1.208 if (o instanceof Collection) {
1841     assertThrows(
1842     UnsupportedOperationException.class,
1843 jsr166 1.253 () -> ((Collection) o).add(null));
1844 jsr166 1.208 }
1845     }
1846 jsr166 1.209
1847 jsr166 1.91 @SuppressWarnings("unchecked")
1848     <T> T serialClone(T o) {
1849 jsr166 1.247 T clone = null;
1850 jsr166 1.91 try {
1851 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1852 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1853 jsr166 1.247 clone = (T) ois.readObject();
1854 jsr166 1.128 } catch (Throwable fail) {
1855     threadUnexpectedException(fail);
1856 jsr166 1.79 }
1857 jsr166 1.247 if (o == clone) assertImmutable(o);
1858     else assertSame(o.getClass(), clone.getClass());
1859     return clone;
1860 jsr166 1.79 }
1861 jsr166 1.106
1862 jsr166 1.208 /**
1863 jsr166 1.211 * A version of serialClone that leaves error handling (for
1864     * e.g. NotSerializableException) up to the caller.
1865     */
1866     @SuppressWarnings("unchecked")
1867     <T> T serialClonePossiblyFailing(T o)
1868     throws ReflectiveOperationException, java.io.IOException {
1869     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1870     ObjectOutputStream oos = new ObjectOutputStream(bos);
1871     oos.writeObject(o);
1872     oos.flush();
1873     oos.close();
1874     ObjectInputStream ois = new ObjectInputStream
1875     (new ByteArrayInputStream(bos.toByteArray()));
1876     T clone = (T) ois.readObject();
1877     if (o == clone) assertImmutable(o);
1878 jsr166 1.247 else assertSame(o.getClass(), clone.getClass());
1879 jsr166 1.211 return clone;
1880     }
1881    
1882     /**
1883 jsr166 1.208 * If o implements Cloneable and has a public clone method,
1884     * returns a clone of o, else null.
1885     */
1886     @SuppressWarnings("unchecked")
1887     <T> T cloneableClone(T o) {
1888     if (!(o instanceof Cloneable)) return null;
1889     final T clone;
1890     try {
1891     clone = (T) o.getClass().getMethod("clone").invoke(o);
1892     } catch (NoSuchMethodException ok) {
1893     return null;
1894     } catch (ReflectiveOperationException unexpected) {
1895     throw new Error(unexpected);
1896     }
1897     assertNotSame(o, clone); // not 100% guaranteed by spec
1898     assertSame(o.getClass(), clone.getClass());
1899     return clone;
1900     }
1901    
1902 jsr166 1.106 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1903 jsr166 1.253 Action... throwingActions) {
1904     for (Action throwingAction : throwingActions) {
1905 jsr166 1.106 boolean threw = false;
1906     try { throwingAction.run(); }
1907     catch (Throwable t) {
1908     threw = true;
1909 jsr166 1.239 if (!expectedExceptionClass.isInstance(t))
1910     throw new AssertionError(
1911     "Expected " + expectedExceptionClass.getName() +
1912     ", got " + t.getClass().getName(),
1913     t);
1914 jsr166 1.106 }
1915     if (!threw)
1916     shouldThrow(expectedExceptionClass.getName());
1917     }
1918     }
1919 jsr166 1.126
1920     public void assertIteratorExhausted(Iterator<?> it) {
1921     try {
1922     it.next();
1923     shouldThrow();
1924     } catch (NoSuchElementException success) {}
1925     assertFalse(it.hasNext());
1926 jsr166 1.127 }
1927 jsr166 1.191
1928     public <T> Callable<T> callableThrowing(final Exception ex) {
1929     return new Callable<T>() { public T call() throws Exception { throw ex; }};
1930     }
1931    
1932     public Runnable runnableThrowing(final RuntimeException ex) {
1933     return new Runnable() { public void run() { throw ex; }};
1934     }
1935 jsr166 1.193
1936     /** A reusable thread pool to be shared by tests. */
1937     static final ExecutorService cachedThreadPool =
1938     new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1939     1000L, MILLISECONDS,
1940     new SynchronousQueue<Runnable>());
1941    
1942 jsr166 1.234 static <T> void shuffle(T[] array) {
1943     Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1944     }
1945    
1946 jsr166 1.236 /**
1947     * Returns the same String as would be returned by {@link
1948     * Object#toString}, whether or not the given object's class
1949     * overrides toString().
1950     *
1951     * @see System#identityHashCode
1952     */
1953     static String identityString(Object x) {
1954     return x.getClass().getName()
1955     + "@" + Integer.toHexString(System.identityHashCode(x));
1956     }
1957    
1958 jsr166 1.234 // --- Shared assertions for Executor tests ---
1959    
1960 jsr166 1.233 /**
1961     * Returns maximum number of tasks that can be submitted to given
1962     * pool (with bounded queue) before saturation (when submission
1963     * throws RejectedExecutionException).
1964     */
1965     static final int saturatedSize(ThreadPoolExecutor pool) {
1966     BlockingQueue<Runnable> q = pool.getQueue();
1967     return pool.getMaximumPoolSize() + q.size() + q.remainingCapacity();
1968     }
1969    
1970 jsr166 1.234 @SuppressWarnings("FutureReturnValueIgnored")
1971     void assertNullTaskSubmissionThrowsNullPointerException(Executor e) {
1972     try {
1973     e.execute((Runnable) null);
1974     shouldThrow();
1975     } catch (NullPointerException success) {}
1976    
1977     if (! (e instanceof ExecutorService)) return;
1978     ExecutorService es = (ExecutorService) e;
1979     try {
1980     es.submit((Runnable) null);
1981     shouldThrow();
1982     } catch (NullPointerException success) {}
1983     try {
1984     es.submit((Runnable) null, Boolean.TRUE);
1985     shouldThrow();
1986     } catch (NullPointerException success) {}
1987     try {
1988     es.submit((Callable) null);
1989     shouldThrow();
1990     } catch (NullPointerException success) {}
1991    
1992     if (! (e instanceof ScheduledExecutorService)) return;
1993     ScheduledExecutorService ses = (ScheduledExecutorService) e;
1994     try {
1995     ses.schedule((Runnable) null,
1996     randomTimeout(), randomTimeUnit());
1997     shouldThrow();
1998     } catch (NullPointerException success) {}
1999     try {
2000     ses.schedule((Callable) null,
2001     randomTimeout(), randomTimeUnit());
2002     shouldThrow();
2003     } catch (NullPointerException success) {}
2004     try {
2005     ses.scheduleAtFixedRate((Runnable) null,
2006     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2007     shouldThrow();
2008     } catch (NullPointerException success) {}
2009     try {
2010     ses.scheduleWithFixedDelay((Runnable) null,
2011     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2012     shouldThrow();
2013     } catch (NullPointerException success) {}
2014     }
2015    
2016     void setRejectedExecutionHandler(
2017     ThreadPoolExecutor p, RejectedExecutionHandler handler) {
2018     p.setRejectedExecutionHandler(handler);
2019     assertSame(handler, p.getRejectedExecutionHandler());
2020     }
2021    
2022     void assertTaskSubmissionsAreRejected(ThreadPoolExecutor p) {
2023     final RejectedExecutionHandler savedHandler = p.getRejectedExecutionHandler();
2024     final long savedTaskCount = p.getTaskCount();
2025     final long savedCompletedTaskCount = p.getCompletedTaskCount();
2026     final int savedQueueSize = p.getQueue().size();
2027     final boolean stock = (p.getClass().getClassLoader() == null);
2028    
2029     Runnable r = () -> {};
2030     Callable<Boolean> c = () -> Boolean.TRUE;
2031    
2032     class Recorder implements RejectedExecutionHandler {
2033     public volatile Runnable r = null;
2034     public volatile ThreadPoolExecutor p = null;
2035     public void reset() { r = null; p = null; }
2036     public void rejectedExecution(Runnable r, ThreadPoolExecutor p) {
2037     assertNull(this.r);
2038     assertNull(this.p);
2039     this.r = r;
2040     this.p = p;
2041     }
2042     }
2043    
2044     // check custom handler is invoked exactly once per task
2045     Recorder recorder = new Recorder();
2046     setRejectedExecutionHandler(p, recorder);
2047     for (int i = 2; i--> 0; ) {
2048     recorder.reset();
2049     p.execute(r);
2050     if (stock && p.getClass() == ThreadPoolExecutor.class)
2051     assertSame(r, recorder.r);
2052     assertSame(p, recorder.p);
2053    
2054     recorder.reset();
2055     assertFalse(p.submit(r).isDone());
2056     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2057     assertSame(p, recorder.p);
2058    
2059     recorder.reset();
2060     assertFalse(p.submit(r, Boolean.TRUE).isDone());
2061     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2062     assertSame(p, recorder.p);
2063    
2064     recorder.reset();
2065     assertFalse(p.submit(c).isDone());
2066     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2067     assertSame(p, recorder.p);
2068    
2069     if (p instanceof ScheduledExecutorService) {
2070     ScheduledExecutorService s = (ScheduledExecutorService) p;
2071     ScheduledFuture<?> future;
2072    
2073     recorder.reset();
2074     future = s.schedule(r, randomTimeout(), randomTimeUnit());
2075     assertFalse(future.isDone());
2076     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2077     assertSame(p, recorder.p);
2078    
2079     recorder.reset();
2080     future = s.schedule(c, randomTimeout(), randomTimeUnit());
2081     assertFalse(future.isDone());
2082     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2083     assertSame(p, recorder.p);
2084    
2085     recorder.reset();
2086     future = s.scheduleAtFixedRate(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2087     assertFalse(future.isDone());
2088     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2089     assertSame(p, recorder.p);
2090    
2091     recorder.reset();
2092     future = s.scheduleWithFixedDelay(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2093     assertFalse(future.isDone());
2094     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2095     assertSame(p, recorder.p);
2096     }
2097     }
2098    
2099     // Checking our custom handler above should be sufficient, but
2100     // we add some integration tests of standard handlers.
2101     final AtomicReference<Thread> thread = new AtomicReference<>();
2102     final Runnable setThread = () -> thread.set(Thread.currentThread());
2103    
2104     setRejectedExecutionHandler(p, new ThreadPoolExecutor.AbortPolicy());
2105     try {
2106     p.execute(setThread);
2107     shouldThrow();
2108     } catch (RejectedExecutionException success) {}
2109     assertNull(thread.get());
2110    
2111     setRejectedExecutionHandler(p, new ThreadPoolExecutor.DiscardPolicy());
2112     p.execute(setThread);
2113     assertNull(thread.get());
2114    
2115     setRejectedExecutionHandler(p, new ThreadPoolExecutor.CallerRunsPolicy());
2116     p.execute(setThread);
2117     if (p.isShutdown())
2118     assertNull(thread.get());
2119     else
2120     assertSame(Thread.currentThread(), thread.get());
2121    
2122     setRejectedExecutionHandler(p, savedHandler);
2123    
2124     // check that pool was not perturbed by handlers
2125     assertEquals(savedTaskCount, p.getTaskCount());
2126     assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
2127     assertEquals(savedQueueSize, p.getQueue().size());
2128 jsr166 1.200 }
2129 jsr166 1.243
2130     void assertCollectionsEquals(Collection<?> x, Collection<?> y) {
2131     assertEquals(x, y);
2132     assertEquals(y, x);
2133     assertEquals(x.isEmpty(), y.isEmpty());
2134     assertEquals(x.size(), y.size());
2135     if (x instanceof List) {
2136     assertEquals(x.toString(), y.toString());
2137     }
2138     if (x instanceof List || x instanceof Set) {
2139     assertEquals(x.hashCode(), y.hashCode());
2140     }
2141     if (x instanceof List || x instanceof Deque) {
2142     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2143     assertTrue(Arrays.equals(x.toArray(new Object[0]),
2144     y.toArray(new Object[0])));
2145     }
2146     }
2147    
2148     /**
2149     * A weaker form of assertCollectionsEquals which does not insist
2150     * that the two collections satisfy Object#equals(Object), since
2151     * they may use identity semantics as Deques do.
2152     */
2153     void assertCollectionsEquivalent(Collection<?> x, Collection<?> y) {
2154     if (x instanceof List || x instanceof Set)
2155     assertCollectionsEquals(x, y);
2156     else {
2157     assertEquals(x.isEmpty(), y.isEmpty());
2158     assertEquals(x.size(), y.size());
2159     assertEquals(new HashSet(x), new HashSet(y));
2160     if (x instanceof Deque) {
2161     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2162     assertTrue(Arrays.equals(x.toArray(new Object[0]),
2163     y.toArray(new Object[0])));
2164     }
2165     }
2166     }
2167 dl 1.1 }