ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.212
Committed: Fri Dec 9 04:24:07 2016 UTC (7 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.211: +2 -1 lines
Log Message:
sync @modules ... :open from upstream for module refresh

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