ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.19
Committed: Sat Jan 10 20:37:20 2004 UTC (20 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.18: +1 -0 lines
Log Message:
Added tests

File Contents

# Content
1 /*
2 * 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 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import junit.framework.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12 import java.io.*;
13 import java.security.*;
14
15 /**
16 * 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 * JUnit doe not otherwise arrange). The rules for creating such
21 * tests are:
22 *
23 * <ol>
24 *
25 * <li> All assertions in code running in generated threads must use
26 * the forms {@link #threadFail} , {@link #threadAssertTrue} {@link
27 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
28 * <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 * <li> If you override {@link #setUp} or {@link #tearDown}, make sure
34 * 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 * <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 * discriminable from zero time, and always allows enough time for the
42 * small amounts of computation (creating a thread, calling a few
43 * 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 * but even so, if there is ever any doubt, they can all be increased
47 * in one spot to rerun tests on slower platforms</li>
48 *
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 * method. The <tt> joinPool</tt> method can be used to do this when
52 * using Executors.</li>
53 *
54 * </ol>
55 *
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 *
67 * <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 */
88 public class JSR166TestCase extends TestCase {
89 /**
90 * Runs all JSR166 unit tests using junit.textui.TestRunner
91 */
92 public static void main (String[] args) {
93 int iters = 1;
94 if (args.length > 0)
95 iters = Integer.parseInt(args[0]);
96 Test s = suite();
97 for (int i = 0; i < iters; ++i)
98 junit.textui.TestRunner.run (s);
99 }
100
101 /**
102 * Collects all JSR166 unit tests as one suite
103 */
104 public static Test suite ( ) {
105 TestSuite suite = new TestSuite("JSR166 Unit Tests");
106
107 suite.addTest(new TestSuite(AbstractExecutorServiceTest.class));
108 suite.addTest(new TestSuite(AbstractQueueTest.class));
109 suite.addTest(new TestSuite(AbstractQueuedSynchronizerTest.class));
110 suite.addTest(new TestSuite(ArrayBlockingQueueTest.class));
111 suite.addTest(new TestSuite(AtomicBooleanTest.class));
112 suite.addTest(new TestSuite(AtomicIntegerArrayTest.class));
113 suite.addTest(new TestSuite(AtomicIntegerFieldUpdaterTest.class));
114 suite.addTest(new TestSuite(AtomicIntegerTest.class));
115 suite.addTest(new TestSuite(AtomicLongArrayTest.class));
116 suite.addTest(new TestSuite(AtomicLongFieldUpdaterTest.class));
117 suite.addTest(new TestSuite(AtomicLongTest.class));
118 suite.addTest(new TestSuite(AtomicMarkableReferenceTest.class));
119 suite.addTest(new TestSuite(AtomicReferenceArrayTest.class));
120 suite.addTest(new TestSuite(AtomicReferenceFieldUpdaterTest.class));
121 suite.addTest(new TestSuite(AtomicReferenceTest.class));
122 suite.addTest(new TestSuite(AtomicStampedReferenceTest.class));
123 suite.addTest(new TestSuite(ConcurrentHashMapTest.class));
124 suite.addTest(new TestSuite(ConcurrentLinkedQueueTest.class));
125 suite.addTest(new TestSuite(CopyOnWriteArrayListTest.class));
126 suite.addTest(new TestSuite(CopyOnWriteArraySetTest.class));
127 suite.addTest(new TestSuite(CountDownLatchTest.class));
128 suite.addTest(new TestSuite(CyclicBarrierTest.class));
129 suite.addTest(new TestSuite(DelayQueueTest.class));
130 suite.addTest(new TestSuite(ExchangerTest.class));
131 suite.addTest(new TestSuite(ExecutorsTest.class));
132 suite.addTest(new TestSuite(ExecutorCompletionServiceTest.class));
133 suite.addTest(new TestSuite(FutureTaskTest.class));
134 suite.addTest(new TestSuite(LinkedBlockingQueueTest.class));
135 suite.addTest(new TestSuite(LinkedListTest.class));
136 suite.addTest(new TestSuite(LockSupportTest.class));
137 suite.addTest(new TestSuite(PriorityBlockingQueueTest.class));
138 suite.addTest(new TestSuite(PriorityQueueTest.class));
139 suite.addTest(new TestSuite(ReentrantLockTest.class));
140 suite.addTest(new TestSuite(ReentrantReadWriteLockTest.class));
141 suite.addTest(new TestSuite(ScheduledExecutorTest.class));
142 suite.addTest(new TestSuite(SemaphoreTest.class));
143 suite.addTest(new TestSuite(SynchronousQueueTest.class));
144 suite.addTest(new TestSuite(SystemTest.class));
145 suite.addTest(new TestSuite(ThreadLocalTest.class));
146 suite.addTest(new TestSuite(ThreadPoolExecutorTest.class));
147 suite.addTest(new TestSuite(ThreadTest.class));
148 suite.addTest(new TestSuite(TimeUnitTest.class));
149
150 return suite;
151 }
152
153
154 public static long SHORT_DELAY_MS;
155 public static long SMALL_DELAY_MS;
156 public static long MEDIUM_DELAY_MS;
157 public static long LONG_DELAY_MS;
158
159
160 /**
161 * Return the shortest timed delay. This could
162 * be reimplemented to use for example a Property.
163 */
164 protected long getShortDelay() {
165 return 10;
166 }
167
168
169 /**
170 * Set delays as multiples of SHORT_DELAY.
171 */
172 protected void setDelays() {
173 SHORT_DELAY_MS = getShortDelay();
174 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
175 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
176 LONG_DELAY_MS = SHORT_DELAY_MS * 50;
177 }
178
179 /**
180 * Flag set true if any threadAssert methods fail
181 */
182 volatile boolean threadFailed;
183
184 /**
185 * Initialize test to indicate that no thread assertions have failed
186 */
187 public void setUp() {
188 setDelays();
189 threadFailed = false;
190 }
191
192 /**
193 * Trigger test case failure if any thread assertions have failed
194 */
195 public void tearDown() {
196 assertFalse(threadFailed);
197 }
198
199 /**
200 * Fail, also setting status to indicate current testcase should fail
201 */
202 public void threadFail(String reason) {
203 threadFailed = true;
204 fail(reason);
205 }
206
207 /**
208 * If expression not true, set status to indicate current testcase
209 * should fail
210 */
211 public void threadAssertTrue(boolean b) {
212 if (!b) {
213 threadFailed = true;
214 assertTrue(b);
215 }
216 }
217
218 /**
219 * If expression not false, set status to indicate current testcase
220 * should fail
221 */
222 public void threadAssertFalse(boolean b) {
223 if (b) {
224 threadFailed = true;
225 assertFalse(b);
226 }
227 }
228
229 /**
230 * If argument not null, set status to indicate current testcase
231 * should fail
232 */
233 public void threadAssertNull(Object x) {
234 if (x != null) {
235 threadFailed = true;
236 assertNull(x);
237 }
238 }
239
240 /**
241 * If arguments not equal, set status to indicate current testcase
242 * should fail
243 */
244 public void threadAssertEquals(long x, long y) {
245 if (x != y) {
246 threadFailed = true;
247 assertEquals(x, y);
248 }
249 }
250
251 /**
252 * If arguments not equal, set status to indicate current testcase
253 * should fail
254 */
255 public void threadAssertEquals(Object x, Object y) {
256 if (x != y && (x == null || !x.equals(y))) {
257 threadFailed = true;
258 assertEquals(x, y);
259 }
260 }
261
262 /**
263 * threadFail with message "should throw exception"
264 */
265 public void threadShouldThrow() {
266 threadFailed = true;
267 fail("should throw exception");
268 }
269
270 /**
271 * threadFail with message "Unexpected exception"
272 */
273 public void threadUnexpectedException() {
274 threadFailed = true;
275 fail("Unexpected exception");
276 }
277
278
279 /**
280 * Wait out termination of a thread pool or fail doing so
281 */
282 public void joinPool(ExecutorService exec) {
283 try {
284 exec.shutdown();
285 assertTrue(exec.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
286 } catch(InterruptedException ie) {
287 fail("Unexpected exception");
288 }
289 }
290
291
292 /**
293 * fail with message "should throw exception"
294 */
295 public void shouldThrow() {
296 fail("Should throw exception");
297 }
298
299 /**
300 * fail with message "Unexpected exception"
301 */
302 public void unexpectedException() {
303 fail("Unexpected exception");
304 }
305
306
307 /**
308 * The number of elements to place in collections, arrays, etc.
309 */
310 static final int SIZE = 20;
311
312 // Some convenient Integer constants
313
314 static final Integer zero = new Integer(0);
315 static final Integer one = new Integer(1);
316 static final Integer two = new Integer(2);
317 static final Integer three = new Integer(3);
318 static final Integer four = new Integer(4);
319 static final Integer five = new Integer(5);
320 static final Integer six = new Integer(6);
321 static final Integer seven = new Integer(7);
322 static final Integer eight = new Integer(8);
323 static final Integer nine = new Integer(9);
324 static final Integer m1 = new Integer(-1);
325 static final Integer m2 = new Integer(-2);
326 static final Integer m3 = new Integer(-3);
327 static final Integer m4 = new Integer(-4);
328 static final Integer m5 = new Integer(-5);
329 static final Integer m10 = new Integer(-10);
330
331
332 /**
333 * A security policy where new permissions can be dynamically added
334 * or all cleared.
335 */
336 static class AdjustablePolicy extends java.security.Policy {
337 Permissions perms = new Permissions();
338 AdjustablePolicy() { }
339 void addPermission(Permission perm) { perms.add(perm); }
340 void clearPermissions() { perms = new Permissions(); }
341 public PermissionCollection getPermissions(CodeSource cs) {
342 return perms;
343 }
344 public PermissionCollection getPermissions(ProtectionDomain pd) {
345 return perms;
346 }
347 public boolean implies(ProtectionDomain pd, Permission p) {
348 return perms.implies(p);
349 }
350 public void refresh() {}
351 }
352
353
354 // Some convenient Runnable classes
355
356 static class NoOpRunnable implements Runnable {
357 public void run() {}
358 }
359
360 static class NoOpCallable implements Callable {
361 public Object call() { return Boolean.TRUE; }
362 }
363
364 static final String TEST_STRING = "a test string";
365
366 static class StringTask implements Callable<String> {
367 public String call() { return TEST_STRING; }
368 }
369
370 static class NPETask implements Callable<String> {
371 public String call() { throw new NullPointerException(); }
372 }
373
374 static class CallableOne implements Callable<Integer> {
375 public Integer call() { return one; }
376 }
377
378 class ShortRunnable implements Runnable {
379 public void run() {
380 try {
381 Thread.sleep(SHORT_DELAY_MS);
382 }
383 catch(Exception e) {
384 threadUnexpectedException();
385 }
386 }
387 }
388
389 class ShortInterruptedRunnable implements Runnable {
390 public void run() {
391 try {
392 Thread.sleep(SHORT_DELAY_MS);
393 threadShouldThrow();
394 }
395 catch(InterruptedException success) {
396 }
397 }
398 }
399
400 class SmallRunnable implements Runnable {
401 public void run() {
402 try {
403 Thread.sleep(SMALL_DELAY_MS);
404 }
405 catch(Exception e) {
406 threadUnexpectedException();
407 }
408 }
409 }
410
411 class SmallPossiblyInterruptedRunnable implements Runnable {
412 public void run() {
413 try {
414 Thread.sleep(SMALL_DELAY_MS);
415 }
416 catch(Exception e) {
417 }
418 }
419 }
420
421 class SmallCallable implements Callable {
422 public Object call() {
423 try {
424 Thread.sleep(SMALL_DELAY_MS);
425 }
426 catch(Exception e) {
427 threadUnexpectedException();
428 }
429 return Boolean.TRUE;
430 }
431 }
432
433 class SmallInterruptedRunnable implements Runnable {
434 public void run() {
435 try {
436 Thread.sleep(SMALL_DELAY_MS);
437 threadShouldThrow();
438 }
439 catch(InterruptedException success) {
440 }
441 }
442 }
443
444
445 class MediumRunnable implements Runnable {
446 public void run() {
447 try {
448 Thread.sleep(MEDIUM_DELAY_MS);
449 }
450 catch(Exception e) {
451 threadUnexpectedException();
452 }
453 }
454 }
455
456 class MediumInterruptedRunnable implements Runnable {
457 public void run() {
458 try {
459 Thread.sleep(MEDIUM_DELAY_MS);
460 threadShouldThrow();
461 }
462 catch(InterruptedException success) {
463 }
464 }
465 }
466
467 class MediumPossiblyInterruptedRunnable implements Runnable {
468 public void run() {
469 try {
470 Thread.sleep(MEDIUM_DELAY_MS);
471 }
472 catch(InterruptedException success) {
473 }
474 }
475 }
476
477 class LongPossiblyInterruptedRunnable implements Runnable {
478 public void run() {
479 try {
480 Thread.sleep(LONG_DELAY_MS);
481 }
482 catch(InterruptedException success) {
483 }
484 }
485 }
486
487 /**
488 * For use as ThreadFactory in constructors
489 */
490 static class SimpleThreadFactory implements ThreadFactory{
491 public Thread newThread(Runnable r){
492 return new Thread(r);
493 }
494 }
495
496 static class TrackedShortRunnable implements Runnable {
497 volatile boolean done = false;
498 public void run() {
499 try {
500 Thread.sleep(SMALL_DELAY_MS);
501 done = true;
502 } catch(Exception e){
503 }
504 }
505 }
506
507 static class TrackedMediumRunnable implements Runnable {
508 volatile boolean done = false;
509 public void run() {
510 try {
511 Thread.sleep(MEDIUM_DELAY_MS);
512 done = true;
513 } catch(Exception e){
514 }
515 }
516 }
517
518 static class TrackedLongRunnable implements Runnable {
519 volatile boolean done = false;
520 public void run() {
521 try {
522 Thread.sleep(LONG_DELAY_MS);
523 done = true;
524 } catch(Exception e){
525 }
526 }
527 }
528
529 static class TrackedNoOpRunnable implements Runnable {
530 volatile boolean done = false;
531 public void run() {
532 done = true;
533 }
534 }
535
536 static class TrackedCallable implements Callable {
537 volatile boolean done = false;
538 public Object call() {
539 try {
540 Thread.sleep(SMALL_DELAY_MS);
541 done = true;
542 } catch(Exception e){
543 }
544 return Boolean.TRUE;
545 }
546 }
547
548
549 /**
550 * For use as RejectedExecutionHandler in constructors
551 */
552 static class NoOpREHandler implements RejectedExecutionHandler{
553 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor){}
554 }
555
556
557 }