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