ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.75
Committed: Tue May 3 06:08:49 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.74: +17 -0 lines
Log Message:
rewrite ReentrantReadWriteLockTest

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     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.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
635     * state: BLOCKED, WAITING, or TIMED_WAITING.
636     */
637     void waitForThreadToEnterWaitState(Thread thread) {
638     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
639     }
640    
641     /**
642 jsr166 1.66 * Returns the number of milliseconds since time given by
643     * startNanoTime, which must have been previously returned from a
644     * call to {@link System.nanoTime()}.
645     */
646     long millisElapsedSince(long startNanoTime) {
647     return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
648     }
649 jsr166 1.68
650 jsr166 1.66 /**
651 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
652 jsr166 1.38 */
653     Thread newStartedThread(Runnable runnable) {
654     Thread t = new Thread(runnable);
655 jsr166 1.58 t.setDaemon(true);
656 jsr166 1.38 t.start();
657     return t;
658     }
659 dl 1.1
660 jsr166 1.59 /**
661     * Waits for the specified time (in milliseconds) for the thread
662     * to terminate (using {@link Thread#join(long)}), else interrupts
663     * the thread (in the hope that it may terminate later) and fails.
664     */
665     void awaitTermination(Thread t, long timeoutMillis) {
666     try {
667     t.join(timeoutMillis);
668     } catch (InterruptedException ie) {
669     threadUnexpectedException(ie);
670     } finally {
671     if (t.isAlive()) {
672     t.interrupt();
673     fail("Test timed out");
674     }
675     }
676     }
677    
678 jsr166 1.75 /**
679     * Waits for LONG_DELAY_MS milliseconds for the thread to
680     * terminate (using {@link Thread#join(long)}), else interrupts
681     * the thread (in the hope that it may terminate later) and fails.
682     */
683     void awaitTermination(Thread t) {
684     awaitTermination(t, LONG_DELAY_MS);
685     }
686    
687 dl 1.1 // Some convenient Runnable classes
688    
689 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
690     protected abstract void realRun() throws Throwable;
691 jsr166 1.35
692     public final void run() {
693     try {
694     realRun();
695     } catch (Throwable t) {
696     threadUnexpectedException(t);
697     }
698     }
699     }
700    
701 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
702     protected abstract void realRun() throws Throwable;
703 jsr166 1.40
704     final Class<?> exceptionClass;
705    
706     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
707     this.exceptionClass = exceptionClass;
708     }
709    
710     public final void run() {
711     try {
712     realRun();
713     threadShouldThrow(exceptionClass.getSimpleName());
714     } catch (Throwable t) {
715     if (! exceptionClass.isInstance(t))
716     threadUnexpectedException(t);
717     }
718     }
719     }
720    
721 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
722     protected abstract void realRun() throws Throwable;
723 jsr166 1.40
724     final Class<?> exceptionClass;
725    
726     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
727     this.exceptionClass = exceptionClass;
728     }
729    
730     public final void run() {
731     try {
732     realRun();
733     threadShouldThrow(exceptionClass.getSimpleName());
734     } catch (Throwable t) {
735     if (! exceptionClass.isInstance(t))
736     threadUnexpectedException(t);
737     }
738     }
739     }
740    
741 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
742     protected abstract void realRun() throws Throwable;
743 jsr166 1.35
744     public final void run() {
745     try {
746     realRun();
747 jsr166 1.40 threadShouldThrow("InterruptedException");
748 jsr166 1.35 } catch (InterruptedException success) {
749     } catch (Throwable t) {
750     threadUnexpectedException(t);
751     }
752     }
753     }
754    
755 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
756     protected abstract T realCall() throws Throwable;
757 jsr166 1.35
758     public final T call() {
759     try {
760     return realCall();
761     } catch (Throwable t) {
762     threadUnexpectedException(t);
763 jsr166 1.53 return null;
764 jsr166 1.35 }
765 jsr166 1.40 }
766     }
767    
768 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
769     implements Callable<T> {
770 jsr166 1.45 protected abstract T realCall() throws Throwable;
771 jsr166 1.40
772     public final T call() {
773     try {
774     T result = realCall();
775     threadShouldThrow("InterruptedException");
776     return result;
777     } catch (InterruptedException success) {
778     } catch (Throwable t) {
779     threadUnexpectedException(t);
780     }
781     return null;
782 jsr166 1.35 }
783     }
784    
785 jsr166 1.45 public static class NoOpRunnable implements Runnable {
786 dl 1.1 public void run() {}
787     }
788    
789 jsr166 1.45 public static class NoOpCallable implements Callable {
790 dl 1.1 public Object call() { return Boolean.TRUE; }
791 dl 1.10 }
792    
793 jsr166 1.45 public static final String TEST_STRING = "a test string";
794 dl 1.10
795 jsr166 1.45 public static class StringTask implements Callable<String> {
796 dl 1.10 public String call() { return TEST_STRING; }
797     }
798    
799 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
800     return new CheckedCallable<String>() {
801 jsr166 1.64 protected String realCall() {
802 jsr166 1.48 try {
803     latch.await();
804     } catch (InterruptedException quittingTime) {}
805     return TEST_STRING;
806     }};
807     }
808    
809 jsr166 1.73 public Runnable awaiter(final CountDownLatch latch) {
810     return new CheckedRunnable() {
811     public void realRun() throws InterruptedException {
812     latch.await();
813     }};
814     }
815    
816 jsr166 1.45 public static class NPETask implements Callable<String> {
817 dl 1.10 public String call() { throw new NullPointerException(); }
818     }
819    
820 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
821 dl 1.10 public Integer call() { return one; }
822 dl 1.1 }
823    
824 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
825     protected void realRun() throws Throwable {
826 jsr166 1.35 Thread.sleep(SHORT_DELAY_MS);
827 dl 1.1 }
828     }
829    
830 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
831     protected void realRun() throws InterruptedException {
832 jsr166 1.35 Thread.sleep(SHORT_DELAY_MS);
833 dl 1.1 }
834     }
835    
836 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
837     protected void realRun() throws Throwable {
838 jsr166 1.35 Thread.sleep(SMALL_DELAY_MS);
839 dl 1.1 }
840     }
841    
842 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
843     protected void realRun() {
844 dl 1.6 try {
845     Thread.sleep(SMALL_DELAY_MS);
846 jsr166 1.44 } catch (InterruptedException ok) {}
847 dl 1.6 }
848     }
849    
850 jsr166 1.45 public class SmallCallable extends CheckedCallable {
851     protected Object realCall() throws InterruptedException {
852 jsr166 1.35 Thread.sleep(SMALL_DELAY_MS);
853 dl 1.1 return Boolean.TRUE;
854     }
855     }
856    
857 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
858     protected void realRun() throws Throwable {
859 jsr166 1.35 Thread.sleep(MEDIUM_DELAY_MS);
860 dl 1.1 }
861     }
862    
863 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
864     protected void realRun() throws InterruptedException {
865 jsr166 1.35 Thread.sleep(MEDIUM_DELAY_MS);
866 dl 1.1 }
867     }
868    
869 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
870     return new CheckedRunnable() {
871     protected void realRun() {
872     try {
873     Thread.sleep(timeoutMillis);
874     } catch (InterruptedException ok) {}
875     }};
876     }
877    
878 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
879     protected void realRun() {
880 dl 1.1 try {
881     Thread.sleep(MEDIUM_DELAY_MS);
882 jsr166 1.44 } catch (InterruptedException ok) {}
883 dl 1.1 }
884     }
885 dl 1.5
886 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
887     protected void realRun() {
888 dl 1.12 try {
889     Thread.sleep(LONG_DELAY_MS);
890 jsr166 1.44 } catch (InterruptedException ok) {}
891 dl 1.12 }
892     }
893    
894 dl 1.5 /**
895     * For use as ThreadFactory in constructors
896     */
897 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
898 jsr166 1.33 public Thread newThread(Runnable r) {
899 dl 1.5 return new Thread(r);
900 jsr166 1.27 }
901 dl 1.5 }
902    
903 jsr166 1.61 public interface TrackedRunnable extends Runnable {
904     boolean isDone();
905     }
906    
907     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
908     return new TrackedRunnable() {
909     private volatile boolean done = false;
910     public boolean isDone() { return done; }
911     public void run() {
912     try {
913     Thread.sleep(timeoutMillis);
914     done = true;
915     } catch (InterruptedException ok) {}
916     }
917     };
918     }
919    
920 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
921     public volatile boolean done = false;
922 dl 1.5 public void run() {
923     try {
924 jsr166 1.61 Thread.sleep(SHORT_DELAY_MS);
925     done = true;
926     } catch (InterruptedException ok) {}
927     }
928     }
929    
930     public static class TrackedSmallRunnable implements Runnable {
931     public volatile boolean done = false;
932     public void run() {
933     try {
934 dl 1.5 Thread.sleep(SMALL_DELAY_MS);
935     done = true;
936 jsr166 1.44 } catch (InterruptedException ok) {}
937 dl 1.6 }
938     }
939    
940 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
941     public volatile boolean done = false;
942 dl 1.6 public void run() {
943     try {
944     Thread.sleep(MEDIUM_DELAY_MS);
945     done = true;
946 jsr166 1.44 } catch (InterruptedException ok) {}
947 dl 1.6 }
948     }
949    
950 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
951     public volatile boolean done = false;
952 dl 1.6 public void run() {
953     try {
954     Thread.sleep(LONG_DELAY_MS);
955     done = true;
956 jsr166 1.44 } catch (InterruptedException ok) {}
957 dl 1.6 }
958     }
959    
960 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
961     public volatile boolean done = false;
962 dl 1.6 public void run() {
963     done = true;
964 dl 1.5 }
965     }
966    
967 jsr166 1.45 public static class TrackedCallable implements Callable {
968     public volatile boolean done = false;
969 dl 1.5 public Object call() {
970     try {
971     Thread.sleep(SMALL_DELAY_MS);
972     done = true;
973 jsr166 1.44 } catch (InterruptedException ok) {}
974 dl 1.5 return Boolean.TRUE;
975     }
976     }
977 dl 1.14
978 jsr166 1.53 /**
979     * Analog of CheckedRunnable for RecursiveAction
980     */
981     public abstract class CheckedRecursiveAction extends RecursiveAction {
982     protected abstract void realCompute() throws Throwable;
983    
984     public final void compute() {
985     try {
986     realCompute();
987     } catch (Throwable t) {
988     threadUnexpectedException(t);
989     }
990     }
991     }
992    
993     /**
994     * Analog of CheckedCallable for RecursiveTask
995     */
996     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
997     protected abstract T realCompute() throws Throwable;
998    
999     public final T compute() {
1000     try {
1001     return realCompute();
1002     } catch (Throwable t) {
1003     threadUnexpectedException(t);
1004     return null;
1005     }
1006     }
1007     }
1008 dl 1.5
1009     /**
1010     * For use as RejectedExecutionHandler in constructors
1011     */
1012 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1013 jsr166 1.35 public void rejectedExecution(Runnable r,
1014     ThreadPoolExecutor executor) {}
1015 dl 1.5 }
1016 jsr166 1.27
1017 jsr166 1.60 /**
1018     * A CyclicBarrier that fails with AssertionFailedErrors instead
1019     * of throwing checked exceptions.
1020     */
1021     public class CheckedBarrier extends CyclicBarrier {
1022     public CheckedBarrier(int parties) { super(parties); }
1023    
1024     public int await() {
1025     try {
1026     return super.await();
1027     } catch (Exception e) {
1028     AssertionFailedError afe =
1029     new AssertionFailedError("Unexpected exception: " + e);
1030     afe.initCause(e);
1031     throw afe;
1032     }
1033     }
1034     }
1035    
1036 jsr166 1.72 public void checkEmpty(BlockingQueue q) {
1037     try {
1038     assertTrue(q.isEmpty());
1039     assertEquals(0, q.size());
1040     assertNull(q.peek());
1041     assertNull(q.poll());
1042     assertNull(q.poll(0, MILLISECONDS));
1043     assertEquals(q.toString(), "[]");
1044     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1045     assertFalse(q.iterator().hasNext());
1046     try {
1047     q.element();
1048     shouldThrow();
1049     } catch (NoSuchElementException success) {}
1050     try {
1051     q.iterator().next();
1052     shouldThrow();
1053     } catch (NoSuchElementException success) {}
1054     try {
1055     q.remove();
1056     shouldThrow();
1057     } catch (NoSuchElementException success) {}
1058     } catch (InterruptedException ie) {
1059     threadUnexpectedException(ie);
1060     }
1061     }
1062    
1063 dl 1.1 }