ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.267
Committed: Sun Sep 8 16:08:56 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.266: +1 -1 lines
Log Message:
elide unwanted newlines for profile reports

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