ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.222
Committed: Fri May 12 18:12:51 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.221: +6 -0 lines
Log Message:
introduce MAX_SPURIOUS_WAKEUPS

File Contents

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