ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DelayQueueTest.java
Revision: 1.96
Committed: Wed Jan 27 02:55:18 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.95: +2 -1 lines
Log Message:
Suppress all new errorprone "errors"

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