ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.135
Committed: Fri Jul 3 05:48:30 2015 UTC (8 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.134: +4 -3 lines
Log Message:
only test Date/currentTimeMillis with Date/currentTimeMillis, not with nanoTime

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 jsr166 1.135 * Returns a new Date instance representing a time at least
485     * delayMillis milliseconds in the future.
486 jsr166 1.81 */
487     Date delayedDate(long delayMillis) {
488 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
489     return new Date(System.currentTimeMillis() + delayMillis + 1);
490 jsr166 1.81 }
491    
492     /**
493 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
494 dl 1.1 */
495 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
496     = new AtomicReference<Throwable>(null);
497 dl 1.1
498     /**
499 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
500     * harness thread, triggering a test case failure. Only the first
501     * failure is recorded; subsequent calls to this method from within
502     * the same test have no effect.
503 dl 1.1 */
504 jsr166 1.53 public void threadRecordFailure(Throwable t) {
505     threadFailure.compareAndSet(null, t);
506     }
507    
508 jsr166 1.27 public void setUp() {
509 dl 1.2 setDelays();
510 dl 1.1 }
511    
512     /**
513 jsr166 1.85 * Extra checks that get done for all test cases.
514     *
515 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
516     * by rethrowing, in the test harness thread, any exception recorded
517     * earlier by threadRecordFailure.
518 jsr166 1.85 *
519     * Triggers test case failure if interrupt status is set in the main thread.
520 jsr166 1.53 */
521     public void tearDown() throws Exception {
522 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
523 jsr166 1.53 if (t != null) {
524     if (t instanceof Error)
525     throw (Error) t;
526     else if (t instanceof RuntimeException)
527     throw (RuntimeException) t;
528     else if (t instanceof Exception)
529     throw (Exception) t;
530 jsr166 1.57 else {
531     AssertionFailedError afe =
532     new AssertionFailedError(t.toString());
533     afe.initCause(t);
534     throw afe;
535     }
536 jsr166 1.53 }
537 jsr166 1.85
538     if (Thread.interrupted())
539     throw new AssertionFailedError("interrupt status set in main thread");
540 jsr166 1.100
541     checkForkJoinPoolThreadLeaks();
542 dl 1.1 }
543    
544 dl 1.5 /**
545 jsr166 1.125 * Finds missing try { ... } finally { joinPool(e); }
546 jsr166 1.100 */
547     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
548     Thread[] survivors = new Thread[5];
549     int count = Thread.enumerate(survivors);
550     for (int i = 0; i < count; i++) {
551     Thread thread = survivors[i];
552     String name = thread.getName();
553     if (name.startsWith("ForkJoinPool-")) {
554     // give thread some time to terminate
555     thread.join(LONG_DELAY_MS);
556     if (!thread.isAlive()) continue;
557     throw new AssertionFailedError
558     (String.format("Found leaked ForkJoinPool thread test=%s thread=%s%n",
559     toString(), name));
560     }
561     }
562     }
563 jsr166 1.101
564 jsr166 1.100 /**
565 jsr166 1.53 * Just like fail(reason), but additionally recording (using
566 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
567     * the current testcase will fail.
568 jsr166 1.27 */
569 dl 1.1 public void threadFail(String reason) {
570 jsr166 1.53 try {
571     fail(reason);
572 jsr166 1.57 } catch (AssertionFailedError t) {
573 jsr166 1.53 threadRecordFailure(t);
574     fail(reason);
575     }
576 dl 1.1 }
577    
578 dl 1.5 /**
579 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
580 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
581     * the current testcase will fail.
582 jsr166 1.27 */
583 dl 1.1 public void threadAssertTrue(boolean b) {
584 jsr166 1.53 try {
585 dl 1.1 assertTrue(b);
586 jsr166 1.57 } catch (AssertionFailedError t) {
587 jsr166 1.53 threadRecordFailure(t);
588     throw t;
589 dl 1.1 }
590     }
591 dl 1.5
592     /**
593 jsr166 1.53 * Just like assertFalse(b), 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 threadAssertFalse(boolean b) {
598 jsr166 1.53 try {
599 dl 1.1 assertFalse(b);
600 jsr166 1.57 } catch (AssertionFailedError t) {
601 jsr166 1.53 threadRecordFailure(t);
602     throw t;
603 dl 1.1 }
604     }
605 dl 1.5
606     /**
607 jsr166 1.53 * Just like assertNull(x), 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 threadAssertNull(Object x) {
612 jsr166 1.53 try {
613 dl 1.1 assertNull(x);
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 assertEquals(x, y), 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 threadAssertEquals(long x, long y) {
626 jsr166 1.53 try {
627 dl 1.1 assertEquals(x, y);
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 assertEquals(x, y), 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 threadAssertEquals(Object x, Object y) {
640 jsr166 1.53 try {
641 dl 1.1 assertEquals(x, y);
642 jsr166 1.129 } catch (AssertionFailedError fail) {
643     threadRecordFailure(fail);
644     throw fail;
645     } catch (Throwable fail) {
646     threadUnexpectedException(fail);
647 dl 1.1 }
648     }
649    
650 dl 1.5 /**
651 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
652 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
653     * the current testcase will fail.
654 jsr166 1.52 */
655     public void threadAssertSame(Object x, Object y) {
656 jsr166 1.53 try {
657 jsr166 1.52 assertSame(x, y);
658 jsr166 1.129 } catch (AssertionFailedError fail) {
659     threadRecordFailure(fail);
660     throw fail;
661 jsr166 1.52 }
662     }
663    
664     /**
665 jsr166 1.53 * Calls threadFail with message "should throw exception".
666 jsr166 1.33 */
667 dl 1.3 public void threadShouldThrow() {
668 jsr166 1.53 threadFail("should throw exception");
669 dl 1.3 }
670    
671 dl 1.5 /**
672 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
673 jsr166 1.40 */
674     public void threadShouldThrow(String exceptionName) {
675 jsr166 1.53 threadFail("should throw " + exceptionName);
676 dl 1.3 }
677    
678 dl 1.31 /**
679 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
680     * then rethrows the exception, wrapping it in an
681     * AssertionFailedError if necessary.
682 dl 1.31 */
683 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
684     threadRecordFailure(t);
685     t.printStackTrace();
686     if (t instanceof RuntimeException)
687     throw (RuntimeException) t;
688     else if (t instanceof Error)
689     throw (Error) t;
690     else {
691 jsr166 1.57 AssertionFailedError afe =
692     new AssertionFailedError("unexpected exception: " + t);
693 jsr166 1.82 afe.initCause(t);
694 jsr166 1.57 throw afe;
695 jsr166 1.55 }
696 dl 1.31 }
697 dl 1.3
698 dl 1.1 /**
699 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
700 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
701     * until time elapses.
702     */
703 jsr166 1.81 static void delay(long millis) throws InterruptedException {
704 dl 1.76 long startTime = System.nanoTime();
705 jsr166 1.80 long ns = millis * 1000 * 1000;
706 dl 1.76 for (;;) {
707 jsr166 1.80 if (millis > 0L)
708     Thread.sleep(millis);
709 dl 1.76 else // too short to sleep
710     Thread.yield();
711     long d = ns - (System.nanoTime() - startTime);
712     if (d > 0L)
713 jsr166 1.80 millis = d / (1000 * 1000);
714 dl 1.76 else
715     break;
716     }
717     }
718    
719     /**
720 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
721 dl 1.1 */
722 jsr166 1.81 void joinPool(ExecutorService exec) {
723 dl 1.1 try {
724     exec.shutdown();
725 jsr166 1.121 if (!exec.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS))
726     fail("ExecutorService " + exec +
727     " did not terminate in a timely manner");
728 jsr166 1.33 } catch (SecurityException ok) {
729 dl 1.22 // Allowed in case test doesn't have privs
730 jsr166 1.128 } catch (InterruptedException fail) {
731 jsr166 1.44 fail("Unexpected InterruptedException");
732 dl 1.1 }
733     }
734    
735 jsr166 1.78 /**
736 jsr166 1.95 * A debugging tool to print all stack traces, as jstack does.
737     */
738 jsr166 1.96 static void printAllStackTraces() {
739     for (ThreadInfo info :
740     ManagementFactory.getThreadMXBean()
741     .dumpAllThreads(true, true))
742     System.err.print(info);
743 jsr166 1.95 }
744    
745     /**
746 jsr166 1.81 * Checks that thread does not terminate within the default
747     * millisecond delay of {@code timeoutMillis()}.
748     */
749     void assertThreadStaysAlive(Thread thread) {
750     assertThreadStaysAlive(thread, timeoutMillis());
751     }
752    
753     /**
754 jsr166 1.80 * Checks that thread does not terminate within the given millisecond delay.
755 jsr166 1.78 */
756 jsr166 1.81 void assertThreadStaysAlive(Thread thread, long millis) {
757 jsr166 1.78 try {
758 jsr166 1.80 // No need to optimize the failing case via Thread.join.
759     delay(millis);
760 jsr166 1.78 assertTrue(thread.isAlive());
761 jsr166 1.128 } catch (InterruptedException fail) {
762 jsr166 1.78 fail("Unexpected InterruptedException");
763     }
764     }
765 dl 1.5
766     /**
767 jsr166 1.90 * Checks that the threads do not terminate within the default
768     * millisecond delay of {@code timeoutMillis()}.
769     */
770     void assertThreadsStayAlive(Thread... threads) {
771     assertThreadsStayAlive(timeoutMillis(), threads);
772     }
773    
774     /**
775     * Checks that the threads do not terminate within the given millisecond delay.
776     */
777     void assertThreadsStayAlive(long millis, Thread... threads) {
778     try {
779     // No need to optimize the failing case via Thread.join.
780     delay(millis);
781     for (Thread thread : threads)
782     assertTrue(thread.isAlive());
783 jsr166 1.128 } catch (InterruptedException fail) {
784 jsr166 1.90 fail("Unexpected InterruptedException");
785     }
786     }
787    
788     /**
789 jsr166 1.83 * Checks that future.get times out, with the default timeout of
790     * {@code timeoutMillis()}.
791     */
792     void assertFutureTimesOut(Future future) {
793     assertFutureTimesOut(future, timeoutMillis());
794     }
795    
796     /**
797     * Checks that future.get times out, with the given millisecond timeout.
798     */
799     void assertFutureTimesOut(Future future, long timeoutMillis) {
800     long startTime = System.nanoTime();
801     try {
802     future.get(timeoutMillis, MILLISECONDS);
803     shouldThrow();
804     } catch (TimeoutException success) {
805 jsr166 1.128 } catch (Exception fail) {
806     threadUnexpectedException(fail);
807 jsr166 1.83 } finally { future.cancel(true); }
808     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
809     }
810    
811     /**
812 jsr166 1.53 * Fails with message "should throw exception".
813 jsr166 1.27 */
814 dl 1.3 public void shouldThrow() {
815     fail("Should throw exception");
816     }
817    
818 dl 1.5 /**
819 jsr166 1.53 * Fails with message "should throw " + exceptionName.
820 jsr166 1.40 */
821     public void shouldThrow(String exceptionName) {
822     fail("Should throw " + exceptionName);
823     }
824    
825     /**
826 dl 1.1 * The number of elements to place in collections, arrays, etc.
827     */
828 jsr166 1.45 public static final int SIZE = 20;
829 dl 1.1
830     // Some convenient Integer constants
831    
832 jsr166 1.47 public static final Integer zero = new Integer(0);
833     public static final Integer one = new Integer(1);
834     public static final Integer two = new Integer(2);
835     public static final Integer three = new Integer(3);
836 jsr166 1.45 public static final Integer four = new Integer(4);
837     public static final Integer five = new Integer(5);
838 jsr166 1.47 public static final Integer six = new Integer(6);
839 jsr166 1.45 public static final Integer seven = new Integer(7);
840     public static final Integer eight = new Integer(8);
841 jsr166 1.47 public static final Integer nine = new Integer(9);
842 jsr166 1.45 public static final Integer m1 = new Integer(-1);
843     public static final Integer m2 = new Integer(-2);
844     public static final Integer m3 = new Integer(-3);
845 jsr166 1.47 public static final Integer m4 = new Integer(-4);
846     public static final Integer m5 = new Integer(-5);
847     public static final Integer m6 = new Integer(-6);
848 jsr166 1.45 public static final Integer m10 = new Integer(-10);
849 dl 1.7
850     /**
851 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
852     * the specified permissions. If there is no current security
853     * manager, the runnable is run twice, both with and without a
854     * security manager. We require that any security manager permit
855     * getPolicy/setPolicy.
856     */
857     public void runWithPermissions(Runnable r, Permission... permissions) {
858     SecurityManager sm = System.getSecurityManager();
859     if (sm == null) {
860     r.run();
861 jsr166 1.93 }
862     runWithSecurityManagerWithPermissions(r, permissions);
863     }
864    
865     /**
866     * Runs Runnable r with a security policy that permits precisely
867     * the specified permissions. If there is no current security
868     * manager, a temporary one is set for the duration of the
869     * Runnable. We require that any security manager permit
870     * getPolicy/setPolicy.
871     */
872     public void runWithSecurityManagerWithPermissions(Runnable r,
873     Permission... permissions) {
874     SecurityManager sm = System.getSecurityManager();
875     if (sm == null) {
876 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
877     try {
878     Policy.setPolicy(permissivePolicy());
879     System.setSecurityManager(new SecurityManager());
880 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
881 jsr166 1.49 } finally {
882     System.setSecurityManager(null);
883     Policy.setPolicy(savedPolicy);
884     }
885     } else {
886     Policy savedPolicy = Policy.getPolicy();
887     AdjustablePolicy policy = new AdjustablePolicy(permissions);
888     Policy.setPolicy(policy);
889    
890     try {
891     r.run();
892     } finally {
893     policy.addPermission(new SecurityPermission("setPolicy"));
894     Policy.setPolicy(savedPolicy);
895     }
896     }
897     }
898    
899     /**
900     * Runs a runnable without any permissions.
901     */
902     public void runWithoutPermissions(Runnable r) {
903     runWithPermissions(r);
904     }
905    
906     /**
907 dl 1.7 * A security policy where new permissions can be dynamically added
908     * or all cleared.
909     */
910 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
911 dl 1.7 Permissions perms = new Permissions();
912 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
913     for (Permission permission : permissions)
914     perms.add(permission);
915     }
916 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
917     void clearPermissions() { perms = new Permissions(); }
918 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
919     return perms;
920     }
921     public PermissionCollection getPermissions(ProtectionDomain pd) {
922     return perms;
923     }
924     public boolean implies(ProtectionDomain pd, Permission p) {
925     return perms.implies(p);
926     }
927     public void refresh() {}
928 jsr166 1.93 public String toString() {
929     List<Permission> ps = new ArrayList<Permission>();
930     for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
931     ps.add(e.nextElement());
932     return "AdjustablePolicy with permissions " + ps;
933     }
934 dl 1.7 }
935 dl 1.1
936 jsr166 1.38 /**
937 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
938     */
939     public static Policy permissivePolicy() {
940     return new AdjustablePolicy
941     // Permissions j.u.c. needs directly
942     (new RuntimePermission("modifyThread"),
943     new RuntimePermission("getClassLoader"),
944     new RuntimePermission("setContextClassLoader"),
945     // Permissions needed to change permissions!
946     new SecurityPermission("getPolicy"),
947     new SecurityPermission("setPolicy"),
948     new RuntimePermission("setSecurityManager"),
949     // Permissions needed by the junit test harness
950     new RuntimePermission("accessDeclaredMembers"),
951     new PropertyPermission("*", "read"),
952     new java.io.FilePermission("<<ALL FILES>>", "read"));
953     }
954    
955     /**
956 jsr166 1.60 * Sleeps until the given time has elapsed.
957     * Throws AssertionFailedError if interrupted.
958     */
959     void sleep(long millis) {
960     try {
961 dl 1.76 delay(millis);
962 jsr166 1.128 } catch (InterruptedException fail) {
963 jsr166 1.60 AssertionFailedError afe =
964     new AssertionFailedError("Unexpected InterruptedException");
965 jsr166 1.128 afe.initCause(fail);
966 jsr166 1.60 throw afe;
967     }
968     }
969    
970     /**
971 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
972 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
973     */
974     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
975 jsr166 1.88 long startTime = System.nanoTime();
976 jsr166 1.65 for (;;) {
977     Thread.State s = thread.getState();
978     if (s == Thread.State.BLOCKED ||
979     s == Thread.State.WAITING ||
980 jsr166 1.67 s == Thread.State.TIMED_WAITING)
981 jsr166 1.65 return;
982 jsr166 1.67 else if (s == Thread.State.TERMINATED)
983     fail("Unexpected thread termination");
984 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
985 jsr166 1.67 threadAssertTrue(thread.isAlive());
986     return;
987     }
988 jsr166 1.65 Thread.yield();
989     }
990     }
991    
992     /**
993 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
994     * state: BLOCKED, WAITING, or TIMED_WAITING.
995     */
996     void waitForThreadToEnterWaitState(Thread thread) {
997     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
998     }
999    
1000     /**
1001 jsr166 1.66 * Returns the number of milliseconds since time given by
1002     * startNanoTime, which must have been previously returned from a
1003 jsr166 1.124 * call to {@link System#nanoTime()}.
1004 jsr166 1.66 */
1005 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1006 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1007     }
1008 jsr166 1.68
1009 jsr166 1.120 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1010     // long startTime = System.nanoTime();
1011     // try {
1012     // r.run();
1013     // } catch (Throwable fail) { threadUnexpectedException(fail); }
1014     // if (millisElapsedSince(startTime) > timeoutMillis/2)
1015     // throw new AssertionFailedError("did not return promptly");
1016     // }
1017    
1018     // void assertTerminatesPromptly(Runnable r) {
1019     // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1020     // }
1021    
1022     /**
1023     * Checks that timed f.get() returns the expected value, and does not
1024     * wait for the timeout to elapse before returning.
1025     */
1026     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1027     long startTime = System.nanoTime();
1028     try {
1029     assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1030     } catch (Throwable fail) { threadUnexpectedException(fail); }
1031     if (millisElapsedSince(startTime) > timeoutMillis/2)
1032     throw new AssertionFailedError("timed get did not return promptly");
1033     }
1034    
1035     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1036     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1037     }
1038    
1039 jsr166 1.66 /**
1040 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1041 jsr166 1.38 */
1042     Thread newStartedThread(Runnable runnable) {
1043     Thread t = new Thread(runnable);
1044 jsr166 1.58 t.setDaemon(true);
1045 jsr166 1.38 t.start();
1046     return t;
1047     }
1048 dl 1.1
1049 jsr166 1.59 /**
1050     * Waits for the specified time (in milliseconds) for the thread
1051     * to terminate (using {@link Thread#join(long)}), else interrupts
1052     * the thread (in the hope that it may terminate later) and fails.
1053     */
1054     void awaitTermination(Thread t, long timeoutMillis) {
1055     try {
1056     t.join(timeoutMillis);
1057 jsr166 1.128 } catch (InterruptedException fail) {
1058     threadUnexpectedException(fail);
1059 jsr166 1.59 } finally {
1060 jsr166 1.83 if (t.getState() != Thread.State.TERMINATED) {
1061 jsr166 1.59 t.interrupt();
1062     fail("Test timed out");
1063     }
1064     }
1065     }
1066    
1067 jsr166 1.75 /**
1068     * Waits for LONG_DELAY_MS milliseconds for the thread to
1069     * terminate (using {@link Thread#join(long)}), else interrupts
1070     * the thread (in the hope that it may terminate later) and fails.
1071     */
1072     void awaitTermination(Thread t) {
1073     awaitTermination(t, LONG_DELAY_MS);
1074     }
1075    
1076 dl 1.1 // Some convenient Runnable classes
1077    
1078 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1079     protected abstract void realRun() throws Throwable;
1080 jsr166 1.35
1081     public final void run() {
1082     try {
1083     realRun();
1084 jsr166 1.128 } catch (Throwable fail) {
1085     threadUnexpectedException(fail);
1086 jsr166 1.35 }
1087     }
1088     }
1089    
1090 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
1091     protected abstract void realRun() throws Throwable;
1092 jsr166 1.40
1093     final Class<?> exceptionClass;
1094    
1095     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1096     this.exceptionClass = exceptionClass;
1097     }
1098    
1099     public final void run() {
1100     try {
1101     realRun();
1102     threadShouldThrow(exceptionClass.getSimpleName());
1103     } catch (Throwable t) {
1104     if (! exceptionClass.isInstance(t))
1105     threadUnexpectedException(t);
1106     }
1107     }
1108     }
1109    
1110 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1111     protected abstract void realRun() throws Throwable;
1112 jsr166 1.40
1113     final Class<?> exceptionClass;
1114    
1115     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1116     this.exceptionClass = exceptionClass;
1117     }
1118    
1119     public final void run() {
1120     try {
1121     realRun();
1122     threadShouldThrow(exceptionClass.getSimpleName());
1123     } catch (Throwable t) {
1124     if (! exceptionClass.isInstance(t))
1125     threadUnexpectedException(t);
1126     }
1127     }
1128     }
1129    
1130 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1131     protected abstract void realRun() throws Throwable;
1132 jsr166 1.35
1133     public final void run() {
1134     try {
1135     realRun();
1136 jsr166 1.40 threadShouldThrow("InterruptedException");
1137 jsr166 1.35 } catch (InterruptedException success) {
1138 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1139 jsr166 1.128 } catch (Throwable fail) {
1140     threadUnexpectedException(fail);
1141 jsr166 1.35 }
1142     }
1143     }
1144    
1145 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1146     protected abstract T realCall() throws Throwable;
1147 jsr166 1.35
1148     public final T call() {
1149     try {
1150     return realCall();
1151 jsr166 1.128 } catch (Throwable fail) {
1152     threadUnexpectedException(fail);
1153 jsr166 1.53 return null;
1154 jsr166 1.35 }
1155 jsr166 1.40 }
1156     }
1157    
1158 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
1159     implements Callable<T> {
1160 jsr166 1.45 protected abstract T realCall() throws Throwable;
1161 jsr166 1.40
1162     public final T call() {
1163     try {
1164     T result = realCall();
1165     threadShouldThrow("InterruptedException");
1166     return result;
1167     } catch (InterruptedException success) {
1168 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1169 jsr166 1.128 } catch (Throwable fail) {
1170     threadUnexpectedException(fail);
1171 jsr166 1.40 }
1172     return null;
1173 jsr166 1.35 }
1174     }
1175    
1176 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1177 dl 1.1 public void run() {}
1178     }
1179    
1180 jsr166 1.45 public static class NoOpCallable implements Callable {
1181 dl 1.1 public Object call() { return Boolean.TRUE; }
1182 dl 1.10 }
1183    
1184 jsr166 1.45 public static final String TEST_STRING = "a test string";
1185 dl 1.10
1186 jsr166 1.45 public static class StringTask implements Callable<String> {
1187 dl 1.10 public String call() { return TEST_STRING; }
1188     }
1189    
1190 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1191     return new CheckedCallable<String>() {
1192 jsr166 1.64 protected String realCall() {
1193 jsr166 1.48 try {
1194     latch.await();
1195     } catch (InterruptedException quittingTime) {}
1196     return TEST_STRING;
1197     }};
1198     }
1199    
1200 jsr166 1.73 public Runnable awaiter(final CountDownLatch latch) {
1201     return new CheckedRunnable() {
1202     public void realRun() throws InterruptedException {
1203 jsr166 1.79 await(latch);
1204 jsr166 1.73 }};
1205     }
1206    
1207 jsr166 1.79 public void await(CountDownLatch latch) {
1208     try {
1209     assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
1210 jsr166 1.128 } catch (Throwable fail) {
1211     threadUnexpectedException(fail);
1212 jsr166 1.79 }
1213     }
1214    
1215 jsr166 1.89 public void await(Semaphore semaphore) {
1216     try {
1217     assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
1218 jsr166 1.128 } catch (Throwable fail) {
1219     threadUnexpectedException(fail);
1220 jsr166 1.89 }
1221     }
1222    
1223 jsr166 1.81 // /**
1224     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1225     // */
1226     // public void await(AtomicBoolean flag) {
1227     // await(flag, LONG_DELAY_MS);
1228     // }
1229    
1230     // /**
1231     // * Spin-waits up to the specified timeout until flag becomes true.
1232     // */
1233     // public void await(AtomicBoolean flag, long timeoutMillis) {
1234     // long startTime = System.nanoTime();
1235     // while (!flag.get()) {
1236     // if (millisElapsedSince(startTime) > timeoutMillis)
1237     // throw new AssertionFailedError("timed out");
1238     // Thread.yield();
1239     // }
1240     // }
1241    
1242 jsr166 1.45 public static class NPETask implements Callable<String> {
1243 dl 1.10 public String call() { throw new NullPointerException(); }
1244     }
1245    
1246 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
1247 dl 1.10 public Integer call() { return one; }
1248 dl 1.1 }
1249    
1250 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
1251     protected void realRun() throws Throwable {
1252 dl 1.76 delay(SHORT_DELAY_MS);
1253 dl 1.1 }
1254     }
1255    
1256 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1257     protected void realRun() throws InterruptedException {
1258 dl 1.76 delay(SHORT_DELAY_MS);
1259 dl 1.1 }
1260     }
1261    
1262 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
1263     protected void realRun() throws Throwable {
1264 dl 1.76 delay(SMALL_DELAY_MS);
1265 dl 1.1 }
1266     }
1267    
1268 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1269     protected void realRun() {
1270 dl 1.6 try {
1271 dl 1.76 delay(SMALL_DELAY_MS);
1272 jsr166 1.44 } catch (InterruptedException ok) {}
1273 dl 1.6 }
1274     }
1275    
1276 jsr166 1.45 public class SmallCallable extends CheckedCallable {
1277     protected Object realCall() throws InterruptedException {
1278 dl 1.76 delay(SMALL_DELAY_MS);
1279 dl 1.1 return Boolean.TRUE;
1280     }
1281     }
1282    
1283 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
1284     protected void realRun() throws Throwable {
1285 dl 1.76 delay(MEDIUM_DELAY_MS);
1286 dl 1.1 }
1287     }
1288    
1289 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1290     protected void realRun() throws InterruptedException {
1291 dl 1.76 delay(MEDIUM_DELAY_MS);
1292 dl 1.1 }
1293     }
1294    
1295 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1296     return new CheckedRunnable() {
1297     protected void realRun() {
1298     try {
1299 dl 1.76 delay(timeoutMillis);
1300 jsr166 1.63 } catch (InterruptedException ok) {}
1301     }};
1302     }
1303    
1304 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1305     protected void realRun() {
1306 dl 1.1 try {
1307 dl 1.76 delay(MEDIUM_DELAY_MS);
1308 jsr166 1.44 } catch (InterruptedException ok) {}
1309 dl 1.1 }
1310     }
1311 dl 1.5
1312 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1313     protected void realRun() {
1314 dl 1.12 try {
1315 dl 1.76 delay(LONG_DELAY_MS);
1316 jsr166 1.44 } catch (InterruptedException ok) {}
1317 dl 1.12 }
1318     }
1319    
1320 dl 1.5 /**
1321     * For use as ThreadFactory in constructors
1322     */
1323 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1324 jsr166 1.33 public Thread newThread(Runnable r) {
1325 dl 1.5 return new Thread(r);
1326 jsr166 1.27 }
1327 dl 1.5 }
1328    
1329 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1330     boolean isDone();
1331     }
1332    
1333     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1334     return new TrackedRunnable() {
1335     private volatile boolean done = false;
1336     public boolean isDone() { return done; }
1337     public void run() {
1338     try {
1339 dl 1.76 delay(timeoutMillis);
1340 jsr166 1.61 done = true;
1341     } catch (InterruptedException ok) {}
1342     }
1343     };
1344     }
1345    
1346 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
1347     public volatile boolean done = false;
1348 dl 1.5 public void run() {
1349     try {
1350 dl 1.76 delay(SHORT_DELAY_MS);
1351 jsr166 1.61 done = true;
1352     } catch (InterruptedException ok) {}
1353     }
1354     }
1355    
1356     public static class TrackedSmallRunnable implements Runnable {
1357     public volatile boolean done = false;
1358     public void run() {
1359     try {
1360 dl 1.76 delay(SMALL_DELAY_MS);
1361 dl 1.5 done = true;
1362 jsr166 1.44 } catch (InterruptedException ok) {}
1363 dl 1.6 }
1364     }
1365    
1366 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
1367     public volatile boolean done = false;
1368 dl 1.6 public void run() {
1369     try {
1370 dl 1.76 delay(MEDIUM_DELAY_MS);
1371 dl 1.6 done = true;
1372 jsr166 1.44 } catch (InterruptedException ok) {}
1373 dl 1.6 }
1374     }
1375    
1376 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
1377     public volatile boolean done = false;
1378 dl 1.6 public void run() {
1379     try {
1380 dl 1.76 delay(LONG_DELAY_MS);
1381 dl 1.6 done = true;
1382 jsr166 1.44 } catch (InterruptedException ok) {}
1383 dl 1.6 }
1384     }
1385    
1386 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1387     public volatile boolean done = false;
1388 dl 1.6 public void run() {
1389     done = true;
1390 dl 1.5 }
1391     }
1392    
1393 jsr166 1.45 public static class TrackedCallable implements Callable {
1394     public volatile boolean done = false;
1395 dl 1.5 public Object call() {
1396     try {
1397 dl 1.76 delay(SMALL_DELAY_MS);
1398 dl 1.5 done = true;
1399 jsr166 1.44 } catch (InterruptedException ok) {}
1400 dl 1.5 return Boolean.TRUE;
1401     }
1402     }
1403 dl 1.14
1404 jsr166 1.53 /**
1405     * Analog of CheckedRunnable for RecursiveAction
1406     */
1407     public abstract class CheckedRecursiveAction extends RecursiveAction {
1408     protected abstract void realCompute() throws Throwable;
1409    
1410 jsr166 1.108 @Override protected final void compute() {
1411 jsr166 1.53 try {
1412     realCompute();
1413 jsr166 1.128 } catch (Throwable fail) {
1414     threadUnexpectedException(fail);
1415 jsr166 1.53 }
1416     }
1417     }
1418    
1419     /**
1420     * Analog of CheckedCallable for RecursiveTask
1421     */
1422     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1423     protected abstract T realCompute() throws Throwable;
1424    
1425 jsr166 1.108 @Override protected final T compute() {
1426 jsr166 1.53 try {
1427     return realCompute();
1428 jsr166 1.128 } catch (Throwable fail) {
1429     threadUnexpectedException(fail);
1430 jsr166 1.53 return null;
1431     }
1432     }
1433     }
1434 dl 1.5
1435     /**
1436     * For use as RejectedExecutionHandler in constructors
1437     */
1438 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1439 jsr166 1.35 public void rejectedExecution(Runnable r,
1440     ThreadPoolExecutor executor) {}
1441 dl 1.5 }
1442 jsr166 1.27
1443 jsr166 1.60 /**
1444 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1445     * AssertionFailedErrors instead of throwing checked exceptions.
1446 jsr166 1.60 */
1447     public class CheckedBarrier extends CyclicBarrier {
1448     public CheckedBarrier(int parties) { super(parties); }
1449    
1450     public int await() {
1451     try {
1452 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1453 jsr166 1.128 } catch (TimeoutException timedOut) {
1454 jsr166 1.86 throw new AssertionFailedError("timed out");
1455 jsr166 1.128 } catch (Exception fail) {
1456 jsr166 1.60 AssertionFailedError afe =
1457 jsr166 1.128 new AssertionFailedError("Unexpected exception: " + fail);
1458     afe.initCause(fail);
1459 jsr166 1.60 throw afe;
1460     }
1461     }
1462     }
1463    
1464 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1465 jsr166 1.72 try {
1466     assertTrue(q.isEmpty());
1467     assertEquals(0, q.size());
1468     assertNull(q.peek());
1469     assertNull(q.poll());
1470     assertNull(q.poll(0, MILLISECONDS));
1471     assertEquals(q.toString(), "[]");
1472     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1473     assertFalse(q.iterator().hasNext());
1474     try {
1475     q.element();
1476     shouldThrow();
1477     } catch (NoSuchElementException success) {}
1478     try {
1479     q.iterator().next();
1480     shouldThrow();
1481     } catch (NoSuchElementException success) {}
1482     try {
1483     q.remove();
1484     shouldThrow();
1485     } catch (NoSuchElementException success) {}
1486 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1487 jsr166 1.72 }
1488    
1489 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1490     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1491     }
1492    
1493     void assertNotSerialEquals(Object x, Object y) {
1494     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1495     }
1496    
1497     byte[] serialBytes(Object o) {
1498 jsr166 1.79 try {
1499     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1500     ObjectOutputStream oos = new ObjectOutputStream(bos);
1501     oos.writeObject(o);
1502     oos.flush();
1503     oos.close();
1504 jsr166 1.91 return bos.toByteArray();
1505 jsr166 1.128 } catch (Throwable fail) {
1506     threadUnexpectedException(fail);
1507 jsr166 1.91 return new byte[0];
1508     }
1509     }
1510    
1511     @SuppressWarnings("unchecked")
1512     <T> T serialClone(T o) {
1513     try {
1514 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1515 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1516 jsr166 1.87 T clone = (T) ois.readObject();
1517     assertSame(o.getClass(), clone.getClass());
1518     return clone;
1519 jsr166 1.128 } catch (Throwable fail) {
1520     threadUnexpectedException(fail);
1521 jsr166 1.79 return null;
1522     }
1523     }
1524 jsr166 1.106
1525     public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1526     Runnable... throwingActions) {
1527     for (Runnable throwingAction : throwingActions) {
1528     boolean threw = false;
1529     try { throwingAction.run(); }
1530     catch (Throwable t) {
1531     threw = true;
1532     if (!expectedExceptionClass.isInstance(t)) {
1533     AssertionFailedError afe =
1534     new AssertionFailedError
1535     ("Expected " + expectedExceptionClass.getName() +
1536     ", got " + t.getClass().getName());
1537     afe.initCause(t);
1538     threadUnexpectedException(afe);
1539     }
1540     }
1541     if (!threw)
1542     shouldThrow(expectedExceptionClass.getName());
1543     }
1544     }
1545 jsr166 1.126
1546     public void assertIteratorExhausted(Iterator<?> it) {
1547     try {
1548     it.next();
1549     shouldThrow();
1550     } catch (NoSuchElementException success) {}
1551     assertFalse(it.hasNext());
1552 jsr166 1.127 }
1553 dl 1.1 }