ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
(Generate patch)

Comparing jsr166/src/test/tck/ScheduledExecutorTest.java (file contents):
Revision 1.17 by dl, Tue Jan 20 20:20:56 2004 UTC vs.
Revision 1.22 by jsr166, Mon Nov 2 20:28:32 2009 UTC

# Line 2 | Line 2
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.
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.util.concurrent.atomic.*;
13  
14   public class ScheduledExecutorTest extends JSR166TestCase {
15      public static void main(String[] args) {
16 <        junit.textui.TestRunner.run (suite());  
16 >        junit.textui.TestRunner.run (suite());
17      }
18      public static Test suite() {
19          return new TestSuite(ScheduledExecutorTest.class);
# Line 42 | Line 43 | public class ScheduledExecutorTest exten
43          catch(Exception e){
44              unexpectedException();
45          }
46 <        
46 >
47      }
48  
49  
# Line 85 | Line 86 | public class ScheduledExecutorTest exten
86              unexpectedException();
87          }
88      }
89 <    
89 >
90      /**
91       * scheduleAtFixedRate executes runnable after given initial delay
92       */
# Line 104 | Line 105 | public class ScheduledExecutorTest exten
105          }
106      }
107  
108 +    static class RunnableCounter implements Runnable {
109 +        AtomicInteger count = new AtomicInteger(0);
110 +        public void run() { count.getAndIncrement(); }
111 +    }
112 +
113      /**
114       * scheduleWithFixedDelay executes runnable after given initial delay
115       */
# Line 121 | Line 127 | public class ScheduledExecutorTest exten
127              unexpectedException();
128          }
129      }
130 <    
130 >
131 >    /**
132 >     * scheduleAtFixedRate executes series of tasks at given rate
133 >     */
134 >    public void testFixedRateSequence() {
135 >        try {
136 >            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
137 >            RunnableCounter counter = new RunnableCounter();
138 >            ScheduledFuture h =
139 >                p1.scheduleAtFixedRate(counter, 0, 1, TimeUnit.MILLISECONDS);
140 >            Thread.sleep(SMALL_DELAY_MS);
141 >            h.cancel(true);
142 >            int c = counter.count.get();
143 >            // By time scaling conventions, we must have at least
144 >            // an execution per SHORT delay, but no more than one SHORT more
145 >            assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
146 >            assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
147 >            joinPool(p1);
148 >        } catch(Exception e){
149 >            unexpectedException();
150 >        }
151 >    }
152 >
153 >    /**
154 >     * scheduleWithFixedDelay executes series of tasks with given period
155 >     */
156 >    public void testFixedDelaySequence() {
157 >        try {
158 >            ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
159 >            RunnableCounter counter = new RunnableCounter();
160 >            ScheduledFuture h =
161 >                p1.scheduleWithFixedDelay(counter, 0, 1, TimeUnit.MILLISECONDS);
162 >            Thread.sleep(SMALL_DELAY_MS);
163 >            h.cancel(true);
164 >            int c = counter.count.get();
165 >            assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
166 >            assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
167 >            joinPool(p1);
168 >        } catch(Exception e){
169 >            unexpectedException();
170 >        }
171 >    }
172 >
173 >
174      /**
175       *  execute (null) throws NPE
176       */
# Line 135 | Line 184 | public class ScheduledExecutorTest exten
184          catch(Exception e){
185              unexpectedException();
186          }
187 <        
187 >
188          joinPool(se);
189      }
190  
# Line 154 | Line 203 | public class ScheduledExecutorTest exten
203          }
204          joinPool(se);
205      }
206 <  
206 >
207      /**
208       * execute throws RejectedExecutionException if shutdown
209       */
# Line 168 | Line 217 | public class ScheduledExecutorTest exten
217          } catch(RejectedExecutionException success){
218          } catch (SecurityException ok) {
219          }
220 <        
220 >
221          joinPool(se);
222  
223      }
# Line 217 | Line 266 | public class ScheduledExecutorTest exten
266              shouldThrow();
267          } catch(RejectedExecutionException success){
268          } catch (SecurityException ok) {
269 <        }
269 >        }
270          joinPool(se);
271      }
272 <    
272 >
273      /**
274       * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
275       */
# Line 233 | Line 282 | public class ScheduledExecutorTest exten
282              shouldThrow();
283          } catch(RejectedExecutionException success){
284          } catch (SecurityException ok) {
285 <        }
285 >        }
286          joinPool(se);
287      }
288  
# Line 253 | Line 302 | public class ScheduledExecutorTest exten
302          assertEquals(1, p2.getActiveCount());
303          joinPool(p2);
304      }
305 <    
305 >
306      /**
307       *    getCompletedTaskCount increases, but doesn't overestimate,
308       *   when tasks complete
# Line 270 | Line 319 | public class ScheduledExecutorTest exten
319          assertEquals(1, p2.getCompletedTaskCount());
320          joinPool(p2);
321      }
322 <    
322 >
323      /**
324 <     *  getCorePoolSize returns size given in constructor if not otherwise set
324 >     *  getCorePoolSize returns size given in constructor if not otherwise set
325       */
326      public void testGetCorePoolSize() {
327          ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
328          assertEquals(1, p1.getCorePoolSize());
329          joinPool(p1);
330      }
331 <    
331 >
332      /**
333       *    getLargestPoolSize increases, but doesn't overestimate, when
334       *   multiple threads active
# Line 297 | Line 346 | public class ScheduledExecutorTest exten
346          assertEquals(2, p2.getLargestPoolSize());
347          joinPool(p2);
348      }
349 <    
349 >
350      /**
351       *   getPoolSize increases, but doesn't overestimate, when threads
352       *   become active
# Line 309 | Line 358 | public class ScheduledExecutorTest exten
358          assertEquals(1, p1.getPoolSize());
359          joinPool(p1);
360      }
361 <    
361 >
362      /**
363       *    getTaskCount increases, but doesn't overestimate, when tasks
364       *    submitted
# Line 328 | Line 377 | public class ScheduledExecutorTest exten
377          joinPool(p1);
378      }
379  
380 <    /**
380 >    /**
381       * getThreadFactory returns factory in constructor if not set
382       */
383      public void testGetThreadFactory() {
# Line 338 | Line 387 | public class ScheduledExecutorTest exten
387          joinPool(p);
388      }
389  
390 <    /**
390 >    /**
391       * setThreadFactory sets the thread factory returned by getThreadFactory
392       */
393      public void testSetThreadFactory() {
# Line 349 | Line 398 | public class ScheduledExecutorTest exten
398          joinPool(p);
399      }
400  
401 <    /**
401 >    /**
402       * setThreadFactory(null) throws NPE
403       */
404      public void testSetThreadFactoryNull() {
# Line 362 | Line 411 | public class ScheduledExecutorTest exten
411              joinPool(p);
412          }
413      }
414 <    
414 >
415      /**
416       *   is isShutDown is false before shutdown, true after
417       */
418      public void testIsShutdown() {
419 <        
419 >
420          ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
421          try {
422              assertFalse(p1.isShutdown());
# Line 378 | Line 427 | public class ScheduledExecutorTest exten
427          assertTrue(p1.isShutdown());
428      }
429  
430 <        
430 >
431      /**
432       *   isTerminated is false before termination, true after
433       */
# Line 394 | Line 443 | public class ScheduledExecutorTest exten
443              assertTrue(p1.isTerminated());
444          } catch(Exception e){
445              unexpectedException();
446 <        }      
446 >        }
447      }
448  
449      /**
# Line 415 | Line 464 | public class ScheduledExecutorTest exten
464              assertFalse(p1.isTerminating());
465          } catch(Exception e){
466              unexpectedException();
467 <        }      
467 >        }
468      }
469  
470      /**
# Line 474 | Line 523 | public class ScheduledExecutorTest exten
523          ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
524          ScheduledFuture[] tasks = new ScheduledFuture[5];
525          for(int i = 0; i < 5; i++){
526 <            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, TimeUnit.MILLISECONDS);
526 >            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
527 >        }
528 >        try {
529 >            int max = 5;
530 >            if (tasks[4].cancel(true)) --max;
531 >            if (tasks[3].cancel(true)) --max;
532 >            // There must eventually be an interference-free point at
533 >            // which purge will not fail. (At worst, when queue is empty.)
534 >            int k;
535 >            for (k = 0; k < SMALL_DELAY_MS; ++k) {
536 >                p1.purge();
537 >                long count = p1.getTaskCount();
538 >                if (count >= 0 && count <= max)
539 >                    break;
540 >                Thread.sleep(1);
541 >            }
542 >            assertTrue(k < SMALL_DELAY_MS);
543 >        } catch(Exception e) {
544 >            unexpectedException();
545 >        } finally {
546 >            joinPool(p1);
547          }
479        int max = 5;
480        if (tasks[4].cancel(true)) --max;
481        if (tasks[3].cancel(true)) --max;
482        p1.purge();
483        long count = p1.getTaskCount();
484        assertTrue(count > 0 && count <= max);
485        joinPool(p1);
548      }
549  
550      /**
# Line 495 | Line 557 | public class ScheduledExecutorTest exten
557          List l;
558          try {
559              l = p1.shutdownNow();
560 <        } catch (SecurityException ok) {
560 >        } catch (SecurityException ok) {
561              return;
562          }
563          assertTrue(p1.isShutdown());
# Line 528 | Line 590 | public class ScheduledExecutorTest exten
590                  assertTrue(tasks[i].isDone());
591                  assertFalse(tasks[i].isCancelled());
592              }
593 <            
593 >
594          }
595          catch(Exception ex) {
596              unexpectedException();
# Line 607 | Line 669 | public class ScheduledExecutorTest exten
669          catch(Exception ex) {
670              unexpectedException();
671          }
672 <        finally {
672 >        finally {
673              joinPool(p1);
674          }
675      }
# Line 672 | Line 734 | public class ScheduledExecutorTest exten
734          }
735      }
736  
675
676
677
678
737      /**
738       * invokeAny(null) throws NPE
739       */
# Line 818 | Line 876 | public class ScheduledExecutorTest exten
876              l.add(new NPETask());
877              List<Future<String>> result = e.invokeAll(l);
878              assertEquals(1, result.size());
879 <            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
879 >            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
880                  it.next().get();
881          } catch(ExecutionException success) {
882          } catch(Exception ex) {
# Line 839 | Line 897 | public class ScheduledExecutorTest exten
897              l.add(new StringTask());
898              List<Future<String>> result = e.invokeAll(l);
899              assertEquals(2, result.size());
900 <            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
900 >            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
901                  assertSame(TEST_STRING, it.next().get());
902          } catch (ExecutionException success) {
903          } catch(Exception ex) {
# Line 1026 | Line 1084 | public class ScheduledExecutorTest exten
1084              l.add(new NPETask());
1085              List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1086              assertEquals(1, result.size());
1087 <            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1087 >            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1088                  it.next().get();
1089          } catch(ExecutionException success) {
1090          } catch(Exception ex) {
# Line 1047 | Line 1105 | public class ScheduledExecutorTest exten
1105              l.add(new StringTask());
1106              List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1107              assertEquals(2, result.size());
1108 <            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1108 >            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1109                  assertSame(TEST_STRING, it.next().get());
1110          } catch (ExecutionException success) {
1111          } catch(Exception ex) {
# Line 1069 | Line 1127 | public class ScheduledExecutorTest exten
1127              l.add(new StringTask());
1128              List<Future<String>> result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
1129              assertEquals(3, result.size());
1130 <            Iterator<Future<String>> it = result.iterator();
1130 >            Iterator<Future<String>> it = result.iterator();
1131              Future<String> f1 = it.next();
1132              Future<String> f2 = it.next();
1133              Future<String> f3 = it.next();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines