ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.77
Committed: Fri May 6 17:26:29 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.76: +2 -2 lines
Log Message:
whitespace

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 dl 1.76 * Delays, via Thread.sleep for the given millisecond delay, but
447     * if the sleep is shorter than specified, may re-sleep or yield
448     * until time elapses.
449     */
450     public static void delay(long ms) throws InterruptedException {
451     long startTime = System.nanoTime();
452 jsr166 1.77 long ns = ms * 1000 * 1000;
453 dl 1.76 for (;;) {
454     if (ms > 0L)
455     Thread.sleep(ms);
456     else // too short to sleep
457     Thread.yield();
458     long d = ns - (System.nanoTime() - startTime);
459     if (d > 0L)
460 jsr166 1.77 ms = d / (1000 * 1000);
461 dl 1.76 else
462     break;
463     }
464     }
465    
466     /**
467 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
468 dl 1.1 */
469     public void joinPool(ExecutorService exec) {
470     try {
471     exec.shutdown();
472 jsr166 1.54 assertTrue("ExecutorService did not terminate in a timely manner",
473 jsr166 1.71 exec.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS));
474 jsr166 1.33 } catch (SecurityException ok) {
475 dl 1.22 // Allowed in case test doesn't have privs
476 jsr166 1.33 } catch (InterruptedException ie) {
477 jsr166 1.44 fail("Unexpected InterruptedException");
478 dl 1.1 }
479     }
480    
481 dl 1.5
482     /**
483 jsr166 1.53 * Fails with message "should throw exception".
484 jsr166 1.27 */
485 dl 1.3 public void shouldThrow() {
486     fail("Should throw exception");
487     }
488    
489 dl 1.5 /**
490 jsr166 1.53 * Fails with message "should throw " + exceptionName.
491 jsr166 1.40 */
492     public void shouldThrow(String exceptionName) {
493     fail("Should throw " + exceptionName);
494     }
495    
496     /**
497 dl 1.1 * The number of elements to place in collections, arrays, etc.
498     */
499 jsr166 1.45 public static final int SIZE = 20;
500 dl 1.1
501     // Some convenient Integer constants
502    
503 jsr166 1.47 public static final Integer zero = new Integer(0);
504     public static final Integer one = new Integer(1);
505     public static final Integer two = new Integer(2);
506     public static final Integer three = new Integer(3);
507 jsr166 1.45 public static final Integer four = new Integer(4);
508     public static final Integer five = new Integer(5);
509 jsr166 1.47 public static final Integer six = new Integer(6);
510 jsr166 1.45 public static final Integer seven = new Integer(7);
511     public static final Integer eight = new Integer(8);
512 jsr166 1.47 public static final Integer nine = new Integer(9);
513 jsr166 1.45 public static final Integer m1 = new Integer(-1);
514     public static final Integer m2 = new Integer(-2);
515     public static final Integer m3 = new Integer(-3);
516 jsr166 1.47 public static final Integer m4 = new Integer(-4);
517     public static final Integer m5 = new Integer(-5);
518     public static final Integer m6 = new Integer(-6);
519 jsr166 1.45 public static final Integer m10 = new Integer(-10);
520 dl 1.7
521    
522     /**
523 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
524     * the specified permissions. If there is no current security
525     * manager, the runnable is run twice, both with and without a
526     * security manager. We require that any security manager permit
527     * getPolicy/setPolicy.
528     */
529     public void runWithPermissions(Runnable r, Permission... permissions) {
530     SecurityManager sm = System.getSecurityManager();
531     if (sm == null) {
532     r.run();
533     Policy savedPolicy = Policy.getPolicy();
534     try {
535     Policy.setPolicy(permissivePolicy());
536     System.setSecurityManager(new SecurityManager());
537     runWithPermissions(r, permissions);
538     } finally {
539     System.setSecurityManager(null);
540     Policy.setPolicy(savedPolicy);
541     }
542     } else {
543     Policy savedPolicy = Policy.getPolicy();
544     AdjustablePolicy policy = new AdjustablePolicy(permissions);
545     Policy.setPolicy(policy);
546    
547     try {
548     r.run();
549     } finally {
550     policy.addPermission(new SecurityPermission("setPolicy"));
551     Policy.setPolicy(savedPolicy);
552     }
553     }
554     }
555    
556     /**
557     * Runs a runnable without any permissions.
558     */
559     public void runWithoutPermissions(Runnable r) {
560     runWithPermissions(r);
561     }
562    
563     /**
564 dl 1.7 * A security policy where new permissions can be dynamically added
565     * or all cleared.
566     */
567 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
568 dl 1.7 Permissions perms = new Permissions();
569 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
570     for (Permission permission : permissions)
571     perms.add(permission);
572     }
573 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
574     void clearPermissions() { perms = new Permissions(); }
575 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
576     return perms;
577     }
578     public PermissionCollection getPermissions(ProtectionDomain pd) {
579     return perms;
580     }
581     public boolean implies(ProtectionDomain pd, Permission p) {
582     return perms.implies(p);
583     }
584     public void refresh() {}
585 dl 1.7 }
586 dl 1.1
587 jsr166 1.38 /**
588 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
589     */
590     public static Policy permissivePolicy() {
591     return new AdjustablePolicy
592     // Permissions j.u.c. needs directly
593     (new RuntimePermission("modifyThread"),
594     new RuntimePermission("getClassLoader"),
595     new RuntimePermission("setContextClassLoader"),
596     // Permissions needed to change permissions!
597     new SecurityPermission("getPolicy"),
598     new SecurityPermission("setPolicy"),
599     new RuntimePermission("setSecurityManager"),
600     // Permissions needed by the junit test harness
601     new RuntimePermission("accessDeclaredMembers"),
602     new PropertyPermission("*", "read"),
603     new java.io.FilePermission("<<ALL FILES>>", "read"));
604     }
605    
606     /**
607 jsr166 1.60 * Sleeps until the given time has elapsed.
608     * Throws AssertionFailedError if interrupted.
609     */
610     void sleep(long millis) {
611     try {
612 dl 1.76 delay(millis);
613 jsr166 1.60 } catch (InterruptedException ie) {
614     AssertionFailedError afe =
615     new AssertionFailedError("Unexpected InterruptedException");
616     afe.initCause(ie);
617     throw afe;
618     }
619     }
620    
621     /**
622 jsr166 1.59 * Sleeps until the timeout has elapsed, or interrupted.
623 jsr166 1.38 * Does <em>NOT</em> throw InterruptedException.
624     */
625     void sleepTillInterrupted(long timeoutMillis) {
626     try {
627     Thread.sleep(timeoutMillis);
628 jsr166 1.44 } catch (InterruptedException wakeup) {}
629 jsr166 1.38 }
630    
631     /**
632 jsr166 1.65 * Waits up to the specified number of milliseconds for the given
633     * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
634     */
635     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
636     long timeoutNanos = timeoutMillis * 1000L * 1000L;
637     long t0 = System.nanoTime();
638     for (;;) {
639     Thread.State s = thread.getState();
640     if (s == Thread.State.BLOCKED ||
641     s == Thread.State.WAITING ||
642 jsr166 1.67 s == Thread.State.TIMED_WAITING)
643 jsr166 1.65 return;
644 jsr166 1.67 else if (s == Thread.State.TERMINATED)
645     fail("Unexpected thread termination");
646     else if (System.nanoTime() - t0 > timeoutNanos) {
647     threadAssertTrue(thread.isAlive());
648     return;
649     }
650 jsr166 1.65 Thread.yield();
651     }
652     }
653    
654     /**
655 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
656     * state: BLOCKED, WAITING, or TIMED_WAITING.
657     */
658     void waitForThreadToEnterWaitState(Thread thread) {
659     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
660     }
661    
662     /**
663 jsr166 1.66 * Returns the number of milliseconds since time given by
664     * startNanoTime, which must have been previously returned from a
665     * call to {@link System.nanoTime()}.
666     */
667     long millisElapsedSince(long startNanoTime) {
668     return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
669     }
670 jsr166 1.68
671 jsr166 1.66 /**
672 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
673 jsr166 1.38 */
674     Thread newStartedThread(Runnable runnable) {
675     Thread t = new Thread(runnable);
676 jsr166 1.58 t.setDaemon(true);
677 jsr166 1.38 t.start();
678     return t;
679     }
680 dl 1.1
681 jsr166 1.59 /**
682     * Waits for the specified time (in milliseconds) for the thread
683     * to terminate (using {@link Thread#join(long)}), else interrupts
684     * the thread (in the hope that it may terminate later) and fails.
685     */
686     void awaitTermination(Thread t, long timeoutMillis) {
687     try {
688     t.join(timeoutMillis);
689     } catch (InterruptedException ie) {
690     threadUnexpectedException(ie);
691     } finally {
692     if (t.isAlive()) {
693     t.interrupt();
694     fail("Test timed out");
695     }
696     }
697     }
698    
699 jsr166 1.75 /**
700     * Waits for LONG_DELAY_MS milliseconds for the thread to
701     * terminate (using {@link Thread#join(long)}), else interrupts
702     * the thread (in the hope that it may terminate later) and fails.
703     */
704     void awaitTermination(Thread t) {
705     awaitTermination(t, LONG_DELAY_MS);
706     }
707    
708 dl 1.1 // Some convenient Runnable classes
709    
710 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
711     protected abstract void realRun() throws Throwable;
712 jsr166 1.35
713     public final void run() {
714     try {
715     realRun();
716     } catch (Throwable t) {
717     threadUnexpectedException(t);
718     }
719     }
720     }
721    
722 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
723     protected abstract void realRun() throws Throwable;
724 jsr166 1.40
725     final Class<?> exceptionClass;
726    
727     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
728     this.exceptionClass = exceptionClass;
729     }
730    
731     public final void run() {
732     try {
733     realRun();
734     threadShouldThrow(exceptionClass.getSimpleName());
735     } catch (Throwable t) {
736     if (! exceptionClass.isInstance(t))
737     threadUnexpectedException(t);
738     }
739     }
740     }
741    
742 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
743     protected abstract void realRun() throws Throwable;
744 jsr166 1.40
745     final Class<?> exceptionClass;
746    
747     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
748     this.exceptionClass = exceptionClass;
749     }
750    
751     public final void run() {
752     try {
753     realRun();
754     threadShouldThrow(exceptionClass.getSimpleName());
755     } catch (Throwable t) {
756     if (! exceptionClass.isInstance(t))
757     threadUnexpectedException(t);
758     }
759     }
760     }
761    
762 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
763     protected abstract void realRun() throws Throwable;
764 jsr166 1.35
765     public final void run() {
766     try {
767     realRun();
768 jsr166 1.40 threadShouldThrow("InterruptedException");
769 jsr166 1.35 } catch (InterruptedException success) {
770     } catch (Throwable t) {
771     threadUnexpectedException(t);
772     }
773     }
774     }
775    
776 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
777     protected abstract T realCall() throws Throwable;
778 jsr166 1.35
779     public final T call() {
780     try {
781     return realCall();
782     } catch (Throwable t) {
783     threadUnexpectedException(t);
784 jsr166 1.53 return null;
785 jsr166 1.35 }
786 jsr166 1.40 }
787     }
788    
789 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
790     implements Callable<T> {
791 jsr166 1.45 protected abstract T realCall() throws Throwable;
792 jsr166 1.40
793     public final T call() {
794     try {
795     T result = realCall();
796     threadShouldThrow("InterruptedException");
797     return result;
798     } catch (InterruptedException success) {
799     } catch (Throwable t) {
800     threadUnexpectedException(t);
801     }
802     return null;
803 jsr166 1.35 }
804     }
805    
806 jsr166 1.45 public static class NoOpRunnable implements Runnable {
807 dl 1.1 public void run() {}
808     }
809    
810 jsr166 1.45 public static class NoOpCallable implements Callable {
811 dl 1.1 public Object call() { return Boolean.TRUE; }
812 dl 1.10 }
813    
814 jsr166 1.45 public static final String TEST_STRING = "a test string";
815 dl 1.10
816 jsr166 1.45 public static class StringTask implements Callable<String> {
817 dl 1.10 public String call() { return TEST_STRING; }
818     }
819    
820 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
821     return new CheckedCallable<String>() {
822 jsr166 1.64 protected String realCall() {
823 jsr166 1.48 try {
824     latch.await();
825     } catch (InterruptedException quittingTime) {}
826     return TEST_STRING;
827     }};
828     }
829    
830 jsr166 1.73 public Runnable awaiter(final CountDownLatch latch) {
831     return new CheckedRunnable() {
832     public void realRun() throws InterruptedException {
833     latch.await();
834     }};
835     }
836    
837 jsr166 1.45 public static class NPETask implements Callable<String> {
838 dl 1.10 public String call() { throw new NullPointerException(); }
839     }
840    
841 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
842 dl 1.10 public Integer call() { return one; }
843 dl 1.1 }
844    
845 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
846     protected void realRun() throws Throwable {
847 dl 1.76 delay(SHORT_DELAY_MS);
848 dl 1.1 }
849     }
850    
851 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
852     protected void realRun() throws InterruptedException {
853 dl 1.76 delay(SHORT_DELAY_MS);
854 dl 1.1 }
855     }
856    
857 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
858     protected void realRun() throws Throwable {
859 dl 1.76 delay(SMALL_DELAY_MS);
860 dl 1.1 }
861     }
862    
863 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
864     protected void realRun() {
865 dl 1.6 try {
866 dl 1.76 delay(SMALL_DELAY_MS);
867 jsr166 1.44 } catch (InterruptedException ok) {}
868 dl 1.6 }
869     }
870    
871 jsr166 1.45 public class SmallCallable extends CheckedCallable {
872     protected Object realCall() throws InterruptedException {
873 dl 1.76 delay(SMALL_DELAY_MS);
874 dl 1.1 return Boolean.TRUE;
875     }
876     }
877    
878 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
879     protected void realRun() throws Throwable {
880 dl 1.76 delay(MEDIUM_DELAY_MS);
881 dl 1.1 }
882     }
883    
884 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
885     protected void realRun() throws InterruptedException {
886 dl 1.76 delay(MEDIUM_DELAY_MS);
887 dl 1.1 }
888     }
889    
890 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
891     return new CheckedRunnable() {
892     protected void realRun() {
893     try {
894 dl 1.76 delay(timeoutMillis);
895 jsr166 1.63 } catch (InterruptedException ok) {}
896     }};
897     }
898    
899 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
900     protected void realRun() {
901 dl 1.1 try {
902 dl 1.76 delay(MEDIUM_DELAY_MS);
903 jsr166 1.44 } catch (InterruptedException ok) {}
904 dl 1.1 }
905     }
906 dl 1.5
907 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
908     protected void realRun() {
909 dl 1.12 try {
910 dl 1.76 delay(LONG_DELAY_MS);
911 jsr166 1.44 } catch (InterruptedException ok) {}
912 dl 1.12 }
913     }
914    
915 dl 1.5 /**
916     * For use as ThreadFactory in constructors
917     */
918 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
919 jsr166 1.33 public Thread newThread(Runnable r) {
920 dl 1.5 return new Thread(r);
921 jsr166 1.27 }
922 dl 1.5 }
923    
924 jsr166 1.61 public interface TrackedRunnable extends Runnable {
925     boolean isDone();
926     }
927    
928     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
929     return new TrackedRunnable() {
930     private volatile boolean done = false;
931     public boolean isDone() { return done; }
932     public void run() {
933     try {
934 dl 1.76 delay(timeoutMillis);
935 jsr166 1.61 done = true;
936     } catch (InterruptedException ok) {}
937     }
938     };
939     }
940    
941 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
942     public volatile boolean done = false;
943 dl 1.5 public void run() {
944     try {
945 dl 1.76 delay(SHORT_DELAY_MS);
946 jsr166 1.61 done = true;
947     } catch (InterruptedException ok) {}
948     }
949     }
950    
951     public static class TrackedSmallRunnable implements Runnable {
952     public volatile boolean done = false;
953     public void run() {
954     try {
955 dl 1.76 delay(SMALL_DELAY_MS);
956 dl 1.5 done = true;
957 jsr166 1.44 } catch (InterruptedException ok) {}
958 dl 1.6 }
959     }
960    
961 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
962     public volatile boolean done = false;
963 dl 1.6 public void run() {
964     try {
965 dl 1.76 delay(MEDIUM_DELAY_MS);
966 dl 1.6 done = true;
967 jsr166 1.44 } catch (InterruptedException ok) {}
968 dl 1.6 }
969     }
970    
971 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
972     public volatile boolean done = false;
973 dl 1.6 public void run() {
974     try {
975 dl 1.76 delay(LONG_DELAY_MS);
976 dl 1.6 done = true;
977 jsr166 1.44 } catch (InterruptedException ok) {}
978 dl 1.6 }
979     }
980    
981 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
982     public volatile boolean done = false;
983 dl 1.6 public void run() {
984     done = true;
985 dl 1.5 }
986     }
987    
988 jsr166 1.45 public static class TrackedCallable implements Callable {
989     public volatile boolean done = false;
990 dl 1.5 public Object call() {
991     try {
992 dl 1.76 delay(SMALL_DELAY_MS);
993 dl 1.5 done = true;
994 jsr166 1.44 } catch (InterruptedException ok) {}
995 dl 1.5 return Boolean.TRUE;
996     }
997     }
998 dl 1.14
999 jsr166 1.53 /**
1000     * Analog of CheckedRunnable for RecursiveAction
1001     */
1002     public abstract class CheckedRecursiveAction extends RecursiveAction {
1003     protected abstract void realCompute() throws Throwable;
1004    
1005     public final void compute() {
1006     try {
1007     realCompute();
1008     } catch (Throwable t) {
1009     threadUnexpectedException(t);
1010     }
1011     }
1012     }
1013    
1014     /**
1015     * Analog of CheckedCallable for RecursiveTask
1016     */
1017     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1018     protected abstract T realCompute() throws Throwable;
1019    
1020     public final T compute() {
1021     try {
1022     return realCompute();
1023     } catch (Throwable t) {
1024     threadUnexpectedException(t);
1025     return null;
1026     }
1027     }
1028     }
1029 dl 1.5
1030     /**
1031     * For use as RejectedExecutionHandler in constructors
1032     */
1033 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1034 jsr166 1.35 public void rejectedExecution(Runnable r,
1035     ThreadPoolExecutor executor) {}
1036 dl 1.5 }
1037 jsr166 1.27
1038 jsr166 1.60 /**
1039     * A CyclicBarrier that fails with AssertionFailedErrors instead
1040     * of throwing checked exceptions.
1041     */
1042     public class CheckedBarrier extends CyclicBarrier {
1043     public CheckedBarrier(int parties) { super(parties); }
1044    
1045     public int await() {
1046     try {
1047     return super.await();
1048     } catch (Exception e) {
1049     AssertionFailedError afe =
1050     new AssertionFailedError("Unexpected exception: " + e);
1051     afe.initCause(e);
1052     throw afe;
1053     }
1054     }
1055     }
1056    
1057 jsr166 1.72 public void checkEmpty(BlockingQueue q) {
1058     try {
1059     assertTrue(q.isEmpty());
1060     assertEquals(0, q.size());
1061     assertNull(q.peek());
1062     assertNull(q.poll());
1063     assertNull(q.poll(0, MILLISECONDS));
1064     assertEquals(q.toString(), "[]");
1065     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1066     assertFalse(q.iterator().hasNext());
1067     try {
1068     q.element();
1069     shouldThrow();
1070     } catch (NoSuchElementException success) {}
1071     try {
1072     q.iterator().next();
1073     shouldThrow();
1074     } catch (NoSuchElementException success) {}
1075     try {
1076     q.remove();
1077     shouldThrow();
1078     } catch (NoSuchElementException success) {}
1079     } catch (InterruptedException ie) {
1080     threadUnexpectedException(ie);
1081     }
1082     }
1083    
1084 dl 1.1 }