ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.9
Committed: Thu Dec 4 20:54:46 2003 UTC (20 years, 5 months ago) by dl
Branch: MAIN
CVS Tags: JSR166_DEC9_PRE_ES_SUBMIT, JSR166_DEC9_POST_ES_SUBMIT
Changes since 1.8: +0 -1 lines
Log Message:
Collapsed Cancellable and Future

File Contents

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