ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.203
Committed: Thu Sep 15 03:46:19 2016 UTC (7 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.202: +6 -3 lines
Log Message:
dumpTestThreads: prevent NPE while dumping threads

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