ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExecutorCompletionServiceTest.java
Revision: 1.15
Committed: Fri May 27 19:42:42 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.14: +0 -2 lines
Log Message:
whitespace

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