ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.158
Committed: Sat Oct 3 23:17:03 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.157: +16 -8 lines
Log Message:
improve diagnostics for failing tests

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