ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.198
Committed: Wed Jul 27 17:16:23 2016 UTC (7 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.197: +1 -0 lines
Log Message:
also test common pool parallelism of 1 and secureRandomSeed=true

File Contents

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