ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.10
Committed: Mon Dec 22 00:48:55 2003 UTC (20 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.9: +15 -1 lines
Log Message:
Add and adjust tests reflecting API changes

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(AbstractExecutorServiceTest.class));
102 suite.addTest(new TestSuite(ArrayBlockingQueueTest.class));
103 suite.addTest(new TestSuite(AtomicBooleanTest.class));
104 suite.addTest(new TestSuite(AtomicIntegerArrayTest.class));
105 suite.addTest(new TestSuite(AtomicIntegerFieldUpdaterTest.class));
106 suite.addTest(new TestSuite(AtomicIntegerTest.class));
107 suite.addTest(new TestSuite(AtomicLongArrayTest.class));
108 suite.addTest(new TestSuite(AtomicLongFieldUpdaterTest.class));
109 suite.addTest(new TestSuite(AtomicLongTest.class));
110 suite.addTest(new TestSuite(AtomicMarkableReferenceTest.class));
111 suite.addTest(new TestSuite(AtomicReferenceArrayTest.class));
112 suite.addTest(new TestSuite(AtomicReferenceFieldUpdaterTest.class));
113 suite.addTest(new TestSuite(AtomicReferenceTest.class));
114 suite.addTest(new TestSuite(AtomicStampedReferenceTest.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(FutureTaskTest.class));
125 suite.addTest(new TestSuite(LinkedBlockingQueueTest.class));
126 suite.addTest(new TestSuite(LinkedListTest.class));
127 suite.addTest(new TestSuite(LockSupportTest.class));
128 suite.addTest(new TestSuite(PriorityBlockingQueueTest.class));
129 suite.addTest(new TestSuite(PriorityQueueTest.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 static final String TEST_STRING = "a test string";
356
357 static class StringTask implements Callable<String> {
358 public String call() { return TEST_STRING; }
359 }
360
361 static class NPETask implements Callable<String> {
362 public String call() { throw new NullPointerException(); }
363 }
364
365 static class CallableOne implements Callable<Integer> {
366 public Integer call() { return one; }
367 }
368
369 class ShortRunnable implements Runnable {
370 public void run() {
371 try {
372 Thread.sleep(SHORT_DELAY_MS);
373 }
374 catch(Exception e) {
375 threadUnexpectedException();
376 }
377 }
378 }
379
380 class ShortInterruptedRunnable implements Runnable {
381 public void run() {
382 try {
383 Thread.sleep(SHORT_DELAY_MS);
384 threadShouldThrow();
385 }
386 catch(InterruptedException success) {
387 }
388 }
389 }
390
391 class SmallRunnable implements Runnable {
392 public void run() {
393 try {
394 Thread.sleep(SMALL_DELAY_MS);
395 }
396 catch(Exception e) {
397 threadUnexpectedException();
398 }
399 }
400 }
401
402 class SmallPossiblyInterruptedRunnable implements Runnable {
403 public void run() {
404 try {
405 Thread.sleep(SMALL_DELAY_MS);
406 }
407 catch(Exception e) {
408 }
409 }
410 }
411
412 class SmallCallable implements Callable {
413 public Object call() {
414 try {
415 Thread.sleep(SMALL_DELAY_MS);
416 }
417 catch(Exception e) {
418 threadUnexpectedException();
419 }
420 return Boolean.TRUE;
421 }
422 }
423
424 class SmallInterruptedRunnable implements Runnable {
425 public void run() {
426 try {
427 Thread.sleep(SMALL_DELAY_MS);
428 threadShouldThrow();
429 }
430 catch(InterruptedException success) {
431 }
432 }
433 }
434
435
436 class MediumRunnable implements Runnable {
437 public void run() {
438 try {
439 Thread.sleep(MEDIUM_DELAY_MS);
440 }
441 catch(Exception e) {
442 threadUnexpectedException();
443 }
444 }
445 }
446
447 class MediumInterruptedRunnable implements Runnable {
448 public void run() {
449 try {
450 Thread.sleep(MEDIUM_DELAY_MS);
451 threadShouldThrow();
452 }
453 catch(InterruptedException success) {
454 }
455 }
456 }
457
458 class MediumPossiblyInterruptedRunnable implements Runnable {
459 public void run() {
460 try {
461 Thread.sleep(MEDIUM_DELAY_MS);
462 }
463 catch(InterruptedException success) {
464 }
465 }
466 }
467
468 /**
469 * For use as ThreadFactory in constructors
470 */
471 static class SimpleThreadFactory implements ThreadFactory{
472 public Thread newThread(Runnable r){
473 return new Thread(r);
474 }
475 }
476
477 static class TrackedShortRunnable implements Runnable {
478 volatile boolean done = false;
479 public void run() {
480 try {
481 Thread.sleep(SMALL_DELAY_MS);
482 done = true;
483 } catch(Exception e){
484 }
485 }
486 }
487
488 static class TrackedMediumRunnable implements Runnable {
489 volatile boolean done = false;
490 public void run() {
491 try {
492 Thread.sleep(MEDIUM_DELAY_MS);
493 done = true;
494 } catch(Exception e){
495 }
496 }
497 }
498
499 static class TrackedLongRunnable implements Runnable {
500 volatile boolean done = false;
501 public void run() {
502 try {
503 Thread.sleep(LONG_DELAY_MS);
504 done = true;
505 } catch(Exception e){
506 }
507 }
508 }
509
510 static class TrackedNoOpRunnable implements Runnable {
511 volatile boolean done = false;
512 public void run() {
513 done = true;
514 }
515 }
516
517 static class TrackedCallable implements Callable {
518 volatile boolean done = false;
519 public Object call() {
520 try {
521 Thread.sleep(SMALL_DELAY_MS);
522 done = true;
523 } catch(Exception e){
524 }
525 return Boolean.TRUE;
526 }
527 }
528
529 /**
530 * For use as RejectedExecutionHandler in constructors
531 */
532 static class NoOpREHandler implements RejectedExecutionHandler{
533 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor){}
534 }
535
536
537 }