21 |
|
} |
22 |
|
|
23 |
|
/** |
24 |
< |
* |
24 |
> |
* Zero, negative, and positive initial values are allowed in constructor |
25 |
|
*/ |
26 |
< |
public void testConstructor1() { |
27 |
< |
FairSemaphore s = new FairSemaphore(0); |
28 |
< |
assertEquals(0, s.availablePermits()); |
26 |
> |
public void testConstructor() { |
27 |
> |
FairSemaphore s0 = new FairSemaphore(0); |
28 |
> |
assertEquals(0, s0.availablePermits()); |
29 |
> |
FairSemaphore s1 = new FairSemaphore(-1); |
30 |
> |
assertEquals(-1, s1.availablePermits()); |
31 |
> |
FairSemaphore s2 = new FairSemaphore(-1); |
32 |
> |
assertEquals(-1, s2.availablePermits()); |
33 |
|
} |
34 |
|
|
35 |
|
/** |
36 |
< |
* |
33 |
< |
*/ |
34 |
< |
public void testConstructor2() { |
35 |
< |
FairSemaphore s = new FairSemaphore(-1); |
36 |
< |
assertEquals(-1, s.availablePermits()); |
37 |
< |
} |
38 |
< |
|
39 |
< |
/** |
40 |
< |
* |
36 |
> |
* tryAcquire succeeds when sufficent permits, else fails |
37 |
|
*/ |
38 |
|
public void testTryAcquireInSameThread() { |
39 |
|
FairSemaphore s = new FairSemaphore(2); |
45 |
|
} |
46 |
|
|
47 |
|
/** |
48 |
< |
* |
48 |
> |
* tryAcquire(n) succeeds when sufficent permits, else fails |
49 |
|
*/ |
50 |
|
public void testTryAcquireNInSameThread() { |
51 |
|
FairSemaphore s = new FairSemaphore(2); |
56 |
|
} |
57 |
|
|
58 |
|
/** |
59 |
< |
* |
59 |
> |
* Acquire and release of semaphore succeed if initially available |
60 |
|
*/ |
61 |
|
public void testAcquireReleaseInSameThread() { |
62 |
|
FairSemaphore s = new FairSemaphore(1); |
78 |
|
} |
79 |
|
|
80 |
|
/** |
81 |
< |
* |
81 |
> |
* Acquire(n) and release(n) of semaphore succeed if initially available |
82 |
|
*/ |
83 |
|
public void testAcquireReleaseNInSameThread() { |
84 |
|
FairSemaphore s = new FairSemaphore(1); |
100 |
|
} |
101 |
|
|
102 |
|
/** |
103 |
< |
* |
103 |
> |
* Acquire(n) and release(n) of semaphore succeed if initially available |
104 |
|
*/ |
105 |
|
public void testAcquireUninterruptiblyReleaseNInSameThread() { |
106 |
|
FairSemaphore s = new FairSemaphore(1); |
121 |
|
} |
122 |
|
|
123 |
|
/** |
124 |
< |
* |
124 |
> |
* release(n) in one thread enables timed acquire(n) in another thread |
125 |
> |
*/ |
126 |
> |
public void testTimedAcquireReleaseNInSameThread() { |
127 |
> |
FairSemaphore s = new FairSemaphore(1); |
128 |
> |
try { |
129 |
> |
s.release(1); |
130 |
> |
assertTrue(s.tryAcquire(1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
131 |
> |
s.release(2); |
132 |
> |
assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
133 |
> |
s.release(3); |
134 |
> |
assertTrue(s.tryAcquire(3, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
135 |
> |
s.release(4); |
136 |
> |
assertTrue(s.tryAcquire(4, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
137 |
> |
s.release(5); |
138 |
> |
assertTrue(s.tryAcquire(5, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
139 |
> |
assertEquals(1, s.availablePermits()); |
140 |
> |
} catch( InterruptedException e){ |
141 |
> |
unexpectedException(); |
142 |
> |
} |
143 |
> |
} |
144 |
> |
|
145 |
> |
/** |
146 |
> |
* release in one thread enables timed acquire in another thread |
147 |
> |
*/ |
148 |
> |
public void testTimedAcquireReleaseInSameThread() { |
149 |
> |
FairSemaphore s = new FairSemaphore(1); |
150 |
> |
try { |
151 |
> |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
152 |
> |
s.release(); |
153 |
> |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
154 |
> |
s.release(); |
155 |
> |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
156 |
> |
s.release(); |
157 |
> |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
158 |
> |
s.release(); |
159 |
> |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
160 |
> |
s.release(); |
161 |
> |
assertEquals(1, s.availablePermits()); |
162 |
> |
} catch( InterruptedException e){ |
163 |
> |
unexpectedException(); |
164 |
> |
} |
165 |
> |
} |
166 |
> |
|
167 |
> |
/** |
168 |
> |
* A release in one thread enables an acquire in another thread |
169 |
|
*/ |
170 |
|
public void testAcquireReleaseInDifferentThreads() { |
171 |
< |
final FairSemaphore s = new FairSemaphore(1); |
171 |
> |
final FairSemaphore s = new FairSemaphore(0); |
172 |
|
Thread t = new Thread(new Runnable() { |
173 |
|
public void run() { |
174 |
|
try { |
176 |
|
s.acquire(); |
177 |
|
s.acquire(); |
178 |
|
s.acquire(); |
139 |
– |
s.acquire(); |
179 |
|
} catch(InterruptedException ie){ |
180 |
|
threadUnexpectedException(); |
181 |
|
} |
182 |
|
} |
183 |
|
}); |
145 |
– |
t.start(); |
184 |
|
try { |
185 |
+ |
t.start(); |
186 |
+ |
Thread.sleep(SHORT_DELAY_MS); |
187 |
+ |
s.release(); |
188 |
|
s.release(); |
189 |
|
s.release(); |
190 |
|
s.release(); |
191 |
|
s.release(); |
192 |
|
s.release(); |
193 |
|
t.join(); |
194 |
< |
assertEquals(1, s.availablePermits()); |
194 |
> |
assertEquals(2, s.availablePermits()); |
195 |
|
} catch( InterruptedException e){ |
196 |
|
unexpectedException(); |
197 |
|
} |
198 |
|
} |
199 |
|
|
200 |
|
/** |
201 |
< |
* |
201 |
> |
* release(n) in one thread enables acquire(n) in another thread |
202 |
|
*/ |
203 |
|
public void testAcquireReleaseNInDifferentThreads() { |
204 |
< |
final FairSemaphore s = new FairSemaphore(2); |
204 |
> |
final FairSemaphore s = new FairSemaphore(0); |
205 |
|
Thread t = new Thread(new Runnable() { |
206 |
|
public void run() { |
207 |
|
try { |
167 |
– |
s.release(2); |
168 |
– |
s.release(2); |
208 |
|
s.acquire(2); |
209 |
|
s.acquire(2); |
210 |
+ |
s.release(4); |
211 |
|
} catch(InterruptedException ie){ |
212 |
|
threadUnexpectedException(); |
213 |
|
} |
214 |
|
} |
215 |
|
}); |
176 |
– |
t.start(); |
216 |
|
try { |
217 |
+ |
t.start(); |
218 |
+ |
Thread.sleep(SHORT_DELAY_MS); |
219 |
+ |
s.release(6); |
220 |
|
s.acquire(2); |
221 |
|
s.acquire(2); |
222 |
|
s.release(2); |
181 |
– |
s.release(2); |
223 |
|
t.join(); |
224 |
|
} catch( InterruptedException e){ |
225 |
|
unexpectedException(); |
226 |
|
} |
227 |
|
} |
228 |
|
|
188 |
– |
/** |
189 |
– |
* |
190 |
– |
*/ |
191 |
– |
public void testTimedAcquireReleaseInSameThread() { |
192 |
– |
FairSemaphore s = new FairSemaphore(1); |
193 |
– |
try { |
194 |
– |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
195 |
– |
s.release(); |
196 |
– |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
197 |
– |
s.release(); |
198 |
– |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
199 |
– |
s.release(); |
200 |
– |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
201 |
– |
s.release(); |
202 |
– |
assertTrue(s.tryAcquire(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
203 |
– |
s.release(); |
204 |
– |
assertEquals(1, s.availablePermits()); |
205 |
– |
} catch( InterruptedException e){ |
206 |
– |
unexpectedException(); |
207 |
– |
} |
208 |
– |
} |
229 |
|
|
210 |
– |
/** |
211 |
– |
* |
212 |
– |
*/ |
213 |
– |
public void testTimedAcquireReleaseNInSameThread() { |
214 |
– |
FairSemaphore s = new FairSemaphore(1); |
215 |
– |
try { |
216 |
– |
s.release(1); |
217 |
– |
assertTrue(s.tryAcquire(1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
218 |
– |
s.release(2); |
219 |
– |
assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
220 |
– |
s.release(3); |
221 |
– |
assertTrue(s.tryAcquire(3, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
222 |
– |
s.release(4); |
223 |
– |
assertTrue(s.tryAcquire(4, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
224 |
– |
s.release(5); |
225 |
– |
assertTrue(s.tryAcquire(5, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
226 |
– |
assertEquals(1, s.availablePermits()); |
227 |
– |
} catch( InterruptedException e){ |
228 |
– |
unexpectedException(); |
229 |
– |
} |
230 |
– |
} |
230 |
|
|
231 |
|
/** |
232 |
< |
* |
232 |
> |
* release in one thread enables timed acquire in another thread |
233 |
|
*/ |
234 |
|
public void testTimedAcquireReleaseInDifferentThreads() { |
235 |
|
final FairSemaphore s = new FairSemaphore(1); |
261 |
|
} |
262 |
|
|
263 |
|
/** |
264 |
< |
* |
264 |
> |
* release(n) in one thread enables timed acquire(n) in another thread |
265 |
|
*/ |
266 |
|
public void testTimedAcquireReleaseNInDifferentThreads() { |
267 |
|
final FairSemaphore s = new FairSemaphore(2); |
279 |
|
}); |
280 |
|
t.start(); |
281 |
|
try { |
283 |
– |
s.release(2); |
282 |
|
assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
283 |
|
s.release(2); |
284 |
|
assertTrue(s.tryAcquire(2, SHORT_DELAY_MS, TimeUnit.MILLISECONDS)); |
285 |
+ |
s.release(2); |
286 |
|
t.join(); |
287 |
|
} catch( InterruptedException e){ |
288 |
|
unexpectedException(); |
290 |
|
} |
291 |
|
|
292 |
|
/** |
293 |
< |
* |
293 |
> |
* A waiting acquire blocks interruptibly |
294 |
|
*/ |
295 |
|
public void testAcquire_InterruptedException() { |
296 |
|
final FairSemaphore s = new FairSemaphore(0); |
313 |
|
} |
314 |
|
|
315 |
|
/** |
316 |
< |
* |
316 |
> |
* A waiting acquire(n) blocks interruptibly |
317 |
|
*/ |
318 |
|
public void testAcquireN_InterruptedException() { |
319 |
|
final FairSemaphore s = new FairSemaphore(2); |
336 |
|
} |
337 |
|
|
338 |
|
/** |
339 |
< |
* |
339 |
> |
* A waiting tryAcquire blocks interruptibly |
340 |
|
*/ |
341 |
|
public void testTryAcquire_InterruptedException() { |
342 |
|
final FairSemaphore s = new FairSemaphore(0); |
360 |
|
} |
361 |
|
|
362 |
|
/** |
363 |
< |
* |
363 |
> |
* A waiting tryAcquire(n) blocks interruptibly |
364 |
|
*/ |
365 |
|
public void testTryAcquireN_InterruptedException() { |
366 |
|
final FairSemaphore s = new FairSemaphore(1); |
384 |
|
} |
385 |
|
|
386 |
|
/** |
387 |
< |
* |
387 |
> |
* a deserialized serialized semaphore has same number of permits |
388 |
|
*/ |
389 |
|
public void testSerialization() { |
390 |
|
FairSemaphore l = new FairSemaphore(3); |