ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PriorityBlockingQueueTest.java
Revision: 1.2
Committed: Sun Sep 7 20:39:11 2003 UTC (20 years, 8 months ago) by dl
Branch: MAIN
Changes since 1.1: +21 -1 lines
Log Message:
Added serialization and lock tests

File Contents

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