ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.120
Committed: Wed Jun 25 15:32:10 2014 UTC (9 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.119: +30 -0 lines
Log Message:
add checks that timed get returns promptly

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