ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.195
Committed: Sat Jun 4 23:49:29 2016 UTC (7 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.194: +11 -0 lines
Log Message:
Add ant target tck-security-manager to test tck with security manager

File Contents

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