ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.6
Committed: Sun Oct 5 23:00:40 2003 UTC (20 years, 7 months ago) by dl
Branch: MAIN
Changes since 1.5: +133 -5 lines
Log Message:
Added tests and documentation

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
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(CancellableTaskTest.class));
115 suite.addTest(new TestSuite(ConcurrentHashMapTest.class));
116 suite.addTest(new TestSuite(ConcurrentLinkedQueueTest.class));
117 suite.addTest(new TestSuite(CopyOnWriteArrayListTest.class));
118 suite.addTest(new TestSuite(CopyOnWriteArraySetTest.class));
119 suite.addTest(new TestSuite(CountDownLatchTest.class));
120 suite.addTest(new TestSuite(CyclicBarrierTest.class));
121 suite.addTest(new TestSuite(DelayQueueTest.class));
122 suite.addTest(new TestSuite(ExchangerTest.class));
123 suite.addTest(new TestSuite(ExecutorsTest.class));
124 suite.addTest(new TestSuite(FairSemaphoreTest.class));
125 suite.addTest(new TestSuite(FutureTaskTest.class));
126 suite.addTest(new TestSuite(LinkedBlockingQueueTest.class));
127 suite.addTest(new TestSuite(LinkedListTest.class));
128 suite.addTest(new TestSuite(LockSupportTest.class));
129 suite.addTest(new TestSuite(PriorityBlockingQueueTest.class));
130 suite.addTest(new TestSuite(PriorityQueueTest.class));
131 suite.addTest(new TestSuite(ReentrantLockTest.class));
132 suite.addTest(new TestSuite(ReentrantReadWriteLockTest.class));
133 suite.addTest(new TestSuite(ScheduledExecutorTest.class));
134 suite.addTest(new TestSuite(SemaphoreTest.class));
135 suite.addTest(new TestSuite(SynchronousQueueTest.class));
136 suite.addTest(new TestSuite(SystemTest.class));
137 suite.addTest(new TestSuite(ThreadLocalTest.class));
138 suite.addTest(new TestSuite(ThreadPoolExecutorTest.class));
139 suite.addTest(new TestSuite(ThreadTest.class));
140 suite.addTest(new TestSuite(TimeUnitTest.class));
141
142 return suite;
143 }
144
145
146 public static long SHORT_DELAY_MS;
147 public static long SMALL_DELAY_MS;
148 public static long MEDIUM_DELAY_MS;
149 public static long LONG_DELAY_MS;
150
151
152 /**
153 * Return the shortest timed delay. This could
154 * be reimplmented to use for example a Property.
155 */
156 protected long getShortDelay() {
157 return 100;
158 }
159
160
161 /**
162 * Set delays as multiples of SHORT_DELAY.
163 */
164 protected void setDelays() {
165 SHORT_DELAY_MS = getShortDelay();
166 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
167 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
168 LONG_DELAY_MS = SHORT_DELAY_MS * 50;
169 }
170
171 /**
172 * Flag set true if any threadAssert methods fail
173 */
174 volatile boolean threadFailed;
175
176 /**
177 * Initialize test to indicate that no thread assertions have failed
178 */
179 public void setUp() {
180 setDelays();
181 threadFailed = false;
182 }
183
184 /**
185 * Trigger test case failure if any thread assertions have failed
186 */
187 public void tearDown() {
188 assertFalse(threadFailed);
189 }
190
191 /**
192 * Fail, also setting status to indicate current testcase should fail
193 */
194 public void threadFail(String reason) {
195 threadFailed = true;
196 fail(reason);
197 }
198
199 /**
200 * If expression not true, set status to indicate current testcase
201 * should fail
202 */
203 public void threadAssertTrue(boolean b) {
204 if (!b) {
205 threadFailed = true;
206 assertTrue(b);
207 }
208 }
209
210 /**
211 * If expression not false, set status to indicate current testcase
212 * should fail
213 */
214 public void threadAssertFalse(boolean b) {
215 if (b) {
216 threadFailed = true;
217 assertFalse(b);
218 }
219 }
220
221 /**
222 * If argument not null, set status to indicate current testcase
223 * should fail
224 */
225 public void threadAssertNull(Object x) {
226 if (x != null) {
227 threadFailed = true;
228 assertNull(x);
229 }
230 }
231
232 /**
233 * If arguments not equal, set status to indicate current testcase
234 * should fail
235 */
236 public void threadAssertEquals(long x, long y) {
237 if (x != y) {
238 threadFailed = true;
239 assertEquals(x, y);
240 }
241 }
242
243 /**
244 * If arguments not equal, set status to indicate current testcase
245 * should fail
246 */
247 public void threadAssertEquals(Object x, Object y) {
248 if (x != y && (x == null || !x.equals(y))) {
249 threadFailed = true;
250 assertEquals(x, y);
251 }
252 }
253
254 /**
255 * threadFail with message "should throw exception"
256 */
257 public void threadShouldThrow() {
258 threadFailed = true;
259 fail("should throw exception");
260 }
261
262 /**
263 * threadFail with message "Unexpected exception"
264 */
265 public void threadUnexpectedException() {
266 threadFailed = true;
267 fail("Unexpected exception");
268 }
269
270
271 /**
272 * Wait out termination of a thread pool or fail doing so
273 */
274 public void joinPool(ExecutorService exec) {
275 try {
276 exec.shutdown();
277 assertTrue(exec.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
278 } catch(InterruptedException ie) {
279 fail("Unexpected exception");
280 }
281 }
282
283
284 /**
285 * fail with message "should throw exception"
286 */
287 public void shouldThrow() {
288 fail("Should throw exception");
289 }
290
291 /**
292 * fail with message "Unexpected exception"
293 */
294 public void unexpectedException() {
295 fail("Unexpected exception");
296 }
297
298
299 /**
300 * The number of elements to place in collections, arrays, etc.
301 */
302 static final int SIZE = 20;
303
304 // Some convenient Integer constants
305
306 static final Integer zero = new Integer(0);
307 static final Integer one = new Integer(1);
308 static final Integer two = new Integer(2);
309 static final Integer three = new Integer(3);
310 static final Integer four = new Integer(4);
311 static final Integer five = new Integer(5);
312 static final Integer six = new Integer(6);
313 static final Integer seven = new Integer(7);
314 static final Integer eight = new Integer(8);
315 static final Integer nine = new Integer(9);
316 static final Integer m1 = new Integer(-1);
317 static final Integer m2 = new Integer(-2);
318 static final Integer m3 = new Integer(-3);
319 static final Integer m4 = new Integer(-4);
320 static final Integer m5 = new Integer(-5);
321 static final Integer m10 = new Integer(-10);
322
323
324 // Some convenient Runnable classes
325
326 static class NoOpRunnable implements Runnable {
327 public void run() {}
328 }
329
330 static class NoOpCallable implements Callable {
331 public Object call() { return Boolean.TRUE; }
332 }
333
334 class ShortRunnable implements Runnable {
335 public void run() {
336 try {
337 Thread.sleep(SHORT_DELAY_MS);
338 }
339 catch(Exception e) {
340 threadUnexpectedException();
341 }
342 }
343 }
344
345 class ShortInterruptedRunnable implements Runnable {
346 public void run() {
347 try {
348 Thread.sleep(SHORT_DELAY_MS);
349 threadShouldThrow();
350 }
351 catch(InterruptedException success) {
352 }
353 }
354 }
355
356 class SmallRunnable implements Runnable {
357 public void run() {
358 try {
359 Thread.sleep(SMALL_DELAY_MS);
360 }
361 catch(Exception e) {
362 threadUnexpectedException();
363 }
364 }
365 }
366
367 class SmallPossiblyInterruptedRunnable implements Runnable {
368 public void run() {
369 try {
370 Thread.sleep(SMALL_DELAY_MS);
371 }
372 catch(Exception e) {
373 }
374 }
375 }
376
377 class SmallCallable implements Callable {
378 public Object call() {
379 try {
380 Thread.sleep(SMALL_DELAY_MS);
381 }
382 catch(Exception e) {
383 threadUnexpectedException();
384 }
385 return Boolean.TRUE;
386 }
387 }
388
389 class SmallInterruptedRunnable implements Runnable {
390 public void run() {
391 try {
392 Thread.sleep(SMALL_DELAY_MS);
393 threadShouldThrow();
394 }
395 catch(InterruptedException success) {
396 }
397 }
398 }
399
400
401 class MediumRunnable implements Runnable {
402 public void run() {
403 try {
404 Thread.sleep(MEDIUM_DELAY_MS);
405 }
406 catch(Exception e) {
407 threadUnexpectedException();
408 }
409 }
410 }
411
412 class MediumInterruptedRunnable implements Runnable {
413 public void run() {
414 try {
415 Thread.sleep(MEDIUM_DELAY_MS);
416 threadShouldThrow();
417 }
418 catch(InterruptedException success) {
419 }
420 }
421 }
422
423 class MediumPossiblyInterruptedRunnable implements Runnable {
424 public void run() {
425 try {
426 Thread.sleep(MEDIUM_DELAY_MS);
427 }
428 catch(InterruptedException success) {
429 }
430 }
431 }
432
433 /**
434 * For use as ThreadFactory in constructors
435 */
436 static class SimpleThreadFactory implements ThreadFactory{
437 public Thread newThread(Runnable r){
438 return new Thread(r);
439 }
440 }
441
442 static class TrackedShortRunnable implements Runnable {
443 volatile boolean done = false;
444 public void run() {
445 try {
446 Thread.sleep(SMALL_DELAY_MS);
447 done = true;
448 } catch(Exception e){
449 }
450 }
451 }
452
453 static class TrackedMediumRunnable implements Runnable {
454 volatile boolean done = false;
455 public void run() {
456 try {
457 Thread.sleep(MEDIUM_DELAY_MS);
458 done = true;
459 } catch(Exception e){
460 }
461 }
462 }
463
464 static class TrackedLongRunnable implements Runnable {
465 volatile boolean done = false;
466 public void run() {
467 try {
468 Thread.sleep(LONG_DELAY_MS);
469 done = true;
470 } catch(Exception e){
471 }
472 }
473 }
474
475 static class TrackedNoOpRunnable implements Runnable {
476 volatile boolean done = false;
477 public void run() {
478 done = true;
479 }
480 }
481
482 static class TrackedCallable implements Callable {
483 volatile boolean done = false;
484 public Object call() {
485 try {
486 Thread.sleep(SMALL_DELAY_MS);
487 done = true;
488 } catch(Exception e){
489 }
490 return Boolean.TRUE;
491 }
492 }
493
494 /**
495 * For use as RejectedExecutionHandler in constructors
496 */
497 static class NoOpREHandler implements RejectedExecutionHandler{
498 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor){}
499 }
500
501
502 }