ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.88
Committed: Tue May 31 15:01:24 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.87: +3 -4 lines
Log Message:
improve waitForThreadToEnterWaitState

File Contents

# Content
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 import junit.framework.*;
10 import java.io.ByteArrayInputStream;
11 import java.io.ByteArrayOutputStream;
12 import java.io.ObjectInputStream;
13 import java.io.ObjectOutputStream;
14 import java.util.Arrays;
15 import java.util.Date;
16 import java.util.NoSuchElementException;
17 import java.util.PropertyPermission;
18 import java.util.concurrent.*;
19 import java.util.concurrent.atomic.AtomicBoolean;
20 import java.util.concurrent.atomic.AtomicReference;
21 import static java.util.concurrent.TimeUnit.MILLISECONDS;
22 import static java.util.concurrent.TimeUnit.NANOSECONDS;
23 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
31 /**
32 * 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 * JUnit does not otherwise arrange). The rules for creating such
37 * tests are:
38 *
39 * <ol>
40 *
41 * <li> All assertions in code running in generated threads must use
42 * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
43 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
44 * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
45 * 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 * <li> If you override {@link #setUp} or {@link #tearDown}, make sure
50 * to invoke {@code super.setUp} and {@code super.tearDown} within
51 * them. These methods are used to clear and check for thread
52 * assertion failures.</li>
53 *
54 * <li>All delays and timeouts must use one of the constants {@code
55 * 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 * discriminable from zero time, and always allows enough time for the
58 * small amounts of computation (creating a thread, calling a few
59 * 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 * but even so, if there is ever any doubt, they can all be increased
63 * in one spot to rerun tests on slower platforms.</li>
64 *
65 * <li> All threads generated must be joined inside each test case
66 * 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 * using Executors.</li>
69 *
70 * </ol>
71 *
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 *
83 * <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 * <li> As a convenience, the {@code main} of this class (JSR166TestCase)
100 * runs all JSR166 unit tests.</li>
101 *
102 * </ul>
103 */
104 public class JSR166TestCase extends TestCase {
105 private static final boolean useSecurityManager =
106 Boolean.getBoolean("jsr166.useSecurityManager");
107
108 protected static final boolean expensiveTests =
109 Boolean.getBoolean("jsr166.expensiveTests");
110
111 /**
112 * 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
144 /**
145 * Runs all JSR166 unit tests using junit.textui.TestRunner
146 */
147 public static void main(String[] args) {
148 if (useSecurityManager) {
149 System.err.println("Setting a permissive security manager");
150 Policy.setPolicy(permissivePolicy());
151 System.setSecurityManager(new SecurityManager());
152 }
153 int iters = (args.length == 0) ? 1 : Integer.parseInt(args[0]);
154
155 Test s = suite();
156 for (int i = 0; i < iters; ++i) {
157 junit.textui.TestRunner.run(s);
158 System.gc();
159 System.runFinalization();
160 }
161 System.exit(0);
162 }
163
164 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 /**
178 * Collects all JSR166 unit tests as one suite.
179 */
180 public static Test suite() {
181 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 }
247
248
249 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 * Returns the shortest timed delay. This could
257 * be reimplemented to use for example a Property.
258 */
259 protected long getShortDelay() {
260 return 50;
261 }
262
263 /**
264 * Sets delays as multiples of SHORT_DELAY.
265 */
266 protected void setDelays() {
267 SHORT_DELAY_MS = getShortDelay();
268 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
269 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
270 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
271 }
272
273 /**
274 * 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 return new Date(System.currentTimeMillis() + delayMillis);
287 }
288
289 /**
290 * The first exception encountered if any threadAssertXXX method fails.
291 */
292 private final AtomicReference<Throwable> threadFailure
293 = new AtomicReference<Throwable>(null);
294
295 /**
296 * 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 */
301 public void threadRecordFailure(Throwable t) {
302 threadFailure.compareAndSet(null, t);
303 }
304
305 public void setUp() {
306 setDelays();
307 }
308
309 /**
310 * Extra checks that get done for all test cases.
311 *
312 * 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 *
316 * Triggers test case failure if interrupt status is set in the main thread.
317 */
318 public void tearDown() throws Exception {
319 Throwable t = threadFailure.getAndSet(null);
320 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 else {
328 AssertionFailedError afe =
329 new AssertionFailedError(t.toString());
330 afe.initCause(t);
331 throw afe;
332 }
333 }
334
335 if (Thread.interrupted())
336 throw new AssertionFailedError("interrupt status set in main thread");
337 }
338
339 /**
340 * Just like fail(reason), but additionally recording (using
341 * threadRecordFailure) any AssertionFailedError thrown, so that
342 * the current testcase will fail.
343 */
344 public void threadFail(String reason) {
345 try {
346 fail(reason);
347 } catch (AssertionFailedError t) {
348 threadRecordFailure(t);
349 fail(reason);
350 }
351 }
352
353 /**
354 * Just like assertTrue(b), but additionally recording (using
355 * threadRecordFailure) any AssertionFailedError thrown, so that
356 * the current testcase will fail.
357 */
358 public void threadAssertTrue(boolean b) {
359 try {
360 assertTrue(b);
361 } catch (AssertionFailedError t) {
362 threadRecordFailure(t);
363 throw t;
364 }
365 }
366
367 /**
368 * Just like assertFalse(b), but additionally recording (using
369 * threadRecordFailure) any AssertionFailedError thrown, so that
370 * the current testcase will fail.
371 */
372 public void threadAssertFalse(boolean b) {
373 try {
374 assertFalse(b);
375 } catch (AssertionFailedError t) {
376 threadRecordFailure(t);
377 throw t;
378 }
379 }
380
381 /**
382 * Just like assertNull(x), but additionally recording (using
383 * threadRecordFailure) any AssertionFailedError thrown, so that
384 * the current testcase will fail.
385 */
386 public void threadAssertNull(Object x) {
387 try {
388 assertNull(x);
389 } catch (AssertionFailedError t) {
390 threadRecordFailure(t);
391 throw t;
392 }
393 }
394
395 /**
396 * Just like assertEquals(x, y), but additionally recording (using
397 * threadRecordFailure) any AssertionFailedError thrown, so that
398 * the current testcase will fail.
399 */
400 public void threadAssertEquals(long x, long y) {
401 try {
402 assertEquals(x, y);
403 } catch (AssertionFailedError t) {
404 threadRecordFailure(t);
405 throw t;
406 }
407 }
408
409 /**
410 * Just like assertEquals(x, y), but additionally recording (using
411 * threadRecordFailure) any AssertionFailedError thrown, so that
412 * the current testcase will fail.
413 */
414 public void threadAssertEquals(Object x, Object y) {
415 try {
416 assertEquals(x, y);
417 } catch (AssertionFailedError t) {
418 threadRecordFailure(t);
419 throw t;
420 } catch (Throwable t) {
421 threadUnexpectedException(t);
422 }
423 }
424
425 /**
426 * Just like assertSame(x, y), but additionally recording (using
427 * threadRecordFailure) any AssertionFailedError thrown, so that
428 * the current testcase will fail.
429 */
430 public void threadAssertSame(Object x, Object y) {
431 try {
432 assertSame(x, y);
433 } catch (AssertionFailedError t) {
434 threadRecordFailure(t);
435 throw t;
436 }
437 }
438
439 /**
440 * Calls threadFail with message "should throw exception".
441 */
442 public void threadShouldThrow() {
443 threadFail("should throw exception");
444 }
445
446 /**
447 * Calls threadFail with message "should throw" + exceptionName.
448 */
449 public void threadShouldThrow(String exceptionName) {
450 threadFail("should throw " + exceptionName);
451 }
452
453 /**
454 * Records the given exception using {@link #threadRecordFailure},
455 * then rethrows the exception, wrapping it in an
456 * AssertionFailedError if necessary.
457 */
458 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 AssertionFailedError afe =
467 new AssertionFailedError("unexpected exception: " + t);
468 afe.initCause(t);
469 throw afe;
470 }
471 }
472
473 /**
474 * Delays, via Thread.sleep, for the given millisecond delay, but
475 * if the sleep is shorter than specified, may re-sleep or yield
476 * until time elapses.
477 */
478 static void delay(long millis) throws InterruptedException {
479 long startTime = System.nanoTime();
480 long ns = millis * 1000 * 1000;
481 for (;;) {
482 if (millis > 0L)
483 Thread.sleep(millis);
484 else // too short to sleep
485 Thread.yield();
486 long d = ns - (System.nanoTime() - startTime);
487 if (d > 0L)
488 millis = d / (1000 * 1000);
489 else
490 break;
491 }
492 }
493
494 /**
495 * Waits out termination of a thread pool or fails doing so.
496 */
497 void joinPool(ExecutorService exec) {
498 try {
499 exec.shutdown();
500 assertTrue("ExecutorService did not terminate in a timely manner",
501 exec.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS));
502 } catch (SecurityException ok) {
503 // Allowed in case test doesn't have privs
504 } catch (InterruptedException ie) {
505 fail("Unexpected InterruptedException");
506 }
507 }
508
509 /**
510 * 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 * Checks that thread does not terminate within the given millisecond delay.
519 */
520 void assertThreadStaysAlive(Thread thread, long millis) {
521 try {
522 // No need to optimize the failing case via Thread.join.
523 delay(millis);
524 assertTrue(thread.isAlive());
525 } catch (InterruptedException ie) {
526 fail("Unexpected InterruptedException");
527 }
528 }
529
530 /**
531 * 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 * Fails with message "should throw exception".
555 */
556 public void shouldThrow() {
557 fail("Should throw exception");
558 }
559
560 /**
561 * Fails with message "should throw " + exceptionName.
562 */
563 public void shouldThrow(String exceptionName) {
564 fail("Should throw " + exceptionName);
565 }
566
567 /**
568 * The number of elements to place in collections, arrays, etc.
569 */
570 public static final int SIZE = 20;
571
572 // Some convenient Integer constants
573
574 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 public static final Integer four = new Integer(4);
579 public static final Integer five = new Integer(5);
580 public static final Integer six = new Integer(6);
581 public static final Integer seven = new Integer(7);
582 public static final Integer eight = new Integer(8);
583 public static final Integer nine = new Integer(9);
584 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 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 public static final Integer m10 = new Integer(-10);
591
592
593 /**
594 * 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 * A security policy where new permissions can be dynamically added
636 * or all cleared.
637 */
638 public static class AdjustablePolicy extends java.security.Policy {
639 Permissions perms = new Permissions();
640 AdjustablePolicy(Permission... permissions) {
641 for (Permission permission : permissions)
642 perms.add(permission);
643 }
644 void addPermission(Permission perm) { perms.add(perm); }
645 void clearPermissions() { perms = new Permissions(); }
646 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 }
657
658 /**
659 * 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 * Sleeps until the given time has elapsed.
679 * Throws AssertionFailedError if interrupted.
680 */
681 void sleep(long millis) {
682 try {
683 delay(millis);
684 } catch (InterruptedException ie) {
685 AssertionFailedError afe =
686 new AssertionFailedError("Unexpected InterruptedException");
687 afe.initCause(ie);
688 throw afe;
689 }
690 }
691
692 /**
693 * Spin-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 startTime = System.nanoTime();
698 for (;;) {
699 Thread.State s = thread.getState();
700 if (s == Thread.State.BLOCKED ||
701 s == Thread.State.WAITING ||
702 s == Thread.State.TIMED_WAITING)
703 return;
704 else if (s == Thread.State.TERMINATED)
705 fail("Unexpected thread termination");
706 else if (millisElapsedSince(startTime) > timeoutMillis) {
707 threadAssertTrue(thread.isAlive());
708 return;
709 }
710 Thread.yield();
711 }
712 }
713
714 /**
715 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
716 * state: BLOCKED, WAITING, or TIMED_WAITING.
717 */
718 void waitForThreadToEnterWaitState(Thread thread) {
719 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
720 }
721
722 /**
723 * Returns the number of milliseconds since time given by
724 * startNanoTime, which must have been previously returned from a
725 * call to {@link System.nanoTime()}.
726 */
727 long millisElapsedSince(long startNanoTime) {
728 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
729 }
730
731 /**
732 * Returns a new started daemon Thread running the given runnable.
733 */
734 Thread newStartedThread(Runnable runnable) {
735 Thread t = new Thread(runnable);
736 t.setDaemon(true);
737 t.start();
738 return t;
739 }
740
741 /**
742 * Waits for the specified time (in milliseconds) for the thread
743 * to terminate (using {@link Thread#join(long)}), else interrupts
744 * the thread (in the hope that it may terminate later) and fails.
745 */
746 void awaitTermination(Thread t, long timeoutMillis) {
747 try {
748 t.join(timeoutMillis);
749 } catch (InterruptedException ie) {
750 threadUnexpectedException(ie);
751 } finally {
752 if (t.getState() != Thread.State.TERMINATED) {
753 t.interrupt();
754 fail("Test timed out");
755 }
756 }
757 }
758
759 /**
760 * Waits for LONG_DELAY_MS milliseconds for the thread to
761 * terminate (using {@link Thread#join(long)}), else interrupts
762 * the thread (in the hope that it may terminate later) and fails.
763 */
764 void awaitTermination(Thread t) {
765 awaitTermination(t, LONG_DELAY_MS);
766 }
767
768 // Some convenient Runnable classes
769
770 public abstract class CheckedRunnable implements Runnable {
771 protected abstract void realRun() throws Throwable;
772
773 public final void run() {
774 try {
775 realRun();
776 } catch (Throwable t) {
777 threadUnexpectedException(t);
778 }
779 }
780 }
781
782 public abstract class RunnableShouldThrow implements Runnable {
783 protected abstract void realRun() throws Throwable;
784
785 final Class<?> exceptionClass;
786
787 <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
788 this.exceptionClass = exceptionClass;
789 }
790
791 public final void run() {
792 try {
793 realRun();
794 threadShouldThrow(exceptionClass.getSimpleName());
795 } catch (Throwable t) {
796 if (! exceptionClass.isInstance(t))
797 threadUnexpectedException(t);
798 }
799 }
800 }
801
802 public abstract class ThreadShouldThrow extends Thread {
803 protected abstract void realRun() throws Throwable;
804
805 final Class<?> exceptionClass;
806
807 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
808 this.exceptionClass = exceptionClass;
809 }
810
811 public final void run() {
812 try {
813 realRun();
814 threadShouldThrow(exceptionClass.getSimpleName());
815 } catch (Throwable t) {
816 if (! exceptionClass.isInstance(t))
817 threadUnexpectedException(t);
818 }
819 }
820 }
821
822 public abstract class CheckedInterruptedRunnable implements Runnable {
823 protected abstract void realRun() throws Throwable;
824
825 public final void run() {
826 try {
827 realRun();
828 threadShouldThrow("InterruptedException");
829 } catch (InterruptedException success) {
830 threadAssertFalse(Thread.interrupted());
831 } catch (Throwable t) {
832 threadUnexpectedException(t);
833 }
834 }
835 }
836
837 public abstract class CheckedCallable<T> implements Callable<T> {
838 protected abstract T realCall() throws Throwable;
839
840 public final T call() {
841 try {
842 return realCall();
843 } catch (Throwable t) {
844 threadUnexpectedException(t);
845 return null;
846 }
847 }
848 }
849
850 public abstract class CheckedInterruptedCallable<T>
851 implements Callable<T> {
852 protected abstract T realCall() throws Throwable;
853
854 public final T call() {
855 try {
856 T result = realCall();
857 threadShouldThrow("InterruptedException");
858 return result;
859 } catch (InterruptedException success) {
860 threadAssertFalse(Thread.interrupted());
861 } catch (Throwable t) {
862 threadUnexpectedException(t);
863 }
864 return null;
865 }
866 }
867
868 public static class NoOpRunnable implements Runnable {
869 public void run() {}
870 }
871
872 public static class NoOpCallable implements Callable {
873 public Object call() { return Boolean.TRUE; }
874 }
875
876 public static final String TEST_STRING = "a test string";
877
878 public static class StringTask implements Callable<String> {
879 public String call() { return TEST_STRING; }
880 }
881
882 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
883 return new CheckedCallable<String>() {
884 protected String realCall() {
885 try {
886 latch.await();
887 } catch (InterruptedException quittingTime) {}
888 return TEST_STRING;
889 }};
890 }
891
892 public Runnable awaiter(final CountDownLatch latch) {
893 return new CheckedRunnable() {
894 public void realRun() throws InterruptedException {
895 await(latch);
896 }};
897 }
898
899 public void await(CountDownLatch latch) {
900 try {
901 assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
902 } catch (Throwable t) {
903 threadUnexpectedException(t);
904 }
905 }
906
907 // /**
908 // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
909 // */
910 // public void await(AtomicBoolean flag) {
911 // await(flag, LONG_DELAY_MS);
912 // }
913
914 // /**
915 // * Spin-waits up to the specified timeout until flag becomes true.
916 // */
917 // public void await(AtomicBoolean flag, long timeoutMillis) {
918 // long startTime = System.nanoTime();
919 // while (!flag.get()) {
920 // if (millisElapsedSince(startTime) > timeoutMillis)
921 // throw new AssertionFailedError("timed out");
922 // Thread.yield();
923 // }
924 // }
925
926 public static class NPETask implements Callable<String> {
927 public String call() { throw new NullPointerException(); }
928 }
929
930 public static class CallableOne implements Callable<Integer> {
931 public Integer call() { return one; }
932 }
933
934 public class ShortRunnable extends CheckedRunnable {
935 protected void realRun() throws Throwable {
936 delay(SHORT_DELAY_MS);
937 }
938 }
939
940 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
941 protected void realRun() throws InterruptedException {
942 delay(SHORT_DELAY_MS);
943 }
944 }
945
946 public class SmallRunnable extends CheckedRunnable {
947 protected void realRun() throws Throwable {
948 delay(SMALL_DELAY_MS);
949 }
950 }
951
952 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
953 protected void realRun() {
954 try {
955 delay(SMALL_DELAY_MS);
956 } catch (InterruptedException ok) {}
957 }
958 }
959
960 public class SmallCallable extends CheckedCallable {
961 protected Object realCall() throws InterruptedException {
962 delay(SMALL_DELAY_MS);
963 return Boolean.TRUE;
964 }
965 }
966
967 public class MediumRunnable extends CheckedRunnable {
968 protected void realRun() throws Throwable {
969 delay(MEDIUM_DELAY_MS);
970 }
971 }
972
973 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
974 protected void realRun() throws InterruptedException {
975 delay(MEDIUM_DELAY_MS);
976 }
977 }
978
979 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
980 return new CheckedRunnable() {
981 protected void realRun() {
982 try {
983 delay(timeoutMillis);
984 } catch (InterruptedException ok) {}
985 }};
986 }
987
988 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
989 protected void realRun() {
990 try {
991 delay(MEDIUM_DELAY_MS);
992 } catch (InterruptedException ok) {}
993 }
994 }
995
996 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
997 protected void realRun() {
998 try {
999 delay(LONG_DELAY_MS);
1000 } catch (InterruptedException ok) {}
1001 }
1002 }
1003
1004 /**
1005 * For use as ThreadFactory in constructors
1006 */
1007 public static class SimpleThreadFactory implements ThreadFactory {
1008 public Thread newThread(Runnable r) {
1009 return new Thread(r);
1010 }
1011 }
1012
1013 public interface TrackedRunnable extends Runnable {
1014 boolean isDone();
1015 }
1016
1017 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1018 return new TrackedRunnable() {
1019 private volatile boolean done = false;
1020 public boolean isDone() { return done; }
1021 public void run() {
1022 try {
1023 delay(timeoutMillis);
1024 done = true;
1025 } catch (InterruptedException ok) {}
1026 }
1027 };
1028 }
1029
1030 public static class TrackedShortRunnable implements Runnable {
1031 public volatile boolean done = false;
1032 public void run() {
1033 try {
1034 delay(SHORT_DELAY_MS);
1035 done = true;
1036 } catch (InterruptedException ok) {}
1037 }
1038 }
1039
1040 public static class TrackedSmallRunnable implements Runnable {
1041 public volatile boolean done = false;
1042 public void run() {
1043 try {
1044 delay(SMALL_DELAY_MS);
1045 done = true;
1046 } catch (InterruptedException ok) {}
1047 }
1048 }
1049
1050 public static class TrackedMediumRunnable implements Runnable {
1051 public volatile boolean done = false;
1052 public void run() {
1053 try {
1054 delay(MEDIUM_DELAY_MS);
1055 done = true;
1056 } catch (InterruptedException ok) {}
1057 }
1058 }
1059
1060 public static class TrackedLongRunnable implements Runnable {
1061 public volatile boolean done = false;
1062 public void run() {
1063 try {
1064 delay(LONG_DELAY_MS);
1065 done = true;
1066 } catch (InterruptedException ok) {}
1067 }
1068 }
1069
1070 public static class TrackedNoOpRunnable implements Runnable {
1071 public volatile boolean done = false;
1072 public void run() {
1073 done = true;
1074 }
1075 }
1076
1077 public static class TrackedCallable implements Callable {
1078 public volatile boolean done = false;
1079 public Object call() {
1080 try {
1081 delay(SMALL_DELAY_MS);
1082 done = true;
1083 } catch (InterruptedException ok) {}
1084 return Boolean.TRUE;
1085 }
1086 }
1087
1088 /**
1089 * Analog of CheckedRunnable for RecursiveAction
1090 */
1091 public abstract class CheckedRecursiveAction extends RecursiveAction {
1092 protected abstract void realCompute() throws Throwable;
1093
1094 public final void compute() {
1095 try {
1096 realCompute();
1097 } catch (Throwable t) {
1098 threadUnexpectedException(t);
1099 }
1100 }
1101 }
1102
1103 /**
1104 * Analog of CheckedCallable for RecursiveTask
1105 */
1106 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1107 protected abstract T realCompute() throws Throwable;
1108
1109 public final T compute() {
1110 try {
1111 return realCompute();
1112 } catch (Throwable t) {
1113 threadUnexpectedException(t);
1114 return null;
1115 }
1116 }
1117 }
1118
1119 /**
1120 * For use as RejectedExecutionHandler in constructors
1121 */
1122 public static class NoOpREHandler implements RejectedExecutionHandler {
1123 public void rejectedExecution(Runnable r,
1124 ThreadPoolExecutor executor) {}
1125 }
1126
1127 /**
1128 * A CyclicBarrier that uses timed await and fails with
1129 * AssertionFailedErrors instead of throwing checked exceptions.
1130 */
1131 public class CheckedBarrier extends CyclicBarrier {
1132 public CheckedBarrier(int parties) { super(parties); }
1133
1134 public int await() {
1135 try {
1136 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1137 } catch (TimeoutException e) {
1138 throw new AssertionFailedError("timed out");
1139 } catch (Exception e) {
1140 AssertionFailedError afe =
1141 new AssertionFailedError("Unexpected exception: " + e);
1142 afe.initCause(e);
1143 throw afe;
1144 }
1145 }
1146 }
1147
1148 void checkEmpty(BlockingQueue q) {
1149 try {
1150 assertTrue(q.isEmpty());
1151 assertEquals(0, q.size());
1152 assertNull(q.peek());
1153 assertNull(q.poll());
1154 assertNull(q.poll(0, MILLISECONDS));
1155 assertEquals(q.toString(), "[]");
1156 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1157 assertFalse(q.iterator().hasNext());
1158 try {
1159 q.element();
1160 shouldThrow();
1161 } catch (NoSuchElementException success) {}
1162 try {
1163 q.iterator().next();
1164 shouldThrow();
1165 } catch (NoSuchElementException success) {}
1166 try {
1167 q.remove();
1168 shouldThrow();
1169 } catch (NoSuchElementException success) {}
1170 } catch (InterruptedException ie) {
1171 threadUnexpectedException(ie);
1172 }
1173 }
1174
1175 @SuppressWarnings("unchecked")
1176 <T> T serialClone(T o) {
1177 try {
1178 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1179 ObjectOutputStream oos = new ObjectOutputStream(bos);
1180 oos.writeObject(o);
1181 oos.flush();
1182 oos.close();
1183 ObjectInputStream ois = new ObjectInputStream
1184 (new ByteArrayInputStream(bos.toByteArray()));
1185 T clone = (T) ois.readObject();
1186 assertSame(o.getClass(), clone.getClass());
1187 return clone;
1188 } catch (Throwable t) {
1189 threadUnexpectedException(t);
1190 return null;
1191 }
1192 }
1193 }