ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.153
Committed: Sat Oct 3 19:37:43 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.152: +1 -0 lines
Log Message:
threadRecordFailure: do a thread dump at first test failure

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