ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.200
Committed: Wed Aug 10 01:28:14 2016 UTC (7 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.199: +5 -0 lines
Log Message:
introduce shuffle(T[]) utility method

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