ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.4
Committed: Sat Sep 20 00:31:57 2003 UTC (20 years, 8 months ago) by dl
Branch: MAIN
Changes since 1.3: +3 -1 lines
Log Message:
Added tests

File Contents

# User Rev Content
1 dl 1.1 /*
2     * Written by members of JCP JSR-166 Expert Group and released to the
3     * public domain. Use, modify, and redistribute this code in any way
4     * without acknowledgement. Other contributors include Andrew Wright,
5     * Jeffrey Hayes, Pat Fischer, Mike Judd.
6     */
7    
8     import junit.framework.*;
9     import java.util.*;
10     import java.util.concurrent.*;
11 dl 1.2 import java.io.*;
12 dl 1.1
13 dl 1.3 public class PriorityBlockingQueueTest extends JSR166TestCase {
14 dl 1.1 public static void main(String[] args) {
15     junit.textui.TestRunner.run (suite());
16     }
17    
18     public static Test suite() {
19     return new TestSuite(PriorityBlockingQueueTest.class);
20     }
21    
22 dl 1.3 private static final int NOCAP = Integer.MAX_VALUE;
23    
24     /** Sample Comparator */
25 dl 1.1 static class MyReverseComparator implements Comparator {
26     public int compare(Object x, Object y) {
27     int i = ((Integer)x).intValue();
28     int j = ((Integer)y).intValue();
29     if (i < j) return 1;
30     if (i > j) return -1;
31     return 0;
32     }
33     }
34    
35    
36     /**
37     * Create a queue of given size containing consecutive
38     * Integers 0 ... n.
39     */
40 dl 1.3 private PriorityBlockingQueue populatedQueue(int n) {
41 dl 1.1 PriorityBlockingQueue q = new PriorityBlockingQueue(n);
42     assertTrue(q.isEmpty());
43     for(int i = n-1; i >= 0; i-=2)
44     assertTrue(q.offer(new Integer(i)));
45     for(int i = (n & 1); i < n; i+=2)
46     assertTrue(q.offer(new Integer(i)));
47     assertFalse(q.isEmpty());
48     assertEquals(NOCAP, q.remainingCapacity());
49     assertEquals(n, q.size());
50     return q;
51     }
52    
53     public void testConstructor1(){
54 dl 1.3 assertEquals(NOCAP, new PriorityBlockingQueue(SIZE).remainingCapacity());
55 dl 1.1 }
56    
57     public void testConstructor2(){
58     try {
59     PriorityBlockingQueue q = new PriorityBlockingQueue(0);
60     fail("Cannot make zero-sized");
61     }
62     catch (IllegalArgumentException success) {}
63     }
64    
65     public void testConstructor3(){
66    
67     try {
68     PriorityBlockingQueue q = new PriorityBlockingQueue(null);
69     fail("Cannot make from null collection");
70     }
71     catch (NullPointerException success) {}
72     }
73    
74     public void testConstructor4(){
75     try {
76 dl 1.3 Integer[] ints = new Integer[SIZE];
77 dl 1.1 PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
78     fail("Cannot make with null elements");
79     }
80     catch (NullPointerException success) {}
81     }
82    
83     public void testConstructor5(){
84     try {
85 dl 1.3 Integer[] ints = new Integer[SIZE];
86     for (int i = 0; i < SIZE-1; ++i)
87 dl 1.1 ints[i] = new Integer(i);
88     PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
89     fail("Cannot make with null elements");
90     }
91     catch (NullPointerException success) {}
92     }
93    
94     public void testConstructor6(){
95     try {
96 dl 1.3 Integer[] ints = new Integer[SIZE];
97     for (int i = 0; i < SIZE; ++i)
98 dl 1.1 ints[i] = new Integer(i);
99     PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
100 dl 1.3 for (int i = 0; i < SIZE; ++i)
101 dl 1.1 assertEquals(ints[i], q.poll());
102     }
103     finally {}
104     }
105    
106     public void testConstructor7(){
107     try {
108 dl 1.4 MyReverseComparator cmp = new MyReverseComparator();
109     PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE, cmp);
110     assertEquals(cmp, q.comparator());
111 dl 1.3 Integer[] ints = new Integer[SIZE];
112     for (int i = 0; i < SIZE; ++i)
113 dl 1.1 ints[i] = new Integer(i);
114     q.addAll(Arrays.asList(ints));
115 dl 1.3 for (int i = SIZE-1; i >= 0; --i)
116 dl 1.1 assertEquals(ints[i], q.poll());
117     }
118     finally {}
119     }
120    
121     public void testEmpty() {
122     PriorityBlockingQueue q = new PriorityBlockingQueue(2);
123     assertTrue(q.isEmpty());
124     assertEquals(NOCAP, q.remainingCapacity());
125     q.add(new Integer(1));
126     assertFalse(q.isEmpty());
127     q.add(new Integer(2));
128     q.remove();
129     q.remove();
130     assertTrue(q.isEmpty());
131     }
132    
133     public void testRemainingCapacity(){
134 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
135     for (int i = 0; i < SIZE; ++i) {
136 dl 1.1 assertEquals(NOCAP, q.remainingCapacity());
137 dl 1.3 assertEquals(SIZE-i, q.size());
138 dl 1.1 q.remove();
139     }
140 dl 1.3 for (int i = 0; i < SIZE; ++i) {
141 dl 1.1 assertEquals(NOCAP, q.remainingCapacity());
142     assertEquals(i, q.size());
143     q.add(new Integer(i));
144     }
145     }
146    
147     public void testOfferNull(){
148     try {
149     PriorityBlockingQueue q = new PriorityBlockingQueue(1);
150     q.offer(null);
151     fail("should throw NPE");
152     } catch (NullPointerException success) { }
153     }
154    
155     public void testOffer() {
156     PriorityBlockingQueue q = new PriorityBlockingQueue(1);
157     assertTrue(q.offer(new Integer(0)));
158     assertTrue(q.offer(new Integer(1)));
159     }
160    
161     public void testOfferNonComparable() {
162     try {
163     PriorityBlockingQueue q = new PriorityBlockingQueue(1);
164     q.offer(new Object());
165     q.offer(new Object());
166     q.offer(new Object());
167     fail("should throw CCE");
168     }
169     catch(ClassCastException success) {}
170     }
171    
172     public void testAdd(){
173 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
174     for (int i = 0; i < SIZE; ++i) {
175 dl 1.1 assertEquals(i, q.size());
176     assertTrue(q.add(new Integer(i)));
177     }
178     }
179    
180     public void testAddAll1(){
181     try {
182     PriorityBlockingQueue q = new PriorityBlockingQueue(1);
183     q.addAll(null);
184     fail("Cannot add null collection");
185     }
186     catch (NullPointerException success) {}
187     }
188     public void testAddAll2(){
189     try {
190 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
191     Integer[] ints = new Integer[SIZE];
192 dl 1.1 q.addAll(Arrays.asList(ints));
193     fail("Cannot add null elements");
194     }
195     catch (NullPointerException success) {}
196     }
197     public void testAddAll3(){
198     try {
199 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
200     Integer[] ints = new Integer[SIZE];
201     for (int i = 0; i < SIZE-1; ++i)
202 dl 1.1 ints[i] = new Integer(i);
203     q.addAll(Arrays.asList(ints));
204     fail("Cannot add null elements");
205     }
206     catch (NullPointerException success) {}
207     }
208    
209     public void testAddAll5(){
210     try {
211     Integer[] empty = new Integer[0];
212 dl 1.3 Integer[] ints = new Integer[SIZE];
213     for (int i = SIZE-1; i >= 0; --i)
214 dl 1.1 ints[i] = new Integer(i);
215 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
216 dl 1.1 assertFalse(q.addAll(Arrays.asList(empty)));
217     assertTrue(q.addAll(Arrays.asList(ints)));
218 dl 1.3 for (int i = 0; i < SIZE; ++i)
219 dl 1.1 assertEquals(ints[i], q.poll());
220     }
221     finally {}
222     }
223    
224     public void testPutNull() {
225     try {
226 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
227 dl 1.1 q.put(null);
228     fail("put should throw NPE");
229     }
230     catch (NullPointerException success){
231     }
232     }
233    
234     public void testPut() {
235     try {
236 dl 1.3 PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
237     for (int i = 0; i < SIZE; ++i) {
238 dl 1.1 Integer I = new Integer(i);
239     q.put(I);
240     assertTrue(q.contains(I));
241     }
242 dl 1.3 assertEquals(SIZE, q.size());
243 dl 1.1 }
244     finally {
245     }
246     }
247    
248     public void testPutWithTake() {
249     final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
250     Thread t = new Thread(new Runnable() {
251     public void run(){
252     int added = 0;
253     try {
254     q.put(new Integer(0));
255     ++added;
256     q.put(new Integer(0));
257     ++added;
258     q.put(new Integer(0));
259     ++added;
260     q.put(new Integer(0));
261     ++added;
262 dl 1.3 threadAssertTrue(added == 4);
263 dl 1.1 } finally {
264     }
265     }
266     });
267     try {
268     t.start();
269     Thread.sleep(SHORT_DELAY_MS);
270     q.take();
271     t.interrupt();
272     t.join();
273     } catch (Exception e){
274     fail("Unexpected exception");
275     }
276     }
277    
278     public void testTimedOffer() {
279     final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
280     Thread t = new Thread(new Runnable() {
281     public void run(){
282     try {
283     q.put(new Integer(0));
284     q.put(new Integer(0));
285 dl 1.3 threadAssertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
286     threadAssertTrue(q.offer(new Integer(0), LONG_DELAY_MS, TimeUnit.MILLISECONDS));
287 dl 1.1 } finally { }
288     }
289     });
290    
291     try {
292     t.start();
293 dl 1.3 Thread.sleep(SMALL_DELAY_MS);
294 dl 1.1 t.interrupt();
295     t.join();
296     } catch (Exception e){
297     fail("Unexpected exception");
298     }
299     }
300    
301     public void testTake(){
302     try {
303 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
304     for (int i = 0; i < SIZE; ++i) {
305 dl 1.1 assertEquals(i, ((Integer)q.take()).intValue());
306     }
307     } catch (InterruptedException e){
308     fail("Unexpected exception");
309     }
310     }
311    
312     public void testTakeFromEmpty() {
313     final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
314     Thread t = new Thread(new Runnable() {
315     public void run(){
316     try {
317     q.take();
318 dl 1.3 threadFail("Should block");
319 dl 1.1 } catch (InterruptedException success){ }
320     }
321     });
322     try {
323     t.start();
324     Thread.sleep(SHORT_DELAY_MS);
325     t.interrupt();
326     t.join();
327     } catch (Exception e){
328     fail("Unexpected exception");
329     }
330     }
331    
332     public void testBlockingTake(){
333     Thread t = new Thread(new Runnable() {
334     public void run() {
335     try {
336 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
337     for (int i = 0; i < SIZE; ++i) {
338     threadAssertEquals(i, ((Integer)q.take()).intValue());
339 dl 1.1 }
340     q.take();
341 dl 1.3 threadFail("take should block");
342 dl 1.1 } catch (InterruptedException success){
343     }
344     }});
345     t.start();
346     try {
347     Thread.sleep(SHORT_DELAY_MS);
348     t.interrupt();
349     t.join();
350     }
351     catch (InterruptedException ie) {
352     fail("Unexpected exception");
353     }
354     }
355    
356    
357     public void testPoll(){
358 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
359     for (int i = 0; i < SIZE; ++i) {
360 dl 1.1 assertEquals(i, ((Integer)q.poll()).intValue());
361     }
362     assertNull(q.poll());
363     }
364    
365     public void testTimedPoll0() {
366     try {
367 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
368     for (int i = 0; i < SIZE; ++i) {
369 dl 1.1 assertEquals(i, ((Integer)q.poll(0, TimeUnit.MILLISECONDS)).intValue());
370     }
371     assertNull(q.poll(0, TimeUnit.MILLISECONDS));
372     } catch (InterruptedException e){
373     fail("Unexpected exception");
374     }
375     }
376    
377     public void testTimedPoll() {
378     try {
379 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
380     for (int i = 0; i < SIZE; ++i) {
381 dl 1.1 assertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
382     }
383     assertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
384     } catch (InterruptedException e){
385     fail("Unexpected exception");
386     }
387     }
388    
389     public void testInterruptedTimedPoll(){
390     Thread t = new Thread(new Runnable() {
391     public void run() {
392     try {
393 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
394     for (int i = 0; i < SIZE; ++i) {
395     threadAssertEquals(i, ((Integer)q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS)).intValue());
396 dl 1.1 }
397 dl 1.3 threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
398 dl 1.1 } catch (InterruptedException success){
399     }
400     }});
401     t.start();
402     try {
403     Thread.sleep(SHORT_DELAY_MS);
404     t.interrupt();
405     t.join();
406     }
407     catch (InterruptedException ie) {
408     fail("Unexpected exception");
409     }
410     }
411    
412     public void testTimedPollWithOffer(){
413     final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
414     Thread t = new Thread(new Runnable() {
415     public void run(){
416     try {
417 dl 1.3 threadAssertNull(q.poll(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
418 dl 1.1 q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
419     q.poll(LONG_DELAY_MS, TimeUnit.MILLISECONDS);
420 dl 1.3 threadFail("Should block");
421 dl 1.1 } catch (InterruptedException success) { }
422     }
423     });
424     try {
425     t.start();
426 dl 1.3 Thread.sleep(SMALL_DELAY_MS);
427 dl 1.1 assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
428     t.interrupt();
429     t.join();
430     } catch (Exception e){
431     fail("Unexpected exception");
432     }
433     }
434    
435    
436     public void testPeek(){
437 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
438     for (int i = 0; i < SIZE; ++i) {
439 dl 1.1 assertEquals(i, ((Integer)q.peek()).intValue());
440     q.poll();
441     assertTrue(q.peek() == null ||
442     i != ((Integer)q.peek()).intValue());
443     }
444     assertNull(q.peek());
445     }
446    
447     public void testElement(){
448 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
449     for (int i = 0; i < SIZE; ++i) {
450 dl 1.1 assertEquals(i, ((Integer)q.element()).intValue());
451     q.poll();
452     }
453     try {
454     q.element();
455     fail("no such element");
456     }
457     catch (NoSuchElementException success) {}
458     }
459    
460     public void testRemove(){
461 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
462     for (int i = 0; i < SIZE; ++i) {
463 dl 1.1 assertEquals(i, ((Integer)q.remove()).intValue());
464     }
465     try {
466     q.remove();
467     fail("remove should throw");
468     } catch (NoSuchElementException success){
469     }
470     }
471    
472     public void testRemoveElement(){
473 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
474     for (int i = 1; i < SIZE; i+=2) {
475 dl 1.1 assertTrue(q.remove(new Integer(i)));
476     }
477 dl 1.3 for (int i = 0; i < SIZE; i+=2) {
478 dl 1.1 assertTrue(q.remove(new Integer(i)));
479     assertFalse(q.remove(new Integer(i+1)));
480     }
481 dl 1.2 assertTrue(q.isEmpty());
482 dl 1.1 }
483    
484     public void testContains(){
485 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
486     for (int i = 0; i < SIZE; ++i) {
487 dl 1.1 assertTrue(q.contains(new Integer(i)));
488     q.poll();
489     assertFalse(q.contains(new Integer(i)));
490     }
491     }
492    
493     public void testClear(){
494 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
495 dl 1.1 q.clear();
496     assertTrue(q.isEmpty());
497     assertEquals(0, q.size());
498     assertEquals(NOCAP, q.remainingCapacity());
499     q.add(new Integer(1));
500     assertFalse(q.isEmpty());
501     q.clear();
502     assertTrue(q.isEmpty());
503     }
504    
505     public void testContainsAll(){
506 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
507     PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
508     for (int i = 0; i < SIZE; ++i) {
509 dl 1.1 assertTrue(q.containsAll(p));
510     assertFalse(p.containsAll(q));
511     p.add(new Integer(i));
512     }
513     assertTrue(p.containsAll(q));
514     }
515    
516     public void testRetainAll(){
517 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
518     PriorityBlockingQueue p = populatedQueue(SIZE);
519     for (int i = 0; i < SIZE; ++i) {
520 dl 1.1 boolean changed = q.retainAll(p);
521     if (i == 0)
522     assertFalse(changed);
523     else
524     assertTrue(changed);
525    
526     assertTrue(q.containsAll(p));
527 dl 1.3 assertEquals(SIZE-i, q.size());
528 dl 1.1 p.remove();
529     }
530     }
531    
532     public void testRemoveAll(){
533 dl 1.3 for (int i = 1; i < SIZE; ++i) {
534     PriorityBlockingQueue q = populatedQueue(SIZE);
535     PriorityBlockingQueue p = populatedQueue(i);
536 dl 1.1 assertTrue(q.removeAll(p));
537 dl 1.3 assertEquals(SIZE-i, q.size());
538 dl 1.1 for (int j = 0; j < i; ++j) {
539     Integer I = (Integer)(p.remove());
540     assertFalse(q.contains(I));
541     }
542     }
543     }
544    
545     public void testToArray(){
546 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
547 dl 1.1 Object[] o = q.toArray();
548     Arrays.sort(o);
549     try {
550     for(int i = 0; i < o.length; i++)
551     assertEquals(o[i], q.take());
552     } catch (InterruptedException e){
553     fail("Unexpected exception");
554     }
555     }
556    
557     public void testToArray2(){
558 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
559     Integer[] ints = new Integer[SIZE];
560 dl 1.1 ints = (Integer[])q.toArray(ints);
561     Arrays.sort(ints);
562     try {
563     for(int i = 0; i < ints.length; i++)
564     assertEquals(ints[i], q.take());
565     } catch (InterruptedException e){
566     fail("Unexpected exception");
567     }
568     }
569    
570     public void testIterator(){
571 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
572 dl 1.1 int i = 0;
573     Iterator it = q.iterator();
574     while(it.hasNext()) {
575     assertTrue(q.contains(it.next()));
576     ++i;
577     }
578 dl 1.3 assertEquals(i, SIZE);
579 dl 1.1 }
580    
581     public void testIteratorRemove () {
582    
583     final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
584    
585     q.add(new Integer(2));
586     q.add(new Integer(1));
587     q.add(new Integer(3));
588    
589     Iterator it = q.iterator();
590     it.next();
591     it.remove();
592    
593     it = q.iterator();
594     assertEquals(it.next(), new Integer(2));
595     assertEquals(it.next(), new Integer(3));
596     assertFalse(it.hasNext());
597     }
598    
599    
600     public void testToString(){
601 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
602 dl 1.1 String s = q.toString();
603 dl 1.3 for (int i = 0; i < SIZE; ++i) {
604 dl 1.1 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
605     }
606     }
607    
608     public void testPollInExecutor() {
609    
610     final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
611    
612     ExecutorService executor = Executors.newFixedThreadPool(2);
613    
614     executor.execute(new Runnable() {
615     public void run() {
616 dl 1.3 threadAssertNull(q.poll());
617 dl 1.1 try {
618 dl 1.3 threadAssertTrue(null != q.poll(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS));
619     threadAssertTrue(q.isEmpty());
620 dl 1.1 }
621     catch (InterruptedException e) {
622 dl 1.3 threadFail("should not be interrupted");
623 dl 1.1 }
624     }
625     });
626    
627     executor.execute(new Runnable() {
628     public void run() {
629     try {
630 dl 1.3 Thread.sleep(SMALL_DELAY_MS);
631 dl 1.1 q.put(new Integer(1));
632     }
633     catch (InterruptedException e) {
634 dl 1.3 threadFail("should not be interrupted");
635 dl 1.1 }
636     }
637     });
638    
639 dl 1.3 joinPool(executor);
640 dl 1.1
641 dl 1.2 }
642    
643     public void testSerialization() {
644 dl 1.3 PriorityBlockingQueue q = populatedQueue(SIZE);
645 dl 1.2 try {
646     ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
647     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
648     out.writeObject(q);
649     out.close();
650    
651     ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
652     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
653     PriorityBlockingQueue r = (PriorityBlockingQueue)in.readObject();
654     assertEquals(q.size(), r.size());
655     while (!q.isEmpty())
656     assertEquals(q.remove(), r.remove());
657     } catch(Exception e){
658     fail("unexpected exception");
659     }
660 dl 1.1 }
661    
662     }