ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.134
Committed: Sun Jun 14 20:58:14 2015 UTC (8 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.133: +67 -0 lines
Log Message:
add support for parameterized test execution; add support for automatically executing jdk8+ tests; add tests for JDK-8085978

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