ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.190
Committed: Sat Mar 26 06:58:47 2016 UTC (8 years, 1 month ago) by jsr166
Branch: MAIN
Changes since 1.189: +1 -0 lines
Log Message:
split ChronoUnit tests off into TimeUnit8Test, to fix ant target 4jdk7-tck

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