ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.90
Committed: Wed Jun 22 07:46:57 2011 UTC (12 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.89: +22 -0 lines
Log Message:
various test improvements

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.90 * Checks that the threads do not terminate within the default
532     * millisecond delay of {@code timeoutMillis()}.
533     */
534     void assertThreadsStayAlive(Thread... threads) {
535     assertThreadsStayAlive(timeoutMillis(), threads);
536     }
537    
538     /**
539     * Checks that the threads do not terminate within the given millisecond delay.
540     */
541     void assertThreadsStayAlive(long millis, Thread... threads) {
542     try {
543     // No need to optimize the failing case via Thread.join.
544     delay(millis);
545     for (Thread thread : threads)
546     assertTrue(thread.isAlive());
547     } catch (InterruptedException ie) {
548     fail("Unexpected InterruptedException");
549     }
550     }
551    
552     /**
553 jsr166 1.83 * Checks that future.get times out, with the default timeout of
554     * {@code timeoutMillis()}.
555     */
556     void assertFutureTimesOut(Future future) {
557     assertFutureTimesOut(future, timeoutMillis());
558     }
559    
560     /**
561     * Checks that future.get times out, with the given millisecond timeout.
562     */
563     void assertFutureTimesOut(Future future, long timeoutMillis) {
564     long startTime = System.nanoTime();
565     try {
566     future.get(timeoutMillis, MILLISECONDS);
567     shouldThrow();
568     } catch (TimeoutException success) {
569     } catch (Exception e) {
570     threadUnexpectedException(e);
571     } finally { future.cancel(true); }
572     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
573     }
574    
575     /**
576 jsr166 1.53 * Fails with message "should throw exception".
577 jsr166 1.27 */
578 dl 1.3 public void shouldThrow() {
579     fail("Should throw exception");
580     }
581    
582 dl 1.5 /**
583 jsr166 1.53 * Fails with message "should throw " + exceptionName.
584 jsr166 1.40 */
585     public void shouldThrow(String exceptionName) {
586     fail("Should throw " + exceptionName);
587     }
588    
589     /**
590 dl 1.1 * The number of elements to place in collections, arrays, etc.
591     */
592 jsr166 1.45 public static final int SIZE = 20;
593 dl 1.1
594     // Some convenient Integer constants
595    
596 jsr166 1.47 public static final Integer zero = new Integer(0);
597     public static final Integer one = new Integer(1);
598     public static final Integer two = new Integer(2);
599     public static final Integer three = new Integer(3);
600 jsr166 1.45 public static final Integer four = new Integer(4);
601     public static final Integer five = new Integer(5);
602 jsr166 1.47 public static final Integer six = new Integer(6);
603 jsr166 1.45 public static final Integer seven = new Integer(7);
604     public static final Integer eight = new Integer(8);
605 jsr166 1.47 public static final Integer nine = new Integer(9);
606 jsr166 1.45 public static final Integer m1 = new Integer(-1);
607     public static final Integer m2 = new Integer(-2);
608     public static final Integer m3 = new Integer(-3);
609 jsr166 1.47 public static final Integer m4 = new Integer(-4);
610     public static final Integer m5 = new Integer(-5);
611     public static final Integer m6 = new Integer(-6);
612 jsr166 1.45 public static final Integer m10 = new Integer(-10);
613 dl 1.7
614    
615     /**
616 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
617     * the specified permissions. If there is no current security
618     * manager, the runnable is run twice, both with and without a
619     * security manager. We require that any security manager permit
620     * getPolicy/setPolicy.
621     */
622     public void runWithPermissions(Runnable r, Permission... permissions) {
623     SecurityManager sm = System.getSecurityManager();
624     if (sm == null) {
625     r.run();
626     Policy savedPolicy = Policy.getPolicy();
627     try {
628     Policy.setPolicy(permissivePolicy());
629     System.setSecurityManager(new SecurityManager());
630     runWithPermissions(r, permissions);
631     } finally {
632     System.setSecurityManager(null);
633     Policy.setPolicy(savedPolicy);
634     }
635     } else {
636     Policy savedPolicy = Policy.getPolicy();
637     AdjustablePolicy policy = new AdjustablePolicy(permissions);
638     Policy.setPolicy(policy);
639    
640     try {
641     r.run();
642     } finally {
643     policy.addPermission(new SecurityPermission("setPolicy"));
644     Policy.setPolicy(savedPolicy);
645     }
646     }
647     }
648    
649     /**
650     * Runs a runnable without any permissions.
651     */
652     public void runWithoutPermissions(Runnable r) {
653     runWithPermissions(r);
654     }
655    
656     /**
657 dl 1.7 * A security policy where new permissions can be dynamically added
658     * or all cleared.
659     */
660 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
661 dl 1.7 Permissions perms = new Permissions();
662 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
663     for (Permission permission : permissions)
664     perms.add(permission);
665     }
666 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
667     void clearPermissions() { perms = new Permissions(); }
668 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
669     return perms;
670     }
671     public PermissionCollection getPermissions(ProtectionDomain pd) {
672     return perms;
673     }
674     public boolean implies(ProtectionDomain pd, Permission p) {
675     return perms.implies(p);
676     }
677     public void refresh() {}
678 dl 1.7 }
679 dl 1.1
680 jsr166 1.38 /**
681 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
682     */
683     public static Policy permissivePolicy() {
684     return new AdjustablePolicy
685     // Permissions j.u.c. needs directly
686     (new RuntimePermission("modifyThread"),
687     new RuntimePermission("getClassLoader"),
688     new RuntimePermission("setContextClassLoader"),
689     // Permissions needed to change permissions!
690     new SecurityPermission("getPolicy"),
691     new SecurityPermission("setPolicy"),
692     new RuntimePermission("setSecurityManager"),
693     // Permissions needed by the junit test harness
694     new RuntimePermission("accessDeclaredMembers"),
695     new PropertyPermission("*", "read"),
696     new java.io.FilePermission("<<ALL FILES>>", "read"));
697     }
698    
699     /**
700 jsr166 1.60 * Sleeps until the given time has elapsed.
701     * Throws AssertionFailedError if interrupted.
702     */
703     void sleep(long millis) {
704     try {
705 dl 1.76 delay(millis);
706 jsr166 1.60 } catch (InterruptedException ie) {
707     AssertionFailedError afe =
708     new AssertionFailedError("Unexpected InterruptedException");
709     afe.initCause(ie);
710     throw afe;
711     }
712     }
713    
714     /**
715 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
716 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
717     */
718     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
719 jsr166 1.88 long startTime = System.nanoTime();
720 jsr166 1.65 for (;;) {
721     Thread.State s = thread.getState();
722     if (s == Thread.State.BLOCKED ||
723     s == Thread.State.WAITING ||
724 jsr166 1.67 s == Thread.State.TIMED_WAITING)
725 jsr166 1.65 return;
726 jsr166 1.67 else if (s == Thread.State.TERMINATED)
727     fail("Unexpected thread termination");
728 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
729 jsr166 1.67 threadAssertTrue(thread.isAlive());
730     return;
731     }
732 jsr166 1.65 Thread.yield();
733     }
734     }
735    
736     /**
737 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
738     * state: BLOCKED, WAITING, or TIMED_WAITING.
739     */
740     void waitForThreadToEnterWaitState(Thread thread) {
741     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
742     }
743    
744     /**
745 jsr166 1.66 * Returns the number of milliseconds since time given by
746     * startNanoTime, which must have been previously returned from a
747     * call to {@link System.nanoTime()}.
748     */
749     long millisElapsedSince(long startNanoTime) {
750     return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
751     }
752 jsr166 1.68
753 jsr166 1.66 /**
754 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
755 jsr166 1.38 */
756     Thread newStartedThread(Runnable runnable) {
757     Thread t = new Thread(runnable);
758 jsr166 1.58 t.setDaemon(true);
759 jsr166 1.38 t.start();
760     return t;
761     }
762 dl 1.1
763 jsr166 1.59 /**
764     * Waits for the specified time (in milliseconds) for the thread
765     * to terminate (using {@link Thread#join(long)}), else interrupts
766     * the thread (in the hope that it may terminate later) and fails.
767     */
768     void awaitTermination(Thread t, long timeoutMillis) {
769     try {
770     t.join(timeoutMillis);
771     } catch (InterruptedException ie) {
772     threadUnexpectedException(ie);
773     } finally {
774 jsr166 1.83 if (t.getState() != Thread.State.TERMINATED) {
775 jsr166 1.59 t.interrupt();
776     fail("Test timed out");
777     }
778     }
779     }
780    
781 jsr166 1.75 /**
782     * Waits for LONG_DELAY_MS milliseconds for the thread to
783     * terminate (using {@link Thread#join(long)}), else interrupts
784     * the thread (in the hope that it may terminate later) and fails.
785     */
786     void awaitTermination(Thread t) {
787     awaitTermination(t, LONG_DELAY_MS);
788     }
789    
790 dl 1.1 // Some convenient Runnable classes
791    
792 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
793     protected abstract void realRun() throws Throwable;
794 jsr166 1.35
795     public final void run() {
796     try {
797     realRun();
798     } catch (Throwable t) {
799     threadUnexpectedException(t);
800     }
801     }
802     }
803    
804 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
805     protected abstract void realRun() throws Throwable;
806 jsr166 1.40
807     final Class<?> exceptionClass;
808    
809     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
810     this.exceptionClass = exceptionClass;
811     }
812    
813     public final void run() {
814     try {
815     realRun();
816     threadShouldThrow(exceptionClass.getSimpleName());
817     } catch (Throwable t) {
818     if (! exceptionClass.isInstance(t))
819     threadUnexpectedException(t);
820     }
821     }
822     }
823    
824 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
825     protected abstract void realRun() throws Throwable;
826 jsr166 1.40
827     final Class<?> exceptionClass;
828    
829     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
830     this.exceptionClass = exceptionClass;
831     }
832    
833     public final void run() {
834     try {
835     realRun();
836     threadShouldThrow(exceptionClass.getSimpleName());
837     } catch (Throwable t) {
838     if (! exceptionClass.isInstance(t))
839     threadUnexpectedException(t);
840     }
841     }
842     }
843    
844 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
845     protected abstract void realRun() throws Throwable;
846 jsr166 1.35
847     public final void run() {
848     try {
849     realRun();
850 jsr166 1.40 threadShouldThrow("InterruptedException");
851 jsr166 1.35 } catch (InterruptedException success) {
852 jsr166 1.81 threadAssertFalse(Thread.interrupted());
853 jsr166 1.35 } catch (Throwable t) {
854     threadUnexpectedException(t);
855     }
856     }
857     }
858    
859 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
860     protected abstract T realCall() throws Throwable;
861 jsr166 1.35
862     public final T call() {
863     try {
864     return realCall();
865     } catch (Throwable t) {
866     threadUnexpectedException(t);
867 jsr166 1.53 return null;
868 jsr166 1.35 }
869 jsr166 1.40 }
870     }
871    
872 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
873     implements Callable<T> {
874 jsr166 1.45 protected abstract T realCall() throws Throwable;
875 jsr166 1.40
876     public final T call() {
877     try {
878     T result = realCall();
879     threadShouldThrow("InterruptedException");
880     return result;
881     } catch (InterruptedException success) {
882 jsr166 1.81 threadAssertFalse(Thread.interrupted());
883 jsr166 1.40 } catch (Throwable t) {
884     threadUnexpectedException(t);
885     }
886     return null;
887 jsr166 1.35 }
888     }
889    
890 jsr166 1.45 public static class NoOpRunnable implements Runnable {
891 dl 1.1 public void run() {}
892     }
893    
894 jsr166 1.45 public static class NoOpCallable implements Callable {
895 dl 1.1 public Object call() { return Boolean.TRUE; }
896 dl 1.10 }
897    
898 jsr166 1.45 public static final String TEST_STRING = "a test string";
899 dl 1.10
900 jsr166 1.45 public static class StringTask implements Callable<String> {
901 dl 1.10 public String call() { return TEST_STRING; }
902     }
903    
904 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
905     return new CheckedCallable<String>() {
906 jsr166 1.64 protected String realCall() {
907 jsr166 1.48 try {
908     latch.await();
909     } catch (InterruptedException quittingTime) {}
910     return TEST_STRING;
911     }};
912     }
913    
914 jsr166 1.73 public Runnable awaiter(final CountDownLatch latch) {
915     return new CheckedRunnable() {
916     public void realRun() throws InterruptedException {
917 jsr166 1.79 await(latch);
918 jsr166 1.73 }};
919     }
920    
921 jsr166 1.79 public void await(CountDownLatch latch) {
922     try {
923     assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
924     } catch (Throwable t) {
925     threadUnexpectedException(t);
926     }
927     }
928    
929 jsr166 1.89 public void await(Semaphore semaphore) {
930     try {
931     assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
932     } catch (Throwable t) {
933     threadUnexpectedException(t);
934     }
935     }
936    
937 jsr166 1.81 // /**
938     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
939     // */
940     // public void await(AtomicBoolean flag) {
941     // await(flag, LONG_DELAY_MS);
942     // }
943    
944     // /**
945     // * Spin-waits up to the specified timeout until flag becomes true.
946     // */
947     // public void await(AtomicBoolean flag, long timeoutMillis) {
948     // long startTime = System.nanoTime();
949     // while (!flag.get()) {
950     // if (millisElapsedSince(startTime) > timeoutMillis)
951     // throw new AssertionFailedError("timed out");
952     // Thread.yield();
953     // }
954     // }
955    
956 jsr166 1.45 public static class NPETask implements Callable<String> {
957 dl 1.10 public String call() { throw new NullPointerException(); }
958     }
959    
960 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
961 dl 1.10 public Integer call() { return one; }
962 dl 1.1 }
963    
964 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
965     protected void realRun() throws Throwable {
966 dl 1.76 delay(SHORT_DELAY_MS);
967 dl 1.1 }
968     }
969    
970 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
971     protected void realRun() throws InterruptedException {
972 dl 1.76 delay(SHORT_DELAY_MS);
973 dl 1.1 }
974     }
975    
976 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
977     protected void realRun() throws Throwable {
978 dl 1.76 delay(SMALL_DELAY_MS);
979 dl 1.1 }
980     }
981    
982 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
983     protected void realRun() {
984 dl 1.6 try {
985 dl 1.76 delay(SMALL_DELAY_MS);
986 jsr166 1.44 } catch (InterruptedException ok) {}
987 dl 1.6 }
988     }
989    
990 jsr166 1.45 public class SmallCallable extends CheckedCallable {
991     protected Object realCall() throws InterruptedException {
992 dl 1.76 delay(SMALL_DELAY_MS);
993 dl 1.1 return Boolean.TRUE;
994     }
995     }
996    
997 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
998     protected void realRun() throws Throwable {
999 dl 1.76 delay(MEDIUM_DELAY_MS);
1000 dl 1.1 }
1001     }
1002    
1003 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1004     protected void realRun() throws InterruptedException {
1005 dl 1.76 delay(MEDIUM_DELAY_MS);
1006 dl 1.1 }
1007     }
1008    
1009 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1010     return new CheckedRunnable() {
1011     protected void realRun() {
1012     try {
1013 dl 1.76 delay(timeoutMillis);
1014 jsr166 1.63 } catch (InterruptedException ok) {}
1015     }};
1016     }
1017    
1018 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1019     protected void realRun() {
1020 dl 1.1 try {
1021 dl 1.76 delay(MEDIUM_DELAY_MS);
1022 jsr166 1.44 } catch (InterruptedException ok) {}
1023 dl 1.1 }
1024     }
1025 dl 1.5
1026 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1027     protected void realRun() {
1028 dl 1.12 try {
1029 dl 1.76 delay(LONG_DELAY_MS);
1030 jsr166 1.44 } catch (InterruptedException ok) {}
1031 dl 1.12 }
1032     }
1033    
1034 dl 1.5 /**
1035     * For use as ThreadFactory in constructors
1036     */
1037 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1038 jsr166 1.33 public Thread newThread(Runnable r) {
1039 dl 1.5 return new Thread(r);
1040 jsr166 1.27 }
1041 dl 1.5 }
1042    
1043 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1044     boolean isDone();
1045     }
1046    
1047     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1048     return new TrackedRunnable() {
1049     private volatile boolean done = false;
1050     public boolean isDone() { return done; }
1051     public void run() {
1052     try {
1053 dl 1.76 delay(timeoutMillis);
1054 jsr166 1.61 done = true;
1055     } catch (InterruptedException ok) {}
1056     }
1057     };
1058     }
1059    
1060 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
1061     public volatile boolean done = false;
1062 dl 1.5 public void run() {
1063     try {
1064 dl 1.76 delay(SHORT_DELAY_MS);
1065 jsr166 1.61 done = true;
1066     } catch (InterruptedException ok) {}
1067     }
1068     }
1069    
1070     public static class TrackedSmallRunnable implements Runnable {
1071     public volatile boolean done = false;
1072     public void run() {
1073     try {
1074 dl 1.76 delay(SMALL_DELAY_MS);
1075 dl 1.5 done = true;
1076 jsr166 1.44 } catch (InterruptedException ok) {}
1077 dl 1.6 }
1078     }
1079    
1080 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
1081     public volatile boolean done = false;
1082 dl 1.6 public void run() {
1083     try {
1084 dl 1.76 delay(MEDIUM_DELAY_MS);
1085 dl 1.6 done = true;
1086 jsr166 1.44 } catch (InterruptedException ok) {}
1087 dl 1.6 }
1088     }
1089    
1090 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
1091     public volatile boolean done = false;
1092 dl 1.6 public void run() {
1093     try {
1094 dl 1.76 delay(LONG_DELAY_MS);
1095 dl 1.6 done = true;
1096 jsr166 1.44 } catch (InterruptedException ok) {}
1097 dl 1.6 }
1098     }
1099    
1100 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1101     public volatile boolean done = false;
1102 dl 1.6 public void run() {
1103     done = true;
1104 dl 1.5 }
1105     }
1106    
1107 jsr166 1.45 public static class TrackedCallable implements Callable {
1108     public volatile boolean done = false;
1109 dl 1.5 public Object call() {
1110     try {
1111 dl 1.76 delay(SMALL_DELAY_MS);
1112 dl 1.5 done = true;
1113 jsr166 1.44 } catch (InterruptedException ok) {}
1114 dl 1.5 return Boolean.TRUE;
1115     }
1116     }
1117 dl 1.14
1118 jsr166 1.53 /**
1119     * Analog of CheckedRunnable for RecursiveAction
1120     */
1121     public abstract class CheckedRecursiveAction extends RecursiveAction {
1122     protected abstract void realCompute() throws Throwable;
1123    
1124     public final void compute() {
1125     try {
1126     realCompute();
1127     } catch (Throwable t) {
1128     threadUnexpectedException(t);
1129     }
1130     }
1131     }
1132    
1133     /**
1134     * Analog of CheckedCallable for RecursiveTask
1135     */
1136     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1137     protected abstract T realCompute() throws Throwable;
1138    
1139     public final T compute() {
1140     try {
1141     return realCompute();
1142     } catch (Throwable t) {
1143     threadUnexpectedException(t);
1144     return null;
1145     }
1146     }
1147     }
1148 dl 1.5
1149     /**
1150     * For use as RejectedExecutionHandler in constructors
1151     */
1152 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1153 jsr166 1.35 public void rejectedExecution(Runnable r,
1154     ThreadPoolExecutor executor) {}
1155 dl 1.5 }
1156 jsr166 1.27
1157 jsr166 1.60 /**
1158 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1159     * AssertionFailedErrors instead of throwing checked exceptions.
1160 jsr166 1.60 */
1161     public class CheckedBarrier extends CyclicBarrier {
1162     public CheckedBarrier(int parties) { super(parties); }
1163    
1164     public int await() {
1165     try {
1166 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1167     } catch (TimeoutException e) {
1168     throw new AssertionFailedError("timed out");
1169 jsr166 1.60 } catch (Exception e) {
1170     AssertionFailedError afe =
1171     new AssertionFailedError("Unexpected exception: " + e);
1172     afe.initCause(e);
1173     throw afe;
1174     }
1175     }
1176     }
1177    
1178 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1179 jsr166 1.72 try {
1180     assertTrue(q.isEmpty());
1181     assertEquals(0, q.size());
1182     assertNull(q.peek());
1183     assertNull(q.poll());
1184     assertNull(q.poll(0, MILLISECONDS));
1185     assertEquals(q.toString(), "[]");
1186     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1187     assertFalse(q.iterator().hasNext());
1188     try {
1189     q.element();
1190     shouldThrow();
1191     } catch (NoSuchElementException success) {}
1192     try {
1193     q.iterator().next();
1194     shouldThrow();
1195     } catch (NoSuchElementException success) {}
1196     try {
1197     q.remove();
1198     shouldThrow();
1199     } catch (NoSuchElementException success) {}
1200     } catch (InterruptedException ie) {
1201     threadUnexpectedException(ie);
1202     }
1203     }
1204    
1205 jsr166 1.79 @SuppressWarnings("unchecked")
1206 jsr166 1.81 <T> T serialClone(T o) {
1207 jsr166 1.79 try {
1208     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1209     ObjectOutputStream oos = new ObjectOutputStream(bos);
1210     oos.writeObject(o);
1211     oos.flush();
1212     oos.close();
1213 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1214     (new ByteArrayInputStream(bos.toByteArray()));
1215     T clone = (T) ois.readObject();
1216     assertSame(o.getClass(), clone.getClass());
1217     return clone;
1218 jsr166 1.79 } catch (Throwable t) {
1219     threadUnexpectedException(t);
1220     return null;
1221     }
1222     }
1223 dl 1.1 }