ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.204
Committed: Sat Oct 15 18:51:12 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.203: +2 -1 lines
Log Message:
fix 4jdk7-tck target by segregating jdk8+ tests

File Contents

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