Parent Directory
|
Revision Log
Revision 1.27 - (view) (download)
| 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 : | * http://creativecommons.org/licenses/publicdomain | ||
| 5 : | jsr166 | 1.27 | * Other contributors include Andrew Wright, Jeffrey Hayes, |
| 6 : | * Pat Fisher, Mike Judd. | ||
| 7 : | dl | 1.1 | */ |
| 8 : | |||
| 9 : | import junit.framework.*; | ||
| 10 : | import java.util.*; | ||
| 11 : | import java.util.concurrent.*; | ||
| 12 : | import java.io.*; | ||
| 13 : | dl | 1.7 | import java.security.*; |
| 14 : | dl | 1.1 | |
| 15 : | /** | ||
| 16 : | dl | 1.5 | * Base class for JSR166 Junit TCK tests. Defines some constants, |
| 17 : | * utility methods and classes, as well as a simple framework for | ||
| 18 : | * helping to make sure that assertions failing in generated threads | ||
| 19 : | * cause the associated test that generated them to itself fail (which | ||
| 20 : | jsr166 | 1.27 | * JUnit does not otherwise arrange). The rules for creating such |
| 21 : | dl | 1.5 | * tests are: |
| 22 : | dl | 1.1 | * |
| 23 : | * <ol> | ||
| 24 : | * | ||
| 25 : | * <li> All assertions in code running in generated threads must use | ||
| 26 : | jsr166 | 1.27 | * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link |
| 27 : | dl | 1.18 | * #threadAssertEquals}, or {@link #threadAssertNull}, (not |
| 28 : | dl | 1.1 | * <tt>fail</tt>, <tt>assertTrue</tt>, etc.) It is OK (but not |
| 29 : | * particularly recommended) for other code to use these forms too. | ||
| 30 : | * Only the most typically used JUnit assertion methods are defined | ||
| 31 : | * this way, but enough to live with.</li> | ||
| 32 : | * | ||
| 33 : | dl | 1.18 | * <li> If you override {@link #setUp} or {@link #tearDown}, make sure |
| 34 : | dl | 1.1 | * to invoke <tt>super.setUp</tt> and <tt>super.tearDown</tt> within |
| 35 : | * them. These methods are used to clear and check for thread | ||
| 36 : | * assertion failures.</li> | ||
| 37 : | * | ||
| 38 : | dl | 1.6 | * <li>All delays and timeouts must use one of the constants <tt> |
| 39 : | * SHORT_DELAY_MS</tt>, <tt> SMALL_DELAY_MS</tt>, <tt> MEDIUM_DELAY_MS</tt>, | ||
| 40 : | * <tt> LONG_DELAY_MS</tt>. The idea here is that a SHORT is always | ||
| 41 : | dl | 1.5 | * discriminable from zero time, and always allows enough time for the |
| 42 : | * small amounts of computation (creating a thread, calling a few | ||
| 43 : | dl | 1.1 | * methods, etc) needed to reach a timeout point. Similarly, a SMALL |
| 44 : | * is always discriminable as larger than SHORT and smaller than | ||
| 45 : | * MEDIUM. And so on. These constants are set to conservative values, | ||
| 46 : | dl | 1.2 | * but even so, if there is ever any doubt, they can all be increased |
| 47 : | jsr166 | 1.27 | * in one spot to rerun tests on slower platforms.</li> |
| 48 : | dl | 1.1 | * |
| 49 : | * <li> All threads generated must be joined inside each test case | ||
| 50 : | * method (or <tt>fail</tt> to do so) before returning from the | ||
| 51 : | dl | 1.6 | * method. The <tt> joinPool</tt> method can be used to do this when |
| 52 : | dl | 1.1 | * using Executors.</li> |
| 53 : | * | ||
| 54 : | * </ol> | ||
| 55 : | dl | 1.6 | * |
| 56 : | * <p> <b>Other notes</b> | ||
| 57 : | * <ul> | ||
| 58 : | * | ||
| 59 : | * <li> Usually, there is one testcase method per JSR166 method | ||
| 60 : | * covering "normal" operation, and then as many exception-testing | ||
| 61 : | * methods as there are exceptions the method can throw. Sometimes | ||
| 62 : | * there are multiple tests per JSR166 method when the different | ||
| 63 : | * "normal" behaviors differ significantly. And sometimes testcases | ||
| 64 : | * cover multiple methods when they cannot be tested in | ||
| 65 : | * isolation.</li> | ||
| 66 : | jsr166 | 1.27 | * |
| 67 : | dl | 1.6 | * <li> The documentation style for testcases is to provide as javadoc |
| 68 : | * a simple sentence or two describing the property that the testcase | ||
| 69 : | * method purports to test. The javadocs do not say anything about how | ||
| 70 : | * the property is tested. To find out, read the code.</li> | ||
| 71 : | * | ||
| 72 : | * <li> These tests are "conformance tests", and do not attempt to | ||
| 73 : | * test throughput, latency, scalability or other performance factors | ||
| 74 : | * (see the separate "jtreg" tests for a set intended to check these | ||
| 75 : | * for the most central aspects of functionality.) So, most tests use | ||
| 76 : | * the smallest sensible numbers of threads, collection sizes, etc | ||
| 77 : | * needed to check basic conformance.</li> | ||
| 78 : | * | ||
| 79 : | * <li>The test classes currently do not declare inclusion in | ||
| 80 : | * any particular package to simplify things for people integrating | ||
| 81 : | * them in TCK test suites.</li> | ||
| 82 : | * | ||
| 83 : | * <li> As a convenience, the <tt>main</tt> of this class (JSR166TestCase) | ||
| 84 : | * runs all JSR166 unit tests.</li> | ||
| 85 : | * | ||
| 86 : | * </ul> | ||
| 87 : | dl | 1.1 | */ |
| 88 : | public class JSR166TestCase extends TestCase { | ||
| 89 : | dl | 1.6 | /** |
| 90 : | * Runs all JSR166 unit tests using junit.textui.TestRunner | ||
| 91 : | jsr166 | 1.27 | */ |
| 92 : | dl | 1.6 | public static void main (String[] args) { |
| 93 : | dl | 1.16 | int iters = 1; |
| 94 : | jsr166 | 1.27 | if (args.length > 0) |
| 95 : | dl | 1.16 | iters = Integer.parseInt(args[0]); |
| 96 : | Test s = suite(); | ||
| 97 : | dl | 1.22 | for (int i = 0; i < iters; ++i) { |
| 98 : | dl | 1.16 | junit.textui.TestRunner.run (s); |
| 99 : | dl | 1.22 | System.gc(); |
| 100 : | System.runFinalization(); | ||
| 101 : | } | ||
| 102 : | System.exit(0); | ||
| 103 : | dl | 1.6 | } |
| 104 : | |||
| 105 : | /** | ||
| 106 : | * Collects all JSR166 unit tests as one suite | ||
| 107 : | jsr166 | 1.27 | */ |
| 108 : | dl | 1.6 | public static Test suite ( ) { |
| 109 : | TestSuite suite = new TestSuite("JSR166 Unit Tests"); | ||
| 110 : | jsr166 | 1.27 | |
| 111 : | dl | 1.10 | suite.addTest(new TestSuite(AbstractExecutorServiceTest.class)); |
| 112 : | dl | 1.19 | suite.addTest(new TestSuite(AbstractQueueTest.class)); |
| 113 : | dl | 1.14 | suite.addTest(new TestSuite(AbstractQueuedSynchronizerTest.class)); |
| 114 : | dl | 1.25 | suite.addTest(new TestSuite(AbstractQueuedLongSynchronizerTest.class)); |
| 115 : | dl | 1.6 | suite.addTest(new TestSuite(ArrayBlockingQueueTest.class)); |
| 116 : | dl | 1.23 | suite.addTest(new TestSuite(ArrayDequeTest.class)); |
| 117 : | jsr166 | 1.27 | suite.addTest(new TestSuite(AtomicBooleanTest.class)); |
| 118 : | suite.addTest(new TestSuite(AtomicIntegerArrayTest.class)); | ||
| 119 : | suite.addTest(new TestSuite(AtomicIntegerFieldUpdaterTest.class)); | ||
| 120 : | suite.addTest(new TestSuite(AtomicIntegerTest.class)); | ||
| 121 : | suite.addTest(new TestSuite(AtomicLongArrayTest.class)); | ||
| 122 : | suite.addTest(new TestSuite(AtomicLongFieldUpdaterTest.class)); | ||
| 123 : | suite.addTest(new TestSuite(AtomicLongTest.class)); | ||
| 124 : | suite.addTest(new TestSuite(AtomicMarkableReferenceTest.class)); | ||
| 125 : | suite.addTest(new TestSuite(AtomicReferenceArrayTest.class)); | ||
| 126 : | suite.addTest(new TestSuite(AtomicReferenceFieldUpdaterTest.class)); | ||
| 127 : | suite.addTest(new TestSuite(AtomicReferenceTest.class)); | ||
| 128 : | suite.addTest(new TestSuite(AtomicStampedReferenceTest.class)); | ||
| 129 : | dl | 1.6 | suite.addTest(new TestSuite(ConcurrentHashMapTest.class)); |
| 130 : | suite.addTest(new TestSuite(ConcurrentLinkedQueueTest.class)); | ||
| 131 : | dl | 1.23 | suite.addTest(new TestSuite(ConcurrentSkipListMapTest.class)); |
| 132 : | suite.addTest(new TestSuite(ConcurrentSkipListSubMapTest.class)); | ||
| 133 : | suite.addTest(new TestSuite(ConcurrentSkipListSetTest.class)); | ||
| 134 : | suite.addTest(new TestSuite(ConcurrentSkipListSubSetTest.class)); | ||
| 135 : | dl | 1.6 | suite.addTest(new TestSuite(CopyOnWriteArrayListTest.class)); |
| 136 : | suite.addTest(new TestSuite(CopyOnWriteArraySetTest.class)); | ||
| 137 : | suite.addTest(new TestSuite(CountDownLatchTest.class)); | ||
| 138 : | suite.addTest(new TestSuite(CyclicBarrierTest.class)); | ||
| 139 : | suite.addTest(new TestSuite(DelayQueueTest.class)); | ||
| 140 : | suite.addTest(new TestSuite(ExchangerTest.class)); | ||
| 141 : | suite.addTest(new TestSuite(ExecutorsTest.class)); | ||
| 142 : | dl | 1.11 | suite.addTest(new TestSuite(ExecutorCompletionServiceTest.class)); |
| 143 : | dl | 1.6 | suite.addTest(new TestSuite(FutureTaskTest.class)); |
| 144 : | dl | 1.23 | suite.addTest(new TestSuite(LinkedBlockingDequeTest.class)); |
| 145 : | dl | 1.6 | suite.addTest(new TestSuite(LinkedBlockingQueueTest.class)); |
| 146 : | suite.addTest(new TestSuite(LinkedListTest.class)); | ||
| 147 : | suite.addTest(new TestSuite(LockSupportTest.class)); | ||
| 148 : | suite.addTest(new TestSuite(PriorityBlockingQueueTest.class)); | ||
| 149 : | suite.addTest(new TestSuite(PriorityQueueTest.class)); | ||
| 150 : | suite.addTest(new TestSuite(ReentrantLockTest.class)); | ||
| 151 : | suite.addTest(new TestSuite(ReentrantReadWriteLockTest.class)); | ||
| 152 : | suite.addTest(new TestSuite(ScheduledExecutorTest.class)); | ||
| 153 : | suite.addTest(new TestSuite(SemaphoreTest.class)); | ||
| 154 : | suite.addTest(new TestSuite(SynchronousQueueTest.class)); | ||
| 155 : | suite.addTest(new TestSuite(SystemTest.class)); | ||
| 156 : | suite.addTest(new TestSuite(ThreadLocalTest.class)); | ||
| 157 : | suite.addTest(new TestSuite(ThreadPoolExecutorTest.class)); | ||
| 158 : | suite.addTest(new TestSuite(ThreadTest.class)); | ||
| 159 : | dl | 1.24 | suite.addTest(new TestSuite(TimeUnitTest.class)); |
| 160 : | dl | 1.23 | suite.addTest(new TestSuite(TreeMapTest.class)); |
| 161 : | suite.addTest(new TestSuite(TreeSetTest.class)); | ||
| 162 : | dl | 1.26 | suite.addTest(new TestSuite(TreeSubMapTest.class)); |
| 163 : | suite.addTest(new TestSuite(TreeSubSetTest.class)); | ||
| 164 : | jsr166 | 1.27 | |
| 165 : | dl | 1.6 | return suite; |
| 166 : | } | ||
| 167 : | |||
| 168 : | dl | 1.1 | |
| 169 : | dl | 1.2 | public static long SHORT_DELAY_MS; |
| 170 : | public static long SMALL_DELAY_MS; | ||
| 171 : | public static long MEDIUM_DELAY_MS; | ||
| 172 : | public static long LONG_DELAY_MS; | ||
| 173 : | |||
| 174 : | |||
| 175 : | /** | ||
| 176 : | jsr166 | 1.27 | * Returns the shortest timed delay. This could |
| 177 : | dl | 1.15 | * be reimplemented to use for example a Property. |
| 178 : | jsr166 | 1.27 | */ |
| 179 : | dl | 1.2 | protected long getShortDelay() { |
| 180 : | dl | 1.21 | return 50; |
| 181 : | dl | 1.2 | } |
| 182 : | |||
| 183 : | |||
| 184 : | /** | ||
| 185 : | jsr166 | 1.27 | * Sets delays as multiples of SHORT_DELAY. |
| 186 : | dl | 1.2 | */ |
| 187 : | protected void setDelays() { | ||
| 188 : | SHORT_DELAY_MS = getShortDelay(); | ||
| 189 : | SMALL_DELAY_MS = SHORT_DELAY_MS * 5; | ||
| 190 : | MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10; | ||
| 191 : | LONG_DELAY_MS = SHORT_DELAY_MS * 50; | ||
| 192 : | } | ||
| 193 : | |||
| 194 : | dl | 1.1 | /** |
| 195 : | * Flag set true if any threadAssert methods fail | ||
| 196 : | */ | ||
| 197 : | dl | 1.5 | volatile boolean threadFailed; |
| 198 : | dl | 1.1 | |
| 199 : | /** | ||
| 200 : | jsr166 | 1.27 | * Initializes test to indicate that no thread assertions have failed |
| 201 : | dl | 1.1 | */ |
| 202 : | jsr166 | 1.27 | public void setUp() { |
| 203 : | dl | 1.2 | setDelays(); |
| 204 : | jsr166 | 1.27 | threadFailed = false; |
| 205 : | dl | 1.1 | } |
| 206 : | |||
| 207 : | /** | ||
| 208 : | jsr166 | 1.27 | * Triggers test case failure if any thread assertions have failed |
| 209 : | dl | 1.1 | */ |
| 210 : | jsr166 | 1.27 | public void tearDown() { |
| 211 : | assertFalse(threadFailed); | ||
| 212 : | dl | 1.1 | } |
| 213 : | |||
| 214 : | dl | 1.5 | /** |
| 215 : | * Fail, also setting status to indicate current testcase should fail | ||
| 216 : | jsr166 | 1.27 | */ |
| 217 : | dl | 1.1 | public void threadFail(String reason) { |
| 218 : | threadFailed = true; | ||
| 219 : | fail(reason); | ||
| 220 : | } | ||
| 221 : | |||
| 222 : | dl | 1.5 | /** |
| 223 : | * If expression not true, set status to indicate current testcase | ||
| 224 : | * should fail | ||
| 225 : | jsr166 | 1.27 | */ |
| 226 : | dl | 1.1 | public void threadAssertTrue(boolean b) { |
| 227 : | if (!b) { | ||
| 228 : | threadFailed = true; | ||
| 229 : | assertTrue(b); | ||
| 230 : | } | ||
| 231 : | } | ||
| 232 : | dl | 1.5 | |
| 233 : | /** | ||
| 234 : | * If expression not false, set status to indicate current testcase | ||
| 235 : | * should fail | ||
| 236 : | jsr166 | 1.27 | */ |
| 237 : | dl | 1.1 | public void threadAssertFalse(boolean b) { |
| 238 : | if (b) { | ||
| 239 : | threadFailed = true; | ||
| 240 : | assertFalse(b); | ||
| 241 : | } | ||
| 242 : | } | ||
| 243 : | dl | 1.5 | |
| 244 : | /** | ||
| 245 : | * If argument not null, set status to indicate current testcase | ||
| 246 : | * should fail | ||
| 247 : | jsr166 | 1.27 | */ |
| 248 : | dl | 1.1 | public void threadAssertNull(Object x) { |
| 249 : | if (x != null) { | ||
| 250 : | threadFailed = true; | ||
| 251 : | assertNull(x); | ||
| 252 : | } | ||
| 253 : | } | ||
| 254 : | dl | 1.5 | |
| 255 : | /** | ||
| 256 : | * If arguments not equal, set status to indicate current testcase | ||
| 257 : | * should fail | ||
| 258 : | jsr166 | 1.27 | */ |
| 259 : | dl | 1.1 | public void threadAssertEquals(long x, long y) { |
| 260 : | if (x != y) { | ||
| 261 : | threadFailed = true; | ||
| 262 : | assertEquals(x, y); | ||
| 263 : | } | ||
| 264 : | } | ||
| 265 : | dl | 1.5 | |
| 266 : | /** | ||
| 267 : | * If arguments not equal, set status to indicate current testcase | ||
| 268 : | * should fail | ||
| 269 : | jsr166 | 1.27 | */ |
| 270 : | dl | 1.1 | public void threadAssertEquals(Object x, Object y) { |
| 271 : | if (x != y && (x == null || !x.equals(y))) { | ||
| 272 : | threadFailed = true; | ||
| 273 : | assertEquals(x, y); | ||
| 274 : | } | ||
| 275 : | } | ||
| 276 : | |||
| 277 : | dl | 1.5 | /** |
| 278 : | * threadFail with message "should throw exception" | ||
| 279 : | jsr166 | 1.27 | */ |
| 280 : | dl | 1.3 | public void threadShouldThrow() { |
| 281 : | threadFailed = true; | ||
| 282 : | fail("should throw exception"); | ||
| 283 : | } | ||
| 284 : | |||
| 285 : | dl | 1.5 | /** |
| 286 : | * threadFail with message "Unexpected exception" | ||
| 287 : | */ | ||
| 288 : | dl | 1.3 | public void threadUnexpectedException() { |
| 289 : | threadFailed = true; | ||
| 290 : | fail("Unexpected exception"); | ||
| 291 : | } | ||
| 292 : | |||
| 293 : | |||
| 294 : | dl | 1.1 | /** |
| 295 : | * Wait out termination of a thread pool or fail doing so | ||
| 296 : | */ | ||
| 297 : | public void joinPool(ExecutorService exec) { | ||
| 298 : | try { | ||
| 299 : | exec.shutdown(); | ||
| 300 : | assertTrue(exec.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS)); | ||
| 301 : | dl | 1.22 | } catch(SecurityException ok) { |
| 302 : | // Allowed in case test doesn't have privs | ||
| 303 : | dl | 1.1 | } catch(InterruptedException ie) { |
| 304 : | dl | 1.3 | fail("Unexpected exception"); |
| 305 : | dl | 1.1 | } |
| 306 : | } | ||
| 307 : | |||
| 308 : | dl | 1.5 | |
| 309 : | /** | ||
| 310 : | * fail with message "should throw exception" | ||
| 311 : | jsr166 | 1.27 | */ |
| 312 : | dl | 1.3 | public void shouldThrow() { |
| 313 : | fail("Should throw exception"); | ||
| 314 : | } | ||
| 315 : | |||
| 316 : | dl | 1.5 | /** |
| 317 : | * fail with message "Unexpected exception" | ||
| 318 : | */ | ||
| 319 : | dl | 1.3 | public void unexpectedException() { |
| 320 : | fail("Unexpected exception"); | ||
| 321 : | } | ||
| 322 : | dl | 1.1 | |
| 323 : | |||
| 324 : | /** | ||
| 325 : | * The number of elements to place in collections, arrays, etc. | ||
| 326 : | */ | ||
| 327 : | dl | 1.5 | static final int SIZE = 20; |
| 328 : | dl | 1.1 | |
| 329 : | // Some convenient Integer constants | ||
| 330 : | |||
| 331 : | dl | 1.5 | static final Integer zero = new Integer(0); |
| 332 : | static final Integer one = new Integer(1); | ||
| 333 : | static final Integer two = new Integer(2); | ||
| 334 : | static final Integer three = new Integer(3); | ||
| 335 : | static final Integer four = new Integer(4); | ||
| 336 : | static final Integer five = new Integer(5); | ||
| 337 : | static final Integer six = new Integer(6); | ||
| 338 : | static final Integer seven = new Integer(7); | ||
| 339 : | static final Integer eight = new Integer(8); | ||
| 340 : | static final Integer nine = new Integer(9); | ||
| 341 : | static final Integer m1 = new Integer(-1); | ||
| 342 : | static final Integer m2 = new Integer(-2); | ||
| 343 : | static final Integer m3 = new Integer(-3); | ||
| 344 : | static final Integer m4 = new Integer(-4); | ||
| 345 : | static final Integer m5 = new Integer(-5); | ||
| 346 : | static final Integer m10 = new Integer(-10); | ||
| 347 : | dl | 1.7 | |
| 348 : | |||
| 349 : | /** | ||
| 350 : | * A security policy where new permissions can be dynamically added | ||
| 351 : | * or all cleared. | ||
| 352 : | */ | ||
| 353 : | static class AdjustablePolicy extends java.security.Policy { | ||
| 354 : | Permissions perms = new Permissions(); | ||
| 355 : | AdjustablePolicy() { } | ||
| 356 : | void addPermission(Permission perm) { perms.add(perm); } | ||
| 357 : | void clearPermissions() { perms = new Permissions(); } | ||
| 358 : | public PermissionCollection getPermissions(CodeSource cs) { | ||
| 359 : | return perms; | ||
| 360 : | } | ||
| 361 : | public PermissionCollection getPermissions(ProtectionDomain pd) { | ||
| 362 : | return perms; | ||
| 363 : | } | ||
| 364 : | public boolean implies(ProtectionDomain pd, Permission p) { | ||
| 365 : | return perms.implies(p); | ||
| 366 : | } | ||
| 367 : | public void refresh() {} | ||
| 368 : | } | ||
| 369 : | dl | 1.1 | |
| 370 : | |||
| 371 : | // Some convenient Runnable classes | ||
| 372 : | |||
| 373 : | dl | 1.5 | static class NoOpRunnable implements Runnable { |
| 374 : | dl | 1.1 | public void run() {} |
| 375 : | } | ||
| 376 : | |||
| 377 : | dl | 1.5 | static class NoOpCallable implements Callable { |
| 378 : | dl | 1.1 | public Object call() { return Boolean.TRUE; } |
| 379 : | dl | 1.10 | } |
| 380 : | |||
| 381 : | static final String TEST_STRING = "a test string"; | ||
| 382 : | |||
| 383 : | static class StringTask implements Callable<String> { | ||
| 384 : | public String call() { return TEST_STRING; } | ||
| 385 : | } | ||
| 386 : | |||
| 387 : | static class NPETask implements Callable<String> { | ||
| 388 : | public String call() { throw new NullPointerException(); } | ||
| 389 : | } | ||
| 390 : | |||
| 391 : | static class CallableOne implements Callable<Integer> { | ||
| 392 : | public Integer call() { return one; } | ||
| 393 : | dl | 1.1 | } |
| 394 : | |||
| 395 : | dl | 1.5 | class ShortRunnable implements Runnable { |
| 396 : | dl | 1.1 | public void run() { |
| 397 : | try { | ||
| 398 : | Thread.sleep(SHORT_DELAY_MS); | ||
| 399 : | } | ||
| 400 : | catch(Exception e) { | ||
| 401 : | dl | 1.3 | threadUnexpectedException(); |
| 402 : | dl | 1.1 | } |
| 403 : | } | ||
| 404 : | } | ||
| 405 : | |||
| 406 : | dl | 1.5 | class ShortInterruptedRunnable implements Runnable { |
| 407 : | dl | 1.1 | public void run() { |
| 408 : | try { | ||
| 409 : | Thread.sleep(SHORT_DELAY_MS); | ||
| 410 : | dl | 1.3 | threadShouldThrow(); |
| 411 : | dl | 1.1 | } |
| 412 : | catch(InterruptedException success) { | ||
| 413 : | } | ||
| 414 : | } | ||
| 415 : | } | ||
| 416 : | |||
| 417 : | dl | 1.5 | class SmallRunnable implements Runnable { |
| 418 : | dl | 1.1 | public void run() { |
| 419 : | try { | ||
| 420 : | Thread.sleep(SMALL_DELAY_MS); | ||
| 421 : | } | ||
| 422 : | catch(Exception e) { | ||
| 423 : | dl | 1.3 | threadUnexpectedException(); |
| 424 : | dl | 1.1 | } |
| 425 : | } | ||
| 426 : | } | ||
| 427 : | |||
| 428 : | dl | 1.6 | class SmallPossiblyInterruptedRunnable implements Runnable { |
| 429 : | public void run() { | ||
| 430 : | try { | ||
| 431 : | Thread.sleep(SMALL_DELAY_MS); | ||
| 432 : | } | ||
| 433 : | catch(Exception e) { | ||
| 434 : | } | ||
| 435 : | } | ||
| 436 : | } | ||
| 437 : | |||
| 438 : | dl | 1.5 | class SmallCallable implements Callable { |
| 439 : | dl | 1.1 | public Object call() { |
| 440 : | try { | ||
| 441 : | Thread.sleep(SMALL_DELAY_MS); | ||
| 442 : | } | ||
| 443 : | catch(Exception e) { | ||
| 444 : | dl | 1.3 | threadUnexpectedException(); |
| 445 : | dl | 1.1 | } |
| 446 : | return Boolean.TRUE; | ||
| 447 : | } | ||
| 448 : | } | ||
| 449 : | |||
| 450 : | dl | 1.5 | class SmallInterruptedRunnable implements Runnable { |
| 451 : | dl | 1.1 | public void run() { |
| 452 : | try { | ||
| 453 : | Thread.sleep(SMALL_DELAY_MS); | ||
| 454 : | dl | 1.3 | threadShouldThrow(); |
| 455 : | dl | 1.1 | } |
| 456 : | catch(InterruptedException success) { | ||
| 457 : | } | ||
| 458 : | } | ||
| 459 : | } | ||
| 460 : | |||
| 461 : | |||
| 462 : | dl | 1.5 | class MediumRunnable implements Runnable { |
| 463 : | dl | 1.1 | public void run() { |
| 464 : | try { | ||
| 465 : | Thread.sleep(MEDIUM_DELAY_MS); | ||
| 466 : | } | ||
| 467 : | catch(Exception e) { | ||
| 468 : | dl | 1.3 | threadUnexpectedException(); |
| 469 : | dl | 1.1 | } |
| 470 : | } | ||
| 471 : | } | ||
| 472 : | |||
| 473 : | dl | 1.5 | class MediumInterruptedRunnable implements Runnable { |
| 474 : | dl | 1.1 | public void run() { |
| 475 : | try { | ||
| 476 : | Thread.sleep(MEDIUM_DELAY_MS); | ||
| 477 : | dl | 1.3 | threadShouldThrow(); |
| 478 : | dl | 1.1 | } |
| 479 : | catch(InterruptedException success) { | ||
| 480 : | } | ||
| 481 : | } | ||
| 482 : | } | ||
| 483 : | |||
| 484 : | dl | 1.5 | class MediumPossiblyInterruptedRunnable implements Runnable { |
| 485 : | dl | 1.1 | public void run() { |
| 486 : | try { | ||
| 487 : | Thread.sleep(MEDIUM_DELAY_MS); | ||
| 488 : | } | ||
| 489 : | catch(InterruptedException success) { | ||
| 490 : | } | ||
| 491 : | } | ||
| 492 : | } | ||
| 493 : | dl | 1.5 | |
| 494 : | dl | 1.12 | class LongPossiblyInterruptedRunnable implements Runnable { |
| 495 : | public void run() { | ||
| 496 : | try { | ||
| 497 : | Thread.sleep(LONG_DELAY_MS); | ||
| 498 : | } | ||
| 499 : | catch(InterruptedException success) { | ||
| 500 : | } | ||
| 501 : | } | ||
| 502 : | } | ||
| 503 : | |||
| 504 : | dl | 1.5 | /** |
| 505 : | * For use as ThreadFactory in constructors | ||
| 506 : | */ | ||
| 507 : | static class SimpleThreadFactory implements ThreadFactory{ | ||
| 508 : | public Thread newThread(Runnable r){ | ||
| 509 : | return new Thread(r); | ||
| 510 : | jsr166 | 1.27 | } |
| 511 : | dl | 1.5 | } |
| 512 : | |||
| 513 : | dl | 1.6 | static class TrackedShortRunnable implements Runnable { |
| 514 : | dl | 1.5 | volatile boolean done = false; |
| 515 : | public void run() { | ||
| 516 : | try { | ||
| 517 : | Thread.sleep(SMALL_DELAY_MS); | ||
| 518 : | done = true; | ||
| 519 : | } catch(Exception e){ | ||
| 520 : | } | ||
| 521 : | dl | 1.6 | } |
| 522 : | } | ||
| 523 : | |||
| 524 : | static class TrackedMediumRunnable implements Runnable { | ||
| 525 : | volatile boolean done = false; | ||
| 526 : | public void run() { | ||
| 527 : | try { | ||
| 528 : | Thread.sleep(MEDIUM_DELAY_MS); | ||
| 529 : | done = true; | ||
| 530 : | } catch(Exception e){ | ||
| 531 : | } | ||
| 532 : | } | ||
| 533 : | } | ||
| 534 : | |||
| 535 : | static class TrackedLongRunnable implements Runnable { | ||
| 536 : | volatile boolean done = false; | ||
| 537 : | public void run() { | ||
| 538 : | try { | ||
| 539 : | Thread.sleep(LONG_DELAY_MS); | ||
| 540 : | done = true; | ||
| 541 : | } catch(Exception e){ | ||
| 542 : | } | ||
| 543 : | } | ||
| 544 : | } | ||
| 545 : | |||
| 546 : | static class TrackedNoOpRunnable implements Runnable { | ||
| 547 : | volatile boolean done = false; | ||
| 548 : | public void run() { | ||
| 549 : | done = true; | ||
| 550 : | dl | 1.5 | } |
| 551 : | } | ||
| 552 : | |||
| 553 : | static class TrackedCallable implements Callable { | ||
| 554 : | volatile boolean done = false; | ||
| 555 : | public Object call() { | ||
| 556 : | try { | ||
| 557 : | Thread.sleep(SMALL_DELAY_MS); | ||
| 558 : | done = true; | ||
| 559 : | } catch(Exception e){ | ||
| 560 : | } | ||
| 561 : | return Boolean.TRUE; | ||
| 562 : | } | ||
| 563 : | } | ||
| 564 : | dl | 1.14 | |
| 565 : | dl | 1.5 | |
| 566 : | /** | ||
| 567 : | * For use as RejectedExecutionHandler in constructors | ||
| 568 : | */ | ||
| 569 : | static class NoOpREHandler implements RejectedExecutionHandler{ | ||
| 570 : | jsr166 | 1.27 | public void rejectedExecution(Runnable r, ThreadPoolExecutor executor){} |
| 571 : | dl | 1.5 | } |
| 572 : | jsr166 | 1.27 | |
| 573 : | |||
| 574 : | dl | 1.1 | } |
| Doug Lea | ViewVC Help |
| Powered by ViewVC 1.0.8 |