ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.255
Committed: Sun Jul 28 18:09:25 2019 UTC (4 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.254: +3 -2 lines
Log Message:
timeoutMinutes should take delay factor into account

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