ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.169
Committed: Thu Oct 8 21:50:26 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.168: +2 -0 lines
Log Message:
record availableProcessors in case of wedged test

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