ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.157
Committed: Sat Oct 3 22:20:05 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.156: +3 -1 lines
Log Message:
avoid spurious checkForWedgedTest reports with enormous runsPerTest

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 dumpTestThreads();
545 threadFailure.compareAndSet(null, t);
546 }
547
548 public void setUp() {
549 setDelays();
550 }
551
552 void tearDownFail(String format, Object... args) {
553 String msg = toString() + ": " + String.format(format, args);
554 System.err.println(msg);
555 dumpTestThreads();
556 throw new AssertionFailedError(msg);
557 }
558
559 /**
560 * Extra checks that get done for all test cases.
561 *
562 * Triggers test case failure if any thread assertions have failed,
563 * by rethrowing, in the test harness thread, any exception recorded
564 * earlier by threadRecordFailure.
565 *
566 * Triggers test case failure if interrupt status is set in the main thread.
567 */
568 public void tearDown() throws Exception {
569 Throwable t = threadFailure.getAndSet(null);
570 if (t != null) {
571 if (t instanceof Error)
572 throw (Error) t;
573 else if (t instanceof RuntimeException)
574 throw (RuntimeException) t;
575 else if (t instanceof Exception)
576 throw (Exception) t;
577 else {
578 AssertionFailedError afe =
579 new AssertionFailedError(t.toString());
580 afe.initCause(t);
581 throw afe;
582 }
583 }
584
585 if (Thread.interrupted())
586 tearDownFail("interrupt status set in main thread");
587
588 checkForkJoinPoolThreadLeaks();
589 }
590
591 /**
592 * Finds missing try { ... } finally { joinPool(e); }
593 */
594 void checkForkJoinPoolThreadLeaks() throws InterruptedException {
595 Thread[] survivors = new Thread[7];
596 int count = Thread.enumerate(survivors);
597 for (int i = 0; i < count; i++) {
598 Thread thread = survivors[i];
599 String name = thread.getName();
600 if (name.startsWith("ForkJoinPool-")) {
601 // give thread some time to terminate
602 thread.join(LONG_DELAY_MS);
603 if (thread.isAlive())
604 tearDownFail("Found leaked ForkJoinPool thread thread=%s",
605 thread);
606 }
607 }
608
609 if (!ForkJoinPool.commonPool()
610 .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
611 tearDownFail("ForkJoin common pool thread stuck");
612 }
613
614 /**
615 * Just like fail(reason), but additionally recording (using
616 * threadRecordFailure) any AssertionFailedError thrown, so that
617 * the current testcase will fail.
618 */
619 public void threadFail(String reason) {
620 try {
621 fail(reason);
622 } catch (AssertionFailedError t) {
623 threadRecordFailure(t);
624 throw t;
625 }
626 }
627
628 /**
629 * Just like assertTrue(b), but additionally recording (using
630 * threadRecordFailure) any AssertionFailedError thrown, so that
631 * the current testcase will fail.
632 */
633 public void threadAssertTrue(boolean b) {
634 try {
635 assertTrue(b);
636 } catch (AssertionFailedError t) {
637 threadRecordFailure(t);
638 throw t;
639 }
640 }
641
642 /**
643 * Just like assertFalse(b), but additionally recording (using
644 * threadRecordFailure) any AssertionFailedError thrown, so that
645 * the current testcase will fail.
646 */
647 public void threadAssertFalse(boolean b) {
648 try {
649 assertFalse(b);
650 } catch (AssertionFailedError t) {
651 threadRecordFailure(t);
652 throw t;
653 }
654 }
655
656 /**
657 * Just like assertNull(x), but additionally recording (using
658 * threadRecordFailure) any AssertionFailedError thrown, so that
659 * the current testcase will fail.
660 */
661 public void threadAssertNull(Object x) {
662 try {
663 assertNull(x);
664 } catch (AssertionFailedError t) {
665 threadRecordFailure(t);
666 throw t;
667 }
668 }
669
670 /**
671 * Just like assertEquals(x, y), but additionally recording (using
672 * threadRecordFailure) any AssertionFailedError thrown, so that
673 * the current testcase will fail.
674 */
675 public void threadAssertEquals(long x, long y) {
676 try {
677 assertEquals(x, y);
678 } catch (AssertionFailedError t) {
679 threadRecordFailure(t);
680 throw t;
681 }
682 }
683
684 /**
685 * Just like assertEquals(x, y), but additionally recording (using
686 * threadRecordFailure) any AssertionFailedError thrown, so that
687 * the current testcase will fail.
688 */
689 public void threadAssertEquals(Object x, Object y) {
690 try {
691 assertEquals(x, y);
692 } catch (AssertionFailedError fail) {
693 threadRecordFailure(fail);
694 throw fail;
695 } catch (Throwable fail) {
696 threadUnexpectedException(fail);
697 }
698 }
699
700 /**
701 * Just like assertSame(x, y), but additionally recording (using
702 * threadRecordFailure) any AssertionFailedError thrown, so that
703 * the current testcase will fail.
704 */
705 public void threadAssertSame(Object x, Object y) {
706 try {
707 assertSame(x, y);
708 } catch (AssertionFailedError fail) {
709 threadRecordFailure(fail);
710 throw fail;
711 }
712 }
713
714 /**
715 * Calls threadFail with message "should throw exception".
716 */
717 public void threadShouldThrow() {
718 threadFail("should throw exception");
719 }
720
721 /**
722 * Calls threadFail with message "should throw" + exceptionName.
723 */
724 public void threadShouldThrow(String exceptionName) {
725 threadFail("should throw " + exceptionName);
726 }
727
728 /**
729 * Records the given exception using {@link #threadRecordFailure},
730 * then rethrows the exception, wrapping it in an
731 * AssertionFailedError if necessary.
732 */
733 public void threadUnexpectedException(Throwable t) {
734 threadRecordFailure(t);
735 t.printStackTrace();
736 if (t instanceof RuntimeException)
737 throw (RuntimeException) t;
738 else if (t instanceof Error)
739 throw (Error) t;
740 else {
741 AssertionFailedError afe =
742 new AssertionFailedError("unexpected exception: " + t);
743 afe.initCause(t);
744 throw afe;
745 }
746 }
747
748 /**
749 * Delays, via Thread.sleep, for the given millisecond delay, but
750 * if the sleep is shorter than specified, may re-sleep or yield
751 * until time elapses.
752 */
753 static void delay(long millis) throws InterruptedException {
754 long startTime = System.nanoTime();
755 long ns = millis * 1000 * 1000;
756 for (;;) {
757 if (millis > 0L)
758 Thread.sleep(millis);
759 else // too short to sleep
760 Thread.yield();
761 long d = ns - (System.nanoTime() - startTime);
762 if (d > 0L)
763 millis = d / (1000 * 1000);
764 else
765 break;
766 }
767 }
768
769 /**
770 * Allows use of try-with-resources with per-test thread pools.
771 */
772 static class PoolCloser<T extends ExecutorService>
773 implements AutoCloseable {
774 public final T pool;
775 public PoolCloser(T pool) { this.pool = pool; }
776 public void close() { joinPool(pool); }
777 }
778
779 /**
780 * Waits out termination of a thread pool or fails doing so.
781 */
782 static void joinPool(ExecutorService pool) {
783 try {
784 pool.shutdown();
785 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS))
786 fail("ExecutorService " + pool +
787 " did not terminate in a timely manner");
788 } catch (SecurityException ok) {
789 // Allowed in case test doesn't have privs
790 } catch (InterruptedException fail) {
791 fail("Unexpected InterruptedException");
792 }
793 }
794
795 /** Like Runnable, but with the freedom to throw anything */
796 interface Action { public void run() throws Throwable; }
797
798 /**
799 * Runs all the given actions in parallel, failing if any fail.
800 * Useful for running multiple variants of tests that are
801 * necessarily individually slow because they must block.
802 */
803 void testInParallel(Action ... actions) {
804 try (PoolCloser<ExecutorService> poolCloser
805 = new PoolCloser<>(Executors.newCachedThreadPool())) {
806 ExecutorService pool = poolCloser.pool;
807 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
808 for (final Action action : actions)
809 futures.add(pool.submit(new CheckedRunnable() {
810 public void realRun() throws Throwable { action.run();}}));
811 for (Future<?> future : futures)
812 try {
813 assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
814 } catch (ExecutionException ex) {
815 threadUnexpectedException(ex.getCause());
816 } catch (Exception ex) {
817 threadUnexpectedException(ex);
818 }
819 }
820 }
821
822 /**
823 * A debugging tool to print stack traces of most threads, as jstack does.
824 * Uninteresting threads are filtered out.
825 */
826 static void dumpTestThreads() {
827 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
828 System.err.println("------ stacktrace dump start ------");
829 for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
830 String name = info.getThreadName();
831 if ("Signal Dispatcher".equals(name))
832 continue;
833 if ("Reference Handler".equals(name)
834 && info.getLockName().startsWith("java.lang.ref.Reference$Lock"))
835 continue;
836 if ("Finalizer".equals(name)
837 && info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock"))
838 continue;
839 if ("checkForWedgedTest".equals(name))
840 continue;
841 System.err.print(info);
842 }
843 System.err.println("------ stacktrace dump end ------");
844 }
845
846 /**
847 * Checks that thread does not terminate within the default
848 * millisecond delay of {@code timeoutMillis()}.
849 */
850 void assertThreadStaysAlive(Thread thread) {
851 assertThreadStaysAlive(thread, timeoutMillis());
852 }
853
854 /**
855 * Checks that thread does not terminate within the given millisecond delay.
856 */
857 void assertThreadStaysAlive(Thread thread, long millis) {
858 try {
859 // No need to optimize the failing case via Thread.join.
860 delay(millis);
861 assertTrue(thread.isAlive());
862 } catch (InterruptedException fail) {
863 fail("Unexpected InterruptedException");
864 }
865 }
866
867 /**
868 * Checks that the threads do not terminate within the default
869 * millisecond delay of {@code timeoutMillis()}.
870 */
871 void assertThreadsStayAlive(Thread... threads) {
872 assertThreadsStayAlive(timeoutMillis(), threads);
873 }
874
875 /**
876 * Checks that the threads do not terminate within the given millisecond delay.
877 */
878 void assertThreadsStayAlive(long millis, Thread... threads) {
879 try {
880 // No need to optimize the failing case via Thread.join.
881 delay(millis);
882 for (Thread thread : threads)
883 assertTrue(thread.isAlive());
884 } catch (InterruptedException fail) {
885 fail("Unexpected InterruptedException");
886 }
887 }
888
889 /**
890 * Checks that future.get times out, with the default timeout of
891 * {@code timeoutMillis()}.
892 */
893 void assertFutureTimesOut(Future future) {
894 assertFutureTimesOut(future, timeoutMillis());
895 }
896
897 /**
898 * Checks that future.get times out, with the given millisecond timeout.
899 */
900 void assertFutureTimesOut(Future future, long timeoutMillis) {
901 long startTime = System.nanoTime();
902 try {
903 future.get(timeoutMillis, MILLISECONDS);
904 shouldThrow();
905 } catch (TimeoutException success) {
906 } catch (Exception fail) {
907 threadUnexpectedException(fail);
908 } finally { future.cancel(true); }
909 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
910 }
911
912 /**
913 * Fails with message "should throw exception".
914 */
915 public void shouldThrow() {
916 fail("Should throw exception");
917 }
918
919 /**
920 * Fails with message "should throw " + exceptionName.
921 */
922 public void shouldThrow(String exceptionName) {
923 fail("Should throw " + exceptionName);
924 }
925
926 /**
927 * The number of elements to place in collections, arrays, etc.
928 */
929 public static final int SIZE = 20;
930
931 // Some convenient Integer constants
932
933 public static final Integer zero = new Integer(0);
934 public static final Integer one = new Integer(1);
935 public static final Integer two = new Integer(2);
936 public static final Integer three = new Integer(3);
937 public static final Integer four = new Integer(4);
938 public static final Integer five = new Integer(5);
939 public static final Integer six = new Integer(6);
940 public static final Integer seven = new Integer(7);
941 public static final Integer eight = new Integer(8);
942 public static final Integer nine = new Integer(9);
943 public static final Integer m1 = new Integer(-1);
944 public static final Integer m2 = new Integer(-2);
945 public static final Integer m3 = new Integer(-3);
946 public static final Integer m4 = new Integer(-4);
947 public static final Integer m5 = new Integer(-5);
948 public static final Integer m6 = new Integer(-6);
949 public static final Integer m10 = new Integer(-10);
950
951 /**
952 * Runs Runnable r with a security policy that permits precisely
953 * the specified permissions. If there is no current security
954 * manager, the runnable is run twice, both with and without a
955 * security manager. We require that any security manager permit
956 * getPolicy/setPolicy.
957 */
958 public void runWithPermissions(Runnable r, Permission... permissions) {
959 SecurityManager sm = System.getSecurityManager();
960 if (sm == null) {
961 r.run();
962 }
963 runWithSecurityManagerWithPermissions(r, permissions);
964 }
965
966 /**
967 * Runs Runnable r with a security policy that permits precisely
968 * the specified permissions. If there is no current security
969 * manager, a temporary one is set for the duration of the
970 * Runnable. We require that any security manager permit
971 * getPolicy/setPolicy.
972 */
973 public void runWithSecurityManagerWithPermissions(Runnable r,
974 Permission... permissions) {
975 SecurityManager sm = System.getSecurityManager();
976 if (sm == null) {
977 Policy savedPolicy = Policy.getPolicy();
978 try {
979 Policy.setPolicy(permissivePolicy());
980 System.setSecurityManager(new SecurityManager());
981 runWithSecurityManagerWithPermissions(r, permissions);
982 } finally {
983 System.setSecurityManager(null);
984 Policy.setPolicy(savedPolicy);
985 }
986 } else {
987 Policy savedPolicy = Policy.getPolicy();
988 AdjustablePolicy policy = new AdjustablePolicy(permissions);
989 Policy.setPolicy(policy);
990
991 try {
992 r.run();
993 } finally {
994 policy.addPermission(new SecurityPermission("setPolicy"));
995 Policy.setPolicy(savedPolicy);
996 }
997 }
998 }
999
1000 /**
1001 * Runs a runnable without any permissions.
1002 */
1003 public void runWithoutPermissions(Runnable r) {
1004 runWithPermissions(r);
1005 }
1006
1007 /**
1008 * A security policy where new permissions can be dynamically added
1009 * or all cleared.
1010 */
1011 public static class AdjustablePolicy extends java.security.Policy {
1012 Permissions perms = new Permissions();
1013 AdjustablePolicy(Permission... permissions) {
1014 for (Permission permission : permissions)
1015 perms.add(permission);
1016 }
1017 void addPermission(Permission perm) { perms.add(perm); }
1018 void clearPermissions() { perms = new Permissions(); }
1019 public PermissionCollection getPermissions(CodeSource cs) {
1020 return perms;
1021 }
1022 public PermissionCollection getPermissions(ProtectionDomain pd) {
1023 return perms;
1024 }
1025 public boolean implies(ProtectionDomain pd, Permission p) {
1026 return perms.implies(p);
1027 }
1028 public void refresh() {}
1029 public String toString() {
1030 List<Permission> ps = new ArrayList<Permission>();
1031 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1032 ps.add(e.nextElement());
1033 return "AdjustablePolicy with permissions " + ps;
1034 }
1035 }
1036
1037 /**
1038 * Returns a policy containing all the permissions we ever need.
1039 */
1040 public static Policy permissivePolicy() {
1041 return new AdjustablePolicy
1042 // Permissions j.u.c. needs directly
1043 (new RuntimePermission("modifyThread"),
1044 new RuntimePermission("getClassLoader"),
1045 new RuntimePermission("setContextClassLoader"),
1046 // Permissions needed to change permissions!
1047 new SecurityPermission("getPolicy"),
1048 new SecurityPermission("setPolicy"),
1049 new RuntimePermission("setSecurityManager"),
1050 // Permissions needed by the junit test harness
1051 new RuntimePermission("accessDeclaredMembers"),
1052 new PropertyPermission("*", "read"),
1053 new java.io.FilePermission("<<ALL FILES>>", "read"));
1054 }
1055
1056 /**
1057 * Sleeps until the given time has elapsed.
1058 * Throws AssertionFailedError if interrupted.
1059 */
1060 void sleep(long millis) {
1061 try {
1062 delay(millis);
1063 } catch (InterruptedException fail) {
1064 AssertionFailedError afe =
1065 new AssertionFailedError("Unexpected InterruptedException");
1066 afe.initCause(fail);
1067 throw afe;
1068 }
1069 }
1070
1071 /**
1072 * Spin-waits up to the specified number of milliseconds for the given
1073 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1074 */
1075 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1076 long startTime = System.nanoTime();
1077 for (;;) {
1078 Thread.State s = thread.getState();
1079 if (s == Thread.State.BLOCKED ||
1080 s == Thread.State.WAITING ||
1081 s == Thread.State.TIMED_WAITING)
1082 return;
1083 else if (s == Thread.State.TERMINATED)
1084 fail("Unexpected thread termination");
1085 else if (millisElapsedSince(startTime) > timeoutMillis) {
1086 threadAssertTrue(thread.isAlive());
1087 return;
1088 }
1089 Thread.yield();
1090 }
1091 }
1092
1093 /**
1094 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1095 * state: BLOCKED, WAITING, or TIMED_WAITING.
1096 */
1097 void waitForThreadToEnterWaitState(Thread thread) {
1098 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1099 }
1100
1101 /**
1102 * Returns the number of milliseconds since time given by
1103 * startNanoTime, which must have been previously returned from a
1104 * call to {@link System#nanoTime()}.
1105 */
1106 static long millisElapsedSince(long startNanoTime) {
1107 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1108 }
1109
1110 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1111 // long startTime = System.nanoTime();
1112 // try {
1113 // r.run();
1114 // } catch (Throwable fail) { threadUnexpectedException(fail); }
1115 // if (millisElapsedSince(startTime) > timeoutMillis/2)
1116 // throw new AssertionFailedError("did not return promptly");
1117 // }
1118
1119 // void assertTerminatesPromptly(Runnable r) {
1120 // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1121 // }
1122
1123 /**
1124 * Checks that timed f.get() returns the expected value, and does not
1125 * wait for the timeout to elapse before returning.
1126 */
1127 <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1128 long startTime = System.nanoTime();
1129 try {
1130 assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1131 } catch (Throwable fail) { threadUnexpectedException(fail); }
1132 if (millisElapsedSince(startTime) > timeoutMillis/2)
1133 throw new AssertionFailedError("timed get did not return promptly");
1134 }
1135
1136 <T> void checkTimedGet(Future<T> f, T expectedValue) {
1137 checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1138 }
1139
1140 /**
1141 * Returns a new started daemon Thread running the given runnable.
1142 */
1143 Thread newStartedThread(Runnable runnable) {
1144 Thread t = new Thread(runnable);
1145 t.setDaemon(true);
1146 t.start();
1147 return t;
1148 }
1149
1150 /**
1151 * Waits for the specified time (in milliseconds) for the thread
1152 * to terminate (using {@link Thread#join(long)}), else interrupts
1153 * the thread (in the hope that it may terminate later) and fails.
1154 */
1155 void awaitTermination(Thread t, long timeoutMillis) {
1156 try {
1157 t.join(timeoutMillis);
1158 } catch (InterruptedException fail) {
1159 threadUnexpectedException(fail);
1160 } finally {
1161 if (t.getState() != Thread.State.TERMINATED) {
1162 t.interrupt();
1163 fail("Test timed out");
1164 }
1165 }
1166 }
1167
1168 /**
1169 * Waits for LONG_DELAY_MS milliseconds for the thread to
1170 * terminate (using {@link Thread#join(long)}), else interrupts
1171 * the thread (in the hope that it may terminate later) and fails.
1172 */
1173 void awaitTermination(Thread t) {
1174 awaitTermination(t, LONG_DELAY_MS);
1175 }
1176
1177 // Some convenient Runnable classes
1178
1179 public abstract class CheckedRunnable implements Runnable {
1180 protected abstract void realRun() throws Throwable;
1181
1182 public final void run() {
1183 try {
1184 realRun();
1185 } catch (Throwable fail) {
1186 threadUnexpectedException(fail);
1187 }
1188 }
1189 }
1190
1191 public abstract class RunnableShouldThrow implements Runnable {
1192 protected abstract void realRun() throws Throwable;
1193
1194 final Class<?> exceptionClass;
1195
1196 <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1197 this.exceptionClass = exceptionClass;
1198 }
1199
1200 public final void run() {
1201 try {
1202 realRun();
1203 threadShouldThrow(exceptionClass.getSimpleName());
1204 } catch (Throwable t) {
1205 if (! exceptionClass.isInstance(t))
1206 threadUnexpectedException(t);
1207 }
1208 }
1209 }
1210
1211 public abstract class ThreadShouldThrow extends Thread {
1212 protected abstract void realRun() throws Throwable;
1213
1214 final Class<?> exceptionClass;
1215
1216 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1217 this.exceptionClass = exceptionClass;
1218 }
1219
1220 public final void run() {
1221 try {
1222 realRun();
1223 threadShouldThrow(exceptionClass.getSimpleName());
1224 } catch (Throwable t) {
1225 if (! exceptionClass.isInstance(t))
1226 threadUnexpectedException(t);
1227 }
1228 }
1229 }
1230
1231 public abstract class CheckedInterruptedRunnable implements Runnable {
1232 protected abstract void realRun() throws Throwable;
1233
1234 public final void run() {
1235 try {
1236 realRun();
1237 threadShouldThrow("InterruptedException");
1238 } catch (InterruptedException success) {
1239 threadAssertFalse(Thread.interrupted());
1240 } catch (Throwable fail) {
1241 threadUnexpectedException(fail);
1242 }
1243 }
1244 }
1245
1246 public abstract class CheckedCallable<T> implements Callable<T> {
1247 protected abstract T realCall() throws Throwable;
1248
1249 public final T call() {
1250 try {
1251 return realCall();
1252 } catch (Throwable fail) {
1253 threadUnexpectedException(fail);
1254 return null;
1255 }
1256 }
1257 }
1258
1259 public abstract class CheckedInterruptedCallable<T>
1260 implements Callable<T> {
1261 protected abstract T realCall() throws Throwable;
1262
1263 public final T call() {
1264 try {
1265 T result = realCall();
1266 threadShouldThrow("InterruptedException");
1267 return result;
1268 } catch (InterruptedException success) {
1269 threadAssertFalse(Thread.interrupted());
1270 } catch (Throwable fail) {
1271 threadUnexpectedException(fail);
1272 }
1273 return null;
1274 }
1275 }
1276
1277 public static class NoOpRunnable implements Runnable {
1278 public void run() {}
1279 }
1280
1281 public static class NoOpCallable implements Callable {
1282 public Object call() { return Boolean.TRUE; }
1283 }
1284
1285 public static final String TEST_STRING = "a test string";
1286
1287 public static class StringTask implements Callable<String> {
1288 final String value;
1289 public StringTask() { this(TEST_STRING); }
1290 public StringTask(String value) { this.value = value; }
1291 public String call() { return value; }
1292 }
1293
1294 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1295 return new CheckedCallable<String>() {
1296 protected String realCall() {
1297 try {
1298 latch.await();
1299 } catch (InterruptedException quittingTime) {}
1300 return TEST_STRING;
1301 }};
1302 }
1303
1304 public Runnable countDowner(final CountDownLatch latch) {
1305 return new CheckedRunnable() {
1306 public void realRun() throws InterruptedException {
1307 latch.countDown();
1308 }};
1309 }
1310
1311 public Runnable awaiter(final CountDownLatch latch) {
1312 return new CheckedRunnable() {
1313 public void realRun() throws InterruptedException {
1314 await(latch);
1315 }};
1316 }
1317
1318 public void await(CountDownLatch latch) {
1319 try {
1320 assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
1321 } catch (Throwable fail) {
1322 threadUnexpectedException(fail);
1323 }
1324 }
1325
1326 public void await(Semaphore semaphore) {
1327 try {
1328 assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
1329 } catch (Throwable fail) {
1330 threadUnexpectedException(fail);
1331 }
1332 }
1333
1334 // /**
1335 // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1336 // */
1337 // public void await(AtomicBoolean flag) {
1338 // await(flag, LONG_DELAY_MS);
1339 // }
1340
1341 // /**
1342 // * Spin-waits up to the specified timeout until flag becomes true.
1343 // */
1344 // public void await(AtomicBoolean flag, long timeoutMillis) {
1345 // long startTime = System.nanoTime();
1346 // while (!flag.get()) {
1347 // if (millisElapsedSince(startTime) > timeoutMillis)
1348 // throw new AssertionFailedError("timed out");
1349 // Thread.yield();
1350 // }
1351 // }
1352
1353 public static class NPETask implements Callable<String> {
1354 public String call() { throw new NullPointerException(); }
1355 }
1356
1357 public static class CallableOne implements Callable<Integer> {
1358 public Integer call() { return one; }
1359 }
1360
1361 public class ShortRunnable extends CheckedRunnable {
1362 protected void realRun() throws Throwable {
1363 delay(SHORT_DELAY_MS);
1364 }
1365 }
1366
1367 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1368 protected void realRun() throws InterruptedException {
1369 delay(SHORT_DELAY_MS);
1370 }
1371 }
1372
1373 public class SmallRunnable extends CheckedRunnable {
1374 protected void realRun() throws Throwable {
1375 delay(SMALL_DELAY_MS);
1376 }
1377 }
1378
1379 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1380 protected void realRun() {
1381 try {
1382 delay(SMALL_DELAY_MS);
1383 } catch (InterruptedException ok) {}
1384 }
1385 }
1386
1387 public class SmallCallable extends CheckedCallable {
1388 protected Object realCall() throws InterruptedException {
1389 delay(SMALL_DELAY_MS);
1390 return Boolean.TRUE;
1391 }
1392 }
1393
1394 public class MediumRunnable extends CheckedRunnable {
1395 protected void realRun() throws Throwable {
1396 delay(MEDIUM_DELAY_MS);
1397 }
1398 }
1399
1400 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1401 protected void realRun() throws InterruptedException {
1402 delay(MEDIUM_DELAY_MS);
1403 }
1404 }
1405
1406 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1407 return new CheckedRunnable() {
1408 protected void realRun() {
1409 try {
1410 delay(timeoutMillis);
1411 } catch (InterruptedException ok) {}
1412 }};
1413 }
1414
1415 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1416 protected void realRun() {
1417 try {
1418 delay(MEDIUM_DELAY_MS);
1419 } catch (InterruptedException ok) {}
1420 }
1421 }
1422
1423 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1424 protected void realRun() {
1425 try {
1426 delay(LONG_DELAY_MS);
1427 } catch (InterruptedException ok) {}
1428 }
1429 }
1430
1431 /**
1432 * For use as ThreadFactory in constructors
1433 */
1434 public static class SimpleThreadFactory implements ThreadFactory {
1435 public Thread newThread(Runnable r) {
1436 return new Thread(r);
1437 }
1438 }
1439
1440 public interface TrackedRunnable extends Runnable {
1441 boolean isDone();
1442 }
1443
1444 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1445 return new TrackedRunnable() {
1446 private volatile boolean done = false;
1447 public boolean isDone() { return done; }
1448 public void run() {
1449 try {
1450 delay(timeoutMillis);
1451 done = true;
1452 } catch (InterruptedException ok) {}
1453 }
1454 };
1455 }
1456
1457 public static class TrackedShortRunnable implements Runnable {
1458 public volatile boolean done = false;
1459 public void run() {
1460 try {
1461 delay(SHORT_DELAY_MS);
1462 done = true;
1463 } catch (InterruptedException ok) {}
1464 }
1465 }
1466
1467 public static class TrackedSmallRunnable implements Runnable {
1468 public volatile boolean done = false;
1469 public void run() {
1470 try {
1471 delay(SMALL_DELAY_MS);
1472 done = true;
1473 } catch (InterruptedException ok) {}
1474 }
1475 }
1476
1477 public static class TrackedMediumRunnable implements Runnable {
1478 public volatile boolean done = false;
1479 public void run() {
1480 try {
1481 delay(MEDIUM_DELAY_MS);
1482 done = true;
1483 } catch (InterruptedException ok) {}
1484 }
1485 }
1486
1487 public static class TrackedLongRunnable implements Runnable {
1488 public volatile boolean done = false;
1489 public void run() {
1490 try {
1491 delay(LONG_DELAY_MS);
1492 done = true;
1493 } catch (InterruptedException ok) {}
1494 }
1495 }
1496
1497 public static class TrackedNoOpRunnable implements Runnable {
1498 public volatile boolean done = false;
1499 public void run() {
1500 done = true;
1501 }
1502 }
1503
1504 public static class TrackedCallable implements Callable {
1505 public volatile boolean done = false;
1506 public Object call() {
1507 try {
1508 delay(SMALL_DELAY_MS);
1509 done = true;
1510 } catch (InterruptedException ok) {}
1511 return Boolean.TRUE;
1512 }
1513 }
1514
1515 /**
1516 * Analog of CheckedRunnable for RecursiveAction
1517 */
1518 public abstract class CheckedRecursiveAction extends RecursiveAction {
1519 protected abstract void realCompute() throws Throwable;
1520
1521 @Override protected final void compute() {
1522 try {
1523 realCompute();
1524 } catch (Throwable fail) {
1525 threadUnexpectedException(fail);
1526 }
1527 }
1528 }
1529
1530 /**
1531 * Analog of CheckedCallable for RecursiveTask
1532 */
1533 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1534 protected abstract T realCompute() throws Throwable;
1535
1536 @Override protected final T compute() {
1537 try {
1538 return realCompute();
1539 } catch (Throwable fail) {
1540 threadUnexpectedException(fail);
1541 return null;
1542 }
1543 }
1544 }
1545
1546 /**
1547 * For use as RejectedExecutionHandler in constructors
1548 */
1549 public static class NoOpREHandler implements RejectedExecutionHandler {
1550 public void rejectedExecution(Runnable r,
1551 ThreadPoolExecutor executor) {}
1552 }
1553
1554 /**
1555 * A CyclicBarrier that uses timed await and fails with
1556 * AssertionFailedErrors instead of throwing checked exceptions.
1557 */
1558 public class CheckedBarrier extends CyclicBarrier {
1559 public CheckedBarrier(int parties) { super(parties); }
1560
1561 public int await() {
1562 try {
1563 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1564 } catch (TimeoutException timedOut) {
1565 throw new AssertionFailedError("timed out");
1566 } catch (Exception fail) {
1567 AssertionFailedError afe =
1568 new AssertionFailedError("Unexpected exception: " + fail);
1569 afe.initCause(fail);
1570 throw afe;
1571 }
1572 }
1573 }
1574
1575 void checkEmpty(BlockingQueue q) {
1576 try {
1577 assertTrue(q.isEmpty());
1578 assertEquals(0, q.size());
1579 assertNull(q.peek());
1580 assertNull(q.poll());
1581 assertNull(q.poll(0, MILLISECONDS));
1582 assertEquals(q.toString(), "[]");
1583 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1584 assertFalse(q.iterator().hasNext());
1585 try {
1586 q.element();
1587 shouldThrow();
1588 } catch (NoSuchElementException success) {}
1589 try {
1590 q.iterator().next();
1591 shouldThrow();
1592 } catch (NoSuchElementException success) {}
1593 try {
1594 q.remove();
1595 shouldThrow();
1596 } catch (NoSuchElementException success) {}
1597 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1598 }
1599
1600 void assertSerialEquals(Object x, Object y) {
1601 assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1602 }
1603
1604 void assertNotSerialEquals(Object x, Object y) {
1605 assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1606 }
1607
1608 byte[] serialBytes(Object o) {
1609 try {
1610 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1611 ObjectOutputStream oos = new ObjectOutputStream(bos);
1612 oos.writeObject(o);
1613 oos.flush();
1614 oos.close();
1615 return bos.toByteArray();
1616 } catch (Throwable fail) {
1617 threadUnexpectedException(fail);
1618 return new byte[0];
1619 }
1620 }
1621
1622 @SuppressWarnings("unchecked")
1623 <T> T serialClone(T o) {
1624 try {
1625 ObjectInputStream ois = new ObjectInputStream
1626 (new ByteArrayInputStream(serialBytes(o)));
1627 T clone = (T) ois.readObject();
1628 assertSame(o.getClass(), clone.getClass());
1629 return clone;
1630 } catch (Throwable fail) {
1631 threadUnexpectedException(fail);
1632 return null;
1633 }
1634 }
1635
1636 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1637 Runnable... throwingActions) {
1638 for (Runnable throwingAction : throwingActions) {
1639 boolean threw = false;
1640 try { throwingAction.run(); }
1641 catch (Throwable t) {
1642 threw = true;
1643 if (!expectedExceptionClass.isInstance(t)) {
1644 AssertionFailedError afe =
1645 new AssertionFailedError
1646 ("Expected " + expectedExceptionClass.getName() +
1647 ", got " + t.getClass().getName());
1648 afe.initCause(t);
1649 threadUnexpectedException(afe);
1650 }
1651 }
1652 if (!threw)
1653 shouldThrow(expectedExceptionClass.getName());
1654 }
1655 }
1656
1657 public void assertIteratorExhausted(Iterator<?> it) {
1658 try {
1659 it.next();
1660 shouldThrow();
1661 } catch (NoSuchElementException success) {}
1662 assertFalse(it.hasNext());
1663 }
1664 }