ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
Revision: 1.7
Committed: Fri Sep 26 15:33:13 2003 UTC (20 years, 7 months ago) by dl
Branch: MAIN
Changes since 1.6: +6 -28 lines
Log Message:
Javadoc fixes

File Contents

# User Rev Content
1 dl 1.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    
12 dl 1.4 public class ScheduledExecutorTest extends JSR166TestCase {
13 dl 1.1 public static void main(String[] args) {
14     junit.textui.TestRunner.run (suite());
15     }
16     public static Test suite() {
17     return new TestSuite(ScheduledExecutorTest.class);
18     }
19    
20    
21 dl 1.5 /**
22 dl 1.6 * execute successfully executes a runnable
23 dl 1.5 */
24     public void testExecute() {
25     try {
26 dl 1.7 TrackedRunnable runnable =new TrackedRunnable();
27 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
28     p1.execute(runnable);
29 dl 1.4 assertFalse(runnable.done);
30     Thread.sleep(SHORT_DELAY_MS);
31 dl 1.5 p1.shutdown();
32     try {
33 dl 1.2 Thread.sleep(MEDIUM_DELAY_MS);
34     } catch(InterruptedException e){
35 dl 1.5 unexpectedException();
36 dl 1.2 }
37 dl 1.1 assertTrue(runnable.done);
38 dl 1.5 p1.shutdown();
39     joinPool(p1);
40 dl 1.1 }
41     catch(Exception e){
42 dl 1.5 unexpectedException();
43 dl 1.1 }
44 dl 1.4
45 dl 1.1 }
46    
47 dl 1.6
48 dl 1.5 /**
49 dl 1.6 * delayed schedule of callable successfully executes after delay
50 dl 1.5 */
51     public void testSchedule1() {
52     try {
53 dl 1.7 TrackedCallable callable = new TrackedCallable();
54 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
55     Future f = p1.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
56 dl 1.4 assertFalse(callable.done);
57 dl 1.2 Thread.sleep(MEDIUM_DELAY_MS);
58 dl 1.1 assertTrue(callable.done);
59     assertEquals(Boolean.TRUE, f.get());
60 dl 1.5 p1.shutdown();
61     joinPool(p1);
62     } catch(RejectedExecutionException e){}
63 dl 1.2 catch(Exception e){
64 dl 1.5 unexpectedException();
65 dl 1.2 }
66 dl 1.1 }
67    
68     /**
69 dl 1.6 * delayed schedule of runnable successfully executes after delay
70 dl 1.1 */
71 dl 1.5 public void testSchedule3() {
72     try {
73 dl 1.7 TrackedRunnable runnable = new TrackedRunnable();
74 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
75     p1.schedule(runnable, SMALL_DELAY_MS, TimeUnit.MILLISECONDS);
76 dl 1.4 Thread.sleep(SHORT_DELAY_MS);
77     assertFalse(runnable.done);
78 dl 1.2 Thread.sleep(MEDIUM_DELAY_MS);
79 dl 1.1 assertTrue(runnable.done);
80 dl 1.5 p1.shutdown();
81     joinPool(p1);
82 dl 1.1 } catch(Exception e){
83 dl 1.5 unexpectedException();
84 dl 1.1 }
85     }
86    
87     /**
88 dl 1.6 * scheduleAtFixedRate executes runnable after given initial delay
89 dl 1.1 */
90 dl 1.5 public void testSchedule4() {
91     try {
92 dl 1.7 TrackedRunnable runnable = new TrackedRunnable();
93 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
94 dl 1.6 ScheduledCancellable h = p1.scheduleAtFixedRate(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
95     assertFalse(runnable.done);
96     Thread.sleep(MEDIUM_DELAY_MS);
97     assertTrue(runnable.done);
98     h.cancel(true);
99     p1.shutdown();
100     joinPool(p1);
101     } catch(Exception e){
102     unexpectedException();
103     }
104     }
105    
106     /**
107     * scheduleWithFixedDelay executes runnable after given initial delay
108     */
109     public void testSchedule5() {
110     try {
111 dl 1.7 TrackedRunnable runnable = new TrackedRunnable();
112 dl 1.6 ScheduledExecutor p1 = new ScheduledExecutor(1);
113     ScheduledCancellable h = p1.scheduleWithFixedDelay(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
114 dl 1.4 assertFalse(runnable.done);
115 dl 1.2 Thread.sleep(MEDIUM_DELAY_MS);
116 dl 1.1 assertTrue(runnable.done);
117 dl 1.6 h.cancel(true);
118 dl 1.5 p1.shutdown();
119     joinPool(p1);
120 dl 1.1 } catch(Exception e){
121 dl 1.5 unexpectedException();
122 dl 1.1 }
123     }
124    
125 dl 1.6 /**
126     * execute (null) throws NPE
127     */
128     public void testExecuteNull() {
129     ScheduledExecutor se = null;
130     try {
131     se = new ScheduledExecutor(1);
132     se.execute(null);
133     shouldThrow();
134     } catch(NullPointerException success){}
135     catch(Exception e){
136     unexpectedException();
137     }
138    
139     joinPool(se);
140     }
141    
142     /**
143     * schedule (null) throws NPE
144     */
145     public void testScheduleNull() {
146     ScheduledExecutor se = new ScheduledExecutor(1);
147     try {
148 dl 1.7 TrackedCallable callable = null;
149 dl 1.6 Future f = se.schedule(callable, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
150     shouldThrow();
151     } catch(NullPointerException success){}
152     catch(Exception e){
153     unexpectedException();
154     }
155     joinPool(se);
156     }
157 dl 1.1
158     /**
159 dl 1.6 * execute throws RejectedExecutionException if shutdown
160 dl 1.1 */
161 dl 1.5 public void testSchedule1_RejectedExecutionException() {
162 dl 1.4 ScheduledExecutor se = new ScheduledExecutor(1);
163 dl 1.5 try {
164 dl 1.1 se.shutdown();
165 dl 1.4 se.schedule(new NoOpRunnable(),
166     MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
167 dl 1.5 shouldThrow();
168 dl 1.4 } catch(RejectedExecutionException success){
169     }
170     joinPool(se);
171    
172 dl 1.1 }
173    
174     /**
175 dl 1.6 * schedule throws RejectedExecutionException if shutdown
176 dl 1.1 */
177 dl 1.5 public void testSchedule2_RejectedExecutionException() {
178 dl 1.4 ScheduledExecutor se = new ScheduledExecutor(1);
179 dl 1.5 try {
180 dl 1.1 se.shutdown();
181 dl 1.4 se.schedule(new NoOpCallable(),
182     MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
183 dl 1.5 shouldThrow();
184 dl 1.4 } catch(RejectedExecutionException success){
185     }
186     joinPool(se);
187 dl 1.1 }
188    
189     /**
190 dl 1.6 * schedule callable throws RejectedExecutionException if shutdown
191 dl 1.1 */
192 dl 1.5 public void testSchedule3_RejectedExecutionException() {
193 dl 1.4 ScheduledExecutor se = new ScheduledExecutor(1);
194 dl 1.5 try {
195 dl 1.1 se.shutdown();
196 dl 1.4 se.schedule(new NoOpCallable(),
197     MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
198 dl 1.5 shouldThrow();
199 dl 1.4 } catch(RejectedExecutionException success){
200     }
201     joinPool(se);
202 dl 1.1 }
203    
204     /**
205 dl 1.6 * scheduleAtFixedRate throws RejectedExecutionException if shutdown
206 dl 1.1 */
207 dl 1.5 public void testScheduleAtFixedRate1_RejectedExecutionException() {
208 dl 1.4 ScheduledExecutor se = new ScheduledExecutor(1);
209 dl 1.5 try {
210 dl 1.1 se.shutdown();
211 dl 1.4 se.scheduleAtFixedRate(new NoOpRunnable(),
212     MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
213 dl 1.5 shouldThrow();
214 dl 1.4 } catch(RejectedExecutionException success){
215     }
216     joinPool(se);
217 dl 1.1 }
218    
219     /**
220 dl 1.6 * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
221 dl 1.1 */
222 dl 1.5 public void testScheduleWithFixedDelay1_RejectedExecutionException() {
223 dl 1.4 ScheduledExecutor se = new ScheduledExecutor(1);
224 dl 1.5 try {
225 dl 1.1 se.shutdown();
226 dl 1.4 se.scheduleWithFixedDelay(new NoOpRunnable(),
227     MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
228 dl 1.5 shouldThrow();
229 dl 1.4 } catch(RejectedExecutionException success){
230     }
231     joinPool(se);
232 dl 1.1 }
233    
234     /**
235 dl 1.6 * getActiveCount increases but doesn't overestimate, when a
236     * thread becomes active
237 dl 1.2 */
238 dl 1.5 public void testGetActiveCount() {
239     ScheduledExecutor p2 = new ScheduledExecutor(2);
240     assertEquals(0, p2.getActiveCount());
241     p2.execute(new SmallRunnable());
242     try {
243 dl 1.4 Thread.sleep(SHORT_DELAY_MS);
244     } catch(Exception e){
245 dl 1.5 unexpectedException();
246 dl 1.2 }
247 dl 1.5 assertEquals(1, p2.getActiveCount());
248     joinPool(p2);
249 dl 1.2 }
250    
251     /**
252 dl 1.6 * getCompletedTaskCount increases, but doesn't overestimate,
253     * when tasks complete
254 dl 1.2 */
255 dl 1.5 public void testGetCompletedTaskCount() {
256     ScheduledExecutor p2 = new ScheduledExecutor(2);
257     assertEquals(0, p2.getCompletedTaskCount());
258     p2.execute(new SmallRunnable());
259     try {
260 dl 1.4 Thread.sleep(MEDIUM_DELAY_MS);
261     } catch(Exception e){
262 dl 1.5 unexpectedException();
263 dl 1.2 }
264 dl 1.5 assertEquals(1, p2.getCompletedTaskCount());
265     joinPool(p2);
266 dl 1.2 }
267    
268     /**
269 dl 1.6 * getCorePoolSize returns size given in constructor if not otherwise set
270 dl 1.2 */
271 dl 1.5 public void testGetCorePoolSize() {
272     ScheduledExecutor p1 = new ScheduledExecutor(1);
273     assertEquals(1, p1.getCorePoolSize());
274     joinPool(p1);
275 dl 1.2 }
276    
277     /**
278 dl 1.6 * getLargestPoolSize increases, but doesn't overestimate, when
279     * multiple threads active
280 dl 1.2 */
281 dl 1.5 public void testGetLargestPoolSize() {
282     ScheduledExecutor p2 = new ScheduledExecutor(2);
283     assertEquals(0, p2.getLargestPoolSize());
284     p2.execute(new SmallRunnable());
285     p2.execute(new SmallRunnable());
286     try {
287 dl 1.4 Thread.sleep(SHORT_DELAY_MS);
288     } catch(Exception e){
289 dl 1.5 unexpectedException();
290 dl 1.2 }
291 dl 1.5 assertEquals(2, p2.getLargestPoolSize());
292     joinPool(p2);
293 dl 1.2 }
294    
295     /**
296 dl 1.6 * getPoolSize increases, but doesn't overestimate, when threads
297     * become active
298 dl 1.2 */
299 dl 1.5 public void testGetPoolSize() {
300     ScheduledExecutor p1 = new ScheduledExecutor(1);
301     assertEquals(0, p1.getPoolSize());
302     p1.execute(new SmallRunnable());
303     assertEquals(1, p1.getPoolSize());
304     joinPool(p1);
305 dl 1.2 }
306    
307     /**
308 dl 1.6 * getTaskCount increases, but doesn't overestimate, when tasks
309     * submitted
310 dl 1.2 */
311 dl 1.5 public void testGetTaskCount() {
312     ScheduledExecutor p1 = new ScheduledExecutor(1);
313     assertEquals(0, p1.getTaskCount());
314 dl 1.4 for(int i = 0; i < 5; i++)
315 dl 1.5 p1.execute(new SmallRunnable());
316     try {
317 dl 1.4 Thread.sleep(SHORT_DELAY_MS);
318     } catch(Exception e){
319 dl 1.5 unexpectedException();
320 dl 1.2 }
321 dl 1.5 assertEquals(5, p1.getTaskCount());
322     joinPool(p1);
323 dl 1.2 }
324    
325     /**
326 dl 1.6 * is isShutDown is false before shutdown, true after
327 dl 1.2 */
328 dl 1.5 public void testIsShutdown() {
329 dl 1.2
330 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
331 dl 1.2 try {
332 dl 1.5 assertFalse(p1.isShutdown());
333 dl 1.2 }
334     finally {
335 dl 1.5 p1.shutdown();
336 dl 1.2 }
337 dl 1.5 assertTrue(p1.isShutdown());
338 dl 1.2 }
339    
340    
341     /**
342 dl 1.6 * isTerminated is false before termination, true after
343 dl 1.2 */
344 dl 1.5 public void testIsTerminated() {
345     ScheduledExecutor p1 = new ScheduledExecutor(1);
346 dl 1.2 try {
347 dl 1.5 p1.execute(new SmallRunnable());
348 dl 1.2 } finally {
349 dl 1.5 p1.shutdown();
350 dl 1.2 }
351 dl 1.4 try {
352 dl 1.5 assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
353     assertTrue(p1.isTerminated());
354 dl 1.2 } catch(Exception e){
355 dl 1.5 unexpectedException();
356     }
357     }
358    
359     /**
360 dl 1.6 * isTerminating is not true when running or when terminated
361 dl 1.5 */
362     public void testIsTerminating() {
363     ScheduledExecutor p1 = new ScheduledExecutor(1);
364     assertFalse(p1.isTerminating());
365     try {
366     p1.execute(new SmallRunnable());
367     assertFalse(p1.isTerminating());
368     } finally {
369     p1.shutdown();
370     }
371     try {
372     assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
373     assertTrue(p1.isTerminated());
374     assertFalse(p1.isTerminating());
375     } catch(Exception e){
376     unexpectedException();
377 dl 1.2 }
378     }
379    
380     /**
381 dl 1.6 * purge removes cancelled tasks from the queue
382 dl 1.2 */
383 dl 1.5 public void testPurge() {
384     ScheduledExecutor p1 = new ScheduledExecutor(1);
385 dl 1.4 ScheduledCancellable[] tasks = new ScheduledCancellable[5];
386     for(int i = 0; i < 5; i++){
387 dl 1.5 tasks[i] = p1.schedule(new SmallRunnable(), 1, TimeUnit.MILLISECONDS);
388 dl 1.2 }
389 dl 1.4 int max = 5;
390     if (tasks[4].cancel(true)) --max;
391     if (tasks[3].cancel(true)) --max;
392 dl 1.5 p1.purge();
393     long count = p1.getTaskCount();
394 dl 1.4 assertTrue(count > 0 && count <= max);
395 dl 1.5 joinPool(p1);
396 dl 1.2 }
397    
398     /**
399 dl 1.6 * shutDownNow returns a list containing tasks that were not run
400 dl 1.2 */
401 dl 1.5 public void testShutDownNow() {
402     ScheduledExecutor p1 = new ScheduledExecutor(1);
403 dl 1.2 for(int i = 0; i < 5; i++)
404 dl 1.5 p1.schedule(new SmallRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
405     List l = p1.shutdownNow();
406     assertTrue(p1.isShutdown());
407 dl 1.2 assertTrue(l.size() > 0 && l.size() <= 5);
408 dl 1.5 joinPool(p1);
409 dl 1.2 }
410    
411 dl 1.5 /**
412 dl 1.6 * In default setting, shutdown cancels periodic but not delayed
413     * tasks at shutdown
414 dl 1.5 */
415     public void testShutDown1() {
416 dl 1.2 try {
417 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
418     assertTrue(p1.getExecuteExistingDelayedTasksAfterShutdownPolicy());
419     assertFalse(p1.getContinueExistingPeriodicTasksAfterShutdownPolicy());
420 dl 1.2
421     ScheduledCancellable[] tasks = new ScheduledCancellable[5];
422     for(int i = 0; i < 5; i++)
423 dl 1.5 tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
424     p1.shutdown();
425     BlockingQueue q = p1.getQueue();
426 dl 1.2 for (Iterator it = q.iterator(); it.hasNext();) {
427     ScheduledCancellable t = (ScheduledCancellable)it.next();
428     assertFalse(t.isCancelled());
429     }
430 dl 1.5 assertTrue(p1.isShutdown());
431 dl 1.4 Thread.sleep(SMALL_DELAY_MS);
432 dl 1.2 for (int i = 0; i < 5; ++i) {
433     assertTrue(tasks[i].isDone());
434     assertFalse(tasks[i].isCancelled());
435     }
436    
437     }
438     catch(Exception ex) {
439 dl 1.5 unexpectedException();
440 dl 1.2 }
441     }
442    
443    
444 dl 1.5 /**
445 dl 1.6 * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
446     * delayed tasks are cancelled at shutdown
447 dl 1.5 */
448     public void testShutDown2() {
449 dl 1.2 try {
450 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
451     p1.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
452 dl 1.2 ScheduledCancellable[] tasks = new ScheduledCancellable[5];
453     for(int i = 0; i < 5; i++)
454 dl 1.5 tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
455     p1.shutdown();
456     assertTrue(p1.isShutdown());
457     BlockingQueue q = p1.getQueue();
458 dl 1.2 assertTrue(q.isEmpty());
459 dl 1.4 Thread.sleep(SMALL_DELAY_MS);
460 dl 1.5 assertTrue(p1.isTerminated());
461 dl 1.2 }
462     catch(Exception ex) {
463 dl 1.5 unexpectedException();
464 dl 1.2 }
465     }
466    
467    
468 dl 1.5 /**
469 dl 1.6 * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
470     * periodic tasks are not cancelled at shutdown
471 dl 1.5 */
472     public void testShutDown3() {
473 dl 1.2 try {
474 dl 1.5 ScheduledExecutor p1 = new ScheduledExecutor(1);
475     p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
476 dl 1.2 ScheduledCancellable task =
477 dl 1.5 p1.scheduleAtFixedRate(new NoOpRunnable(), 5, 5, TimeUnit.MILLISECONDS);
478     p1.shutdown();
479     assertTrue(p1.isShutdown());
480     BlockingQueue q = p1.getQueue();
481 dl 1.2 assertTrue(q.isEmpty());
482     Thread.sleep(SHORT_DELAY_MS);
483 dl 1.5 assertTrue(p1.isTerminated());
484 dl 1.2 }
485     catch(Exception ex) {
486 dl 1.5 unexpectedException();
487 dl 1.2 }
488     }
489    
490 dl 1.5 /**
491 dl 1.6 * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
492     * periodic tasks are cancelled at shutdown
493 dl 1.5 */
494     public void testShutDown4() {
495     ScheduledExecutor p1 = new ScheduledExecutor(1);
496 dl 1.2 try {
497 dl 1.5 p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
498 dl 1.2 ScheduledCancellable task =
499 dl 1.5 p1.scheduleAtFixedRate(new NoOpRunnable(), 5, 5, TimeUnit.MILLISECONDS);
500 dl 1.2 assertFalse(task.isCancelled());
501 dl 1.5 p1.shutdown();
502 dl 1.2 assertFalse(task.isCancelled());
503 dl 1.5 assertFalse(p1.isTerminated());
504     assertTrue(p1.isShutdown());
505 dl 1.2 Thread.sleep(SHORT_DELAY_MS);
506     assertFalse(task.isCancelled());
507     task.cancel(true);
508     assertTrue(task.isCancelled());
509     Thread.sleep(SHORT_DELAY_MS);
510 dl 1.5 assertTrue(p1.isTerminated());
511 dl 1.2 }
512     catch(Exception ex) {
513 dl 1.5 unexpectedException();
514 dl 1.2 }
515     finally {
516 dl 1.5 p1.shutdownNow();
517 dl 1.2 }
518 dl 1.1 }
519    
520     }