ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.85
Committed: Sun May 29 14:18:52 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.84: +7 -0 lines
Log Message:
ensure interrupt status not set by any test

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