ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.263
Committed: Thu Sep 5 22:05:30 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.262: +0 -13 lines
Log Message:
delete assertTerminatesPromptly experiment

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.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.78 /**
1087 jsr166 1.156 * A debugging tool to print stack traces of most threads, as jstack does.
1088 jsr166 1.150 * Uninteresting threads are filtered out.
1089 jsr166 1.95 */
1090 jsr166 1.156 static void dumpTestThreads() {
1091 jsr166 1.195 SecurityManager sm = System.getSecurityManager();
1092     if (sm != null) {
1093     try {
1094     System.setSecurityManager(null);
1095     } catch (SecurityException giveUp) {
1096     return;
1097     }
1098     }
1099    
1100 jsr166 1.150 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
1101     System.err.println("------ stacktrace dump start ------");
1102     for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
1103 jsr166 1.203 final String name = info.getThreadName();
1104     String lockName;
1105 jsr166 1.150 if ("Signal Dispatcher".equals(name))
1106     continue;
1107     if ("Reference Handler".equals(name)
1108 jsr166 1.203 && (lockName = info.getLockName()) != null
1109     && lockName.startsWith("java.lang.ref.Reference$Lock"))
1110 jsr166 1.150 continue;
1111     if ("Finalizer".equals(name)
1112 jsr166 1.203 && (lockName = info.getLockName()) != null
1113     && lockName.startsWith("java.lang.ref.ReferenceQueue$Lock"))
1114 jsr166 1.150 continue;
1115 jsr166 1.156 if ("checkForWedgedTest".equals(name))
1116     continue;
1117 jsr166 1.96 System.err.print(info);
1118 jsr166 1.150 }
1119     System.err.println("------ stacktrace dump end ------");
1120 jsr166 1.195
1121     if (sm != null) System.setSecurityManager(sm);
1122 jsr166 1.95 }
1123    
1124     /**
1125 jsr166 1.224 * Checks that thread eventually enters the expected blocked thread state.
1126     */
1127     void assertThreadBlocks(Thread thread, Thread.State expected) {
1128 jsr166 1.228 // always sleep at least 1 ms, with high probability avoiding
1129     // transitory states
1130 jsr166 1.225 for (long retries = LONG_DELAY_MS * 3 / 4; retries-->0; ) {
1131 jsr166 1.224 try { delay(1); }
1132     catch (InterruptedException fail) {
1133 jsr166 1.240 throw new AssertionError("Unexpected InterruptedException", fail);
1134 jsr166 1.224 }
1135     Thread.State s = thread.getState();
1136     if (s == expected)
1137     return;
1138     else if (s == Thread.State.TERMINATED)
1139     fail("Unexpected thread termination");
1140     }
1141     fail("timed out waiting for thread to enter thread state " + expected);
1142     }
1143    
1144     /**
1145 jsr166 1.83 * Checks that future.get times out, with the default timeout of
1146     * {@code timeoutMillis()}.
1147     */
1148     void assertFutureTimesOut(Future future) {
1149     assertFutureTimesOut(future, timeoutMillis());
1150     }
1151    
1152     /**
1153     * Checks that future.get times out, with the given millisecond timeout.
1154     */
1155     void assertFutureTimesOut(Future future, long timeoutMillis) {
1156     long startTime = System.nanoTime();
1157     try {
1158     future.get(timeoutMillis, MILLISECONDS);
1159     shouldThrow();
1160     } catch (TimeoutException success) {
1161 jsr166 1.128 } catch (Exception fail) {
1162     threadUnexpectedException(fail);
1163 jsr166 1.83 } finally { future.cancel(true); }
1164     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1165     }
1166    
1167     /**
1168 jsr166 1.53 * Fails with message "should throw exception".
1169 jsr166 1.27 */
1170 dl 1.3 public void shouldThrow() {
1171     fail("Should throw exception");
1172     }
1173    
1174 dl 1.5 /**
1175 jsr166 1.53 * Fails with message "should throw " + exceptionName.
1176 jsr166 1.40 */
1177     public void shouldThrow(String exceptionName) {
1178     fail("Should throw " + exceptionName);
1179     }
1180    
1181     /**
1182 jsr166 1.222 * The maximum number of consecutive spurious wakeups we should
1183     * tolerate (from APIs like LockSupport.park) before failing a test.
1184     */
1185     static final int MAX_SPURIOUS_WAKEUPS = 10;
1186    
1187     /**
1188 dl 1.1 * The number of elements to place in collections, arrays, etc.
1189     */
1190 jsr166 1.45 public static final int SIZE = 20;
1191 dl 1.1
1192     // Some convenient Integer constants
1193    
1194 jsr166 1.47 public static final Integer zero = new Integer(0);
1195     public static final Integer one = new Integer(1);
1196     public static final Integer two = new Integer(2);
1197     public static final Integer three = new Integer(3);
1198 jsr166 1.45 public static final Integer four = new Integer(4);
1199     public static final Integer five = new Integer(5);
1200 jsr166 1.47 public static final Integer six = new Integer(6);
1201 jsr166 1.45 public static final Integer seven = new Integer(7);
1202     public static final Integer eight = new Integer(8);
1203 jsr166 1.47 public static final Integer nine = new Integer(9);
1204 jsr166 1.45 public static final Integer m1 = new Integer(-1);
1205     public static final Integer m2 = new Integer(-2);
1206     public static final Integer m3 = new Integer(-3);
1207 jsr166 1.47 public static final Integer m4 = new Integer(-4);
1208     public static final Integer m5 = new Integer(-5);
1209     public static final Integer m6 = new Integer(-6);
1210 jsr166 1.45 public static final Integer m10 = new Integer(-10);
1211 dl 1.7
1212     /**
1213 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
1214     * the specified permissions. If there is no current security
1215     * manager, the runnable is run twice, both with and without a
1216     * security manager. We require that any security manager permit
1217     * getPolicy/setPolicy.
1218     */
1219     public void runWithPermissions(Runnable r, Permission... permissions) {
1220     SecurityManager sm = System.getSecurityManager();
1221     if (sm == null) {
1222     r.run();
1223 jsr166 1.93 }
1224     runWithSecurityManagerWithPermissions(r, permissions);
1225     }
1226    
1227     /**
1228     * Runs Runnable r with a security policy that permits precisely
1229     * the specified permissions. If there is no current security
1230     * manager, a temporary one is set for the duration of the
1231     * Runnable. We require that any security manager permit
1232     * getPolicy/setPolicy.
1233     */
1234     public void runWithSecurityManagerWithPermissions(Runnable r,
1235     Permission... permissions) {
1236     SecurityManager sm = System.getSecurityManager();
1237     if (sm == null) {
1238 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
1239     try {
1240     Policy.setPolicy(permissivePolicy());
1241     System.setSecurityManager(new SecurityManager());
1242 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
1243 jsr166 1.49 } finally {
1244     System.setSecurityManager(null);
1245     Policy.setPolicy(savedPolicy);
1246     }
1247     } else {
1248     Policy savedPolicy = Policy.getPolicy();
1249     AdjustablePolicy policy = new AdjustablePolicy(permissions);
1250     Policy.setPolicy(policy);
1251    
1252     try {
1253     r.run();
1254     } finally {
1255     policy.addPermission(new SecurityPermission("setPolicy"));
1256     Policy.setPolicy(savedPolicy);
1257     }
1258     }
1259     }
1260    
1261     /**
1262     * Runs a runnable without any permissions.
1263     */
1264     public void runWithoutPermissions(Runnable r) {
1265     runWithPermissions(r);
1266     }
1267    
1268     /**
1269 dl 1.7 * A security policy where new permissions can be dynamically added
1270     * or all cleared.
1271     */
1272 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1273 dl 1.7 Permissions perms = new Permissions();
1274 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1275     for (Permission permission : permissions)
1276     perms.add(permission);
1277     }
1278 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1279     void clearPermissions() { perms = new Permissions(); }
1280 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1281     return perms;
1282     }
1283     public PermissionCollection getPermissions(ProtectionDomain pd) {
1284     return perms;
1285     }
1286     public boolean implies(ProtectionDomain pd, Permission p) {
1287     return perms.implies(p);
1288     }
1289     public void refresh() {}
1290 jsr166 1.93 public String toString() {
1291 jsr166 1.216 List<Permission> ps = new ArrayList<>();
1292 jsr166 1.93 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1293     ps.add(e.nextElement());
1294     return "AdjustablePolicy with permissions " + ps;
1295     }
1296 dl 1.7 }
1297 dl 1.1
1298 jsr166 1.38 /**
1299 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1300     */
1301     public static Policy permissivePolicy() {
1302     return new AdjustablePolicy
1303     // Permissions j.u.c. needs directly
1304     (new RuntimePermission("modifyThread"),
1305     new RuntimePermission("getClassLoader"),
1306     new RuntimePermission("setContextClassLoader"),
1307     // Permissions needed to change permissions!
1308     new SecurityPermission("getPolicy"),
1309     new SecurityPermission("setPolicy"),
1310     new RuntimePermission("setSecurityManager"),
1311     // Permissions needed by the junit test harness
1312     new RuntimePermission("accessDeclaredMembers"),
1313     new PropertyPermission("*", "read"),
1314     new java.io.FilePermission("<<ALL FILES>>", "read"));
1315     }
1316    
1317     /**
1318 jsr166 1.60 * Sleeps until the given time has elapsed.
1319 jsr166 1.239 * Throws AssertionError if interrupted.
1320 jsr166 1.60 */
1321 jsr166 1.201 static void sleep(long millis) {
1322 jsr166 1.60 try {
1323 dl 1.76 delay(millis);
1324 jsr166 1.128 } catch (InterruptedException fail) {
1325 jsr166 1.239 throw new AssertionError("Unexpected InterruptedException", fail);
1326 jsr166 1.60 }
1327     }
1328    
1329     /**
1330 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1331 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1332 jsr166 1.248 * @param waitingForGodot if non-null, an additional condition to satisfy
1333 jsr166 1.65 */
1334 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis,
1335     Callable<Boolean> waitingForGodot) {
1336     for (long startTime = 0L;;) {
1337     switch (thread.getState()) {
1338 jsr166 1.250 default: break;
1339 jsr166 1.248 case BLOCKED: case WAITING: case TIMED_WAITING:
1340     try {
1341     if (waitingForGodot == null || waitingForGodot.call())
1342     return;
1343     } catch (Throwable fail) { threadUnexpectedException(fail); }
1344     break;
1345     case TERMINATED:
1346 jsr166 1.67 fail("Unexpected thread termination");
1347 jsr166 1.248 }
1348    
1349     if (startTime == 0L)
1350 jsr166 1.199 startTime = System.nanoTime();
1351 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1352 jsr166 1.248 assertTrue(thread.isAlive());
1353     if (waitingForGodot == null
1354     || thread.getState() == Thread.State.RUNNABLE)
1355     fail("timed out waiting for thread to enter wait state");
1356     else
1357     fail("timed out waiting for condition, thread state="
1358     + thread.getState());
1359 jsr166 1.67 }
1360 jsr166 1.65 Thread.yield();
1361     }
1362     }
1363    
1364     /**
1365 jsr166 1.219 * Spin-waits up to the specified number of milliseconds for the given
1366 jsr166 1.248 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1367 jsr166 1.219 */
1368 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1369     waitForThreadToEnterWaitState(thread, timeoutMillis, null);
1370 jsr166 1.219 }
1371    
1372     /**
1373     * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1374     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1375 jsr166 1.75 */
1376     void waitForThreadToEnterWaitState(Thread thread) {
1377 jsr166 1.248 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, null);
1378 jsr166 1.75 }
1379    
1380     /**
1381 jsr166 1.219 * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1382     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
1383     * and additionally satisfy the given condition.
1384     */
1385 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread,
1386     Callable<Boolean> waitingForGodot) {
1387 jsr166 1.219 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, waitingForGodot);
1388     }
1389    
1390     /**
1391 jsr166 1.257 * Spin-waits up to LONG_DELAY_MS milliseconds for the current thread to
1392     * be interrupted. Clears the interrupt status before returning.
1393     */
1394     void awaitInterrupted() {
1395     for (long startTime = 0L; !Thread.interrupted(); ) {
1396     if (startTime == 0L)
1397     startTime = System.nanoTime();
1398     else if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1399     fail("timed out waiting for thread interrupt");
1400     Thread.yield();
1401     }
1402     }
1403    
1404     /**
1405 jsr166 1.66 * Returns the number of milliseconds since time given by
1406     * startNanoTime, which must have been previously returned from a
1407 jsr166 1.124 * call to {@link System#nanoTime()}.
1408 jsr166 1.66 */
1409 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1410 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1411     }
1412 jsr166 1.68
1413 jsr166 1.120 /**
1414     * Checks that timed f.get() returns the expected value, and does not
1415     * wait for the timeout to elapse before returning.
1416     */
1417     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1418     long startTime = System.nanoTime();
1419 jsr166 1.245 T actual = null;
1420 jsr166 1.120 try {
1421 jsr166 1.245 actual = f.get(timeoutMillis, MILLISECONDS);
1422 jsr166 1.120 } catch (Throwable fail) { threadUnexpectedException(fail); }
1423 jsr166 1.245 assertEquals(expectedValue, actual);
1424 jsr166 1.120 if (millisElapsedSince(startTime) > timeoutMillis/2)
1425 jsr166 1.239 throw new AssertionError("timed get did not return promptly");
1426 jsr166 1.120 }
1427    
1428     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1429     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1430     }
1431    
1432 jsr166 1.66 /**
1433 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1434 jsr166 1.38 */
1435     Thread newStartedThread(Runnable runnable) {
1436     Thread t = new Thread(runnable);
1437 jsr166 1.58 t.setDaemon(true);
1438 jsr166 1.38 t.start();
1439     return t;
1440     }
1441 dl 1.1
1442 jsr166 1.59 /**
1443     * Waits for the specified time (in milliseconds) for the thread
1444     * to terminate (using {@link Thread#join(long)}), else interrupts
1445     * the thread (in the hope that it may terminate later) and fails.
1446     */
1447 jsr166 1.261 void awaitTermination(Thread thread, long timeoutMillis) {
1448 jsr166 1.59 try {
1449 jsr166 1.261 thread.join(timeoutMillis);
1450 jsr166 1.128 } catch (InterruptedException fail) {
1451     threadUnexpectedException(fail);
1452 jsr166 1.258 }
1453 jsr166 1.261 if (thread.getState() != Thread.State.TERMINATED) {
1454     String detail = String.format(
1455     "timed out waiting for thread to terminate, thread=%s, state=%s" ,
1456     thread, thread.getState());
1457     try {
1458     threadFail(detail);
1459     } finally {
1460 jsr166 1.262 // Interrupt thread __after__ having reported its stack trace
1461 jsr166 1.261 thread.interrupt();
1462     }
1463 jsr166 1.59 }
1464     }
1465    
1466 jsr166 1.75 /**
1467     * Waits for LONG_DELAY_MS milliseconds for the thread to
1468     * terminate (using {@link Thread#join(long)}), else interrupts
1469     * the thread (in the hope that it may terminate later) and fails.
1470     */
1471     void awaitTermination(Thread t) {
1472     awaitTermination(t, LONG_DELAY_MS);
1473     }
1474    
1475 dl 1.1 // Some convenient Runnable classes
1476    
1477 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1478     protected abstract void realRun() throws Throwable;
1479 jsr166 1.35
1480     public final void run() {
1481     try {
1482     realRun();
1483 jsr166 1.128 } catch (Throwable fail) {
1484     threadUnexpectedException(fail);
1485 jsr166 1.35 }
1486     }
1487     }
1488    
1489 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1490     protected abstract void realRun() throws Throwable;
1491 jsr166 1.40
1492     final Class<?> exceptionClass;
1493    
1494     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1495     this.exceptionClass = exceptionClass;
1496     }
1497    
1498     public final void run() {
1499     try {
1500     realRun();
1501     } catch (Throwable t) {
1502     if (! exceptionClass.isInstance(t))
1503     threadUnexpectedException(t);
1504 jsr166 1.248 return;
1505 jsr166 1.40 }
1506 jsr166 1.248 threadShouldThrow(exceptionClass.getSimpleName());
1507 jsr166 1.40 }
1508     }
1509    
1510 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1511     protected abstract void realRun() throws Throwable;
1512 jsr166 1.35
1513     public final void run() {
1514     try {
1515     realRun();
1516     } catch (InterruptedException success) {
1517 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1518 jsr166 1.248 return;
1519 jsr166 1.128 } catch (Throwable fail) {
1520     threadUnexpectedException(fail);
1521 jsr166 1.35 }
1522 jsr166 1.248 threadShouldThrow("InterruptedException");
1523 jsr166 1.35 }
1524     }
1525    
1526 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1527     protected abstract T realCall() throws Throwable;
1528 jsr166 1.35
1529     public final T call() {
1530     try {
1531     return realCall();
1532 jsr166 1.128 } catch (Throwable fail) {
1533     threadUnexpectedException(fail);
1534 jsr166 1.40 }
1535 jsr166 1.248 throw new AssertionError("unreached");
1536 jsr166 1.35 }
1537     }
1538    
1539 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1540 dl 1.1 public void run() {}
1541     }
1542    
1543 jsr166 1.45 public static class NoOpCallable implements Callable {
1544 dl 1.1 public Object call() { return Boolean.TRUE; }
1545 dl 1.10 }
1546    
1547 jsr166 1.45 public static final String TEST_STRING = "a test string";
1548 dl 1.10
1549 jsr166 1.45 public static class StringTask implements Callable<String> {
1550 jsr166 1.144 final String value;
1551     public StringTask() { this(TEST_STRING); }
1552     public StringTask(String value) { this.value = value; }
1553     public String call() { return value; }
1554 dl 1.10 }
1555    
1556 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1557     return new CheckedCallable<String>() {
1558 jsr166 1.64 protected String realCall() {
1559 jsr166 1.48 try {
1560     latch.await();
1561     } catch (InterruptedException quittingTime) {}
1562     return TEST_STRING;
1563     }};
1564     }
1565    
1566 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1567     return new CheckedRunnable() {
1568     public void realRun() throws InterruptedException {
1569     latch.countDown();
1570     }};
1571     }
1572    
1573 jsr166 1.161 class LatchAwaiter extends CheckedRunnable {
1574 jsr166 1.162 static final int NEW = 0;
1575     static final int RUNNING = 1;
1576     static final int DONE = 2;
1577 jsr166 1.161 final CountDownLatch latch;
1578     int state = NEW;
1579     LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1580     public void realRun() throws InterruptedException {
1581     state = 1;
1582     await(latch);
1583     state = 2;
1584     }
1585     }
1586 jsr166 1.162
1587 jsr166 1.161 public LatchAwaiter awaiter(CountDownLatch latch) {
1588     return new LatchAwaiter(latch);
1589 jsr166 1.73 }
1590    
1591 jsr166 1.188 public void await(CountDownLatch latch, long timeoutMillis) {
1592 jsr166 1.246 boolean timedOut = false;
1593 jsr166 1.79 try {
1594 jsr166 1.246 timedOut = !latch.await(timeoutMillis, MILLISECONDS);
1595 jsr166 1.128 } catch (Throwable fail) {
1596     threadUnexpectedException(fail);
1597 jsr166 1.79 }
1598 jsr166 1.246 if (timedOut)
1599     fail("timed out waiting for CountDownLatch for "
1600     + (timeoutMillis/1000) + " sec");
1601 jsr166 1.79 }
1602    
1603 jsr166 1.188 public void await(CountDownLatch latch) {
1604     await(latch, LONG_DELAY_MS);
1605     }
1606    
1607 jsr166 1.89 public void await(Semaphore semaphore) {
1608 jsr166 1.246 boolean timedOut = false;
1609 jsr166 1.89 try {
1610 jsr166 1.246 timedOut = !semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS);
1611 jsr166 1.128 } catch (Throwable fail) {
1612     threadUnexpectedException(fail);
1613 jsr166 1.89 }
1614 jsr166 1.246 if (timedOut)
1615     fail("timed out waiting for Semaphore for "
1616     + (LONG_DELAY_MS/1000) + " sec");
1617 jsr166 1.89 }
1618    
1619 jsr166 1.226 public void await(CyclicBarrier barrier) {
1620     try {
1621     barrier.await(LONG_DELAY_MS, MILLISECONDS);
1622     } catch (Throwable fail) {
1623     threadUnexpectedException(fail);
1624     }
1625     }
1626    
1627 jsr166 1.81 // /**
1628     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1629     // */
1630     // public void await(AtomicBoolean flag) {
1631     // await(flag, LONG_DELAY_MS);
1632     // }
1633    
1634     // /**
1635     // * Spin-waits up to the specified timeout until flag becomes true.
1636     // */
1637     // public void await(AtomicBoolean flag, long timeoutMillis) {
1638     // long startTime = System.nanoTime();
1639     // while (!flag.get()) {
1640     // if (millisElapsedSince(startTime) > timeoutMillis)
1641 jsr166 1.239 // throw new AssertionError("timed out");
1642 jsr166 1.81 // Thread.yield();
1643     // }
1644     // }
1645    
1646 jsr166 1.45 public static class NPETask implements Callable<String> {
1647 dl 1.10 public String call() { throw new NullPointerException(); }
1648     }
1649    
1650 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1651     return new CheckedRunnable() {
1652     protected void realRun() {
1653     try {
1654 dl 1.76 delay(timeoutMillis);
1655 jsr166 1.63 } catch (InterruptedException ok) {}
1656     }};
1657     }
1658    
1659 dl 1.5 /**
1660     * For use as ThreadFactory in constructors
1661     */
1662 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1663 jsr166 1.33 public Thread newThread(Runnable r) {
1664 dl 1.5 return new Thread(r);
1665 jsr166 1.27 }
1666 dl 1.5 }
1667    
1668 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1669     boolean isDone();
1670     }
1671    
1672 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1673     public volatile boolean done = false;
1674 dl 1.6 public void run() {
1675     done = true;
1676 dl 1.5 }
1677     }
1678    
1679 jsr166 1.53 /**
1680     * Analog of CheckedRunnable for RecursiveAction
1681     */
1682     public abstract class CheckedRecursiveAction extends RecursiveAction {
1683     protected abstract void realCompute() throws Throwable;
1684    
1685 jsr166 1.108 @Override protected final void compute() {
1686 jsr166 1.53 try {
1687     realCompute();
1688 jsr166 1.128 } catch (Throwable fail) {
1689     threadUnexpectedException(fail);
1690 jsr166 1.53 }
1691     }
1692     }
1693    
1694     /**
1695     * Analog of CheckedCallable for RecursiveTask
1696     */
1697     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1698     protected abstract T realCompute() throws Throwable;
1699    
1700 jsr166 1.108 @Override protected final T compute() {
1701 jsr166 1.53 try {
1702     return realCompute();
1703 jsr166 1.128 } catch (Throwable fail) {
1704     threadUnexpectedException(fail);
1705 jsr166 1.53 }
1706 jsr166 1.248 throw new AssertionError("unreached");
1707 jsr166 1.53 }
1708     }
1709 dl 1.5
1710     /**
1711     * For use as RejectedExecutionHandler in constructors
1712     */
1713 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1714 jsr166 1.35 public void rejectedExecution(Runnable r,
1715     ThreadPoolExecutor executor) {}
1716 dl 1.5 }
1717 jsr166 1.27
1718 jsr166 1.60 /**
1719 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1720 jsr166 1.239 * AssertionErrors instead of throwing checked exceptions.
1721 jsr166 1.60 */
1722 jsr166 1.202 public static class CheckedBarrier extends CyclicBarrier {
1723 jsr166 1.60 public CheckedBarrier(int parties) { super(parties); }
1724    
1725     public int await() {
1726     try {
1727 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1728 jsr166 1.128 } catch (TimeoutException timedOut) {
1729 jsr166 1.239 throw new AssertionError("timed out");
1730 jsr166 1.128 } catch (Exception fail) {
1731 jsr166 1.239 throw new AssertionError("Unexpected exception: " + fail, fail);
1732 jsr166 1.60 }
1733     }
1734     }
1735    
1736 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1737 jsr166 1.72 try {
1738     assertTrue(q.isEmpty());
1739     assertEquals(0, q.size());
1740     assertNull(q.peek());
1741     assertNull(q.poll());
1742 jsr166 1.232 assertNull(q.poll(randomExpiredTimeout(), randomTimeUnit()));
1743 jsr166 1.72 assertEquals(q.toString(), "[]");
1744     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1745     assertFalse(q.iterator().hasNext());
1746     try {
1747     q.element();
1748     shouldThrow();
1749     } catch (NoSuchElementException success) {}
1750     try {
1751     q.iterator().next();
1752     shouldThrow();
1753     } catch (NoSuchElementException success) {}
1754     try {
1755     q.remove();
1756     shouldThrow();
1757     } catch (NoSuchElementException success) {}
1758 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1759 jsr166 1.72 }
1760    
1761 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1762     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1763     }
1764    
1765     void assertNotSerialEquals(Object x, Object y) {
1766     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1767     }
1768    
1769     byte[] serialBytes(Object o) {
1770 jsr166 1.79 try {
1771     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1772     ObjectOutputStream oos = new ObjectOutputStream(bos);
1773     oos.writeObject(o);
1774     oos.flush();
1775     oos.close();
1776 jsr166 1.91 return bos.toByteArray();
1777 jsr166 1.128 } catch (Throwable fail) {
1778     threadUnexpectedException(fail);
1779 jsr166 1.91 return new byte[0];
1780     }
1781     }
1782    
1783 jsr166 1.253 void assertImmutable(Object o) {
1784 jsr166 1.208 if (o instanceof Collection) {
1785     assertThrows(
1786     UnsupportedOperationException.class,
1787 jsr166 1.253 () -> ((Collection) o).add(null));
1788 jsr166 1.208 }
1789     }
1790 jsr166 1.209
1791 jsr166 1.91 @SuppressWarnings("unchecked")
1792     <T> T serialClone(T o) {
1793 jsr166 1.247 T clone = null;
1794 jsr166 1.91 try {
1795 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1796 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1797 jsr166 1.247 clone = (T) ois.readObject();
1798 jsr166 1.128 } catch (Throwable fail) {
1799     threadUnexpectedException(fail);
1800 jsr166 1.79 }
1801 jsr166 1.247 if (o == clone) assertImmutable(o);
1802     else assertSame(o.getClass(), clone.getClass());
1803     return clone;
1804 jsr166 1.79 }
1805 jsr166 1.106
1806 jsr166 1.208 /**
1807 jsr166 1.211 * A version of serialClone that leaves error handling (for
1808     * e.g. NotSerializableException) up to the caller.
1809     */
1810     @SuppressWarnings("unchecked")
1811     <T> T serialClonePossiblyFailing(T o)
1812     throws ReflectiveOperationException, java.io.IOException {
1813     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1814     ObjectOutputStream oos = new ObjectOutputStream(bos);
1815     oos.writeObject(o);
1816     oos.flush();
1817     oos.close();
1818     ObjectInputStream ois = new ObjectInputStream
1819     (new ByteArrayInputStream(bos.toByteArray()));
1820     T clone = (T) ois.readObject();
1821     if (o == clone) assertImmutable(o);
1822 jsr166 1.247 else assertSame(o.getClass(), clone.getClass());
1823 jsr166 1.211 return clone;
1824     }
1825    
1826     /**
1827 jsr166 1.208 * If o implements Cloneable and has a public clone method,
1828     * returns a clone of o, else null.
1829     */
1830     @SuppressWarnings("unchecked")
1831     <T> T cloneableClone(T o) {
1832     if (!(o instanceof Cloneable)) return null;
1833     final T clone;
1834     try {
1835     clone = (T) o.getClass().getMethod("clone").invoke(o);
1836     } catch (NoSuchMethodException ok) {
1837     return null;
1838     } catch (ReflectiveOperationException unexpected) {
1839     throw new Error(unexpected);
1840     }
1841     assertNotSame(o, clone); // not 100% guaranteed by spec
1842     assertSame(o.getClass(), clone.getClass());
1843     return clone;
1844     }
1845    
1846 jsr166 1.106 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1847 jsr166 1.253 Action... throwingActions) {
1848     for (Action throwingAction : throwingActions) {
1849 jsr166 1.106 boolean threw = false;
1850     try { throwingAction.run(); }
1851     catch (Throwable t) {
1852     threw = true;
1853 jsr166 1.239 if (!expectedExceptionClass.isInstance(t))
1854     throw new AssertionError(
1855     "Expected " + expectedExceptionClass.getName() +
1856     ", got " + t.getClass().getName(),
1857     t);
1858 jsr166 1.106 }
1859     if (!threw)
1860     shouldThrow(expectedExceptionClass.getName());
1861     }
1862     }
1863 jsr166 1.126
1864     public void assertIteratorExhausted(Iterator<?> it) {
1865     try {
1866     it.next();
1867     shouldThrow();
1868     } catch (NoSuchElementException success) {}
1869     assertFalse(it.hasNext());
1870 jsr166 1.127 }
1871 jsr166 1.191
1872     public <T> Callable<T> callableThrowing(final Exception ex) {
1873     return new Callable<T>() { public T call() throws Exception { throw ex; }};
1874     }
1875    
1876     public Runnable runnableThrowing(final RuntimeException ex) {
1877     return new Runnable() { public void run() { throw ex; }};
1878     }
1879 jsr166 1.193
1880     /** A reusable thread pool to be shared by tests. */
1881     static final ExecutorService cachedThreadPool =
1882     new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1883     1000L, MILLISECONDS,
1884     new SynchronousQueue<Runnable>());
1885    
1886 jsr166 1.234 static <T> void shuffle(T[] array) {
1887     Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1888     }
1889    
1890 jsr166 1.236 /**
1891     * Returns the same String as would be returned by {@link
1892     * Object#toString}, whether or not the given object's class
1893     * overrides toString().
1894     *
1895     * @see System#identityHashCode
1896     */
1897     static String identityString(Object x) {
1898     return x.getClass().getName()
1899     + "@" + Integer.toHexString(System.identityHashCode(x));
1900     }
1901    
1902 jsr166 1.234 // --- Shared assertions for Executor tests ---
1903    
1904 jsr166 1.233 /**
1905     * Returns maximum number of tasks that can be submitted to given
1906     * pool (with bounded queue) before saturation (when submission
1907     * throws RejectedExecutionException).
1908     */
1909     static final int saturatedSize(ThreadPoolExecutor pool) {
1910     BlockingQueue<Runnable> q = pool.getQueue();
1911     return pool.getMaximumPoolSize() + q.size() + q.remainingCapacity();
1912     }
1913    
1914 jsr166 1.234 @SuppressWarnings("FutureReturnValueIgnored")
1915     void assertNullTaskSubmissionThrowsNullPointerException(Executor e) {
1916     try {
1917     e.execute((Runnable) null);
1918     shouldThrow();
1919     } catch (NullPointerException success) {}
1920    
1921     if (! (e instanceof ExecutorService)) return;
1922     ExecutorService es = (ExecutorService) e;
1923     try {
1924     es.submit((Runnable) null);
1925     shouldThrow();
1926     } catch (NullPointerException success) {}
1927     try {
1928     es.submit((Runnable) null, Boolean.TRUE);
1929     shouldThrow();
1930     } catch (NullPointerException success) {}
1931     try {
1932     es.submit((Callable) null);
1933     shouldThrow();
1934     } catch (NullPointerException success) {}
1935    
1936     if (! (e instanceof ScheduledExecutorService)) return;
1937     ScheduledExecutorService ses = (ScheduledExecutorService) e;
1938     try {
1939     ses.schedule((Runnable) null,
1940     randomTimeout(), randomTimeUnit());
1941     shouldThrow();
1942     } catch (NullPointerException success) {}
1943     try {
1944     ses.schedule((Callable) null,
1945     randomTimeout(), randomTimeUnit());
1946     shouldThrow();
1947     } catch (NullPointerException success) {}
1948     try {
1949     ses.scheduleAtFixedRate((Runnable) null,
1950     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1951     shouldThrow();
1952     } catch (NullPointerException success) {}
1953     try {
1954     ses.scheduleWithFixedDelay((Runnable) null,
1955     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1956     shouldThrow();
1957     } catch (NullPointerException success) {}
1958     }
1959    
1960     void setRejectedExecutionHandler(
1961     ThreadPoolExecutor p, RejectedExecutionHandler handler) {
1962     p.setRejectedExecutionHandler(handler);
1963     assertSame(handler, p.getRejectedExecutionHandler());
1964     }
1965    
1966     void assertTaskSubmissionsAreRejected(ThreadPoolExecutor p) {
1967     final RejectedExecutionHandler savedHandler = p.getRejectedExecutionHandler();
1968     final long savedTaskCount = p.getTaskCount();
1969     final long savedCompletedTaskCount = p.getCompletedTaskCount();
1970     final int savedQueueSize = p.getQueue().size();
1971     final boolean stock = (p.getClass().getClassLoader() == null);
1972    
1973     Runnable r = () -> {};
1974     Callable<Boolean> c = () -> Boolean.TRUE;
1975    
1976     class Recorder implements RejectedExecutionHandler {
1977     public volatile Runnable r = null;
1978     public volatile ThreadPoolExecutor p = null;
1979     public void reset() { r = null; p = null; }
1980     public void rejectedExecution(Runnable r, ThreadPoolExecutor p) {
1981     assertNull(this.r);
1982     assertNull(this.p);
1983     this.r = r;
1984     this.p = p;
1985     }
1986     }
1987    
1988     // check custom handler is invoked exactly once per task
1989     Recorder recorder = new Recorder();
1990     setRejectedExecutionHandler(p, recorder);
1991     for (int i = 2; i--> 0; ) {
1992     recorder.reset();
1993     p.execute(r);
1994     if (stock && p.getClass() == ThreadPoolExecutor.class)
1995     assertSame(r, recorder.r);
1996     assertSame(p, recorder.p);
1997    
1998     recorder.reset();
1999     assertFalse(p.submit(r).isDone());
2000     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2001     assertSame(p, recorder.p);
2002    
2003     recorder.reset();
2004     assertFalse(p.submit(r, Boolean.TRUE).isDone());
2005     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2006     assertSame(p, recorder.p);
2007    
2008     recorder.reset();
2009     assertFalse(p.submit(c).isDone());
2010     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2011     assertSame(p, recorder.p);
2012    
2013     if (p instanceof ScheduledExecutorService) {
2014     ScheduledExecutorService s = (ScheduledExecutorService) p;
2015     ScheduledFuture<?> future;
2016    
2017     recorder.reset();
2018     future = s.schedule(r, randomTimeout(), randomTimeUnit());
2019     assertFalse(future.isDone());
2020     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2021     assertSame(p, recorder.p);
2022    
2023     recorder.reset();
2024     future = s.schedule(c, randomTimeout(), randomTimeUnit());
2025     assertFalse(future.isDone());
2026     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2027     assertSame(p, recorder.p);
2028    
2029     recorder.reset();
2030     future = s.scheduleAtFixedRate(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2031     assertFalse(future.isDone());
2032     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2033     assertSame(p, recorder.p);
2034    
2035     recorder.reset();
2036     future = s.scheduleWithFixedDelay(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2037     assertFalse(future.isDone());
2038     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2039     assertSame(p, recorder.p);
2040     }
2041     }
2042    
2043     // Checking our custom handler above should be sufficient, but
2044     // we add some integration tests of standard handlers.
2045     final AtomicReference<Thread> thread = new AtomicReference<>();
2046     final Runnable setThread = () -> thread.set(Thread.currentThread());
2047    
2048     setRejectedExecutionHandler(p, new ThreadPoolExecutor.AbortPolicy());
2049     try {
2050     p.execute(setThread);
2051     shouldThrow();
2052     } catch (RejectedExecutionException success) {}
2053     assertNull(thread.get());
2054    
2055     setRejectedExecutionHandler(p, new ThreadPoolExecutor.DiscardPolicy());
2056     p.execute(setThread);
2057     assertNull(thread.get());
2058    
2059     setRejectedExecutionHandler(p, new ThreadPoolExecutor.CallerRunsPolicy());
2060     p.execute(setThread);
2061     if (p.isShutdown())
2062     assertNull(thread.get());
2063     else
2064     assertSame(Thread.currentThread(), thread.get());
2065    
2066     setRejectedExecutionHandler(p, savedHandler);
2067    
2068     // check that pool was not perturbed by handlers
2069     assertEquals(savedTaskCount, p.getTaskCount());
2070     assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
2071     assertEquals(savedQueueSize, p.getQueue().size());
2072 jsr166 1.200 }
2073 jsr166 1.243
2074     void assertCollectionsEquals(Collection<?> x, Collection<?> y) {
2075     assertEquals(x, y);
2076     assertEquals(y, x);
2077     assertEquals(x.isEmpty(), y.isEmpty());
2078     assertEquals(x.size(), y.size());
2079     if (x instanceof List) {
2080     assertEquals(x.toString(), y.toString());
2081     }
2082     if (x instanceof List || x instanceof Set) {
2083     assertEquals(x.hashCode(), y.hashCode());
2084     }
2085     if (x instanceof List || x instanceof Deque) {
2086     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2087     assertTrue(Arrays.equals(x.toArray(new Object[0]),
2088     y.toArray(new Object[0])));
2089     }
2090     }
2091    
2092     /**
2093     * A weaker form of assertCollectionsEquals which does not insist
2094     * that the two collections satisfy Object#equals(Object), since
2095     * they may use identity semantics as Deques do.
2096     */
2097     void assertCollectionsEquivalent(Collection<?> x, Collection<?> y) {
2098     if (x instanceof List || x instanceof Set)
2099     assertCollectionsEquals(x, y);
2100     else {
2101     assertEquals(x.isEmpty(), y.isEmpty());
2102     assertEquals(x.size(), y.size());
2103     assertEquals(new HashSet(x), new HashSet(y));
2104     if (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 dl 1.1 }