ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.73
Committed: Mon Nov 29 07:39:53 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.72: +7 -0 lines
Log Message:
add Runnable awaiter(CountDownLatch)

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