ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.237
Committed: Wed Aug 23 05:33:00 2017 UTC (6 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.236: +1 -0 lines
Log Message:
8186171: HashMap: Entry.setValue may not work after Iterator.remove() called for previous entries

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