ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.222
Committed: Fri May 12 18:12:51 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.221: +6 -0 lines
Log Message:
introduce MAX_SPURIOUS_WAKEUPS

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