ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.179
Committed: Fri Oct 23 21:59:58 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.178: +3 -3 lines
Log Message:
untabify

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