ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.60
Committed: Wed Oct 6 07:49:22 2010 UTC (13 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.59: +113 -69 lines
Log Message:
start of a big refactoring, with only one test refactored: testTimedPollWithOffer

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     * http://creativecommons.org/licenses/publicdomain
5 jsr166 1.27 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     import junit.framework.*;
10 jsr166 1.53 import java.util.PropertyPermission;
11 dl 1.1 import java.util.concurrent.*;
12 jsr166 1.53 import java.util.concurrent.atomic.AtomicReference;
13 jsr166 1.36 import static java.util.concurrent.TimeUnit.MILLISECONDS;
14 jsr166 1.53 import java.security.CodeSource;
15     import java.security.Permission;
16     import java.security.PermissionCollection;
17     import java.security.Permissions;
18     import java.security.Policy;
19     import java.security.ProtectionDomain;
20     import java.security.SecurityPermission;
21 dl 1.1
22     /**
23 dl 1.5 * Base class for JSR166 Junit TCK tests. Defines some constants,
24     * utility methods and classes, as well as a simple framework for
25     * helping to make sure that assertions failing in generated threads
26     * cause the associated test that generated them to itself fail (which
27 jsr166 1.27 * JUnit does not otherwise arrange). The rules for creating such
28 dl 1.5 * tests are:
29 dl 1.1 *
30     * <ol>
31     *
32     * <li> All assertions in code running in generated threads must use
33 jsr166 1.27 * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
34 dl 1.18 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
35 jsr166 1.50 * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
36 dl 1.1 * particularly recommended) for other code to use these forms too.
37     * Only the most typically used JUnit assertion methods are defined
38     * this way, but enough to live with.</li>
39     *
40 dl 1.18 * <li> If you override {@link #setUp} or {@link #tearDown}, make sure
41 jsr166 1.50 * to invoke {@code super.setUp} and {@code super.tearDown} within
42 dl 1.1 * them. These methods are used to clear and check for thread
43     * assertion failures.</li>
44     *
45 jsr166 1.51 * <li>All delays and timeouts must use one of the constants {@code
46 jsr166 1.50 * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
47     * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
48 dl 1.5 * discriminable from zero time, and always allows enough time for the
49     * small amounts of computation (creating a thread, calling a few
50 dl 1.1 * methods, etc) needed to reach a timeout point. Similarly, a SMALL
51     * is always discriminable as larger than SHORT and smaller than
52     * MEDIUM. And so on. These constants are set to conservative values,
53 dl 1.2 * but even so, if there is ever any doubt, they can all be increased
54 jsr166 1.27 * in one spot to rerun tests on slower platforms.</li>
55 dl 1.1 *
56     * <li> All threads generated must be joined inside each test case
57 jsr166 1.50 * method (or {@code fail} to do so) before returning from the
58     * method. The {@code joinPool} method can be used to do this when
59 dl 1.1 * using Executors.</li>
60     *
61     * </ol>
62 dl 1.6 *
63     * <p> <b>Other notes</b>
64     * <ul>
65     *
66     * <li> Usually, there is one testcase method per JSR166 method
67     * covering "normal" operation, and then as many exception-testing
68     * methods as there are exceptions the method can throw. Sometimes
69     * there are multiple tests per JSR166 method when the different
70     * "normal" behaviors differ significantly. And sometimes testcases
71     * cover multiple methods when they cannot be tested in
72     * isolation.</li>
73 jsr166 1.27 *
74 dl 1.6 * <li> The documentation style for testcases is to provide as javadoc
75     * a simple sentence or two describing the property that the testcase
76     * method purports to test. The javadocs do not say anything about how
77     * the property is tested. To find out, read the code.</li>
78     *
79     * <li> These tests are "conformance tests", and do not attempt to
80     * test throughput, latency, scalability or other performance factors
81     * (see the separate "jtreg" tests for a set intended to check these
82     * for the most central aspects of functionality.) So, most tests use
83     * the smallest sensible numbers of threads, collection sizes, etc
84     * needed to check basic conformance.</li>
85     *
86     * <li>The test classes currently do not declare inclusion in
87     * any particular package to simplify things for people integrating
88     * them in TCK test suites.</li>
89     *
90 jsr166 1.50 * <li> As a convenience, the {@code main} of this class (JSR166TestCase)
91 dl 1.6 * runs all JSR166 unit tests.</li>
92     *
93     * </ul>
94 dl 1.1 */
95     public class JSR166TestCase extends TestCase {
96 jsr166 1.49 private static final boolean useSecurityManager =
97     Boolean.getBoolean("jsr166.useSecurityManager");
98    
99 dl 1.6 /**
100     * Runs all JSR166 unit tests using junit.textui.TestRunner
101 jsr166 1.27 */
102 jsr166 1.41 public static void main(String[] args) {
103 jsr166 1.49 if (useSecurityManager) {
104     System.err.println("Setting a permissive security manager");
105     Policy.setPolicy(permissivePolicy());
106     System.setSecurityManager(new SecurityManager());
107     }
108 jsr166 1.56 int iters = (args.length == 0) ? 1 : Integer.parseInt(args[0]);
109    
110 dl 1.16 Test s = suite();
111 dl 1.22 for (int i = 0; i < iters; ++i) {
112 jsr166 1.41 junit.textui.TestRunner.run(s);
113 dl 1.22 System.gc();
114     System.runFinalization();
115     }
116     System.exit(0);
117 dl 1.6 }
118    
119 jsr166 1.60 public static TestSuite newTestSuite(Object... suiteOrClasses) {
120     TestSuite suite = new TestSuite();
121     for (Object suiteOrClass : suiteOrClasses) {
122     if (suiteOrClass instanceof TestSuite)
123     suite.addTest((TestSuite) suiteOrClass);
124     else if (suiteOrClass instanceof Class)
125     suite.addTest(new TestSuite((Class<?>) suiteOrClass));
126     else
127     throw new ClassCastException("not a test suite or class");
128     }
129     return suite;
130     }
131    
132 dl 1.6 /**
133 jsr166 1.60 * Collects all JSR166 unit tests as one suite.
134 jsr166 1.27 */
135 jsr166 1.41 public static Test suite() {
136 jsr166 1.60 return newTestSuite(
137     ForkJoinPoolTest.suite(),
138     ForkJoinTaskTest.suite(),
139     RecursiveActionTest.suite(),
140     RecursiveTaskTest.suite(),
141     LinkedTransferQueueTest.suite(),
142     PhaserTest.suite(),
143     ThreadLocalRandomTest.suite(),
144     AbstractExecutorServiceTest.suite(),
145     AbstractQueueTest.suite(),
146     AbstractQueuedSynchronizerTest.suite(),
147     AbstractQueuedLongSynchronizerTest.suite(),
148     ArrayBlockingQueueTest.suite(),
149     ArrayDequeTest.suite(),
150     AtomicBooleanTest.suite(),
151     AtomicIntegerArrayTest.suite(),
152     AtomicIntegerFieldUpdaterTest.suite(),
153     AtomicIntegerTest.suite(),
154     AtomicLongArrayTest.suite(),
155     AtomicLongFieldUpdaterTest.suite(),
156     AtomicLongTest.suite(),
157     AtomicMarkableReferenceTest.suite(),
158     AtomicReferenceArrayTest.suite(),
159     AtomicReferenceFieldUpdaterTest.suite(),
160     AtomicReferenceTest.suite(),
161     AtomicStampedReferenceTest.suite(),
162     ConcurrentHashMapTest.suite(),
163     ConcurrentLinkedDequeTest.suite(),
164     ConcurrentLinkedQueueTest.suite(),
165     ConcurrentSkipListMapTest.suite(),
166     ConcurrentSkipListSubMapTest.suite(),
167     ConcurrentSkipListSetTest.suite(),
168     ConcurrentSkipListSubSetTest.suite(),
169     CopyOnWriteArrayListTest.suite(),
170     CopyOnWriteArraySetTest.suite(),
171     CountDownLatchTest.suite(),
172     CyclicBarrierTest.suite(),
173     DelayQueueTest.suite(),
174     EntryTest.suite(),
175     ExchangerTest.suite(),
176     ExecutorsTest.suite(),
177     ExecutorCompletionServiceTest.suite(),
178     FutureTaskTest.suite(),
179     LinkedBlockingDequeTest.suite(),
180     LinkedBlockingQueueTest.suite(),
181     LinkedListTest.suite(),
182     LockSupportTest.suite(),
183     PriorityBlockingQueueTest.suite(),
184     PriorityQueueTest.suite(),
185     ReentrantLockTest.suite(),
186     ReentrantReadWriteLockTest.suite(),
187     ScheduledExecutorTest.suite(),
188     ScheduledExecutorSubclassTest.suite(),
189     SemaphoreTest.suite(),
190     SynchronousQueueTest.suite(),
191     SystemTest.suite(),
192     ThreadLocalTest.suite(),
193     ThreadPoolExecutorTest.suite(),
194     ThreadPoolExecutorSubclassTest.suite(),
195     ThreadTest.suite(),
196     TimeUnitTest.suite(),
197     TreeMapTest.suite(),
198     TreeSetTest.suite(),
199     TreeSubMapTest.suite(),
200     TreeSubSetTest.suite());
201 dl 1.6 }
202    
203 dl 1.1
204 dl 1.2 public static long SHORT_DELAY_MS;
205     public static long SMALL_DELAY_MS;
206     public static long MEDIUM_DELAY_MS;
207     public static long LONG_DELAY_MS;
208    
209    
210     /**
211 jsr166 1.27 * Returns the shortest timed delay. This could
212 dl 1.15 * be reimplemented to use for example a Property.
213 jsr166 1.27 */
214 dl 1.2 protected long getShortDelay() {
215 dl 1.21 return 50;
216 dl 1.2 }
217    
218    
219     /**
220 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
221 dl 1.2 */
222 jsr166 1.43 protected void setDelays() {
223 dl 1.2 SHORT_DELAY_MS = getShortDelay();
224 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
225 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
226 jsr166 1.53 LONG_DELAY_MS = SHORT_DELAY_MS * 50;
227 dl 1.2 }
228    
229 dl 1.1 /**
230 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
231 dl 1.1 */
232 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
233     = new AtomicReference<Throwable>(null);
234 dl 1.1
235     /**
236 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
237     * harness thread, triggering a test case failure. Only the first
238     * failure is recorded; subsequent calls to this method from within
239     * the same test have no effect.
240 dl 1.1 */
241 jsr166 1.53 public void threadRecordFailure(Throwable t) {
242     threadFailure.compareAndSet(null, t);
243     }
244    
245 jsr166 1.27 public void setUp() {
246 dl 1.2 setDelays();
247 dl 1.1 }
248    
249     /**
250 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
251     * by rethrowing, in the test harness thread, any exception recorded
252     * earlier by threadRecordFailure.
253     */
254     public void tearDown() throws Exception {
255     Throwable t = threadFailure.get();
256     if (t != null) {
257     if (t instanceof Error)
258     throw (Error) t;
259     else if (t instanceof RuntimeException)
260     throw (RuntimeException) t;
261     else if (t instanceof Exception)
262     throw (Exception) t;
263 jsr166 1.57 else {
264     AssertionFailedError afe =
265     new AssertionFailedError(t.toString());
266     afe.initCause(t);
267     throw afe;
268     }
269 jsr166 1.53 }
270 dl 1.1 }
271    
272 dl 1.5 /**
273 jsr166 1.53 * Just like fail(reason), but additionally recording (using
274 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
275     * the current testcase will fail.
276 jsr166 1.27 */
277 dl 1.1 public void threadFail(String reason) {
278 jsr166 1.53 try {
279     fail(reason);
280 jsr166 1.57 } catch (AssertionFailedError t) {
281 jsr166 1.53 threadRecordFailure(t);
282     fail(reason);
283     }
284 dl 1.1 }
285    
286 dl 1.5 /**
287 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
288 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
289     * the current testcase will fail.
290 jsr166 1.27 */
291 dl 1.1 public void threadAssertTrue(boolean b) {
292 jsr166 1.53 try {
293 dl 1.1 assertTrue(b);
294 jsr166 1.57 } catch (AssertionFailedError t) {
295 jsr166 1.53 threadRecordFailure(t);
296     throw t;
297 dl 1.1 }
298     }
299 dl 1.5
300     /**
301 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
302 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
303     * the current testcase will fail.
304 jsr166 1.27 */
305 dl 1.1 public void threadAssertFalse(boolean b) {
306 jsr166 1.53 try {
307 dl 1.1 assertFalse(b);
308 jsr166 1.57 } catch (AssertionFailedError t) {
309 jsr166 1.53 threadRecordFailure(t);
310     throw t;
311 dl 1.1 }
312     }
313 dl 1.5
314     /**
315 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
316 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
317     * the current testcase will fail.
318 jsr166 1.27 */
319 dl 1.1 public void threadAssertNull(Object x) {
320 jsr166 1.53 try {
321 dl 1.1 assertNull(x);
322 jsr166 1.57 } catch (AssertionFailedError t) {
323 jsr166 1.53 threadRecordFailure(t);
324     throw t;
325 dl 1.1 }
326     }
327 dl 1.5
328     /**
329 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
330 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
331     * the current testcase will fail.
332 jsr166 1.27 */
333 dl 1.1 public void threadAssertEquals(long x, long y) {
334 jsr166 1.53 try {
335 dl 1.1 assertEquals(x, y);
336 jsr166 1.57 } catch (AssertionFailedError t) {
337 jsr166 1.53 threadRecordFailure(t);
338     throw t;
339 dl 1.1 }
340     }
341 dl 1.5
342     /**
343 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
344 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
345     * the current testcase will fail.
346 jsr166 1.27 */
347 dl 1.1 public void threadAssertEquals(Object x, Object y) {
348 jsr166 1.53 try {
349 dl 1.1 assertEquals(x, y);
350 jsr166 1.57 } catch (AssertionFailedError t) {
351 jsr166 1.53 threadRecordFailure(t);
352     throw t;
353 jsr166 1.57 } catch (Throwable t) {
354     threadUnexpectedException(t);
355 dl 1.1 }
356     }
357    
358 dl 1.5 /**
359 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
360 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
361     * the current testcase will fail.
362 jsr166 1.52 */
363     public void threadAssertSame(Object x, Object y) {
364 jsr166 1.53 try {
365 jsr166 1.52 assertSame(x, y);
366 jsr166 1.57 } catch (AssertionFailedError t) {
367 jsr166 1.53 threadRecordFailure(t);
368     throw t;
369 jsr166 1.52 }
370     }
371    
372     /**
373 jsr166 1.53 * Calls threadFail with message "should throw exception".
374 jsr166 1.33 */
375 dl 1.3 public void threadShouldThrow() {
376 jsr166 1.53 threadFail("should throw exception");
377 dl 1.3 }
378    
379 dl 1.5 /**
380 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
381 jsr166 1.40 */
382     public void threadShouldThrow(String exceptionName) {
383 jsr166 1.53 threadFail("should throw " + exceptionName);
384 dl 1.3 }
385    
386 dl 1.31 /**
387 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
388     * then rethrows the exception, wrapping it in an
389     * AssertionFailedError if necessary.
390 dl 1.31 */
391 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
392     threadRecordFailure(t);
393     t.printStackTrace();
394     if (t instanceof RuntimeException)
395     throw (RuntimeException) t;
396     else if (t instanceof Error)
397     throw (Error) t;
398     else {
399 jsr166 1.57 AssertionFailedError afe =
400     new AssertionFailedError("unexpected exception: " + t);
401 jsr166 1.53 t.initCause(t);
402 jsr166 1.57 throw afe;
403 jsr166 1.55 }
404 dl 1.31 }
405 dl 1.3
406 dl 1.1 /**
407 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
408 dl 1.1 */
409     public void joinPool(ExecutorService exec) {
410     try {
411     exec.shutdown();
412 jsr166 1.54 assertTrue("ExecutorService did not terminate in a timely manner",
413     exec.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
414 jsr166 1.33 } catch (SecurityException ok) {
415 dl 1.22 // Allowed in case test doesn't have privs
416 jsr166 1.33 } catch (InterruptedException ie) {
417 jsr166 1.44 fail("Unexpected InterruptedException");
418 dl 1.1 }
419     }
420    
421 dl 1.5
422     /**
423 jsr166 1.53 * Fails with message "should throw exception".
424 jsr166 1.27 */
425 dl 1.3 public void shouldThrow() {
426     fail("Should throw exception");
427     }
428    
429 dl 1.5 /**
430 jsr166 1.53 * Fails with message "should throw " + exceptionName.
431 jsr166 1.40 */
432     public void shouldThrow(String exceptionName) {
433     fail("Should throw " + exceptionName);
434     }
435    
436     /**
437 dl 1.1 * The number of elements to place in collections, arrays, etc.
438     */
439 jsr166 1.45 public static final int SIZE = 20;
440 dl 1.1
441     // Some convenient Integer constants
442    
443 jsr166 1.47 public static final Integer zero = new Integer(0);
444     public static final Integer one = new Integer(1);
445     public static final Integer two = new Integer(2);
446     public static final Integer three = new Integer(3);
447 jsr166 1.45 public static final Integer four = new Integer(4);
448     public static final Integer five = new Integer(5);
449 jsr166 1.47 public static final Integer six = new Integer(6);
450 jsr166 1.45 public static final Integer seven = new Integer(7);
451     public static final Integer eight = new Integer(8);
452 jsr166 1.47 public static final Integer nine = new Integer(9);
453 jsr166 1.45 public static final Integer m1 = new Integer(-1);
454     public static final Integer m2 = new Integer(-2);
455     public static final Integer m3 = new Integer(-3);
456 jsr166 1.47 public static final Integer m4 = new Integer(-4);
457     public static final Integer m5 = new Integer(-5);
458     public static final Integer m6 = new Integer(-6);
459 jsr166 1.45 public static final Integer m10 = new Integer(-10);
460 dl 1.7
461    
462     /**
463 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
464     * the specified permissions. If there is no current security
465     * manager, the runnable is run twice, both with and without a
466     * security manager. We require that any security manager permit
467     * getPolicy/setPolicy.
468     */
469     public void runWithPermissions(Runnable r, Permission... permissions) {
470     SecurityManager sm = System.getSecurityManager();
471     if (sm == null) {
472     r.run();
473     Policy savedPolicy = Policy.getPolicy();
474     try {
475     Policy.setPolicy(permissivePolicy());
476     System.setSecurityManager(new SecurityManager());
477     runWithPermissions(r, permissions);
478     } finally {
479     System.setSecurityManager(null);
480     Policy.setPolicy(savedPolicy);
481     }
482     } else {
483     Policy savedPolicy = Policy.getPolicy();
484     AdjustablePolicy policy = new AdjustablePolicy(permissions);
485     Policy.setPolicy(policy);
486    
487     try {
488     r.run();
489     } finally {
490     policy.addPermission(new SecurityPermission("setPolicy"));
491     Policy.setPolicy(savedPolicy);
492     }
493     }
494     }
495    
496     /**
497     * Runs a runnable without any permissions.
498     */
499     public void runWithoutPermissions(Runnable r) {
500     runWithPermissions(r);
501     }
502    
503     /**
504 dl 1.7 * A security policy where new permissions can be dynamically added
505     * or all cleared.
506     */
507 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
508 dl 1.7 Permissions perms = new Permissions();
509 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
510     for (Permission permission : permissions)
511     perms.add(permission);
512     }
513 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
514     void clearPermissions() { perms = new Permissions(); }
515 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
516     return perms;
517     }
518     public PermissionCollection getPermissions(ProtectionDomain pd) {
519     return perms;
520     }
521     public boolean implies(ProtectionDomain pd, Permission p) {
522     return perms.implies(p);
523     }
524     public void refresh() {}
525 dl 1.7 }
526 dl 1.1
527 jsr166 1.38 /**
528 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
529     */
530     public static Policy permissivePolicy() {
531     return new AdjustablePolicy
532     // Permissions j.u.c. needs directly
533     (new RuntimePermission("modifyThread"),
534     new RuntimePermission("getClassLoader"),
535     new RuntimePermission("setContextClassLoader"),
536     // Permissions needed to change permissions!
537     new SecurityPermission("getPolicy"),
538     new SecurityPermission("setPolicy"),
539     new RuntimePermission("setSecurityManager"),
540     // Permissions needed by the junit test harness
541     new RuntimePermission("accessDeclaredMembers"),
542     new PropertyPermission("*", "read"),
543     new java.io.FilePermission("<<ALL FILES>>", "read"));
544     }
545    
546     /**
547 jsr166 1.60 * Sleeps until the given time has elapsed.
548     * Throws AssertionFailedError if interrupted.
549     */
550     void sleep(long millis) {
551     try {
552     Thread.sleep(millis);
553     } catch (InterruptedException ie) {
554     AssertionFailedError afe =
555     new AssertionFailedError("Unexpected InterruptedException");
556     afe.initCause(ie);
557     throw afe;
558     }
559     }
560    
561     /**
562 jsr166 1.59 * Sleeps until the timeout has elapsed, or interrupted.
563 jsr166 1.38 * Does <em>NOT</em> throw InterruptedException.
564     */
565     void sleepTillInterrupted(long timeoutMillis) {
566     try {
567     Thread.sleep(timeoutMillis);
568 jsr166 1.44 } catch (InterruptedException wakeup) {}
569 jsr166 1.38 }
570    
571     /**
572 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
573 jsr166 1.38 */
574     Thread newStartedThread(Runnable runnable) {
575     Thread t = new Thread(runnable);
576 jsr166 1.58 t.setDaemon(true);
577 jsr166 1.38 t.start();
578     return t;
579     }
580 dl 1.1
581 jsr166 1.59 /**
582     * Waits for the specified time (in milliseconds) for the thread
583     * to terminate (using {@link Thread#join(long)}), else interrupts
584     * the thread (in the hope that it may terminate later) and fails.
585     */
586     void awaitTermination(Thread t, long timeoutMillis) {
587     try {
588     t.join(timeoutMillis);
589     } catch (InterruptedException ie) {
590     threadUnexpectedException(ie);
591     } finally {
592     if (t.isAlive()) {
593     t.interrupt();
594     fail("Test timed out");
595     }
596     }
597     }
598    
599 dl 1.1 // Some convenient Runnable classes
600    
601 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
602     protected abstract void realRun() throws Throwable;
603 jsr166 1.35
604     public final void run() {
605     try {
606     realRun();
607     } catch (Throwable t) {
608     threadUnexpectedException(t);
609     }
610     }
611     }
612    
613 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
614     protected abstract void realRun() throws Throwable;
615 jsr166 1.40
616     final Class<?> exceptionClass;
617    
618     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
619     this.exceptionClass = exceptionClass;
620     }
621    
622     public final void run() {
623     try {
624     realRun();
625     threadShouldThrow(exceptionClass.getSimpleName());
626     } catch (Throwable t) {
627     if (! exceptionClass.isInstance(t))
628     threadUnexpectedException(t);
629     }
630     }
631     }
632    
633 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
634     protected abstract void realRun() throws Throwable;
635 jsr166 1.40
636     final Class<?> exceptionClass;
637    
638     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
639     this.exceptionClass = exceptionClass;
640     }
641    
642     public final void run() {
643     try {
644     realRun();
645     threadShouldThrow(exceptionClass.getSimpleName());
646     } catch (Throwable t) {
647     if (! exceptionClass.isInstance(t))
648     threadUnexpectedException(t);
649     }
650     }
651     }
652    
653 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
654     protected abstract void realRun() throws Throwable;
655 jsr166 1.35
656     public final void run() {
657     try {
658     realRun();
659 jsr166 1.40 threadShouldThrow("InterruptedException");
660 jsr166 1.35 } catch (InterruptedException success) {
661     } catch (Throwable t) {
662     threadUnexpectedException(t);
663     }
664     }
665     }
666    
667 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
668     protected abstract T realCall() throws Throwable;
669 jsr166 1.35
670     public final T call() {
671     try {
672     return realCall();
673     } catch (Throwable t) {
674     threadUnexpectedException(t);
675 jsr166 1.53 return null;
676 jsr166 1.35 }
677 jsr166 1.40 }
678     }
679    
680 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
681     implements Callable<T> {
682 jsr166 1.45 protected abstract T realCall() throws Throwable;
683 jsr166 1.40
684     public final T call() {
685     try {
686     T result = realCall();
687     threadShouldThrow("InterruptedException");
688     return result;
689     } catch (InterruptedException success) {
690     } catch (Throwable t) {
691     threadUnexpectedException(t);
692     }
693     return null;
694 jsr166 1.35 }
695     }
696    
697 jsr166 1.45 public static class NoOpRunnable implements Runnable {
698 dl 1.1 public void run() {}
699     }
700    
701 jsr166 1.45 public static class NoOpCallable implements Callable {
702 dl 1.1 public Object call() { return Boolean.TRUE; }
703 dl 1.10 }
704    
705 jsr166 1.45 public static final String TEST_STRING = "a test string";
706 dl 1.10
707 jsr166 1.45 public static class StringTask implements Callable<String> {
708 dl 1.10 public String call() { return TEST_STRING; }
709     }
710    
711 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
712     return new CheckedCallable<String>() {
713     public String realCall() {
714     try {
715     latch.await();
716     } catch (InterruptedException quittingTime) {}
717     return TEST_STRING;
718     }};
719     }
720    
721 jsr166 1.45 public static class NPETask implements Callable<String> {
722 dl 1.10 public String call() { throw new NullPointerException(); }
723     }
724    
725 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
726 dl 1.10 public Integer call() { return one; }
727 dl 1.1 }
728    
729 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
730     protected void realRun() throws Throwable {
731 jsr166 1.35 Thread.sleep(SHORT_DELAY_MS);
732 dl 1.1 }
733     }
734    
735 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
736     protected void realRun() throws InterruptedException {
737 jsr166 1.35 Thread.sleep(SHORT_DELAY_MS);
738 dl 1.1 }
739     }
740    
741 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
742     protected void realRun() throws Throwable {
743 jsr166 1.35 Thread.sleep(SMALL_DELAY_MS);
744 dl 1.1 }
745     }
746    
747 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
748     protected void realRun() {
749 dl 1.6 try {
750     Thread.sleep(SMALL_DELAY_MS);
751 jsr166 1.44 } catch (InterruptedException ok) {}
752 dl 1.6 }
753     }
754    
755 jsr166 1.45 public class SmallCallable extends CheckedCallable {
756     protected Object realCall() throws InterruptedException {
757 jsr166 1.35 Thread.sleep(SMALL_DELAY_MS);
758 dl 1.1 return Boolean.TRUE;
759     }
760     }
761    
762 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
763     protected void realRun() throws Throwable {
764 jsr166 1.35 Thread.sleep(MEDIUM_DELAY_MS);
765 dl 1.1 }
766     }
767    
768 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
769     protected void realRun() throws InterruptedException {
770 jsr166 1.35 Thread.sleep(MEDIUM_DELAY_MS);
771 dl 1.1 }
772     }
773    
774 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
775     protected void realRun() {
776 dl 1.1 try {
777     Thread.sleep(MEDIUM_DELAY_MS);
778 jsr166 1.44 } catch (InterruptedException ok) {}
779 dl 1.1 }
780     }
781 dl 1.5
782 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
783     protected void realRun() {
784 dl 1.12 try {
785     Thread.sleep(LONG_DELAY_MS);
786 jsr166 1.44 } catch (InterruptedException ok) {}
787 dl 1.12 }
788     }
789    
790 dl 1.5 /**
791     * For use as ThreadFactory in constructors
792     */
793 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
794 jsr166 1.33 public Thread newThread(Runnable r) {
795 dl 1.5 return new Thread(r);
796 jsr166 1.27 }
797 dl 1.5 }
798    
799 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
800     public volatile boolean done = false;
801 dl 1.5 public void run() {
802     try {
803     Thread.sleep(SMALL_DELAY_MS);
804     done = true;
805 jsr166 1.44 } catch (InterruptedException ok) {}
806 dl 1.6 }
807     }
808    
809 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
810     public volatile boolean done = false;
811 dl 1.6 public void run() {
812     try {
813     Thread.sleep(MEDIUM_DELAY_MS);
814     done = true;
815 jsr166 1.44 } catch (InterruptedException ok) {}
816 dl 1.6 }
817     }
818    
819 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
820     public volatile boolean done = false;
821 dl 1.6 public void run() {
822     try {
823     Thread.sleep(LONG_DELAY_MS);
824     done = true;
825 jsr166 1.44 } catch (InterruptedException ok) {}
826 dl 1.6 }
827     }
828    
829 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
830     public volatile boolean done = false;
831 dl 1.6 public void run() {
832     done = true;
833 dl 1.5 }
834     }
835    
836 jsr166 1.45 public static class TrackedCallable implements Callable {
837     public volatile boolean done = false;
838 dl 1.5 public Object call() {
839     try {
840     Thread.sleep(SMALL_DELAY_MS);
841     done = true;
842 jsr166 1.44 } catch (InterruptedException ok) {}
843 dl 1.5 return Boolean.TRUE;
844     }
845     }
846 dl 1.14
847 jsr166 1.53 /**
848     * Analog of CheckedRunnable for RecursiveAction
849     */
850     public abstract class CheckedRecursiveAction extends RecursiveAction {
851     protected abstract void realCompute() throws Throwable;
852    
853     public final void compute() {
854     try {
855     realCompute();
856     } catch (Throwable t) {
857     threadUnexpectedException(t);
858     }
859     }
860     }
861    
862     /**
863     * Analog of CheckedCallable for RecursiveTask
864     */
865     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
866     protected abstract T realCompute() throws Throwable;
867    
868     public final T compute() {
869     try {
870     return realCompute();
871     } catch (Throwable t) {
872     threadUnexpectedException(t);
873     return null;
874     }
875     }
876     }
877 dl 1.5
878     /**
879     * For use as RejectedExecutionHandler in constructors
880     */
881 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
882 jsr166 1.35 public void rejectedExecution(Runnable r,
883     ThreadPoolExecutor executor) {}
884 dl 1.5 }
885 jsr166 1.27
886 jsr166 1.60 /**
887     * A CyclicBarrier that fails with AssertionFailedErrors instead
888     * of throwing checked exceptions.
889     */
890     public class CheckedBarrier extends CyclicBarrier {
891     public CheckedBarrier(int parties) { super(parties); }
892    
893     public int await() {
894     try {
895     return super.await();
896     } catch (Exception e) {
897     AssertionFailedError afe =
898     new AssertionFailedError("Unexpected exception: " + e);
899     afe.initCause(e);
900     throw afe;
901     }
902     }
903     }
904    
905 dl 1.1 }