ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorCompletionServiceTest.java
Revision: 1.22
Committed: Sun Oct 4 18:28:51 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +43 -55 lines
Log Message:
PoolCleaning

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 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 jsr166 1.13 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.7 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.19 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11 jsr166 1.18 import java.util.concurrent.ArrayBlockingQueue;
12     import java.util.concurrent.Callable;
13     import java.util.concurrent.ExecutorCompletionService;
14 jsr166 1.19 import java.util.concurrent.Executors;
15 jsr166 1.18 import java.util.concurrent.ExecutorService;
16     import java.util.concurrent.Future;
17     import java.util.concurrent.FutureTask;
18     import java.util.concurrent.RunnableFuture;
19     import java.util.concurrent.ThreadPoolExecutor;
20     import java.util.concurrent.TimeUnit;
21     import java.util.concurrent.atomic.AtomicBoolean;
22 jsr166 1.19
23     import junit.framework.Test;
24     import junit.framework.TestSuite;
25 dl 1.1
26 jsr166 1.8 public class ExecutorCompletionServiceTest extends JSR166TestCase {
27 dl 1.1 public static void main(String[] args) {
28 jsr166 1.21 main(suite(), args);
29 dl 1.1 }
30     public static Test suite() {
31     return new TestSuite(ExecutorCompletionServiceTest.class);
32     }
33    
34     /**
35     * Creating a new ECS with null Executor throw NPE
36 jsr166 1.7 */
37 dl 1.1 public void testConstructorNPE() {
38     try {
39 jsr166 1.20 new ExecutorCompletionService(null);
40 dl 1.1 shouldThrow();
41 jsr166 1.10 } catch (NullPointerException success) {}
42 dl 1.1 }
43    
44     /**
45     * Creating a new ECS with null queue throw NPE
46 jsr166 1.7 */
47 dl 1.1 public void testConstructorNPE2() {
48     try {
49     ExecutorService e = Executors.newCachedThreadPool();
50 jsr166 1.20 new ExecutorCompletionService(e, null);
51 dl 1.1 shouldThrow();
52 jsr166 1.10 } catch (NullPointerException success) {}
53 dl 1.1 }
54    
55     /**
56     * Submitting a null callable throws NPE
57 jsr166 1.7 */
58 dl 1.1 public void testSubmitNPE() {
59 jsr166 1.22 final ExecutorService e = Executors.newCachedThreadPool();
60     final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
61     try (PoolCleaner cleaner = cleaner(e)) {
62 dl 1.1 Callable c = null;
63 jsr166 1.22 try {
64     ecs.submit(c);
65     shouldThrow();
66     } catch (NullPointerException success) {}
67 dl 1.1 }
68     }
69    
70     /**
71     * Submitting a null runnable throws NPE
72 jsr166 1.7 */
73 dl 1.1 public void testSubmitNPE2() {
74 jsr166 1.22 final ExecutorService e = Executors.newCachedThreadPool();
75     final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
76     try (PoolCleaner cleaner = cleaner(e)) {
77 dl 1.1 Runnable r = null;
78 jsr166 1.22 try {
79     ecs.submit(r, Boolean.TRUE);
80     shouldThrow();
81     } catch (NullPointerException success) {}
82 dl 1.1 }
83     }
84    
85     /**
86     * A taken submitted task is completed
87 jsr166 1.7 */
88 jsr166 1.10 public void testTake() throws InterruptedException {
89 jsr166 1.22 final ExecutorService e = Executors.newCachedThreadPool();
90     final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
91     try (PoolCleaner cleaner = cleaner(e)) {
92 dl 1.1 Callable c = new StringTask();
93     ecs.submit(c);
94     Future f = ecs.take();
95 dl 1.3 assertTrue(f.isDone());
96 dl 1.1 }
97     }
98    
99     /**
100     * Take returns the same future object returned by submit
101 jsr166 1.7 */
102 jsr166 1.10 public void testTake2() throws InterruptedException {
103 jsr166 1.22 final ExecutorService e = Executors.newCachedThreadPool();
104     final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
105     try (PoolCleaner cleaner = cleaner(e)) {
106 dl 1.1 Callable c = new StringTask();
107     Future f1 = ecs.submit(c);
108     Future f2 = ecs.take();
109     assertSame(f1, f2);
110     }
111     }
112    
113     /**
114     * If poll returns non-null, the returned task is completed
115 jsr166 1.7 */
116 jsr166 1.16 public void testPoll1() throws Exception {
117 jsr166 1.22 final ExecutorService e = Executors.newCachedThreadPool();
118     final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
119     try (PoolCleaner cleaner = cleaner(e)) {
120 dl 1.1 assertNull(ecs.poll());
121     Callable c = new StringTask();
122     ecs.submit(c);
123 jsr166 1.16
124     long startTime = System.nanoTime();
125     Future f;
126     while ((f = ecs.poll()) == null) {
127     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
128     fail("timed out");
129     Thread.yield();
130 dl 1.1 }
131 jsr166 1.16 assertTrue(f.isDone());
132     assertSame(TEST_STRING, f.get());
133 dl 1.1 }
134     }
135    
136     /**
137     * If timed poll returns non-null, the returned task is completed
138 jsr166 1.7 */
139 jsr166 1.10 public void testPoll2() throws InterruptedException {
140 jsr166 1.22 final ExecutorService e = Executors.newCachedThreadPool();
141     final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
142     try (PoolCleaner cleaner = cleaner(e)) {
143 dl 1.1 assertNull(ecs.poll());
144     Callable c = new StringTask();
145     ecs.submit(c);
146 jsr166 1.9 Future f = ecs.poll(SHORT_DELAY_MS, MILLISECONDS);
147 jsr166 1.7 if (f != null)
148 dl 1.3 assertTrue(f.isDone());
149 dl 1.1 }
150     }
151 jsr166 1.12
152     /**
153     * Submitting to underlying AES that overrides newTaskFor(Callable)
154     * returns and eventually runs Future returned by newTaskFor.
155     */
156     public void testNewTaskForCallable() throws InterruptedException {
157     final AtomicBoolean done = new AtomicBoolean(false);
158     class MyCallableFuture<V> extends FutureTask<V> {
159     MyCallableFuture(Callable<V> c) { super(c); }
160     protected void done() { done.set(true); }
161     }
162 jsr166 1.22 final ExecutorService e =
163     new ThreadPoolExecutor(1, 1,
164     30L, TimeUnit.SECONDS,
165     new ArrayBlockingQueue<Runnable>(1)) {
166     protected <T> RunnableFuture<T> newTaskFor(Callable<T> c) {
167     return new MyCallableFuture<T>(c);
168     }};
169 jsr166 1.12 ExecutorCompletionService<String> ecs =
170     new ExecutorCompletionService<String>(e);
171 jsr166 1.22 try (PoolCleaner cleaner = cleaner(e)) {
172 jsr166 1.12 assertNull(ecs.poll());
173     Callable<String> c = new StringTask();
174     Future f1 = ecs.submit(c);
175     assertTrue("submit must return MyCallableFuture",
176     f1 instanceof MyCallableFuture);
177     Future f2 = ecs.take();
178     assertSame("submit and take must return same objects", f1, f2);
179     assertTrue("completed task must have set done", done.get());
180     }
181     }
182 dl 1.4
183 jsr166 1.12 /**
184     * Submitting to underlying AES that overrides newTaskFor(Runnable,T)
185     * returns and eventually runs Future returned by newTaskFor.
186     */
187     public void testNewTaskForRunnable() throws InterruptedException {
188     final AtomicBoolean done = new AtomicBoolean(false);
189     class MyRunnableFuture<V> extends FutureTask<V> {
190     MyRunnableFuture(Runnable t, V r) { super(t, r); }
191     protected void done() { done.set(true); }
192     }
193 jsr166 1.22 final ExecutorService e =
194     new ThreadPoolExecutor(1, 1,
195     30L, TimeUnit.SECONDS,
196     new ArrayBlockingQueue<Runnable>(1)) {
197     protected <T> RunnableFuture<T> newTaskFor(Runnable t, T r) {
198     return new MyRunnableFuture<T>(t, r);
199     }};
200     final ExecutorCompletionService<String> ecs =
201 jsr166 1.12 new ExecutorCompletionService<String>(e);
202 jsr166 1.22 try (PoolCleaner cleaner = cleaner(e)) {
203 jsr166 1.12 assertNull(ecs.poll());
204     Runnable r = new NoOpRunnable();
205     Future f1 = ecs.submit(r, null);
206     assertTrue("submit must return MyRunnableFuture",
207     f1 instanceof MyRunnableFuture);
208     Future f2 = ecs.take();
209     assertSame("submit and take must return same objects", f1, f2);
210     assertTrue("completed task must have set done", done.get());
211     }
212     }
213 dl 1.4
214 dl 1.1 }