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