ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.11
Committed: Tue Dec 23 19:40:24 2003 UTC (20 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.10: +1 -0 lines
Log Message:
Add and adapt tests to refactored Executor API

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(ExecutorCompletionServiceTest.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 /**
325 * A security policy where new permissions can be dynamically added
326 * or all cleared.
327 */
328 static class AdjustablePolicy extends java.security.Policy {
329 Permissions perms = new Permissions();
330 AdjustablePolicy() { }
331 void addPermission(Permission perm) { perms.add(perm); }
332 void clearPermissions() { perms = new Permissions(); }
333 public PermissionCollection getPermissions(CodeSource cs) {
334 return perms;
335 }
336 public PermissionCollection getPermissions(ProtectionDomain pd) {
337 return perms;
338 }
339 public boolean implies(ProtectionDomain pd, Permission p) {
340 return perms.implies(p);
341 }
342 public void refresh() {}
343 }
344
345
346 // Some convenient Runnable classes
347
348 static class NoOpRunnable implements Runnable {
349 public void run() {}
350 }
351
352 static class NoOpCallable implements Callable {
353 public Object call() { return Boolean.TRUE; }
354 }
355
356 static final String TEST_STRING = "a test string";
357
358 static class StringTask implements Callable<String> {
359 public String call() { return TEST_STRING; }
360 }
361
362 static class NPETask implements Callable<String> {
363 public String call() { throw new NullPointerException(); }
364 }
365
366 static class CallableOne implements Callable<Integer> {
367 public Integer call() { return one; }
368 }
369
370 class ShortRunnable implements Runnable {
371 public void run() {
372 try {
373 Thread.sleep(SHORT_DELAY_MS);
374 }
375 catch(Exception e) {
376 threadUnexpectedException();
377 }
378 }
379 }
380
381 class ShortInterruptedRunnable implements Runnable {
382 public void run() {
383 try {
384 Thread.sleep(SHORT_DELAY_MS);
385 threadShouldThrow();
386 }
387 catch(InterruptedException success) {
388 }
389 }
390 }
391
392 class SmallRunnable implements Runnable {
393 public void run() {
394 try {
395 Thread.sleep(SMALL_DELAY_MS);
396 }
397 catch(Exception e) {
398 threadUnexpectedException();
399 }
400 }
401 }
402
403 class SmallPossiblyInterruptedRunnable implements Runnable {
404 public void run() {
405 try {
406 Thread.sleep(SMALL_DELAY_MS);
407 }
408 catch(Exception e) {
409 }
410 }
411 }
412
413 class SmallCallable implements Callable {
414 public Object call() {
415 try {
416 Thread.sleep(SMALL_DELAY_MS);
417 }
418 catch(Exception e) {
419 threadUnexpectedException();
420 }
421 return Boolean.TRUE;
422 }
423 }
424
425 class SmallInterruptedRunnable implements Runnable {
426 public void run() {
427 try {
428 Thread.sleep(SMALL_DELAY_MS);
429 threadShouldThrow();
430 }
431 catch(InterruptedException success) {
432 }
433 }
434 }
435
436
437 class MediumRunnable implements Runnable {
438 public void run() {
439 try {
440 Thread.sleep(MEDIUM_DELAY_MS);
441 }
442 catch(Exception e) {
443 threadUnexpectedException();
444 }
445 }
446 }
447
448 class MediumInterruptedRunnable implements Runnable {
449 public void run() {
450 try {
451 Thread.sleep(MEDIUM_DELAY_MS);
452 threadShouldThrow();
453 }
454 catch(InterruptedException success) {
455 }
456 }
457 }
458
459 class MediumPossiblyInterruptedRunnable implements Runnable {
460 public void run() {
461 try {
462 Thread.sleep(MEDIUM_DELAY_MS);
463 }
464 catch(InterruptedException success) {
465 }
466 }
467 }
468
469 /**
470 * For use as ThreadFactory in constructors
471 */
472 static class SimpleThreadFactory implements ThreadFactory{
473 public Thread newThread(Runnable r){
474 return new Thread(r);
475 }
476 }
477
478 static class TrackedShortRunnable implements Runnable {
479 volatile boolean done = false;
480 public void run() {
481 try {
482 Thread.sleep(SMALL_DELAY_MS);
483 done = true;
484 } catch(Exception e){
485 }
486 }
487 }
488
489 static class TrackedMediumRunnable implements Runnable {
490 volatile boolean done = false;
491 public void run() {
492 try {
493 Thread.sleep(MEDIUM_DELAY_MS);
494 done = true;
495 } catch(Exception e){
496 }
497 }
498 }
499
500 static class TrackedLongRunnable implements Runnable {
501 volatile boolean done = false;
502 public void run() {
503 try {
504 Thread.sleep(LONG_DELAY_MS);
505 done = true;
506 } catch(Exception e){
507 }
508 }
509 }
510
511 static class TrackedNoOpRunnable implements Runnable {
512 volatile boolean done = false;
513 public void run() {
514 done = true;
515 }
516 }
517
518 static class TrackedCallable implements Callable {
519 volatile boolean done = false;
520 public Object call() {
521 try {
522 Thread.sleep(SMALL_DELAY_MS);
523 done = true;
524 } catch(Exception e){
525 }
526 return Boolean.TRUE;
527 }
528 }
529
530 /**
531 * For use as RejectedExecutionHandler in constructors
532 */
533 static class NoOpREHandler implements RejectedExecutionHandler{
534 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor){}
535 }
536
537
538 }