ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.157
Committed: Sat Oct 3 22:20:05 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.156: +3 -1 lines
Log Message:
avoid spurious checkForWedgedTest reports with enormous runsPerTest

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.13 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.74 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.27 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.123 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10 jsr166 1.156 import static java.util.concurrent.TimeUnit.MINUTES;
11 jsr166 1.123 import static java.util.concurrent.TimeUnit.NANOSECONDS;
12    
13 jsr166 1.79 import java.io.ByteArrayInputStream;
14     import java.io.ByteArrayOutputStream;
15     import java.io.ObjectInputStream;
16     import java.io.ObjectOutputStream;
17 jsr166 1.96 import java.lang.management.ManagementFactory;
18     import java.lang.management.ThreadInfo;
19 jsr166 1.150 import java.lang.management.ThreadMXBean;
20 jsr166 1.134 import java.lang.reflect.Constructor;
21 jsr166 1.97 import java.lang.reflect.Method;
22 jsr166 1.134 import java.lang.reflect.Modifier;
23 jsr166 1.123 import java.security.CodeSource;
24     import java.security.Permission;
25     import java.security.PermissionCollection;
26     import java.security.Permissions;
27     import java.security.Policy;
28     import java.security.ProtectionDomain;
29     import java.security.SecurityPermission;
30 jsr166 1.93 import java.util.ArrayList;
31 jsr166 1.72 import java.util.Arrays;
32 jsr166 1.81 import java.util.Date;
33 jsr166 1.93 import java.util.Enumeration;
34 jsr166 1.126 import java.util.Iterator;
35 jsr166 1.93 import java.util.List;
36 jsr166 1.72 import java.util.NoSuchElementException;
37 jsr166 1.53 import java.util.PropertyPermission;
38 jsr166 1.123 import java.util.concurrent.BlockingQueue;
39     import java.util.concurrent.Callable;
40     import java.util.concurrent.CountDownLatch;
41     import java.util.concurrent.CyclicBarrier;
42 jsr166 1.139 import java.util.concurrent.ExecutionException;
43     import java.util.concurrent.Executors;
44 jsr166 1.123 import java.util.concurrent.ExecutorService;
45 jsr166 1.146 import java.util.concurrent.ForkJoinPool;
46 jsr166 1.123 import java.util.concurrent.Future;
47     import java.util.concurrent.RecursiveAction;
48     import java.util.concurrent.RecursiveTask;
49     import java.util.concurrent.RejectedExecutionHandler;
50     import java.util.concurrent.Semaphore;
51     import java.util.concurrent.ThreadFactory;
52     import java.util.concurrent.ThreadPoolExecutor;
53     import java.util.concurrent.TimeoutException;
54 jsr166 1.53 import java.util.concurrent.atomic.AtomicReference;
55 jsr166 1.114 import java.util.regex.Pattern;
56 jsr166 1.123
57     import junit.framework.AssertionFailedError;
58     import junit.framework.Test;
59     import junit.framework.TestCase;
60 jsr166 1.131 import junit.framework.TestResult;
61 jsr166 1.123 import junit.framework.TestSuite;
62 dl 1.1
63     /**
64 dl 1.5 * Base class for JSR166 Junit TCK tests. Defines some constants,
65     * utility methods and classes, as well as a simple framework for
66     * helping to make sure that assertions failing in generated threads
67     * cause the associated test that generated them to itself fail (which
68 jsr166 1.27 * JUnit does not otherwise arrange). The rules for creating such
69 dl 1.5 * tests are:
70 dl 1.1 *
71     * <ol>
72     *
73 jsr166 1.143 * <li>All assertions in code running in generated threads must use
74 jsr166 1.27 * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
75 dl 1.18 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
76 jsr166 1.50 * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
77 dl 1.1 * particularly recommended) for other code to use these forms too.
78     * Only the most typically used JUnit assertion methods are defined
79 jsr166 1.143 * this way, but enough to live with.
80 dl 1.1 *
81 jsr166 1.143 * <li>If you override {@link #setUp} or {@link #tearDown}, make sure
82 jsr166 1.50 * to invoke {@code super.setUp} and {@code super.tearDown} within
83 dl 1.1 * them. These methods are used to clear and check for thread
84 jsr166 1.143 * assertion failures.
85 dl 1.1 *
86 jsr166 1.51 * <li>All delays and timeouts must use one of the constants {@code
87 jsr166 1.50 * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
88     * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
89 dl 1.5 * discriminable from zero time, and always allows enough time for the
90     * small amounts of computation (creating a thread, calling a few
91 dl 1.1 * methods, etc) needed to reach a timeout point. Similarly, a SMALL
92     * is always discriminable as larger than SHORT and smaller than
93     * MEDIUM. And so on. These constants are set to conservative values,
94 dl 1.2 * but even so, if there is ever any doubt, they can all be increased
95 jsr166 1.143 * in one spot to rerun tests on slower platforms.
96 dl 1.1 *
97 jsr166 1.143 * <li>All threads generated must be joined inside each test case
98 jsr166 1.50 * method (or {@code fail} to do so) before returning from the
99     * method. The {@code joinPool} method can be used to do this when
100 jsr166 1.143 * using Executors.
101 dl 1.1 *
102     * </ol>
103 dl 1.6 *
104 jsr166 1.92 * <p><b>Other notes</b>
105 dl 1.6 * <ul>
106     *
107 jsr166 1.143 * <li>Usually, there is one testcase method per JSR166 method
108 dl 1.6 * covering "normal" operation, and then as many exception-testing
109     * methods as there are exceptions the method can throw. Sometimes
110     * there are multiple tests per JSR166 method when the different
111     * "normal" behaviors differ significantly. And sometimes testcases
112     * cover multiple methods when they cannot be tested in
113 jsr166 1.143 * isolation.
114 jsr166 1.27 *
115 jsr166 1.143 * <li>The documentation style for testcases is to provide as javadoc
116 dl 1.6 * a simple sentence or two describing the property that the testcase
117     * method purports to test. The javadocs do not say anything about how
118 jsr166 1.143 * the property is tested. To find out, read the code.
119 dl 1.6 *
120 jsr166 1.143 * <li>These tests are "conformance tests", and do not attempt to
121 dl 1.6 * test throughput, latency, scalability or other performance factors
122     * (see the separate "jtreg" tests for a set intended to check these
123     * for the most central aspects of functionality.) So, most tests use
124     * the smallest sensible numbers of threads, collection sizes, etc
125 jsr166 1.143 * needed to check basic conformance.
126 dl 1.6 *
127     * <li>The test classes currently do not declare inclusion in
128     * any particular package to simplify things for people integrating
129 jsr166 1.143 * them in TCK test suites.
130 dl 1.6 *
131 jsr166 1.143 * <li>As a convenience, the {@code main} of this class (JSR166TestCase)
132     * runs all JSR166 unit tests.
133 dl 1.6 *
134     * </ul>
135 dl 1.1 */
136     public class JSR166TestCase extends TestCase {
137 jsr166 1.49 private static final boolean useSecurityManager =
138     Boolean.getBoolean("jsr166.useSecurityManager");
139    
140 jsr166 1.62 protected static final boolean expensiveTests =
141     Boolean.getBoolean("jsr166.expensiveTests");
142    
143 jsr166 1.119 /**
144     * If true, also run tests that are not part of the official tck
145     * because they test unspecified implementation details.
146     */
147 jsr166 1.118 protected static final boolean testImplementationDetails =
148     Boolean.getBoolean("jsr166.testImplementationDetails");
149    
150 dl 1.6 /**
151 jsr166 1.61 * If true, report on stdout all "slow" tests, that is, ones that
152     * take more than profileThreshold milliseconds to execute.
153     */
154     private static final boolean profileTests =
155     Boolean.getBoolean("jsr166.profileTests");
156    
157     /**
158     * The number of milliseconds that tests are permitted for
159     * execution without being reported, when profileTests is set.
160     */
161     private static final long profileThreshold =
162     Long.getLong("jsr166.profileThreshold", 100);
163    
164 jsr166 1.107 /**
165     * The number of repetitions per test (for tickling rare bugs).
166     */
167     private static final int runsPerTest =
168     Integer.getInteger("jsr166.runsPerTest", 1);
169    
170 jsr166 1.114 /**
171 jsr166 1.131 * The number of repetitions of the test suite (for finding leaks?).
172     */
173     private static final int suiteRuns =
174     Integer.getInteger("jsr166.suiteRuns", 1);
175    
176 jsr166 1.134 public JSR166TestCase() { super(); }
177     public JSR166TestCase(String name) { super(name); }
178    
179 jsr166 1.131 /**
180 jsr166 1.114 * A filter for tests to run, matching strings of the form
181     * methodName(className), e.g. "testInvokeAll5(ForkJoinPoolTest)"
182     * Usefully combined with jsr166.runsPerTest.
183     */
184     private static final Pattern methodFilter = methodFilter();
185    
186     private static Pattern methodFilter() {
187     String regex = System.getProperty("jsr166.methodFilter");
188     return (regex == null) ? null : Pattern.compile(regex);
189     }
190    
191 jsr166 1.156 static volatile TestCase currentTestCase;
192     static {
193     Runnable checkForWedgedTest = new Runnable() { public void run() {
194 jsr166 1.157 // avoid spurious reports with enormous runsPerTest
195     final int timeoutMinutes = Math.max(runsPerTest / 10, 1);
196 jsr166 1.156 for (TestCase lastTestCase = currentTestCase;;) {
197 jsr166 1.157 try { MINUTES.sleep(timeoutMinutes); }
198 jsr166 1.156 catch (InterruptedException unexpected) { break; }
199     if (lastTestCase == currentTestCase) {
200     System.err.println
201     ("Looks like we're stuck running test: "
202     + lastTestCase);
203     dumpTestThreads();
204     }
205     lastTestCase = currentTestCase;
206     }}};
207     Thread thread = new Thread(checkForWedgedTest, "checkForWedgedTest");
208     thread.setDaemon(true);
209     thread.start();
210     }
211    
212 jsr166 1.147 public void runBare() throws Throwable {
213 jsr166 1.156 currentTestCase = this;
214 jsr166 1.147 if (methodFilter == null
215     || methodFilter.matcher(toString()).find())
216     super.runBare();
217     }
218    
219 jsr166 1.61 protected void runTest() throws Throwable {
220 jsr166 1.147 for (int i = 0; i < runsPerTest; i++) {
221     if (profileTests)
222     runTestProfiled();
223     else
224     super.runTest();
225 jsr166 1.107 }
226 jsr166 1.61 }
227    
228     protected void runTestProfiled() throws Throwable {
229 jsr166 1.145 for (int i = 0; i < 2; i++) {
230     long startTime = System.nanoTime();
231 jsr166 1.61 super.runTest();
232 jsr166 1.145 long elapsedMillis = millisElapsedSince(startTime);
233     if (elapsedMillis < profileThreshold)
234     break;
235     // Never report first run of any test; treat it as a
236     // warmup run, notably to trigger all needed classloading,
237     if (i > 0)
238 jsr166 1.61 System.out.printf("%n%s: %d%n", toString(), elapsedMillis);
239     }
240     }
241 jsr166 1.63
242 jsr166 1.61 /**
243 jsr166 1.94 * Runs all JSR166 unit tests using junit.textui.TestRunner.
244 jsr166 1.27 */
245 jsr166 1.41 public static void main(String[] args) {
246 jsr166 1.131 main(suite(), args);
247     }
248    
249     /**
250     * Runs all unit tests in the given test suite.
251 jsr166 1.132 * Actual behavior influenced by jsr166.* system properties.
252 jsr166 1.131 */
253     static void main(Test suite, String[] args) {
254 jsr166 1.49 if (useSecurityManager) {
255     System.err.println("Setting a permissive security manager");
256     Policy.setPolicy(permissivePolicy());
257     System.setSecurityManager(new SecurityManager());
258     }
259 jsr166 1.131 for (int i = 0; i < suiteRuns; i++) {
260     TestResult result = junit.textui.TestRunner.run(suite);
261     if (!result.wasSuccessful())
262     System.exit(1);
263 dl 1.22 System.gc();
264     System.runFinalization();
265     }
266 dl 1.6 }
267    
268 jsr166 1.60 public static TestSuite newTestSuite(Object... suiteOrClasses) {
269     TestSuite suite = new TestSuite();
270     for (Object suiteOrClass : suiteOrClasses) {
271     if (suiteOrClass instanceof TestSuite)
272     suite.addTest((TestSuite) suiteOrClass);
273     else if (suiteOrClass instanceof Class)
274     suite.addTest(new TestSuite((Class<?>) suiteOrClass));
275     else
276     throw new ClassCastException("not a test suite or class");
277     }
278     return suite;
279     }
280    
281 jsr166 1.98 public static void addNamedTestClasses(TestSuite suite,
282     String... testClassNames) {
283     for (String testClassName : testClassNames) {
284     try {
285     Class<?> testClass = Class.forName(testClassName);
286     Method m = testClass.getDeclaredMethod("suite",
287     new Class<?>[0]);
288     suite.addTest(newTestSuite((Test)m.invoke(null)));
289     } catch (Exception e) {
290     throw new Error("Missing test class", e);
291     }
292 jsr166 1.97 }
293     }
294    
295     public static final double JAVA_CLASS_VERSION;
296 jsr166 1.115 public static final String JAVA_SPECIFICATION_VERSION;
297 jsr166 1.97 static {
298     try {
299     JAVA_CLASS_VERSION = java.security.AccessController.doPrivileged(
300     new java.security.PrivilegedAction<Double>() {
301     public Double run() {
302     return Double.valueOf(System.getProperty("java.class.version"));}});
303 jsr166 1.115 JAVA_SPECIFICATION_VERSION = java.security.AccessController.doPrivileged(
304     new java.security.PrivilegedAction<String>() {
305     public String run() {
306     return System.getProperty("java.specification.version");}});
307 jsr166 1.97 } catch (Throwable t) {
308     throw new Error(t);
309     }
310     }
311    
312 jsr166 1.98 public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
313     public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
314     public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
315 jsr166 1.136 public static boolean atLeastJava9() {
316 jsr166 1.137 return JAVA_CLASS_VERSION >= 53.0
317     // As of 2015-09, java9 still uses 52.0 class file version
318     || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?(9|[0-9][0-9])$");
319 jsr166 1.136 }
320     public static boolean atLeastJava10() {
321 jsr166 1.137 return JAVA_CLASS_VERSION >= 54.0
322     || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?[0-9][0-9]$");
323 jsr166 1.136 }
324 jsr166 1.97
325 dl 1.6 /**
326 jsr166 1.60 * Collects all JSR166 unit tests as one suite.
327 jsr166 1.27 */
328 jsr166 1.41 public static Test suite() {
329 jsr166 1.98 // Java7+ test classes
330 jsr166 1.97 TestSuite suite = newTestSuite(
331 jsr166 1.60 ForkJoinPoolTest.suite(),
332     ForkJoinTaskTest.suite(),
333     RecursiveActionTest.suite(),
334     RecursiveTaskTest.suite(),
335     LinkedTransferQueueTest.suite(),
336     PhaserTest.suite(),
337     ThreadLocalRandomTest.suite(),
338     AbstractExecutorServiceTest.suite(),
339     AbstractQueueTest.suite(),
340     AbstractQueuedSynchronizerTest.suite(),
341     AbstractQueuedLongSynchronizerTest.suite(),
342     ArrayBlockingQueueTest.suite(),
343     ArrayDequeTest.suite(),
344     AtomicBooleanTest.suite(),
345     AtomicIntegerArrayTest.suite(),
346     AtomicIntegerFieldUpdaterTest.suite(),
347     AtomicIntegerTest.suite(),
348     AtomicLongArrayTest.suite(),
349     AtomicLongFieldUpdaterTest.suite(),
350     AtomicLongTest.suite(),
351     AtomicMarkableReferenceTest.suite(),
352     AtomicReferenceArrayTest.suite(),
353     AtomicReferenceFieldUpdaterTest.suite(),
354     AtomicReferenceTest.suite(),
355     AtomicStampedReferenceTest.suite(),
356     ConcurrentHashMapTest.suite(),
357     ConcurrentLinkedDequeTest.suite(),
358     ConcurrentLinkedQueueTest.suite(),
359     ConcurrentSkipListMapTest.suite(),
360     ConcurrentSkipListSubMapTest.suite(),
361     ConcurrentSkipListSetTest.suite(),
362     ConcurrentSkipListSubSetTest.suite(),
363     CopyOnWriteArrayListTest.suite(),
364     CopyOnWriteArraySetTest.suite(),
365     CountDownLatchTest.suite(),
366     CyclicBarrierTest.suite(),
367     DelayQueueTest.suite(),
368     EntryTest.suite(),
369     ExchangerTest.suite(),
370     ExecutorsTest.suite(),
371     ExecutorCompletionServiceTest.suite(),
372     FutureTaskTest.suite(),
373     LinkedBlockingDequeTest.suite(),
374     LinkedBlockingQueueTest.suite(),
375     LinkedListTest.suite(),
376     LockSupportTest.suite(),
377     PriorityBlockingQueueTest.suite(),
378     PriorityQueueTest.suite(),
379     ReentrantLockTest.suite(),
380     ReentrantReadWriteLockTest.suite(),
381     ScheduledExecutorTest.suite(),
382     ScheduledExecutorSubclassTest.suite(),
383     SemaphoreTest.suite(),
384     SynchronousQueueTest.suite(),
385     SystemTest.suite(),
386     ThreadLocalTest.suite(),
387     ThreadPoolExecutorTest.suite(),
388     ThreadPoolExecutorSubclassTest.suite(),
389     ThreadTest.suite(),
390     TimeUnitTest.suite(),
391     TreeMapTest.suite(),
392     TreeSetTest.suite(),
393     TreeSubMapTest.suite(),
394     TreeSubSetTest.suite());
395 jsr166 1.98
396     // Java8+ test classes
397     if (atLeastJava8()) {
398     String[] java8TestClassNames = {
399 dl 1.113 "Atomic8Test",
400 dl 1.104 "CompletableFutureTest",
401 dl 1.105 "ConcurrentHashMap8Test",
402 dl 1.104 "CountedCompleterTest",
403     "DoubleAccumulatorTest",
404 dl 1.103 "DoubleAdderTest",
405 jsr166 1.102 "ForkJoinPool8Test",
406 dl 1.111 "ForkJoinTask8Test",
407 dl 1.104 "LongAccumulatorTest",
408     "LongAdderTest",
409 jsr166 1.110 "SplittableRandomTest",
410 jsr166 1.98 "StampedLockTest",
411 dl 1.140 "SubmissionPublisherTest",
412 jsr166 1.112 "ThreadLocalRandom8Test",
413 jsr166 1.98 };
414     addNamedTestClasses(suite, java8TestClassNames);
415 jsr166 1.97 }
416 jsr166 1.98
417 jsr166 1.115 // Java9+ test classes
418     if (atLeastJava9()) {
419     String[] java9TestClassNames = {
420 jsr166 1.142 // Currently empty, but expecting varhandle tests
421 jsr166 1.115 };
422     addNamedTestClasses(suite, java9TestClassNames);
423     }
424    
425 jsr166 1.97 return suite;
426 dl 1.6 }
427    
428 jsr166 1.134 /** Returns list of junit-style test method names in given class. */
429     public static ArrayList<String> testMethodNames(Class<?> testClass) {
430     Method[] methods = testClass.getDeclaredMethods();
431     ArrayList<String> names = new ArrayList<String>(methods.length);
432     for (Method method : methods) {
433     if (method.getName().startsWith("test")
434     && Modifier.isPublic(method.getModifiers())
435     // method.getParameterCount() requires jdk8+
436     && method.getParameterTypes().length == 0) {
437     names.add(method.getName());
438     }
439     }
440     return names;
441     }
442    
443     /**
444     * Returns junit-style testSuite for the given test class, but
445     * parameterized by passing extra data to each test.
446     */
447     public static <ExtraData> Test parameterizedTestSuite
448     (Class<? extends JSR166TestCase> testClass,
449     Class<ExtraData> dataClass,
450     ExtraData data) {
451     try {
452     TestSuite suite = new TestSuite();
453     Constructor c =
454     testClass.getDeclaredConstructor(dataClass, String.class);
455     for (String methodName : testMethodNames(testClass))
456     suite.addTest((Test) c.newInstance(data, methodName));
457     return suite;
458     } catch (Exception e) {
459     throw new Error(e);
460     }
461     }
462    
463     /**
464     * Returns junit-style testSuite for the jdk8 extension of the
465     * given test class, but parameterized by passing extra data to
466     * each test. Uses reflection to allow compilation in jdk7.
467     */
468     public static <ExtraData> Test jdk8ParameterizedTestSuite
469     (Class<? extends JSR166TestCase> testClass,
470     Class<ExtraData> dataClass,
471     ExtraData data) {
472     if (atLeastJava8()) {
473     String name = testClass.getName();
474     String name8 = name.replaceAll("Test$", "8Test");
475     if (name.equals(name8)) throw new Error(name);
476     try {
477     return (Test)
478     Class.forName(name8)
479     .getMethod("testSuite", new Class[] { dataClass })
480     .invoke(null, data);
481     } catch (Exception e) {
482     throw new Error(e);
483     }
484     } else {
485     return new TestSuite();
486     }
487     }
488    
489 jsr166 1.109 // Delays for timing-dependent tests, in milliseconds.
490 dl 1.1
491 dl 1.2 public static long SHORT_DELAY_MS;
492     public static long SMALL_DELAY_MS;
493     public static long MEDIUM_DELAY_MS;
494     public static long LONG_DELAY_MS;
495    
496     /**
497 jsr166 1.27 * Returns the shortest timed delay. This could
498 dl 1.15 * be reimplemented to use for example a Property.
499 jsr166 1.27 */
500 dl 1.2 protected long getShortDelay() {
501 dl 1.21 return 50;
502 dl 1.2 }
503    
504     /**
505 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
506 dl 1.2 */
507 jsr166 1.43 protected void setDelays() {
508 dl 1.2 SHORT_DELAY_MS = getShortDelay();
509 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
510 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
511 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
512 dl 1.2 }
513    
514 dl 1.1 /**
515 jsr166 1.81 * Returns a timeout in milliseconds to be used in tests that
516     * verify that operations block or time out.
517     */
518     long timeoutMillis() {
519     return SHORT_DELAY_MS / 4;
520     }
521    
522     /**
523 jsr166 1.135 * Returns a new Date instance representing a time at least
524     * delayMillis milliseconds in the future.
525 jsr166 1.81 */
526     Date delayedDate(long delayMillis) {
527 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
528     return new Date(System.currentTimeMillis() + delayMillis + 1);
529 jsr166 1.81 }
530    
531     /**
532 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
533 dl 1.1 */
534 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
535     = new AtomicReference<Throwable>(null);
536 dl 1.1
537     /**
538 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
539     * harness thread, triggering a test case failure. Only the first
540     * failure is recorded; subsequent calls to this method from within
541     * the same test have no effect.
542 dl 1.1 */
543 jsr166 1.53 public void threadRecordFailure(Throwable t) {
544 jsr166 1.156 dumpTestThreads();
545 jsr166 1.53 threadFailure.compareAndSet(null, t);
546     }
547    
548 jsr166 1.27 public void setUp() {
549 dl 1.2 setDelays();
550 dl 1.1 }
551    
552 jsr166 1.146 void tearDownFail(String format, Object... args) {
553     String msg = toString() + ": " + String.format(format, args);
554     System.err.println(msg);
555 jsr166 1.156 dumpTestThreads();
556 jsr166 1.146 throw new AssertionFailedError(msg);
557     }
558    
559 dl 1.1 /**
560 jsr166 1.85 * Extra checks that get done for all test cases.
561     *
562 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
563     * by rethrowing, in the test harness thread, any exception recorded
564     * earlier by threadRecordFailure.
565 jsr166 1.85 *
566     * Triggers test case failure if interrupt status is set in the main thread.
567 jsr166 1.53 */
568     public void tearDown() throws Exception {
569 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
570 jsr166 1.53 if (t != null) {
571     if (t instanceof Error)
572     throw (Error) t;
573     else if (t instanceof RuntimeException)
574     throw (RuntimeException) t;
575     else if (t instanceof Exception)
576     throw (Exception) t;
577 jsr166 1.57 else {
578     AssertionFailedError afe =
579     new AssertionFailedError(t.toString());
580     afe.initCause(t);
581     throw afe;
582     }
583 jsr166 1.53 }
584 jsr166 1.85
585     if (Thread.interrupted())
586 jsr166 1.146 tearDownFail("interrupt status set in main thread");
587 jsr166 1.100
588     checkForkJoinPoolThreadLeaks();
589 dl 1.1 }
590    
591 dl 1.5 /**
592 jsr166 1.125 * Finds missing try { ... } finally { joinPool(e); }
593 jsr166 1.100 */
594     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
595 jsr166 1.146 Thread[] survivors = new Thread[7];
596 jsr166 1.100 int count = Thread.enumerate(survivors);
597     for (int i = 0; i < count; i++) {
598     Thread thread = survivors[i];
599     String name = thread.getName();
600     if (name.startsWith("ForkJoinPool-")) {
601     // give thread some time to terminate
602     thread.join(LONG_DELAY_MS);
603 jsr166 1.146 if (thread.isAlive())
604     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
605     thread);
606 jsr166 1.100 }
607     }
608 jsr166 1.146
609     if (!ForkJoinPool.commonPool()
610     .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
611     tearDownFail("ForkJoin common pool thread stuck");
612 jsr166 1.100 }
613 jsr166 1.101
614 jsr166 1.100 /**
615 jsr166 1.53 * Just like fail(reason), but additionally recording (using
616 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
617     * the current testcase will fail.
618 jsr166 1.27 */
619 dl 1.1 public void threadFail(String reason) {
620 jsr166 1.53 try {
621     fail(reason);
622 jsr166 1.57 } catch (AssertionFailedError t) {
623 jsr166 1.53 threadRecordFailure(t);
624 jsr166 1.152 throw t;
625 jsr166 1.53 }
626 dl 1.1 }
627    
628 dl 1.5 /**
629 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
630 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
631     * the current testcase will fail.
632 jsr166 1.27 */
633 dl 1.1 public void threadAssertTrue(boolean b) {
634 jsr166 1.53 try {
635 dl 1.1 assertTrue(b);
636 jsr166 1.57 } catch (AssertionFailedError t) {
637 jsr166 1.53 threadRecordFailure(t);
638     throw t;
639 dl 1.1 }
640     }
641 dl 1.5
642     /**
643 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
644 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
645     * the current testcase will fail.
646 jsr166 1.27 */
647 dl 1.1 public void threadAssertFalse(boolean b) {
648 jsr166 1.53 try {
649 dl 1.1 assertFalse(b);
650 jsr166 1.57 } catch (AssertionFailedError t) {
651 jsr166 1.53 threadRecordFailure(t);
652     throw t;
653 dl 1.1 }
654     }
655 dl 1.5
656     /**
657 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
658 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
659     * the current testcase will fail.
660 jsr166 1.27 */
661 dl 1.1 public void threadAssertNull(Object x) {
662 jsr166 1.53 try {
663 dl 1.1 assertNull(x);
664 jsr166 1.57 } catch (AssertionFailedError t) {
665 jsr166 1.53 threadRecordFailure(t);
666     throw t;
667 dl 1.1 }
668     }
669 dl 1.5
670     /**
671 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
672 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
673     * the current testcase will fail.
674 jsr166 1.27 */
675 dl 1.1 public void threadAssertEquals(long x, long y) {
676 jsr166 1.53 try {
677 dl 1.1 assertEquals(x, y);
678 jsr166 1.57 } catch (AssertionFailedError t) {
679 jsr166 1.53 threadRecordFailure(t);
680     throw t;
681 dl 1.1 }
682     }
683 dl 1.5
684     /**
685 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
686 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
687     * the current testcase will fail.
688 jsr166 1.27 */
689 dl 1.1 public void threadAssertEquals(Object x, Object y) {
690 jsr166 1.53 try {
691 dl 1.1 assertEquals(x, y);
692 jsr166 1.129 } catch (AssertionFailedError fail) {
693     threadRecordFailure(fail);
694     throw fail;
695     } catch (Throwable fail) {
696     threadUnexpectedException(fail);
697 dl 1.1 }
698     }
699    
700 dl 1.5 /**
701 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
702 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
703     * the current testcase will fail.
704 jsr166 1.52 */
705     public void threadAssertSame(Object x, Object y) {
706 jsr166 1.53 try {
707 jsr166 1.52 assertSame(x, y);
708 jsr166 1.129 } catch (AssertionFailedError fail) {
709     threadRecordFailure(fail);
710     throw fail;
711 jsr166 1.52 }
712     }
713    
714     /**
715 jsr166 1.53 * Calls threadFail with message "should throw exception".
716 jsr166 1.33 */
717 dl 1.3 public void threadShouldThrow() {
718 jsr166 1.53 threadFail("should throw exception");
719 dl 1.3 }
720    
721 dl 1.5 /**
722 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
723 jsr166 1.40 */
724     public void threadShouldThrow(String exceptionName) {
725 jsr166 1.53 threadFail("should throw " + exceptionName);
726 dl 1.3 }
727    
728 dl 1.31 /**
729 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
730     * then rethrows the exception, wrapping it in an
731     * AssertionFailedError if necessary.
732 dl 1.31 */
733 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
734     threadRecordFailure(t);
735     t.printStackTrace();
736     if (t instanceof RuntimeException)
737     throw (RuntimeException) t;
738     else if (t instanceof Error)
739     throw (Error) t;
740     else {
741 jsr166 1.57 AssertionFailedError afe =
742     new AssertionFailedError("unexpected exception: " + t);
743 jsr166 1.82 afe.initCause(t);
744 jsr166 1.57 throw afe;
745 jsr166 1.55 }
746 dl 1.31 }
747 dl 1.3
748 dl 1.1 /**
749 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
750 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
751     * until time elapses.
752     */
753 jsr166 1.81 static void delay(long millis) throws InterruptedException {
754 dl 1.76 long startTime = System.nanoTime();
755 jsr166 1.80 long ns = millis * 1000 * 1000;
756 dl 1.76 for (;;) {
757 jsr166 1.80 if (millis > 0L)
758     Thread.sleep(millis);
759 dl 1.76 else // too short to sleep
760     Thread.yield();
761     long d = ns - (System.nanoTime() - startTime);
762     if (d > 0L)
763 jsr166 1.80 millis = d / (1000 * 1000);
764 dl 1.76 else
765     break;
766     }
767     }
768    
769     /**
770 jsr166 1.149 * Allows use of try-with-resources with per-test thread pools.
771     */
772     static class PoolCloser<T extends ExecutorService>
773     implements AutoCloseable {
774     public final T pool;
775     public PoolCloser(T pool) { this.pool = pool; }
776     public void close() { joinPool(pool); }
777     }
778    
779     /**
780 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
781 dl 1.1 */
782 jsr166 1.149 static void joinPool(ExecutorService pool) {
783 dl 1.1 try {
784 jsr166 1.139 pool.shutdown();
785     if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS))
786     fail("ExecutorService " + pool +
787 jsr166 1.121 " did not terminate in a timely manner");
788 jsr166 1.33 } catch (SecurityException ok) {
789 dl 1.22 // Allowed in case test doesn't have privs
790 jsr166 1.128 } catch (InterruptedException fail) {
791 jsr166 1.44 fail("Unexpected InterruptedException");
792 dl 1.1 }
793     }
794    
795 jsr166 1.139 /** Like Runnable, but with the freedom to throw anything */
796 jsr166 1.141 interface Action { public void run() throws Throwable; }
797 jsr166 1.139
798     /**
799 jsr166 1.141 * Runs all the given actions in parallel, failing if any fail.
800 jsr166 1.139 * Useful for running multiple variants of tests that are
801     * necessarily individually slow because they must block.
802     */
803 jsr166 1.141 void testInParallel(Action ... actions) {
804 jsr166 1.151 try (PoolCloser<ExecutorService> poolCloser
805     = new PoolCloser<>(Executors.newCachedThreadPool())) {
806     ExecutorService pool = poolCloser.pool;
807 jsr166 1.141 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
808     for (final Action action : actions)
809 jsr166 1.139 futures.add(pool.submit(new CheckedRunnable() {
810 jsr166 1.141 public void realRun() throws Throwable { action.run();}}));
811 jsr166 1.139 for (Future<?> future : futures)
812     try {
813     assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
814     } catch (ExecutionException ex) {
815     threadUnexpectedException(ex.getCause());
816     } catch (Exception ex) {
817     threadUnexpectedException(ex);
818     }
819     }
820     }
821    
822 jsr166 1.78 /**
823 jsr166 1.156 * A debugging tool to print stack traces of most threads, as jstack does.
824 jsr166 1.150 * Uninteresting threads are filtered out.
825 jsr166 1.95 */
826 jsr166 1.156 static void dumpTestThreads() {
827 jsr166 1.150 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
828     System.err.println("------ stacktrace dump start ------");
829     for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
830     String name = info.getThreadName();
831     if ("Signal Dispatcher".equals(name))
832     continue;
833     if ("Reference Handler".equals(name)
834     && info.getLockName().startsWith("java.lang.ref.Reference$Lock"))
835     continue;
836     if ("Finalizer".equals(name)
837     && info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock"))
838     continue;
839 jsr166 1.156 if ("checkForWedgedTest".equals(name))
840     continue;
841 jsr166 1.96 System.err.print(info);
842 jsr166 1.150 }
843     System.err.println("------ stacktrace dump end ------");
844 jsr166 1.95 }
845    
846     /**
847 jsr166 1.81 * Checks that thread does not terminate within the default
848     * millisecond delay of {@code timeoutMillis()}.
849     */
850     void assertThreadStaysAlive(Thread thread) {
851     assertThreadStaysAlive(thread, timeoutMillis());
852     }
853    
854     /**
855 jsr166 1.80 * Checks that thread does not terminate within the given millisecond delay.
856 jsr166 1.78 */
857 jsr166 1.81 void assertThreadStaysAlive(Thread thread, long millis) {
858 jsr166 1.78 try {
859 jsr166 1.80 // No need to optimize the failing case via Thread.join.
860     delay(millis);
861 jsr166 1.78 assertTrue(thread.isAlive());
862 jsr166 1.128 } catch (InterruptedException fail) {
863 jsr166 1.78 fail("Unexpected InterruptedException");
864     }
865     }
866 dl 1.5
867     /**
868 jsr166 1.90 * Checks that the threads do not terminate within the default
869     * millisecond delay of {@code timeoutMillis()}.
870     */
871     void assertThreadsStayAlive(Thread... threads) {
872     assertThreadsStayAlive(timeoutMillis(), threads);
873     }
874    
875     /**
876     * Checks that the threads do not terminate within the given millisecond delay.
877     */
878     void assertThreadsStayAlive(long millis, Thread... threads) {
879     try {
880     // No need to optimize the failing case via Thread.join.
881     delay(millis);
882     for (Thread thread : threads)
883     assertTrue(thread.isAlive());
884 jsr166 1.128 } catch (InterruptedException fail) {
885 jsr166 1.90 fail("Unexpected InterruptedException");
886     }
887     }
888    
889     /**
890 jsr166 1.83 * Checks that future.get times out, with the default timeout of
891     * {@code timeoutMillis()}.
892     */
893     void assertFutureTimesOut(Future future) {
894     assertFutureTimesOut(future, timeoutMillis());
895     }
896    
897     /**
898     * Checks that future.get times out, with the given millisecond timeout.
899     */
900     void assertFutureTimesOut(Future future, long timeoutMillis) {
901     long startTime = System.nanoTime();
902     try {
903     future.get(timeoutMillis, MILLISECONDS);
904     shouldThrow();
905     } catch (TimeoutException success) {
906 jsr166 1.128 } catch (Exception fail) {
907     threadUnexpectedException(fail);
908 jsr166 1.83 } finally { future.cancel(true); }
909     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
910     }
911    
912     /**
913 jsr166 1.53 * Fails with message "should throw exception".
914 jsr166 1.27 */
915 dl 1.3 public void shouldThrow() {
916     fail("Should throw exception");
917     }
918    
919 dl 1.5 /**
920 jsr166 1.53 * Fails with message "should throw " + exceptionName.
921 jsr166 1.40 */
922     public void shouldThrow(String exceptionName) {
923     fail("Should throw " + exceptionName);
924     }
925    
926     /**
927 dl 1.1 * The number of elements to place in collections, arrays, etc.
928     */
929 jsr166 1.45 public static final int SIZE = 20;
930 dl 1.1
931     // Some convenient Integer constants
932    
933 jsr166 1.47 public static final Integer zero = new Integer(0);
934     public static final Integer one = new Integer(1);
935     public static final Integer two = new Integer(2);
936     public static final Integer three = new Integer(3);
937 jsr166 1.45 public static final Integer four = new Integer(4);
938     public static final Integer five = new Integer(5);
939 jsr166 1.47 public static final Integer six = new Integer(6);
940 jsr166 1.45 public static final Integer seven = new Integer(7);
941     public static final Integer eight = new Integer(8);
942 jsr166 1.47 public static final Integer nine = new Integer(9);
943 jsr166 1.45 public static final Integer m1 = new Integer(-1);
944     public static final Integer m2 = new Integer(-2);
945     public static final Integer m3 = new Integer(-3);
946 jsr166 1.47 public static final Integer m4 = new Integer(-4);
947     public static final Integer m5 = new Integer(-5);
948     public static final Integer m6 = new Integer(-6);
949 jsr166 1.45 public static final Integer m10 = new Integer(-10);
950 dl 1.7
951     /**
952 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
953     * the specified permissions. If there is no current security
954     * manager, the runnable is run twice, both with and without a
955     * security manager. We require that any security manager permit
956     * getPolicy/setPolicy.
957     */
958     public void runWithPermissions(Runnable r, Permission... permissions) {
959     SecurityManager sm = System.getSecurityManager();
960     if (sm == null) {
961     r.run();
962 jsr166 1.93 }
963     runWithSecurityManagerWithPermissions(r, permissions);
964     }
965    
966     /**
967     * Runs Runnable r with a security policy that permits precisely
968     * the specified permissions. If there is no current security
969     * manager, a temporary one is set for the duration of the
970     * Runnable. We require that any security manager permit
971     * getPolicy/setPolicy.
972     */
973     public void runWithSecurityManagerWithPermissions(Runnable r,
974     Permission... permissions) {
975     SecurityManager sm = System.getSecurityManager();
976     if (sm == null) {
977 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
978     try {
979     Policy.setPolicy(permissivePolicy());
980     System.setSecurityManager(new SecurityManager());
981 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
982 jsr166 1.49 } finally {
983     System.setSecurityManager(null);
984     Policy.setPolicy(savedPolicy);
985     }
986     } else {
987     Policy savedPolicy = Policy.getPolicy();
988     AdjustablePolicy policy = new AdjustablePolicy(permissions);
989     Policy.setPolicy(policy);
990    
991     try {
992     r.run();
993     } finally {
994     policy.addPermission(new SecurityPermission("setPolicy"));
995     Policy.setPolicy(savedPolicy);
996     }
997     }
998     }
999    
1000     /**
1001     * Runs a runnable without any permissions.
1002     */
1003     public void runWithoutPermissions(Runnable r) {
1004     runWithPermissions(r);
1005     }
1006    
1007     /**
1008 dl 1.7 * A security policy where new permissions can be dynamically added
1009     * or all cleared.
1010     */
1011 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1012 dl 1.7 Permissions perms = new Permissions();
1013 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1014     for (Permission permission : permissions)
1015     perms.add(permission);
1016     }
1017 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1018     void clearPermissions() { perms = new Permissions(); }
1019 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1020     return perms;
1021     }
1022     public PermissionCollection getPermissions(ProtectionDomain pd) {
1023     return perms;
1024     }
1025     public boolean implies(ProtectionDomain pd, Permission p) {
1026     return perms.implies(p);
1027     }
1028     public void refresh() {}
1029 jsr166 1.93 public String toString() {
1030     List<Permission> ps = new ArrayList<Permission>();
1031     for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1032     ps.add(e.nextElement());
1033     return "AdjustablePolicy with permissions " + ps;
1034     }
1035 dl 1.7 }
1036 dl 1.1
1037 jsr166 1.38 /**
1038 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1039     */
1040     public static Policy permissivePolicy() {
1041     return new AdjustablePolicy
1042     // Permissions j.u.c. needs directly
1043     (new RuntimePermission("modifyThread"),
1044     new RuntimePermission("getClassLoader"),
1045     new RuntimePermission("setContextClassLoader"),
1046     // Permissions needed to change permissions!
1047     new SecurityPermission("getPolicy"),
1048     new SecurityPermission("setPolicy"),
1049     new RuntimePermission("setSecurityManager"),
1050     // Permissions needed by the junit test harness
1051     new RuntimePermission("accessDeclaredMembers"),
1052     new PropertyPermission("*", "read"),
1053     new java.io.FilePermission("<<ALL FILES>>", "read"));
1054     }
1055    
1056     /**
1057 jsr166 1.60 * Sleeps until the given time has elapsed.
1058     * Throws AssertionFailedError if interrupted.
1059     */
1060     void sleep(long millis) {
1061     try {
1062 dl 1.76 delay(millis);
1063 jsr166 1.128 } catch (InterruptedException fail) {
1064 jsr166 1.60 AssertionFailedError afe =
1065     new AssertionFailedError("Unexpected InterruptedException");
1066 jsr166 1.128 afe.initCause(fail);
1067 jsr166 1.60 throw afe;
1068     }
1069     }
1070    
1071     /**
1072 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1073 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1074     */
1075     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1076 jsr166 1.88 long startTime = System.nanoTime();
1077 jsr166 1.65 for (;;) {
1078     Thread.State s = thread.getState();
1079     if (s == Thread.State.BLOCKED ||
1080     s == Thread.State.WAITING ||
1081 jsr166 1.67 s == Thread.State.TIMED_WAITING)
1082 jsr166 1.65 return;
1083 jsr166 1.67 else if (s == Thread.State.TERMINATED)
1084     fail("Unexpected thread termination");
1085 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1086 jsr166 1.67 threadAssertTrue(thread.isAlive());
1087     return;
1088     }
1089 jsr166 1.65 Thread.yield();
1090     }
1091     }
1092    
1093     /**
1094 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1095     * state: BLOCKED, WAITING, or TIMED_WAITING.
1096     */
1097     void waitForThreadToEnterWaitState(Thread thread) {
1098     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1099     }
1100    
1101     /**
1102 jsr166 1.66 * Returns the number of milliseconds since time given by
1103     * startNanoTime, which must have been previously returned from a
1104 jsr166 1.124 * call to {@link System#nanoTime()}.
1105 jsr166 1.66 */
1106 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1107 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1108     }
1109 jsr166 1.68
1110 jsr166 1.120 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1111     // long startTime = System.nanoTime();
1112     // try {
1113     // r.run();
1114     // } catch (Throwable fail) { threadUnexpectedException(fail); }
1115     // if (millisElapsedSince(startTime) > timeoutMillis/2)
1116     // throw new AssertionFailedError("did not return promptly");
1117     // }
1118    
1119     // void assertTerminatesPromptly(Runnable r) {
1120     // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1121     // }
1122    
1123     /**
1124     * Checks that timed f.get() returns the expected value, and does not
1125     * wait for the timeout to elapse before returning.
1126     */
1127     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1128     long startTime = System.nanoTime();
1129     try {
1130     assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1131     } catch (Throwable fail) { threadUnexpectedException(fail); }
1132     if (millisElapsedSince(startTime) > timeoutMillis/2)
1133     throw new AssertionFailedError("timed get did not return promptly");
1134     }
1135    
1136     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1137     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1138     }
1139    
1140 jsr166 1.66 /**
1141 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1142 jsr166 1.38 */
1143     Thread newStartedThread(Runnable runnable) {
1144     Thread t = new Thread(runnable);
1145 jsr166 1.58 t.setDaemon(true);
1146 jsr166 1.38 t.start();
1147     return t;
1148     }
1149 dl 1.1
1150 jsr166 1.59 /**
1151     * Waits for the specified time (in milliseconds) for the thread
1152     * to terminate (using {@link Thread#join(long)}), else interrupts
1153     * the thread (in the hope that it may terminate later) and fails.
1154     */
1155     void awaitTermination(Thread t, long timeoutMillis) {
1156     try {
1157     t.join(timeoutMillis);
1158 jsr166 1.128 } catch (InterruptedException fail) {
1159     threadUnexpectedException(fail);
1160 jsr166 1.59 } finally {
1161 jsr166 1.83 if (t.getState() != Thread.State.TERMINATED) {
1162 jsr166 1.59 t.interrupt();
1163     fail("Test timed out");
1164     }
1165     }
1166     }
1167    
1168 jsr166 1.75 /**
1169     * Waits for LONG_DELAY_MS milliseconds for the thread to
1170     * terminate (using {@link Thread#join(long)}), else interrupts
1171     * the thread (in the hope that it may terminate later) and fails.
1172     */
1173     void awaitTermination(Thread t) {
1174     awaitTermination(t, LONG_DELAY_MS);
1175     }
1176    
1177 dl 1.1 // Some convenient Runnable classes
1178    
1179 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1180     protected abstract void realRun() throws Throwable;
1181 jsr166 1.35
1182     public final void run() {
1183     try {
1184     realRun();
1185 jsr166 1.128 } catch (Throwable fail) {
1186     threadUnexpectedException(fail);
1187 jsr166 1.35 }
1188     }
1189     }
1190    
1191 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
1192     protected abstract void realRun() throws Throwable;
1193 jsr166 1.40
1194     final Class<?> exceptionClass;
1195    
1196     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1197     this.exceptionClass = exceptionClass;
1198     }
1199    
1200     public final void run() {
1201     try {
1202     realRun();
1203     threadShouldThrow(exceptionClass.getSimpleName());
1204     } catch (Throwable t) {
1205     if (! exceptionClass.isInstance(t))
1206     threadUnexpectedException(t);
1207     }
1208     }
1209     }
1210    
1211 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1212     protected abstract void realRun() throws Throwable;
1213 jsr166 1.40
1214     final Class<?> exceptionClass;
1215    
1216     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1217     this.exceptionClass = exceptionClass;
1218     }
1219    
1220     public final void run() {
1221     try {
1222     realRun();
1223     threadShouldThrow(exceptionClass.getSimpleName());
1224     } catch (Throwable t) {
1225     if (! exceptionClass.isInstance(t))
1226     threadUnexpectedException(t);
1227     }
1228     }
1229     }
1230    
1231 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1232     protected abstract void realRun() throws Throwable;
1233 jsr166 1.35
1234     public final void run() {
1235     try {
1236     realRun();
1237 jsr166 1.40 threadShouldThrow("InterruptedException");
1238 jsr166 1.35 } catch (InterruptedException success) {
1239 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1240 jsr166 1.128 } catch (Throwable fail) {
1241     threadUnexpectedException(fail);
1242 jsr166 1.35 }
1243     }
1244     }
1245    
1246 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1247     protected abstract T realCall() throws Throwable;
1248 jsr166 1.35
1249     public final T call() {
1250     try {
1251     return realCall();
1252 jsr166 1.128 } catch (Throwable fail) {
1253     threadUnexpectedException(fail);
1254 jsr166 1.53 return null;
1255 jsr166 1.35 }
1256 jsr166 1.40 }
1257     }
1258    
1259 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
1260     implements Callable<T> {
1261 jsr166 1.45 protected abstract T realCall() throws Throwable;
1262 jsr166 1.40
1263     public final T call() {
1264     try {
1265     T result = realCall();
1266     threadShouldThrow("InterruptedException");
1267     return result;
1268     } catch (InterruptedException success) {
1269 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1270 jsr166 1.128 } catch (Throwable fail) {
1271     threadUnexpectedException(fail);
1272 jsr166 1.40 }
1273     return null;
1274 jsr166 1.35 }
1275     }
1276    
1277 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1278 dl 1.1 public void run() {}
1279     }
1280    
1281 jsr166 1.45 public static class NoOpCallable implements Callable {
1282 dl 1.1 public Object call() { return Boolean.TRUE; }
1283 dl 1.10 }
1284    
1285 jsr166 1.45 public static final String TEST_STRING = "a test string";
1286 dl 1.10
1287 jsr166 1.45 public static class StringTask implements Callable<String> {
1288 jsr166 1.144 final String value;
1289     public StringTask() { this(TEST_STRING); }
1290     public StringTask(String value) { this.value = value; }
1291     public String call() { return value; }
1292 dl 1.10 }
1293    
1294 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1295     return new CheckedCallable<String>() {
1296 jsr166 1.64 protected String realCall() {
1297 jsr166 1.48 try {
1298     latch.await();
1299     } catch (InterruptedException quittingTime) {}
1300     return TEST_STRING;
1301     }};
1302     }
1303    
1304 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1305     return new CheckedRunnable() {
1306     public void realRun() throws InterruptedException {
1307     latch.countDown();
1308     }};
1309     }
1310    
1311 jsr166 1.73 public Runnable awaiter(final CountDownLatch latch) {
1312     return new CheckedRunnable() {
1313     public void realRun() throws InterruptedException {
1314 jsr166 1.79 await(latch);
1315 jsr166 1.73 }};
1316     }
1317    
1318 jsr166 1.79 public void await(CountDownLatch latch) {
1319     try {
1320     assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
1321 jsr166 1.128 } catch (Throwable fail) {
1322     threadUnexpectedException(fail);
1323 jsr166 1.79 }
1324     }
1325    
1326 jsr166 1.89 public void await(Semaphore semaphore) {
1327     try {
1328     assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
1329 jsr166 1.128 } catch (Throwable fail) {
1330     threadUnexpectedException(fail);
1331 jsr166 1.89 }
1332     }
1333    
1334 jsr166 1.81 // /**
1335     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1336     // */
1337     // public void await(AtomicBoolean flag) {
1338     // await(flag, LONG_DELAY_MS);
1339     // }
1340    
1341     // /**
1342     // * Spin-waits up to the specified timeout until flag becomes true.
1343     // */
1344     // public void await(AtomicBoolean flag, long timeoutMillis) {
1345     // long startTime = System.nanoTime();
1346     // while (!flag.get()) {
1347     // if (millisElapsedSince(startTime) > timeoutMillis)
1348     // throw new AssertionFailedError("timed out");
1349     // Thread.yield();
1350     // }
1351     // }
1352    
1353 jsr166 1.45 public static class NPETask implements Callable<String> {
1354 dl 1.10 public String call() { throw new NullPointerException(); }
1355     }
1356    
1357 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
1358 dl 1.10 public Integer call() { return one; }
1359 dl 1.1 }
1360    
1361 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
1362     protected void realRun() throws Throwable {
1363 dl 1.76 delay(SHORT_DELAY_MS);
1364 dl 1.1 }
1365     }
1366    
1367 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1368     protected void realRun() throws InterruptedException {
1369 dl 1.76 delay(SHORT_DELAY_MS);
1370 dl 1.1 }
1371     }
1372    
1373 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
1374     protected void realRun() throws Throwable {
1375 dl 1.76 delay(SMALL_DELAY_MS);
1376 dl 1.1 }
1377     }
1378    
1379 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1380     protected void realRun() {
1381 dl 1.6 try {
1382 dl 1.76 delay(SMALL_DELAY_MS);
1383 jsr166 1.44 } catch (InterruptedException ok) {}
1384 dl 1.6 }
1385     }
1386    
1387 jsr166 1.45 public class SmallCallable extends CheckedCallable {
1388     protected Object realCall() throws InterruptedException {
1389 dl 1.76 delay(SMALL_DELAY_MS);
1390 dl 1.1 return Boolean.TRUE;
1391     }
1392     }
1393    
1394 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
1395     protected void realRun() throws Throwable {
1396 dl 1.76 delay(MEDIUM_DELAY_MS);
1397 dl 1.1 }
1398     }
1399    
1400 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1401     protected void realRun() throws InterruptedException {
1402 dl 1.76 delay(MEDIUM_DELAY_MS);
1403 dl 1.1 }
1404     }
1405    
1406 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1407     return new CheckedRunnable() {
1408     protected void realRun() {
1409     try {
1410 dl 1.76 delay(timeoutMillis);
1411 jsr166 1.63 } catch (InterruptedException ok) {}
1412     }};
1413     }
1414    
1415 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1416     protected void realRun() {
1417 dl 1.1 try {
1418 dl 1.76 delay(MEDIUM_DELAY_MS);
1419 jsr166 1.44 } catch (InterruptedException ok) {}
1420 dl 1.1 }
1421     }
1422 dl 1.5
1423 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1424     protected void realRun() {
1425 dl 1.12 try {
1426 dl 1.76 delay(LONG_DELAY_MS);
1427 jsr166 1.44 } catch (InterruptedException ok) {}
1428 dl 1.12 }
1429     }
1430    
1431 dl 1.5 /**
1432     * For use as ThreadFactory in constructors
1433     */
1434 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1435 jsr166 1.33 public Thread newThread(Runnable r) {
1436 dl 1.5 return new Thread(r);
1437 jsr166 1.27 }
1438 dl 1.5 }
1439    
1440 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1441     boolean isDone();
1442     }
1443    
1444     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1445     return new TrackedRunnable() {
1446     private volatile boolean done = false;
1447     public boolean isDone() { return done; }
1448     public void run() {
1449     try {
1450 dl 1.76 delay(timeoutMillis);
1451 jsr166 1.61 done = true;
1452     } catch (InterruptedException ok) {}
1453     }
1454     };
1455     }
1456    
1457 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
1458     public volatile boolean done = false;
1459 dl 1.5 public void run() {
1460     try {
1461 dl 1.76 delay(SHORT_DELAY_MS);
1462 jsr166 1.61 done = true;
1463     } catch (InterruptedException ok) {}
1464     }
1465     }
1466    
1467     public static class TrackedSmallRunnable implements Runnable {
1468     public volatile boolean done = false;
1469     public void run() {
1470     try {
1471 dl 1.76 delay(SMALL_DELAY_MS);
1472 dl 1.5 done = true;
1473 jsr166 1.44 } catch (InterruptedException ok) {}
1474 dl 1.6 }
1475     }
1476    
1477 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
1478     public volatile boolean done = false;
1479 dl 1.6 public void run() {
1480     try {
1481 dl 1.76 delay(MEDIUM_DELAY_MS);
1482 dl 1.6 done = true;
1483 jsr166 1.44 } catch (InterruptedException ok) {}
1484 dl 1.6 }
1485     }
1486    
1487 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
1488     public volatile boolean done = false;
1489 dl 1.6 public void run() {
1490     try {
1491 dl 1.76 delay(LONG_DELAY_MS);
1492 dl 1.6 done = true;
1493 jsr166 1.44 } catch (InterruptedException ok) {}
1494 dl 1.6 }
1495     }
1496    
1497 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1498     public volatile boolean done = false;
1499 dl 1.6 public void run() {
1500     done = true;
1501 dl 1.5 }
1502     }
1503    
1504 jsr166 1.45 public static class TrackedCallable implements Callable {
1505     public volatile boolean done = false;
1506 dl 1.5 public Object call() {
1507     try {
1508 dl 1.76 delay(SMALL_DELAY_MS);
1509 dl 1.5 done = true;
1510 jsr166 1.44 } catch (InterruptedException ok) {}
1511 dl 1.5 return Boolean.TRUE;
1512     }
1513     }
1514 dl 1.14
1515 jsr166 1.53 /**
1516     * Analog of CheckedRunnable for RecursiveAction
1517     */
1518     public abstract class CheckedRecursiveAction extends RecursiveAction {
1519     protected abstract void realCompute() throws Throwable;
1520    
1521 jsr166 1.108 @Override protected final void compute() {
1522 jsr166 1.53 try {
1523     realCompute();
1524 jsr166 1.128 } catch (Throwable fail) {
1525     threadUnexpectedException(fail);
1526 jsr166 1.53 }
1527     }
1528     }
1529    
1530     /**
1531     * Analog of CheckedCallable for RecursiveTask
1532     */
1533     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1534     protected abstract T realCompute() throws Throwable;
1535    
1536 jsr166 1.108 @Override protected final T compute() {
1537 jsr166 1.53 try {
1538     return realCompute();
1539 jsr166 1.128 } catch (Throwable fail) {
1540     threadUnexpectedException(fail);
1541 jsr166 1.53 return null;
1542     }
1543     }
1544     }
1545 dl 1.5
1546     /**
1547     * For use as RejectedExecutionHandler in constructors
1548     */
1549 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1550 jsr166 1.35 public void rejectedExecution(Runnable r,
1551     ThreadPoolExecutor executor) {}
1552 dl 1.5 }
1553 jsr166 1.27
1554 jsr166 1.60 /**
1555 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1556     * AssertionFailedErrors instead of throwing checked exceptions.
1557 jsr166 1.60 */
1558     public class CheckedBarrier extends CyclicBarrier {
1559     public CheckedBarrier(int parties) { super(parties); }
1560    
1561     public int await() {
1562     try {
1563 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1564 jsr166 1.128 } catch (TimeoutException timedOut) {
1565 jsr166 1.86 throw new AssertionFailedError("timed out");
1566 jsr166 1.128 } catch (Exception fail) {
1567 jsr166 1.60 AssertionFailedError afe =
1568 jsr166 1.128 new AssertionFailedError("Unexpected exception: " + fail);
1569     afe.initCause(fail);
1570 jsr166 1.60 throw afe;
1571     }
1572     }
1573     }
1574    
1575 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1576 jsr166 1.72 try {
1577     assertTrue(q.isEmpty());
1578     assertEquals(0, q.size());
1579     assertNull(q.peek());
1580     assertNull(q.poll());
1581     assertNull(q.poll(0, MILLISECONDS));
1582     assertEquals(q.toString(), "[]");
1583     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1584     assertFalse(q.iterator().hasNext());
1585     try {
1586     q.element();
1587     shouldThrow();
1588     } catch (NoSuchElementException success) {}
1589     try {
1590     q.iterator().next();
1591     shouldThrow();
1592     } catch (NoSuchElementException success) {}
1593     try {
1594     q.remove();
1595     shouldThrow();
1596     } catch (NoSuchElementException success) {}
1597 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1598 jsr166 1.72 }
1599    
1600 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1601     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1602     }
1603    
1604     void assertNotSerialEquals(Object x, Object y) {
1605     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1606     }
1607    
1608     byte[] serialBytes(Object o) {
1609 jsr166 1.79 try {
1610     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1611     ObjectOutputStream oos = new ObjectOutputStream(bos);
1612     oos.writeObject(o);
1613     oos.flush();
1614     oos.close();
1615 jsr166 1.91 return bos.toByteArray();
1616 jsr166 1.128 } catch (Throwable fail) {
1617     threadUnexpectedException(fail);
1618 jsr166 1.91 return new byte[0];
1619     }
1620     }
1621    
1622     @SuppressWarnings("unchecked")
1623     <T> T serialClone(T o) {
1624     try {
1625 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1626 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1627 jsr166 1.87 T clone = (T) ois.readObject();
1628     assertSame(o.getClass(), clone.getClass());
1629     return clone;
1630 jsr166 1.128 } catch (Throwable fail) {
1631     threadUnexpectedException(fail);
1632 jsr166 1.79 return null;
1633     }
1634     }
1635 jsr166 1.106
1636     public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1637     Runnable... throwingActions) {
1638     for (Runnable throwingAction : throwingActions) {
1639     boolean threw = false;
1640     try { throwingAction.run(); }
1641     catch (Throwable t) {
1642     threw = true;
1643     if (!expectedExceptionClass.isInstance(t)) {
1644     AssertionFailedError afe =
1645     new AssertionFailedError
1646     ("Expected " + expectedExceptionClass.getName() +
1647     ", got " + t.getClass().getName());
1648     afe.initCause(t);
1649     threadUnexpectedException(afe);
1650     }
1651     }
1652     if (!threw)
1653     shouldThrow(expectedExceptionClass.getName());
1654     }
1655     }
1656 jsr166 1.126
1657     public void assertIteratorExhausted(Iterator<?> it) {
1658     try {
1659     it.next();
1660     shouldThrow();
1661     } catch (NoSuchElementException success) {}
1662     assertFalse(it.hasNext());
1663 jsr166 1.127 }
1664 dl 1.1 }