ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.206
Committed: Tue Oct 25 01:32:55 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.205: +1 -0 lines
Log Message:
fix 4jdk7-test ant target

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 ArrayListTest.suite(),
451 AtomicBooleanTest.suite(),
452 AtomicIntegerArrayTest.suite(),
453 AtomicIntegerFieldUpdaterTest.suite(),
454 AtomicIntegerTest.suite(),
455 AtomicLongArrayTest.suite(),
456 AtomicLongFieldUpdaterTest.suite(),
457 AtomicLongTest.suite(),
458 AtomicMarkableReferenceTest.suite(),
459 AtomicReferenceArrayTest.suite(),
460 AtomicReferenceFieldUpdaterTest.suite(),
461 AtomicReferenceTest.suite(),
462 AtomicStampedReferenceTest.suite(),
463 ConcurrentHashMapTest.suite(),
464 ConcurrentLinkedDequeTest.suite(),
465 ConcurrentLinkedQueueTest.suite(),
466 ConcurrentSkipListMapTest.suite(),
467 ConcurrentSkipListSubMapTest.suite(),
468 ConcurrentSkipListSetTest.suite(),
469 ConcurrentSkipListSubSetTest.suite(),
470 CopyOnWriteArrayListTest.suite(),
471 CopyOnWriteArraySetTest.suite(),
472 CountDownLatchTest.suite(),
473 CountedCompleterTest.suite(),
474 CyclicBarrierTest.suite(),
475 DelayQueueTest.suite(),
476 EntryTest.suite(),
477 ExchangerTest.suite(),
478 ExecutorsTest.suite(),
479 ExecutorCompletionServiceTest.suite(),
480 FutureTaskTest.suite(),
481 LinkedBlockingDequeTest.suite(),
482 LinkedBlockingQueueTest.suite(),
483 LinkedListTest.suite(),
484 LockSupportTest.suite(),
485 PriorityBlockingQueueTest.suite(),
486 PriorityQueueTest.suite(),
487 ReentrantLockTest.suite(),
488 ReentrantReadWriteLockTest.suite(),
489 ScheduledExecutorTest.suite(),
490 ScheduledExecutorSubclassTest.suite(),
491 SemaphoreTest.suite(),
492 SynchronousQueueTest.suite(),
493 SystemTest.suite(),
494 ThreadLocalTest.suite(),
495 ThreadPoolExecutorTest.suite(),
496 ThreadPoolExecutorSubclassTest.suite(),
497 ThreadTest.suite(),
498 TimeUnitTest.suite(),
499 TreeMapTest.suite(),
500 TreeSetTest.suite(),
501 TreeSubMapTest.suite(),
502 TreeSubSetTest.suite());
503
504 // Java8+ test classes
505 if (atLeastJava8()) {
506 String[] java8TestClassNames = {
507 "ArrayDeque8Test",
508 "Atomic8Test",
509 "CompletableFutureTest",
510 "ConcurrentHashMap8Test",
511 "CountedCompleter8Test",
512 "DoubleAccumulatorTest",
513 "DoubleAdderTest",
514 "ForkJoinPool8Test",
515 "ForkJoinTask8Test",
516 "LongAccumulatorTest",
517 "LongAdderTest",
518 "SplittableRandomTest",
519 "StampedLockTest",
520 "SubmissionPublisherTest",
521 "ThreadLocalRandom8Test",
522 "TimeUnit8Test",
523 };
524 addNamedTestClasses(suite, java8TestClassNames);
525 }
526
527 // Java9+ test classes
528 if (atLeastJava9()) {
529 String[] java9TestClassNames = {
530 "AtomicBoolean9Test",
531 "AtomicInteger9Test",
532 "AtomicIntegerArray9Test",
533 "AtomicLong9Test",
534 "AtomicLongArray9Test",
535 "AtomicReference9Test",
536 "AtomicReferenceArray9Test",
537 "ExecutorCompletionService9Test",
538 };
539 addNamedTestClasses(suite, java9TestClassNames);
540 }
541
542 return suite;
543 }
544
545 /** Returns list of junit-style test method names in given class. */
546 public static ArrayList<String> testMethodNames(Class<?> testClass) {
547 Method[] methods = testClass.getDeclaredMethods();
548 ArrayList<String> names = new ArrayList<String>(methods.length);
549 for (Method method : methods) {
550 if (method.getName().startsWith("test")
551 && Modifier.isPublic(method.getModifiers())
552 // method.getParameterCount() requires jdk8+
553 && method.getParameterTypes().length == 0) {
554 names.add(method.getName());
555 }
556 }
557 return names;
558 }
559
560 /**
561 * Returns junit-style testSuite for the given test class, but
562 * parameterized by passing extra data to each test.
563 */
564 public static <ExtraData> Test parameterizedTestSuite
565 (Class<? extends JSR166TestCase> testClass,
566 Class<ExtraData> dataClass,
567 ExtraData data) {
568 try {
569 TestSuite suite = new TestSuite();
570 Constructor c =
571 testClass.getDeclaredConstructor(dataClass, String.class);
572 for (String methodName : testMethodNames(testClass))
573 suite.addTest((Test) c.newInstance(data, methodName));
574 return suite;
575 } catch (Exception e) {
576 throw new Error(e);
577 }
578 }
579
580 /**
581 * Returns junit-style testSuite for the jdk8 extension of the
582 * given test class, but parameterized by passing extra data to
583 * each test. Uses reflection to allow compilation in jdk7.
584 */
585 public static <ExtraData> Test jdk8ParameterizedTestSuite
586 (Class<? extends JSR166TestCase> testClass,
587 Class<ExtraData> dataClass,
588 ExtraData data) {
589 if (atLeastJava8()) {
590 String name = testClass.getName();
591 String name8 = name.replaceAll("Test$", "8Test");
592 if (name.equals(name8)) throw new Error(name);
593 try {
594 return (Test)
595 Class.forName(name8)
596 .getMethod("testSuite", new Class[] { dataClass })
597 .invoke(null, data);
598 } catch (Exception e) {
599 throw new Error(e);
600 }
601 } else {
602 return new TestSuite();
603 }
604 }
605
606 // Delays for timing-dependent tests, in milliseconds.
607
608 public static long SHORT_DELAY_MS;
609 public static long SMALL_DELAY_MS;
610 public static long MEDIUM_DELAY_MS;
611 public static long LONG_DELAY_MS;
612
613 /**
614 * Returns the shortest timed delay. This can be scaled up for
615 * slow machines using the jsr166.delay.factor system property,
616 * or via jtreg's -timeoutFactor: flag.
617 * http://openjdk.java.net/jtreg/command-help.html
618 */
619 protected long getShortDelay() {
620 return (long) (50 * delayFactor);
621 }
622
623 /**
624 * Sets delays as multiples of SHORT_DELAY.
625 */
626 protected void setDelays() {
627 SHORT_DELAY_MS = getShortDelay();
628 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
629 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
630 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
631 }
632
633 /**
634 * Returns a timeout in milliseconds to be used in tests that
635 * verify that operations block or time out.
636 */
637 long timeoutMillis() {
638 return SHORT_DELAY_MS / 4;
639 }
640
641 /**
642 * Returns a new Date instance representing a time at least
643 * delayMillis milliseconds in the future.
644 */
645 Date delayedDate(long delayMillis) {
646 // Add 1 because currentTimeMillis is known to round into the past.
647 return new Date(System.currentTimeMillis() + delayMillis + 1);
648 }
649
650 /**
651 * The first exception encountered if any threadAssertXXX method fails.
652 */
653 private final AtomicReference<Throwable> threadFailure
654 = new AtomicReference<Throwable>(null);
655
656 /**
657 * Records an exception so that it can be rethrown later in the test
658 * harness thread, triggering a test case failure. Only the first
659 * failure is recorded; subsequent calls to this method from within
660 * the same test have no effect.
661 */
662 public void threadRecordFailure(Throwable t) {
663 System.err.println(t);
664 dumpTestThreads();
665 threadFailure.compareAndSet(null, t);
666 }
667
668 public void setUp() {
669 setDelays();
670 }
671
672 void tearDownFail(String format, Object... args) {
673 String msg = toString() + ": " + String.format(format, args);
674 System.err.println(msg);
675 dumpTestThreads();
676 throw new AssertionFailedError(msg);
677 }
678
679 /**
680 * Extra checks that get done for all test cases.
681 *
682 * Triggers test case failure if any thread assertions have failed,
683 * by rethrowing, in the test harness thread, any exception recorded
684 * earlier by threadRecordFailure.
685 *
686 * Triggers test case failure if interrupt status is set in the main thread.
687 */
688 public void tearDown() throws Exception {
689 Throwable t = threadFailure.getAndSet(null);
690 if (t != null) {
691 if (t instanceof Error)
692 throw (Error) t;
693 else if (t instanceof RuntimeException)
694 throw (RuntimeException) t;
695 else if (t instanceof Exception)
696 throw (Exception) t;
697 else {
698 AssertionFailedError afe =
699 new AssertionFailedError(t.toString());
700 afe.initCause(t);
701 throw afe;
702 }
703 }
704
705 if (Thread.interrupted())
706 tearDownFail("interrupt status set in main thread");
707
708 checkForkJoinPoolThreadLeaks();
709 }
710
711 /**
712 * Finds missing PoolCleaners
713 */
714 void checkForkJoinPoolThreadLeaks() throws InterruptedException {
715 Thread[] survivors = new Thread[7];
716 int count = Thread.enumerate(survivors);
717 for (int i = 0; i < count; i++) {
718 Thread thread = survivors[i];
719 String name = thread.getName();
720 if (name.startsWith("ForkJoinPool-")) {
721 // give thread some time to terminate
722 thread.join(LONG_DELAY_MS);
723 if (thread.isAlive())
724 tearDownFail("Found leaked ForkJoinPool thread thread=%s",
725 thread);
726 }
727 }
728
729 if (!ForkJoinPool.commonPool()
730 .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
731 tearDownFail("ForkJoin common pool thread stuck");
732 }
733
734 /**
735 * Just like fail(reason), but additionally recording (using
736 * threadRecordFailure) any AssertionFailedError thrown, so that
737 * the current testcase will fail.
738 */
739 public void threadFail(String reason) {
740 try {
741 fail(reason);
742 } catch (AssertionFailedError t) {
743 threadRecordFailure(t);
744 throw t;
745 }
746 }
747
748 /**
749 * Just like assertTrue(b), but additionally recording (using
750 * threadRecordFailure) any AssertionFailedError thrown, so that
751 * the current testcase will fail.
752 */
753 public void threadAssertTrue(boolean b) {
754 try {
755 assertTrue(b);
756 } catch (AssertionFailedError t) {
757 threadRecordFailure(t);
758 throw t;
759 }
760 }
761
762 /**
763 * Just like assertFalse(b), but additionally recording (using
764 * threadRecordFailure) any AssertionFailedError thrown, so that
765 * the current testcase will fail.
766 */
767 public void threadAssertFalse(boolean b) {
768 try {
769 assertFalse(b);
770 } catch (AssertionFailedError t) {
771 threadRecordFailure(t);
772 throw t;
773 }
774 }
775
776 /**
777 * Just like assertNull(x), but additionally recording (using
778 * threadRecordFailure) any AssertionFailedError thrown, so that
779 * the current testcase will fail.
780 */
781 public void threadAssertNull(Object x) {
782 try {
783 assertNull(x);
784 } catch (AssertionFailedError t) {
785 threadRecordFailure(t);
786 throw t;
787 }
788 }
789
790 /**
791 * Just like assertEquals(x, y), but additionally recording (using
792 * threadRecordFailure) any AssertionFailedError thrown, so that
793 * the current testcase will fail.
794 */
795 public void threadAssertEquals(long x, long y) {
796 try {
797 assertEquals(x, y);
798 } catch (AssertionFailedError t) {
799 threadRecordFailure(t);
800 throw t;
801 }
802 }
803
804 /**
805 * Just like assertEquals(x, y), but additionally recording (using
806 * threadRecordFailure) any AssertionFailedError thrown, so that
807 * the current testcase will fail.
808 */
809 public void threadAssertEquals(Object x, Object y) {
810 try {
811 assertEquals(x, y);
812 } catch (AssertionFailedError fail) {
813 threadRecordFailure(fail);
814 throw fail;
815 } catch (Throwable fail) {
816 threadUnexpectedException(fail);
817 }
818 }
819
820 /**
821 * Just like assertSame(x, y), but additionally recording (using
822 * threadRecordFailure) any AssertionFailedError thrown, so that
823 * the current testcase will fail.
824 */
825 public void threadAssertSame(Object x, Object y) {
826 try {
827 assertSame(x, y);
828 } catch (AssertionFailedError fail) {
829 threadRecordFailure(fail);
830 throw fail;
831 }
832 }
833
834 /**
835 * Calls threadFail with message "should throw exception".
836 */
837 public void threadShouldThrow() {
838 threadFail("should throw exception");
839 }
840
841 /**
842 * Calls threadFail with message "should throw" + exceptionName.
843 */
844 public void threadShouldThrow(String exceptionName) {
845 threadFail("should throw " + exceptionName);
846 }
847
848 /**
849 * Records the given exception using {@link #threadRecordFailure},
850 * then rethrows the exception, wrapping it in an
851 * AssertionFailedError if necessary.
852 */
853 public void threadUnexpectedException(Throwable t) {
854 threadRecordFailure(t);
855 t.printStackTrace();
856 if (t instanceof RuntimeException)
857 throw (RuntimeException) t;
858 else if (t instanceof Error)
859 throw (Error) t;
860 else {
861 AssertionFailedError afe =
862 new AssertionFailedError("unexpected exception: " + t);
863 afe.initCause(t);
864 throw afe;
865 }
866 }
867
868 /**
869 * Delays, via Thread.sleep, for the given millisecond delay, but
870 * if the sleep is shorter than specified, may re-sleep or yield
871 * until time elapses. Ensures that the given time, as measured
872 * by System.nanoTime(), has elapsed.
873 */
874 static void delay(long millis) throws InterruptedException {
875 long nanos = millis * (1000 * 1000);
876 final long wakeupTime = System.nanoTime() + nanos;
877 do {
878 if (millis > 0L)
879 Thread.sleep(millis);
880 else // too short to sleep
881 Thread.yield();
882 nanos = wakeupTime - System.nanoTime();
883 millis = nanos / (1000 * 1000);
884 } while (nanos >= 0L);
885 }
886
887 /**
888 * Allows use of try-with-resources with per-test thread pools.
889 */
890 class PoolCleaner implements AutoCloseable {
891 private final ExecutorService pool;
892 public PoolCleaner(ExecutorService pool) { this.pool = pool; }
893 public void close() { joinPool(pool); }
894 }
895
896 /**
897 * An extension of PoolCleaner that has an action to release the pool.
898 */
899 class PoolCleanerWithReleaser extends PoolCleaner {
900 private final Runnable releaser;
901 public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
902 super(pool);
903 this.releaser = releaser;
904 }
905 public void close() {
906 try {
907 releaser.run();
908 } finally {
909 super.close();
910 }
911 }
912 }
913
914 PoolCleaner cleaner(ExecutorService pool) {
915 return new PoolCleaner(pool);
916 }
917
918 PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
919 return new PoolCleanerWithReleaser(pool, releaser);
920 }
921
922 PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
923 return new PoolCleanerWithReleaser(pool, releaser(latch));
924 }
925
926 Runnable releaser(final CountDownLatch latch) {
927 return new Runnable() { public void run() {
928 do { latch.countDown(); }
929 while (latch.getCount() > 0);
930 }};
931 }
932
933 PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
934 return new PoolCleanerWithReleaser(pool, releaser(flag));
935 }
936
937 Runnable releaser(final AtomicBoolean flag) {
938 return new Runnable() { public void run() { flag.set(true); }};
939 }
940
941 /**
942 * Waits out termination of a thread pool or fails doing so.
943 */
944 void joinPool(ExecutorService pool) {
945 try {
946 pool.shutdown();
947 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
948 try {
949 threadFail("ExecutorService " + pool +
950 " did not terminate in a timely manner");
951 } finally {
952 // last resort, for the benefit of subsequent tests
953 pool.shutdownNow();
954 pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
955 }
956 }
957 } catch (SecurityException ok) {
958 // Allowed in case test doesn't have privs
959 } catch (InterruptedException fail) {
960 threadFail("Unexpected InterruptedException");
961 }
962 }
963
964 /**
965 * Like Runnable, but with the freedom to throw anything.
966 * junit folks had the same idea:
967 * http://junit.org/junit5/docs/snapshot/api/org/junit/gen5/api/Executable.html
968 */
969 interface Action { public void run() throws Throwable; }
970
971 /**
972 * Runs all the given actions in parallel, failing if any fail.
973 * Useful for running multiple variants of tests that are
974 * necessarily individually slow because they must block.
975 */
976 void testInParallel(Action ... actions) {
977 ExecutorService pool = Executors.newCachedThreadPool();
978 try (PoolCleaner cleaner = cleaner(pool)) {
979 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
980 for (final Action action : actions)
981 futures.add(pool.submit(new CheckedRunnable() {
982 public void realRun() throws Throwable { action.run();}}));
983 for (Future<?> future : futures)
984 try {
985 assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
986 } catch (ExecutionException ex) {
987 threadUnexpectedException(ex.getCause());
988 } catch (Exception ex) {
989 threadUnexpectedException(ex);
990 }
991 }
992 }
993
994 /**
995 * A debugging tool to print stack traces of most threads, as jstack does.
996 * Uninteresting threads are filtered out.
997 */
998 static void dumpTestThreads() {
999 SecurityManager sm = System.getSecurityManager();
1000 if (sm != null) {
1001 try {
1002 System.setSecurityManager(null);
1003 } catch (SecurityException giveUp) {
1004 return;
1005 }
1006 }
1007
1008 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
1009 System.err.println("------ stacktrace dump start ------");
1010 for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
1011 final String name = info.getThreadName();
1012 String lockName;
1013 if ("Signal Dispatcher".equals(name))
1014 continue;
1015 if ("Reference Handler".equals(name)
1016 && (lockName = info.getLockName()) != null
1017 && lockName.startsWith("java.lang.ref.Reference$Lock"))
1018 continue;
1019 if ("Finalizer".equals(name)
1020 && (lockName = info.getLockName()) != null
1021 && lockName.startsWith("java.lang.ref.ReferenceQueue$Lock"))
1022 continue;
1023 if ("checkForWedgedTest".equals(name))
1024 continue;
1025 System.err.print(info);
1026 }
1027 System.err.println("------ stacktrace dump end ------");
1028
1029 if (sm != null) System.setSecurityManager(sm);
1030 }
1031
1032 /**
1033 * Checks that thread does not terminate within the default
1034 * millisecond delay of {@code timeoutMillis()}.
1035 */
1036 void assertThreadStaysAlive(Thread thread) {
1037 assertThreadStaysAlive(thread, timeoutMillis());
1038 }
1039
1040 /**
1041 * Checks that thread does not terminate within the given millisecond delay.
1042 */
1043 void assertThreadStaysAlive(Thread thread, long millis) {
1044 try {
1045 // No need to optimize the failing case via Thread.join.
1046 delay(millis);
1047 assertTrue(thread.isAlive());
1048 } catch (InterruptedException fail) {
1049 threadFail("Unexpected InterruptedException");
1050 }
1051 }
1052
1053 /**
1054 * Checks that the threads do not terminate within the default
1055 * millisecond delay of {@code timeoutMillis()}.
1056 */
1057 void assertThreadsStayAlive(Thread... threads) {
1058 assertThreadsStayAlive(timeoutMillis(), threads);
1059 }
1060
1061 /**
1062 * Checks that the threads do not terminate within the given millisecond delay.
1063 */
1064 void assertThreadsStayAlive(long millis, Thread... threads) {
1065 try {
1066 // No need to optimize the failing case via Thread.join.
1067 delay(millis);
1068 for (Thread thread : threads)
1069 assertTrue(thread.isAlive());
1070 } catch (InterruptedException fail) {
1071 threadFail("Unexpected InterruptedException");
1072 }
1073 }
1074
1075 /**
1076 * Checks that future.get times out, with the default timeout of
1077 * {@code timeoutMillis()}.
1078 */
1079 void assertFutureTimesOut(Future future) {
1080 assertFutureTimesOut(future, timeoutMillis());
1081 }
1082
1083 /**
1084 * Checks that future.get times out, with the given millisecond timeout.
1085 */
1086 void assertFutureTimesOut(Future future, long timeoutMillis) {
1087 long startTime = System.nanoTime();
1088 try {
1089 future.get(timeoutMillis, MILLISECONDS);
1090 shouldThrow();
1091 } catch (TimeoutException success) {
1092 } catch (Exception fail) {
1093 threadUnexpectedException(fail);
1094 } finally { future.cancel(true); }
1095 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1096 }
1097
1098 /**
1099 * Fails with message "should throw exception".
1100 */
1101 public void shouldThrow() {
1102 fail("Should throw exception");
1103 }
1104
1105 /**
1106 * Fails with message "should throw " + exceptionName.
1107 */
1108 public void shouldThrow(String exceptionName) {
1109 fail("Should throw " + exceptionName);
1110 }
1111
1112 /**
1113 * The number of elements to place in collections, arrays, etc.
1114 */
1115 public static final int SIZE = 20;
1116
1117 // Some convenient Integer constants
1118
1119 public static final Integer zero = new Integer(0);
1120 public static final Integer one = new Integer(1);
1121 public static final Integer two = new Integer(2);
1122 public static final Integer three = new Integer(3);
1123 public static final Integer four = new Integer(4);
1124 public static final Integer five = new Integer(5);
1125 public static final Integer six = new Integer(6);
1126 public static final Integer seven = new Integer(7);
1127 public static final Integer eight = new Integer(8);
1128 public static final Integer nine = new Integer(9);
1129 public static final Integer m1 = new Integer(-1);
1130 public static final Integer m2 = new Integer(-2);
1131 public static final Integer m3 = new Integer(-3);
1132 public static final Integer m4 = new Integer(-4);
1133 public static final Integer m5 = new Integer(-5);
1134 public static final Integer m6 = new Integer(-6);
1135 public static final Integer m10 = new Integer(-10);
1136
1137 /**
1138 * Runs Runnable r with a security policy that permits precisely
1139 * the specified permissions. If there is no current security
1140 * manager, the runnable is run twice, both with and without a
1141 * security manager. We require that any security manager permit
1142 * getPolicy/setPolicy.
1143 */
1144 public void runWithPermissions(Runnable r, Permission... permissions) {
1145 SecurityManager sm = System.getSecurityManager();
1146 if (sm == null) {
1147 r.run();
1148 }
1149 runWithSecurityManagerWithPermissions(r, permissions);
1150 }
1151
1152 /**
1153 * Runs Runnable r with a security policy that permits precisely
1154 * the specified permissions. If there is no current security
1155 * manager, a temporary one is set for the duration of the
1156 * Runnable. We require that any security manager permit
1157 * getPolicy/setPolicy.
1158 */
1159 public void runWithSecurityManagerWithPermissions(Runnable r,
1160 Permission... permissions) {
1161 SecurityManager sm = System.getSecurityManager();
1162 if (sm == null) {
1163 Policy savedPolicy = Policy.getPolicy();
1164 try {
1165 Policy.setPolicy(permissivePolicy());
1166 System.setSecurityManager(new SecurityManager());
1167 runWithSecurityManagerWithPermissions(r, permissions);
1168 } finally {
1169 System.setSecurityManager(null);
1170 Policy.setPolicy(savedPolicy);
1171 }
1172 } else {
1173 Policy savedPolicy = Policy.getPolicy();
1174 AdjustablePolicy policy = new AdjustablePolicy(permissions);
1175 Policy.setPolicy(policy);
1176
1177 try {
1178 r.run();
1179 } finally {
1180 policy.addPermission(new SecurityPermission("setPolicy"));
1181 Policy.setPolicy(savedPolicy);
1182 }
1183 }
1184 }
1185
1186 /**
1187 * Runs a runnable without any permissions.
1188 */
1189 public void runWithoutPermissions(Runnable r) {
1190 runWithPermissions(r);
1191 }
1192
1193 /**
1194 * A security policy where new permissions can be dynamically added
1195 * or all cleared.
1196 */
1197 public static class AdjustablePolicy extends java.security.Policy {
1198 Permissions perms = new Permissions();
1199 AdjustablePolicy(Permission... permissions) {
1200 for (Permission permission : permissions)
1201 perms.add(permission);
1202 }
1203 void addPermission(Permission perm) { perms.add(perm); }
1204 void clearPermissions() { perms = new Permissions(); }
1205 public PermissionCollection getPermissions(CodeSource cs) {
1206 return perms;
1207 }
1208 public PermissionCollection getPermissions(ProtectionDomain pd) {
1209 return perms;
1210 }
1211 public boolean implies(ProtectionDomain pd, Permission p) {
1212 return perms.implies(p);
1213 }
1214 public void refresh() {}
1215 public String toString() {
1216 List<Permission> ps = new ArrayList<Permission>();
1217 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1218 ps.add(e.nextElement());
1219 return "AdjustablePolicy with permissions " + ps;
1220 }
1221 }
1222
1223 /**
1224 * Returns a policy containing all the permissions we ever need.
1225 */
1226 public static Policy permissivePolicy() {
1227 return new AdjustablePolicy
1228 // Permissions j.u.c. needs directly
1229 (new RuntimePermission("modifyThread"),
1230 new RuntimePermission("getClassLoader"),
1231 new RuntimePermission("setContextClassLoader"),
1232 // Permissions needed to change permissions!
1233 new SecurityPermission("getPolicy"),
1234 new SecurityPermission("setPolicy"),
1235 new RuntimePermission("setSecurityManager"),
1236 // Permissions needed by the junit test harness
1237 new RuntimePermission("accessDeclaredMembers"),
1238 new PropertyPermission("*", "read"),
1239 new java.io.FilePermission("<<ALL FILES>>", "read"));
1240 }
1241
1242 /**
1243 * Sleeps until the given time has elapsed.
1244 * Throws AssertionFailedError if interrupted.
1245 */
1246 static void sleep(long millis) {
1247 try {
1248 delay(millis);
1249 } catch (InterruptedException fail) {
1250 AssertionFailedError afe =
1251 new AssertionFailedError("Unexpected InterruptedException");
1252 afe.initCause(fail);
1253 throw afe;
1254 }
1255 }
1256
1257 /**
1258 * Spin-waits up to the specified number of milliseconds for the given
1259 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1260 */
1261 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1262 long startTime = 0L;
1263 for (;;) {
1264 Thread.State s = thread.getState();
1265 if (s == Thread.State.BLOCKED ||
1266 s == Thread.State.WAITING ||
1267 s == Thread.State.TIMED_WAITING)
1268 return;
1269 else if (s == Thread.State.TERMINATED)
1270 fail("Unexpected thread termination");
1271 else if (startTime == 0L)
1272 startTime = System.nanoTime();
1273 else if (millisElapsedSince(startTime) > timeoutMillis) {
1274 threadAssertTrue(thread.isAlive());
1275 return;
1276 }
1277 Thread.yield();
1278 }
1279 }
1280
1281 /**
1282 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1283 * state: BLOCKED, WAITING, or TIMED_WAITING.
1284 */
1285 void waitForThreadToEnterWaitState(Thread thread) {
1286 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1287 }
1288
1289 /**
1290 * Returns the number of milliseconds since time given by
1291 * startNanoTime, which must have been previously returned from a
1292 * call to {@link System#nanoTime()}.
1293 */
1294 static long millisElapsedSince(long startNanoTime) {
1295 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1296 }
1297
1298 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1299 // long startTime = System.nanoTime();
1300 // try {
1301 // r.run();
1302 // } catch (Throwable fail) { threadUnexpectedException(fail); }
1303 // if (millisElapsedSince(startTime) > timeoutMillis/2)
1304 // throw new AssertionFailedError("did not return promptly");
1305 // }
1306
1307 // void assertTerminatesPromptly(Runnable r) {
1308 // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1309 // }
1310
1311 /**
1312 * Checks that timed f.get() returns the expected value, and does not
1313 * wait for the timeout to elapse before returning.
1314 */
1315 <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1316 long startTime = System.nanoTime();
1317 try {
1318 assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1319 } catch (Throwable fail) { threadUnexpectedException(fail); }
1320 if (millisElapsedSince(startTime) > timeoutMillis/2)
1321 throw new AssertionFailedError("timed get did not return promptly");
1322 }
1323
1324 <T> void checkTimedGet(Future<T> f, T expectedValue) {
1325 checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1326 }
1327
1328 /**
1329 * Returns a new started daemon Thread running the given runnable.
1330 */
1331 Thread newStartedThread(Runnable runnable) {
1332 Thread t = new Thread(runnable);
1333 t.setDaemon(true);
1334 t.start();
1335 return t;
1336 }
1337
1338 /**
1339 * Waits for the specified time (in milliseconds) for the thread
1340 * to terminate (using {@link Thread#join(long)}), else interrupts
1341 * the thread (in the hope that it may terminate later) and fails.
1342 */
1343 void awaitTermination(Thread t, long timeoutMillis) {
1344 try {
1345 t.join(timeoutMillis);
1346 } catch (InterruptedException fail) {
1347 threadUnexpectedException(fail);
1348 } finally {
1349 if (t.getState() != Thread.State.TERMINATED) {
1350 t.interrupt();
1351 threadFail("timed out waiting for thread to terminate");
1352 }
1353 }
1354 }
1355
1356 /**
1357 * Waits for LONG_DELAY_MS milliseconds for the thread to
1358 * terminate (using {@link Thread#join(long)}), else interrupts
1359 * the thread (in the hope that it may terminate later) and fails.
1360 */
1361 void awaitTermination(Thread t) {
1362 awaitTermination(t, LONG_DELAY_MS);
1363 }
1364
1365 // Some convenient Runnable classes
1366
1367 public abstract class CheckedRunnable implements Runnable {
1368 protected abstract void realRun() throws Throwable;
1369
1370 public final void run() {
1371 try {
1372 realRun();
1373 } catch (Throwable fail) {
1374 threadUnexpectedException(fail);
1375 }
1376 }
1377 }
1378
1379 public abstract class RunnableShouldThrow implements Runnable {
1380 protected abstract void realRun() throws Throwable;
1381
1382 final Class<?> exceptionClass;
1383
1384 <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1385 this.exceptionClass = exceptionClass;
1386 }
1387
1388 public final void run() {
1389 try {
1390 realRun();
1391 threadShouldThrow(exceptionClass.getSimpleName());
1392 } catch (Throwable t) {
1393 if (! exceptionClass.isInstance(t))
1394 threadUnexpectedException(t);
1395 }
1396 }
1397 }
1398
1399 public abstract class ThreadShouldThrow extends Thread {
1400 protected abstract void realRun() throws Throwable;
1401
1402 final Class<?> exceptionClass;
1403
1404 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1405 this.exceptionClass = exceptionClass;
1406 }
1407
1408 public final void run() {
1409 try {
1410 realRun();
1411 threadShouldThrow(exceptionClass.getSimpleName());
1412 } catch (Throwable t) {
1413 if (! exceptionClass.isInstance(t))
1414 threadUnexpectedException(t);
1415 }
1416 }
1417 }
1418
1419 public abstract class CheckedInterruptedRunnable implements Runnable {
1420 protected abstract void realRun() throws Throwable;
1421
1422 public final void run() {
1423 try {
1424 realRun();
1425 threadShouldThrow("InterruptedException");
1426 } catch (InterruptedException success) {
1427 threadAssertFalse(Thread.interrupted());
1428 } catch (Throwable fail) {
1429 threadUnexpectedException(fail);
1430 }
1431 }
1432 }
1433
1434 public abstract class CheckedCallable<T> implements Callable<T> {
1435 protected abstract T realCall() throws Throwable;
1436
1437 public final T call() {
1438 try {
1439 return realCall();
1440 } catch (Throwable fail) {
1441 threadUnexpectedException(fail);
1442 return null;
1443 }
1444 }
1445 }
1446
1447 public abstract class CheckedInterruptedCallable<T>
1448 implements Callable<T> {
1449 protected abstract T realCall() throws Throwable;
1450
1451 public final T call() {
1452 try {
1453 T result = realCall();
1454 threadShouldThrow("InterruptedException");
1455 return result;
1456 } catch (InterruptedException success) {
1457 threadAssertFalse(Thread.interrupted());
1458 } catch (Throwable fail) {
1459 threadUnexpectedException(fail);
1460 }
1461 return null;
1462 }
1463 }
1464
1465 public static class NoOpRunnable implements Runnable {
1466 public void run() {}
1467 }
1468
1469 public static class NoOpCallable implements Callable {
1470 public Object call() { return Boolean.TRUE; }
1471 }
1472
1473 public static final String TEST_STRING = "a test string";
1474
1475 public static class StringTask implements Callable<String> {
1476 final String value;
1477 public StringTask() { this(TEST_STRING); }
1478 public StringTask(String value) { this.value = value; }
1479 public String call() { return value; }
1480 }
1481
1482 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1483 return new CheckedCallable<String>() {
1484 protected String realCall() {
1485 try {
1486 latch.await();
1487 } catch (InterruptedException quittingTime) {}
1488 return TEST_STRING;
1489 }};
1490 }
1491
1492 public Runnable countDowner(final CountDownLatch latch) {
1493 return new CheckedRunnable() {
1494 public void realRun() throws InterruptedException {
1495 latch.countDown();
1496 }};
1497 }
1498
1499 class LatchAwaiter extends CheckedRunnable {
1500 static final int NEW = 0;
1501 static final int RUNNING = 1;
1502 static final int DONE = 2;
1503 final CountDownLatch latch;
1504 int state = NEW;
1505 LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1506 public void realRun() throws InterruptedException {
1507 state = 1;
1508 await(latch);
1509 state = 2;
1510 }
1511 }
1512
1513 public LatchAwaiter awaiter(CountDownLatch latch) {
1514 return new LatchAwaiter(latch);
1515 }
1516
1517 public void await(CountDownLatch latch, long timeoutMillis) {
1518 try {
1519 if (!latch.await(timeoutMillis, MILLISECONDS))
1520 fail("timed out waiting for CountDownLatch for "
1521 + (timeoutMillis/1000) + " sec");
1522 } catch (Throwable fail) {
1523 threadUnexpectedException(fail);
1524 }
1525 }
1526
1527 public void await(CountDownLatch latch) {
1528 await(latch, LONG_DELAY_MS);
1529 }
1530
1531 public void await(Semaphore semaphore) {
1532 try {
1533 if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
1534 fail("timed out waiting for Semaphore for "
1535 + (LONG_DELAY_MS/1000) + " sec");
1536 } catch (Throwable fail) {
1537 threadUnexpectedException(fail);
1538 }
1539 }
1540
1541 // /**
1542 // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1543 // */
1544 // public void await(AtomicBoolean flag) {
1545 // await(flag, LONG_DELAY_MS);
1546 // }
1547
1548 // /**
1549 // * Spin-waits up to the specified timeout until flag becomes true.
1550 // */
1551 // public void await(AtomicBoolean flag, long timeoutMillis) {
1552 // long startTime = System.nanoTime();
1553 // while (!flag.get()) {
1554 // if (millisElapsedSince(startTime) > timeoutMillis)
1555 // throw new AssertionFailedError("timed out");
1556 // Thread.yield();
1557 // }
1558 // }
1559
1560 public static class NPETask implements Callable<String> {
1561 public String call() { throw new NullPointerException(); }
1562 }
1563
1564 public static class CallableOne implements Callable<Integer> {
1565 public Integer call() { return one; }
1566 }
1567
1568 public class ShortRunnable extends CheckedRunnable {
1569 protected void realRun() throws Throwable {
1570 delay(SHORT_DELAY_MS);
1571 }
1572 }
1573
1574 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1575 protected void realRun() throws InterruptedException {
1576 delay(SHORT_DELAY_MS);
1577 }
1578 }
1579
1580 public class SmallRunnable extends CheckedRunnable {
1581 protected void realRun() throws Throwable {
1582 delay(SMALL_DELAY_MS);
1583 }
1584 }
1585
1586 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1587 protected void realRun() {
1588 try {
1589 delay(SMALL_DELAY_MS);
1590 } catch (InterruptedException ok) {}
1591 }
1592 }
1593
1594 public class SmallCallable extends CheckedCallable {
1595 protected Object realCall() throws InterruptedException {
1596 delay(SMALL_DELAY_MS);
1597 return Boolean.TRUE;
1598 }
1599 }
1600
1601 public class MediumRunnable extends CheckedRunnable {
1602 protected void realRun() throws Throwable {
1603 delay(MEDIUM_DELAY_MS);
1604 }
1605 }
1606
1607 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1608 protected void realRun() throws InterruptedException {
1609 delay(MEDIUM_DELAY_MS);
1610 }
1611 }
1612
1613 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1614 return new CheckedRunnable() {
1615 protected void realRun() {
1616 try {
1617 delay(timeoutMillis);
1618 } catch (InterruptedException ok) {}
1619 }};
1620 }
1621
1622 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1623 protected void realRun() {
1624 try {
1625 delay(MEDIUM_DELAY_MS);
1626 } catch (InterruptedException ok) {}
1627 }
1628 }
1629
1630 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1631 protected void realRun() {
1632 try {
1633 delay(LONG_DELAY_MS);
1634 } catch (InterruptedException ok) {}
1635 }
1636 }
1637
1638 /**
1639 * For use as ThreadFactory in constructors
1640 */
1641 public static class SimpleThreadFactory implements ThreadFactory {
1642 public Thread newThread(Runnable r) {
1643 return new Thread(r);
1644 }
1645 }
1646
1647 public interface TrackedRunnable extends Runnable {
1648 boolean isDone();
1649 }
1650
1651 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1652 return new TrackedRunnable() {
1653 private volatile boolean done = false;
1654 public boolean isDone() { return done; }
1655 public void run() {
1656 try {
1657 delay(timeoutMillis);
1658 done = true;
1659 } catch (InterruptedException ok) {}
1660 }
1661 };
1662 }
1663
1664 public static class TrackedShortRunnable implements Runnable {
1665 public volatile boolean done = false;
1666 public void run() {
1667 try {
1668 delay(SHORT_DELAY_MS);
1669 done = true;
1670 } catch (InterruptedException ok) {}
1671 }
1672 }
1673
1674 public static class TrackedSmallRunnable implements Runnable {
1675 public volatile boolean done = false;
1676 public void run() {
1677 try {
1678 delay(SMALL_DELAY_MS);
1679 done = true;
1680 } catch (InterruptedException ok) {}
1681 }
1682 }
1683
1684 public static class TrackedMediumRunnable implements Runnable {
1685 public volatile boolean done = false;
1686 public void run() {
1687 try {
1688 delay(MEDIUM_DELAY_MS);
1689 done = true;
1690 } catch (InterruptedException ok) {}
1691 }
1692 }
1693
1694 public static class TrackedLongRunnable implements Runnable {
1695 public volatile boolean done = false;
1696 public void run() {
1697 try {
1698 delay(LONG_DELAY_MS);
1699 done = true;
1700 } catch (InterruptedException ok) {}
1701 }
1702 }
1703
1704 public static class TrackedNoOpRunnable implements Runnable {
1705 public volatile boolean done = false;
1706 public void run() {
1707 done = true;
1708 }
1709 }
1710
1711 public static class TrackedCallable implements Callable {
1712 public volatile boolean done = false;
1713 public Object call() {
1714 try {
1715 delay(SMALL_DELAY_MS);
1716 done = true;
1717 } catch (InterruptedException ok) {}
1718 return Boolean.TRUE;
1719 }
1720 }
1721
1722 /**
1723 * Analog of CheckedRunnable for RecursiveAction
1724 */
1725 public abstract class CheckedRecursiveAction extends RecursiveAction {
1726 protected abstract void realCompute() throws Throwable;
1727
1728 @Override protected final void compute() {
1729 try {
1730 realCompute();
1731 } catch (Throwable fail) {
1732 threadUnexpectedException(fail);
1733 }
1734 }
1735 }
1736
1737 /**
1738 * Analog of CheckedCallable for RecursiveTask
1739 */
1740 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1741 protected abstract T realCompute() throws Throwable;
1742
1743 @Override protected final T compute() {
1744 try {
1745 return realCompute();
1746 } catch (Throwable fail) {
1747 threadUnexpectedException(fail);
1748 return null;
1749 }
1750 }
1751 }
1752
1753 /**
1754 * For use as RejectedExecutionHandler in constructors
1755 */
1756 public static class NoOpREHandler implements RejectedExecutionHandler {
1757 public void rejectedExecution(Runnable r,
1758 ThreadPoolExecutor executor) {}
1759 }
1760
1761 /**
1762 * A CyclicBarrier that uses timed await and fails with
1763 * AssertionFailedErrors instead of throwing checked exceptions.
1764 */
1765 public static class CheckedBarrier extends CyclicBarrier {
1766 public CheckedBarrier(int parties) { super(parties); }
1767
1768 public int await() {
1769 try {
1770 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1771 } catch (TimeoutException timedOut) {
1772 throw new AssertionFailedError("timed out");
1773 } catch (Exception fail) {
1774 AssertionFailedError afe =
1775 new AssertionFailedError("Unexpected exception: " + fail);
1776 afe.initCause(fail);
1777 throw afe;
1778 }
1779 }
1780 }
1781
1782 void checkEmpty(BlockingQueue q) {
1783 try {
1784 assertTrue(q.isEmpty());
1785 assertEquals(0, q.size());
1786 assertNull(q.peek());
1787 assertNull(q.poll());
1788 assertNull(q.poll(0, MILLISECONDS));
1789 assertEquals(q.toString(), "[]");
1790 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1791 assertFalse(q.iterator().hasNext());
1792 try {
1793 q.element();
1794 shouldThrow();
1795 } catch (NoSuchElementException success) {}
1796 try {
1797 q.iterator().next();
1798 shouldThrow();
1799 } catch (NoSuchElementException success) {}
1800 try {
1801 q.remove();
1802 shouldThrow();
1803 } catch (NoSuchElementException success) {}
1804 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1805 }
1806
1807 void assertSerialEquals(Object x, Object y) {
1808 assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1809 }
1810
1811 void assertNotSerialEquals(Object x, Object y) {
1812 assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1813 }
1814
1815 byte[] serialBytes(Object o) {
1816 try {
1817 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1818 ObjectOutputStream oos = new ObjectOutputStream(bos);
1819 oos.writeObject(o);
1820 oos.flush();
1821 oos.close();
1822 return bos.toByteArray();
1823 } catch (Throwable fail) {
1824 threadUnexpectedException(fail);
1825 return new byte[0];
1826 }
1827 }
1828
1829 @SuppressWarnings("unchecked")
1830 <T> T serialClone(T o) {
1831 try {
1832 ObjectInputStream ois = new ObjectInputStream
1833 (new ByteArrayInputStream(serialBytes(o)));
1834 T clone = (T) ois.readObject();
1835 assertSame(o.getClass(), clone.getClass());
1836 return clone;
1837 } catch (Throwable fail) {
1838 threadUnexpectedException(fail);
1839 return null;
1840 }
1841 }
1842
1843 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1844 Runnable... throwingActions) {
1845 for (Runnable throwingAction : throwingActions) {
1846 boolean threw = false;
1847 try { throwingAction.run(); }
1848 catch (Throwable t) {
1849 threw = true;
1850 if (!expectedExceptionClass.isInstance(t)) {
1851 AssertionFailedError afe =
1852 new AssertionFailedError
1853 ("Expected " + expectedExceptionClass.getName() +
1854 ", got " + t.getClass().getName());
1855 afe.initCause(t);
1856 threadUnexpectedException(afe);
1857 }
1858 }
1859 if (!threw)
1860 shouldThrow(expectedExceptionClass.getName());
1861 }
1862 }
1863
1864 public void assertIteratorExhausted(Iterator<?> it) {
1865 try {
1866 it.next();
1867 shouldThrow();
1868 } catch (NoSuchElementException success) {}
1869 assertFalse(it.hasNext());
1870 }
1871
1872 public <T> Callable<T> callableThrowing(final Exception ex) {
1873 return new Callable<T>() { public T call() throws Exception { throw ex; }};
1874 }
1875
1876 public Runnable runnableThrowing(final RuntimeException ex) {
1877 return new Runnable() { public void run() { throw ex; }};
1878 }
1879
1880 /** A reusable thread pool to be shared by tests. */
1881 static final ExecutorService cachedThreadPool =
1882 new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1883 1000L, MILLISECONDS,
1884 new SynchronousQueue<Runnable>());
1885
1886 static <T> void shuffle(T[] array) {
1887 Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1888 }
1889 }