ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.77
Committed: Thu Sep 15 17:07:16 2016 UTC (7 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.76: +2 -4 lines
Log Message:
fix errorprone NonOverridingEquals warning

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