ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.76
Committed: Tue Oct 6 00:03:55 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.75: +6 -2 lines
Log Message:
improve testInterruptedTimedPoll

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.7 * 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.47 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.15 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.64 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.util.ArrayList;
12 jsr166 1.53 import java.util.Arrays;
13 jsr166 1.63 import java.util.Collection;
14 jsr166 1.53 import java.util.Iterator;
15     import java.util.NoSuchElementException;
16     import java.util.concurrent.BlockingQueue;
17     import java.util.concurrent.CountDownLatch;
18     import java.util.concurrent.Delayed;
19     import java.util.concurrent.DelayQueue;
20     import java.util.concurrent.Executors;
21     import java.util.concurrent.ExecutorService;
22     import java.util.concurrent.TimeUnit;
23 jsr166 1.64
24     import junit.framework.Test;
25 dl 1.1
26 dl 1.3 public class DelayQueueTest extends JSR166TestCase {
27 jsr166 1.53
28     public static class Generic extends BlockingQueueTest {
29     protected BlockingQueue emptyCollection() {
30     return new DelayQueue();
31     }
32     protected PDelay makeElement(int i) {
33     return new PDelay(i);
34     }
35     }
36    
37 dl 1.1 public static void main(String[] args) {
38 jsr166 1.71 main(suite(), args);
39 dl 1.1 }
40    
41     public static Test suite() {
42 jsr166 1.53 return newTestSuite(DelayQueueTest.class,
43     new Generic().testSuite());
44 dl 1.1 }
45    
46 dl 1.4 /**
47 dl 1.8 * A delayed implementation for testing.
48 jsr166 1.28 * Most tests use Pseudodelays, where delays are all elapsed
49 dl 1.4 * (so, no blocking solely for delays) but are still ordered
50 jsr166 1.15 */
51     static class PDelay implements Delayed {
52 dl 1.1 int pseudodelay;
53 jsr166 1.55 PDelay(int i) { pseudodelay = i; }
54     public int compareTo(PDelay other) {
55     int a = this.pseudodelay;
56     int b = other.pseudodelay;
57     return (a < b) ? -1 : (a > b) ? 1 : 0;
58 dl 1.1 }
59 dl 1.10 public int compareTo(Delayed y) {
60 jsr166 1.28 return compareTo((PDelay)y);
61 dl 1.1 }
62     public boolean equals(Object other) {
63 jsr166 1.55 return (other instanceof PDelay) &&
64     this.pseudodelay == ((PDelay)other).pseudodelay;
65 dl 1.1 }
66 jsr166 1.61 // suppress [overrides] javac warning
67     public int hashCode() { return pseudodelay; }
68 dl 1.1 public long getDelay(TimeUnit ignore) {
69 jsr166 1.55 return Integer.MIN_VALUE + pseudodelay;
70 dl 1.1 }
71     public String toString() {
72     return String.valueOf(pseudodelay);
73     }
74     }
75    
76 dl 1.4 /**
77     * Delayed implementation that actually delays
78     */
79 jsr166 1.15 static class NanoDelay implements Delayed {
80 dl 1.4 long trigger;
81 jsr166 1.15 NanoDelay(long i) {
82 dl 1.4 trigger = System.nanoTime() + i;
83     }
84 dl 1.10 public int compareTo(NanoDelay y) {
85 dl 1.4 long i = trigger;
86 jsr166 1.28 long j = y.trigger;
87 dl 1.4 if (i < j) return -1;
88     if (i > j) return 1;
89     return 0;
90     }
91    
92 dl 1.10 public int compareTo(Delayed y) {
93 jsr166 1.28 return compareTo((NanoDelay)y);
94 dl 1.4 }
95    
96     public boolean equals(Object other) {
97 jsr166 1.28 return equals((NanoDelay)other);
98 dl 1.4 }
99     public boolean equals(NanoDelay other) {
100 jsr166 1.28 return other.trigger == trigger;
101 dl 1.4 }
102    
103 jsr166 1.61 // suppress [overrides] javac warning
104     public int hashCode() { return (int) trigger; }
105    
106 dl 1.4 public long getDelay(TimeUnit unit) {
107     long n = trigger - System.nanoTime();
108     return unit.convert(n, TimeUnit.NANOSECONDS);
109     }
110    
111     public long getTriggerTime() {
112     return trigger;
113     }
114    
115     public String toString() {
116     return String.valueOf(trigger);
117     }
118     }
119 dl 1.1
120     /**
121 jsr166 1.60 * Returns a new queue of given size containing consecutive
122 dl 1.1 * PDelays 0 ... n.
123     */
124 jsr166 1.45 private DelayQueue<PDelay> populatedQueue(int n) {
125     DelayQueue<PDelay> q = new DelayQueue<PDelay>();
126 dl 1.1 assertTrue(q.isEmpty());
127 jsr166 1.74 for (int i = n - 1; i >= 0; i -= 2)
128 jsr166 1.18 assertTrue(q.offer(new PDelay(i)));
129 jsr166 1.65 for (int i = (n & 1); i < n; i += 2)
130 jsr166 1.18 assertTrue(q.offer(new PDelay(i)));
131 dl 1.1 assertFalse(q.isEmpty());
132 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
133 jsr166 1.18 assertEquals(n, q.size());
134 dl 1.1 return q;
135     }
136 jsr166 1.15
137 dl 1.4 /**
138 dl 1.5 * A new queue has unbounded capacity
139 dl 1.4 */
140     public void testConstructor1() {
141 jsr166 1.70 assertEquals(Integer.MAX_VALUE, new DelayQueue().remainingCapacity());
142 dl 1.1 }
143    
144 dl 1.4 /**
145 dl 1.5 * Initializing from null Collection throws NPE
146 dl 1.4 */
147     public void testConstructor3() {
148 dl 1.1 try {
149 jsr166 1.69 new DelayQueue(null);
150 dl 1.4 shouldThrow();
151 jsr166 1.20 } catch (NullPointerException success) {}
152 dl 1.1 }
153    
154 dl 1.4 /**
155 dl 1.5 * Initializing from Collection of null elements throws NPE
156 dl 1.4 */
157     public void testConstructor4() {
158 dl 1.1 try {
159 jsr166 1.72 new DelayQueue(Arrays.asList(new PDelay[SIZE]));
160 dl 1.4 shouldThrow();
161 jsr166 1.20 } catch (NullPointerException success) {}
162 dl 1.1 }
163    
164 dl 1.4 /**
165 dl 1.5 * Initializing from Collection with some null elements throws NPE
166 dl 1.4 */
167     public void testConstructor5() {
168 jsr166 1.72 PDelay[] a = new PDelay[SIZE];
169 jsr166 1.73 for (int i = 0; i < SIZE - 1; ++i)
170 jsr166 1.72 a[i] = new PDelay(i);
171 dl 1.1 try {
172 jsr166 1.72 new DelayQueue(Arrays.asList(a));
173 dl 1.4 shouldThrow();
174 jsr166 1.20 } catch (NullPointerException success) {}
175 dl 1.1 }
176    
177 dl 1.4 /**
178 dl 1.5 * Queue contains all elements of collection used to initialize
179 dl 1.4 */
180     public void testConstructor6() {
181 jsr166 1.21 PDelay[] ints = new PDelay[SIZE];
182     for (int i = 0; i < SIZE; ++i)
183     ints[i] = new PDelay(i);
184     DelayQueue q = new DelayQueue(Arrays.asList(ints));
185     for (int i = 0; i < SIZE; ++i)
186     assertEquals(ints[i], q.poll());
187 dl 1.1 }
188    
189 dl 1.4 /**
190 dl 1.5 * isEmpty is true before add, false after
191 dl 1.4 */
192 dl 1.1 public void testEmpty() {
193     DelayQueue q = new DelayQueue();
194     assertTrue(q.isEmpty());
195 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
196 dl 1.1 q.add(new PDelay(1));
197     assertFalse(q.isEmpty());
198     q.add(new PDelay(2));
199     q.remove();
200     q.remove();
201     assertTrue(q.isEmpty());
202     }
203    
204 dl 1.4 /**
205 jsr166 1.70 * remainingCapacity() always returns Integer.MAX_VALUE
206 dl 1.4 */
207     public void testRemainingCapacity() {
208 jsr166 1.70 BlockingQueue q = populatedQueue(SIZE);
209 dl 1.3 for (int i = 0; i < SIZE; ++i) {
210 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
211 jsr166 1.73 assertEquals(SIZE - i, q.size());
212 jsr166 1.70 assertTrue(q.remove() instanceof PDelay);
213 dl 1.1 }
214 dl 1.3 for (int i = 0; i < SIZE; ++i) {
215 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
216 dl 1.1 assertEquals(i, q.size());
217 jsr166 1.70 assertTrue(q.add(new PDelay(i)));
218 dl 1.1 }
219     }
220    
221 dl 1.4 /**
222 dl 1.5 * offer non-null succeeds
223 dl 1.4 */
224 dl 1.1 public void testOffer() {
225     DelayQueue q = new DelayQueue();
226     assertTrue(q.offer(new PDelay(0)));
227     assertTrue(q.offer(new PDelay(1)));
228     }
229    
230 dl 1.4 /**
231 dl 1.5 * add succeeds
232 dl 1.4 */
233     public void testAdd() {
234 dl 1.1 DelayQueue q = new DelayQueue();
235 dl 1.3 for (int i = 0; i < SIZE; ++i) {
236 dl 1.1 assertEquals(i, q.size());
237     assertTrue(q.add(new PDelay(i)));
238     }
239     }
240    
241 dl 1.4 /**
242 dl 1.6 * addAll(this) throws IAE
243     */
244     public void testAddAllSelf() {
245 jsr166 1.72 DelayQueue q = populatedQueue(SIZE);
246 dl 1.6 try {
247     q.addAll(q);
248     shouldThrow();
249 jsr166 1.20 } catch (IllegalArgumentException success) {}
250 dl 1.6 }
251    
252 dl 1.4 /**
253 dl 1.5 * addAll of a collection with any null elements throws NPE after
254     * possibly adding some elements
255 dl 1.4 */
256     public void testAddAll3() {
257 jsr166 1.72 DelayQueue q = new DelayQueue();
258     PDelay[] a = new PDelay[SIZE];
259 jsr166 1.73 for (int i = 0; i < SIZE - 1; ++i)
260 jsr166 1.72 a[i] = new PDelay(i);
261 dl 1.1 try {
262 jsr166 1.72 q.addAll(Arrays.asList(a));
263 dl 1.4 shouldThrow();
264 jsr166 1.20 } catch (NullPointerException success) {}
265 dl 1.1 }
266    
267 dl 1.4 /**
268 dl 1.5 * Queue contains all elements of successful addAll
269 dl 1.4 */
270     public void testAddAll5() {
271 jsr166 1.21 PDelay[] empty = new PDelay[0];
272     PDelay[] ints = new PDelay[SIZE];
273 jsr166 1.73 for (int i = SIZE - 1; i >= 0; --i)
274 jsr166 1.21 ints[i] = new PDelay(i);
275     DelayQueue q = new DelayQueue();
276     assertFalse(q.addAll(Arrays.asList(empty)));
277     assertTrue(q.addAll(Arrays.asList(ints)));
278     for (int i = 0; i < SIZE; ++i)
279     assertEquals(ints[i], q.poll());
280 dl 1.1 }
281    
282 dl 1.4 /**
283 dl 1.5 * all elements successfully put are contained
284 dl 1.4 */
285 jsr166 1.48 public void testPut() {
286     DelayQueue q = new DelayQueue();
287     for (int i = 0; i < SIZE; ++i) {
288 jsr166 1.66 PDelay x = new PDelay(i);
289     q.put(x);
290     assertTrue(q.contains(x));
291 jsr166 1.48 }
292     assertEquals(SIZE, q.size());
293 dl 1.1 }
294    
295 dl 1.4 /**
296 dl 1.5 * put doesn't block waiting for take
297 dl 1.4 */
298 jsr166 1.20 public void testPutWithTake() throws InterruptedException {
299 dl 1.1 final DelayQueue q = new DelayQueue();
300 jsr166 1.50 Thread t = newStartedThread(new CheckedRunnable() {
301 jsr166 1.20 public void realRun() {
302     q.put(new PDelay(0));
303     q.put(new PDelay(0));
304     q.put(new PDelay(0));
305     q.put(new PDelay(0));
306     }});
307    
308 jsr166 1.50 awaitTermination(t);
309     assertEquals(4, q.size());
310 dl 1.1 }
311    
312 dl 1.4 /**
313 dl 1.5 * timed offer does not time out
314 dl 1.4 */
315 jsr166 1.20 public void testTimedOffer() throws InterruptedException {
316 dl 1.1 final DelayQueue q = new DelayQueue();
317 jsr166 1.50 Thread t = newStartedThread(new CheckedRunnable() {
318 jsr166 1.20 public void realRun() throws InterruptedException {
319     q.put(new PDelay(0));
320     q.put(new PDelay(0));
321 jsr166 1.24 assertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, MILLISECONDS));
322     assertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, MILLISECONDS));
323 jsr166 1.20 }});
324 jsr166 1.15
325 jsr166 1.50 awaitTermination(t);
326 dl 1.1 }
327    
328 dl 1.4 /**
329 dl 1.5 * take retrieves elements in priority order
330 dl 1.4 */
331 jsr166 1.20 public void testTake() throws InterruptedException {
332     DelayQueue q = populatedQueue(SIZE);
333     for (int i = 0; i < SIZE; ++i) {
334 jsr166 1.67 assertEquals(new PDelay(i), q.take());
335 jsr166 1.18 }
336 dl 1.1 }
337    
338 dl 1.4 /**
339 dl 1.5 * Take removes existing elements until empty, then blocks interruptibly
340 dl 1.4 */
341 jsr166 1.20 public void testBlockingTake() throws InterruptedException {
342 jsr166 1.25 final DelayQueue q = populatedQueue(SIZE);
343 jsr166 1.50 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
344     Thread t = newStartedThread(new CheckedRunnable() {
345 jsr166 1.20 public void realRun() throws InterruptedException {
346     for (int i = 0; i < SIZE; ++i) {
347 jsr166 1.25 assertEquals(new PDelay(i), ((PDelay)q.take()));
348 jsr166 1.20 }
349 jsr166 1.50
350     Thread.currentThread().interrupt();
351     try {
352     q.take();
353     shouldThrow();
354     } catch (InterruptedException success) {}
355     assertFalse(Thread.interrupted());
356    
357     pleaseInterrupt.countDown();
358 jsr166 1.25 try {
359     q.take();
360     shouldThrow();
361     } catch (InterruptedException success) {}
362 jsr166 1.50 assertFalse(Thread.interrupted());
363 jsr166 1.25 }});
364 jsr166 1.20
365 jsr166 1.50 await(pleaseInterrupt);
366     assertThreadStaysAlive(t);
367 jsr166 1.20 t.interrupt();
368 jsr166 1.50 awaitTermination(t);
369 dl 1.1 }
370    
371 dl 1.4 /**
372 dl 1.5 * poll succeeds unless empty
373 dl 1.4 */
374     public void testPoll() {
375 dl 1.3 DelayQueue q = populatedQueue(SIZE);
376     for (int i = 0; i < SIZE; ++i) {
377 jsr166 1.67 assertEquals(new PDelay(i), q.poll());
378 dl 1.1 }
379 jsr166 1.18 assertNull(q.poll());
380 dl 1.1 }
381    
382 dl 1.4 /**
383 jsr166 1.41 * timed poll with zero timeout succeeds when non-empty, else times out
384 dl 1.4 */
385 jsr166 1.20 public void testTimedPoll0() throws InterruptedException {
386     DelayQueue q = populatedQueue(SIZE);
387     for (int i = 0; i < SIZE; ++i) {
388 jsr166 1.67 assertEquals(new PDelay(i), q.poll(0, MILLISECONDS));
389 jsr166 1.18 }
390 jsr166 1.20 assertNull(q.poll(0, MILLISECONDS));
391 dl 1.1 }
392    
393 dl 1.4 /**
394 jsr166 1.41 * timed poll with nonzero timeout succeeds when non-empty, else times out
395 dl 1.4 */
396 jsr166 1.20 public void testTimedPoll() throws InterruptedException {
397     DelayQueue q = populatedQueue(SIZE);
398     for (int i = 0; i < SIZE; ++i) {
399 jsr166 1.51 long startTime = System.nanoTime();
400 jsr166 1.67 assertEquals(new PDelay(i), q.poll(LONG_DELAY_MS, MILLISECONDS));
401 jsr166 1.51 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
402 jsr166 1.18 }
403 jsr166 1.51 long startTime = System.nanoTime();
404     assertNull(q.poll(timeoutMillis(), MILLISECONDS));
405     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
406     checkEmpty(q);
407 dl 1.1 }
408    
409 dl 1.4 /**
410 dl 1.5 * Interrupted timed poll throws InterruptedException instead of
411     * returning timeout status
412 dl 1.4 */
413 jsr166 1.20 public void testInterruptedTimedPoll() throws InterruptedException {
414 jsr166 1.50 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
415 jsr166 1.76 final DelayQueue q = populatedQueue(SIZE);
416 jsr166 1.50 Thread t = newStartedThread(new CheckedRunnable() {
417 jsr166 1.20 public void realRun() throws InterruptedException {
418 jsr166 1.76 long startTime = System.nanoTime();
419 jsr166 1.20 for (int i = 0; i < SIZE; ++i) {
420 jsr166 1.76 assertEquals(new PDelay(i),
421     ((PDelay)q.poll(LONG_DELAY_MS, MILLISECONDS)));
422 jsr166 1.20 }
423 jsr166 1.50
424     Thread.currentThread().interrupt();
425     try {
426     q.poll(LONG_DELAY_MS, MILLISECONDS);
427     shouldThrow();
428     } catch (InterruptedException success) {}
429     assertFalse(Thread.interrupted());
430    
431     pleaseInterrupt.countDown();
432 jsr166 1.20 try {
433 jsr166 1.50 q.poll(LONG_DELAY_MS, MILLISECONDS);
434 jsr166 1.20 shouldThrow();
435     } catch (InterruptedException success) {}
436 jsr166 1.50 assertFalse(Thread.interrupted());
437 jsr166 1.76 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
438 jsr166 1.20 }});
439    
440 jsr166 1.50 await(pleaseInterrupt);
441     assertThreadStaysAlive(t);
442 jsr166 1.20 t.interrupt();
443 jsr166 1.50 awaitTermination(t);
444 jsr166 1.76 checkEmpty(q);
445 dl 1.1 }
446    
447 dl 1.4 /**
448 dl 1.5 * peek returns next element, or null if empty
449 dl 1.4 */
450     public void testPeek() {
451 dl 1.3 DelayQueue q = populatedQueue(SIZE);
452     for (int i = 0; i < SIZE; ++i) {
453 jsr166 1.67 assertEquals(new PDelay(i), q.peek());
454     assertEquals(new PDelay(i), q.poll());
455 dl 1.12 if (q.isEmpty())
456     assertNull(q.peek());
457     else
458 jsr166 1.26 assertFalse(new PDelay(i).equals(q.peek()));
459 dl 1.1 }
460 jsr166 1.18 assertNull(q.peek());
461 dl 1.1 }
462    
463 dl 1.4 /**
464 dl 1.5 * element returns next element, or throws NSEE if empty
465 dl 1.4 */
466     public void testElement() {
467 dl 1.3 DelayQueue q = populatedQueue(SIZE);
468     for (int i = 0; i < SIZE; ++i) {
469 jsr166 1.67 assertEquals(new PDelay(i), q.element());
470 dl 1.1 q.poll();
471     }
472     try {
473     q.element();
474 dl 1.4 shouldThrow();
475 jsr166 1.20 } catch (NoSuchElementException success) {}
476 dl 1.1 }
477    
478 dl 1.4 /**
479 dl 1.5 * remove removes next element, or throws NSEE if empty
480 dl 1.4 */
481     public void testRemove() {
482 dl 1.3 DelayQueue q = populatedQueue(SIZE);
483     for (int i = 0; i < SIZE; ++i) {
484 jsr166 1.67 assertEquals(new PDelay(i), q.remove());
485 dl 1.1 }
486     try {
487     q.remove();
488 dl 1.4 shouldThrow();
489 jsr166 1.20 } catch (NoSuchElementException success) {}
490 dl 1.1 }
491    
492 dl 1.4 /**
493 dl 1.5 * contains(x) reports true when elements added but not yet removed
494 dl 1.4 */
495     public void testContains() {
496 dl 1.3 DelayQueue q = populatedQueue(SIZE);
497     for (int i = 0; i < SIZE; ++i) {
498 dl 1.1 assertTrue(q.contains(new PDelay(i)));
499     q.poll();
500     assertFalse(q.contains(new PDelay(i)));
501     }
502     }
503    
504 dl 1.4 /**
505 dl 1.5 * clear removes all elements
506 dl 1.4 */
507     public void testClear() {
508 dl 1.3 DelayQueue q = populatedQueue(SIZE);
509 dl 1.1 q.clear();
510     assertTrue(q.isEmpty());
511     assertEquals(0, q.size());
512 jsr166 1.70 assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
513 dl 1.11 PDelay x = new PDelay(1);
514     q.add(x);
515 dl 1.1 assertFalse(q.isEmpty());
516 dl 1.11 assertTrue(q.contains(x));
517 dl 1.1 q.clear();
518     assertTrue(q.isEmpty());
519     }
520    
521 dl 1.4 /**
522 dl 1.5 * containsAll(c) is true when c contains a subset of elements
523 dl 1.4 */
524     public void testContainsAll() {
525 dl 1.3 DelayQueue q = populatedQueue(SIZE);
526 dl 1.1 DelayQueue p = new DelayQueue();
527 dl 1.3 for (int i = 0; i < SIZE; ++i) {
528 dl 1.1 assertTrue(q.containsAll(p));
529     assertFalse(p.containsAll(q));
530     p.add(new PDelay(i));
531     }
532     assertTrue(p.containsAll(q));
533     }
534    
535 dl 1.4 /**
536 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
537 dl 1.4 */
538     public void testRetainAll() {
539 dl 1.3 DelayQueue q = populatedQueue(SIZE);
540     DelayQueue p = populatedQueue(SIZE);
541     for (int i = 0; i < SIZE; ++i) {
542 dl 1.1 boolean changed = q.retainAll(p);
543     if (i == 0)
544     assertFalse(changed);
545     else
546     assertTrue(changed);
547    
548     assertTrue(q.containsAll(p));
549 jsr166 1.73 assertEquals(SIZE - i, q.size());
550 dl 1.1 p.remove();
551     }
552     }
553    
554 dl 1.4 /**
555 dl 1.5 * removeAll(c) removes only those elements of c and reports true if changed
556 dl 1.4 */
557     public void testRemoveAll() {
558 dl 1.3 for (int i = 1; i < SIZE; ++i) {
559     DelayQueue q = populatedQueue(SIZE);
560     DelayQueue p = populatedQueue(i);
561 dl 1.1 assertTrue(q.removeAll(p));
562 jsr166 1.73 assertEquals(SIZE - i, q.size());
563 dl 1.1 for (int j = 0; j < i; ++j) {
564 jsr166 1.66 PDelay x = (PDelay)(p.remove());
565     assertFalse(q.contains(x));
566 dl 1.1 }
567     }
568     }
569    
570 dl 1.4 /**
571 dl 1.5 * toArray contains all elements
572 dl 1.4 */
573 jsr166 1.20 public void testToArray() throws InterruptedException {
574 dl 1.3 DelayQueue q = populatedQueue(SIZE);
575 jsr166 1.18 Object[] o = q.toArray();
576 dl 1.1 Arrays.sort(o);
577 jsr166 1.18 for (int i = 0; i < o.length; i++)
578 jsr166 1.44 assertSame(o[i], q.take());
579 dl 1.1 }
580    
581 dl 1.4 /**
582 dl 1.5 * toArray(a) contains all elements
583 dl 1.4 */
584 jsr166 1.44 public void testToArray2() {
585 jsr166 1.45 DelayQueue<PDelay> q = populatedQueue(SIZE);
586 jsr166 1.18 PDelay[] ints = new PDelay[SIZE];
587 jsr166 1.45 PDelay[] array = q.toArray(ints);
588     assertSame(ints, array);
589 dl 1.1 Arrays.sort(ints);
590 jsr166 1.20 for (int i = 0; i < ints.length; i++)
591 jsr166 1.44 assertSame(ints[i], q.remove());
592 dl 1.1 }
593 dl 1.6
594     /**
595 jsr166 1.42 * toArray(incompatible array type) throws ArrayStoreException
596 dl 1.6 */
597     public void testToArray1_BadArg() {
598 jsr166 1.26 DelayQueue q = populatedQueue(SIZE);
599 jsr166 1.18 try {
600 jsr166 1.42 q.toArray(new String[10]);
601 jsr166 1.18 shouldThrow();
602 jsr166 1.20 } catch (ArrayStoreException success) {}
603 dl 1.6 }
604 jsr166 1.15
605 dl 1.4 /**
606 dl 1.5 * iterator iterates through all elements
607 dl 1.4 */
608     public void testIterator() {
609 dl 1.3 DelayQueue q = populatedQueue(SIZE);
610 dl 1.1 int i = 0;
611 jsr166 1.18 Iterator it = q.iterator();
612 jsr166 1.16 while (it.hasNext()) {
613 dl 1.1 assertTrue(q.contains(it.next()));
614     ++i;
615     }
616 dl 1.3 assertEquals(i, SIZE);
617 jsr166 1.68 assertIteratorExhausted(it);
618     }
619    
620     /**
621     * iterator of empty collection has no elements
622     */
623     public void testEmptyIterator() {
624     assertIteratorExhausted(new DelayQueue().iterator());
625 dl 1.1 }
626    
627 dl 1.4 /**
628 dl 1.5 * iterator.remove removes current element
629 dl 1.4 */
630 jsr166 1.31 public void testIteratorRemove() {
631 dl 1.1 final DelayQueue q = new DelayQueue();
632     q.add(new PDelay(2));
633     q.add(new PDelay(1));
634     q.add(new PDelay(3));
635     Iterator it = q.iterator();
636     it.next();
637     it.remove();
638     it = q.iterator();
639 jsr166 1.58 assertEquals(new PDelay(2), it.next());
640     assertEquals(new PDelay(3), it.next());
641 dl 1.1 assertFalse(it.hasNext());
642     }
643    
644 dl 1.4 /**
645 dl 1.5 * toString contains toStrings of elements
646 dl 1.4 */
647     public void testToString() {
648 dl 1.3 DelayQueue q = populatedQueue(SIZE);
649 dl 1.1 String s = q.toString();
650 jsr166 1.55 for (Object e : q)
651     assertTrue(s.contains(e.toString()));
652 jsr166 1.15 }
653 dl 1.1
654 dl 1.4 /**
655 jsr166 1.50 * timed poll transfers elements across Executor tasks
656 dl 1.4 */
657 dl 1.1 public void testPollInExecutor() {
658     final DelayQueue q = new DelayQueue();
659 jsr166 1.50 final CheckedBarrier threadsStarted = new CheckedBarrier(2);
660 jsr166 1.75 final ExecutorService executor = Executors.newFixedThreadPool(2);
661     try (PoolCleaner cleaner = cleaner(executor)) {
662     executor.execute(new CheckedRunnable() {
663     public void realRun() throws InterruptedException {
664     assertNull(q.poll());
665     threadsStarted.await();
666     assertNotNull(q.poll(LONG_DELAY_MS, MILLISECONDS));
667     checkEmpty(q);
668     }});
669    
670     executor.execute(new CheckedRunnable() {
671     public void realRun() throws InterruptedException {
672     threadsStarted.await();
673     q.put(new PDelay(1));
674     }});
675     }
676 dl 1.1 }
677    
678 dl 1.4 /**
679 dl 1.8 * Delayed actions do not occur until their delay elapses
680 dl 1.4 */
681 jsr166 1.20 public void testDelay() throws InterruptedException {
682 jsr166 1.37 DelayQueue<NanoDelay> q = new DelayQueue<NanoDelay>();
683     for (int i = 0; i < SIZE; ++i)
684     q.add(new NanoDelay(1000000L * (SIZE - i)));
685 dl 1.1
686 jsr166 1.20 long last = 0;
687     for (int i = 0; i < SIZE; ++i) {
688 jsr166 1.37 NanoDelay e = q.take();
689 jsr166 1.20 long tt = e.getTriggerTime();
690 jsr166 1.37 assertTrue(System.nanoTime() - tt >= 0);
691 jsr166 1.20 if (i != 0)
692     assertTrue(tt >= last);
693     last = tt;
694 dl 1.1 }
695 jsr166 1.37 assertTrue(q.isEmpty());
696 dl 1.1 }
697 dl 1.6
698 dl 1.12 /**
699     * peek of a non-empty queue returns non-null even if not expired
700     */
701     public void testPeekDelayed() {
702     DelayQueue q = new DelayQueue();
703     q.add(new NanoDelay(Long.MAX_VALUE));
704 jsr166 1.33 assertNotNull(q.peek());
705 dl 1.12 }
706    
707     /**
708     * poll of a non-empty queue returns null if no expired elements.
709     */
710     public void testPollDelayed() {
711     DelayQueue q = new DelayQueue();
712     q.add(new NanoDelay(Long.MAX_VALUE));
713     assertNull(q.poll());
714     }
715 dl 1.6
716     /**
717 dl 1.13 * timed poll of a non-empty queue returns null if no expired elements.
718     */
719 jsr166 1.20 public void testTimedPollDelayed() throws InterruptedException {
720 dl 1.13 DelayQueue q = new DelayQueue();
721 dl 1.14 q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
722 jsr166 1.52 assertNull(q.poll(timeoutMillis(), MILLISECONDS));
723 dl 1.13 }
724    
725     /**
726 dl 1.6 * drainTo(c) empties queue into another collection c
727 jsr166 1.15 */
728 dl 1.6 public void testDrainTo() {
729 dl 1.11 DelayQueue q = new DelayQueue();
730     PDelay[] elems = new PDelay[SIZE];
731     for (int i = 0; i < SIZE; ++i) {
732     elems[i] = new PDelay(i);
733     q.add(elems[i]);
734     }
735 dl 1.6 ArrayList l = new ArrayList();
736     q.drainTo(l);
737 jsr166 1.57 assertEquals(0, q.size());
738 jsr166 1.15 for (int i = 0; i < SIZE; ++i)
739 jsr166 1.58 assertEquals(elems[i], l.get(i));
740 dl 1.11 q.add(elems[0]);
741     q.add(elems[1]);
742     assertFalse(q.isEmpty());
743     assertTrue(q.contains(elems[0]));
744     assertTrue(q.contains(elems[1]));
745     l.clear();
746     q.drainTo(l);
747 jsr166 1.57 assertEquals(0, q.size());
748     assertEquals(2, l.size());
749 jsr166 1.15 for (int i = 0; i < 2; ++i)
750 jsr166 1.58 assertEquals(elems[i], l.get(i));
751 dl 1.6 }
752    
753     /**
754     * drainTo empties queue
755 jsr166 1.15 */
756 jsr166 1.20 public void testDrainToWithActivePut() throws InterruptedException {
757 dl 1.6 final DelayQueue q = populatedQueue(SIZE);
758 jsr166 1.20 Thread t = new Thread(new CheckedRunnable() {
759     public void realRun() {
760 jsr166 1.73 q.put(new PDelay(SIZE + 1));
761 jsr166 1.20 }});
762    
763     t.start();
764     ArrayList l = new ArrayList();
765     q.drainTo(l);
766     assertTrue(l.size() >= SIZE);
767     t.join();
768     assertTrue(q.size() + l.size() >= SIZE);
769 dl 1.6 }
770    
771     /**
772 jsr166 1.38 * drainTo(c, n) empties first min(n, size) elements of queue into c
773 jsr166 1.15 */
774 dl 1.6 public void testDrainToN() {
775     for (int i = 0; i < SIZE + 2; ++i) {
776     DelayQueue q = populatedQueue(SIZE);
777     ArrayList l = new ArrayList();
778     q.drainTo(l, i);
779 jsr166 1.39 int k = (i < SIZE) ? i : SIZE;
780 jsr166 1.73 assertEquals(SIZE - k, q.size());
781 jsr166 1.58 assertEquals(k, l.size());
782 dl 1.6 }
783     }
784    
785 jsr166 1.63 /**
786     * remove(null), contains(null) always return false
787     */
788     public void testNeverContainsNull() {
789     Collection<?> q = populatedQueue(SIZE);
790     assertFalse(q.contains(null));
791     assertFalse(q.remove(null));
792     }
793 dl 1.1 }