ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedBlockingDequeTest.java
(Generate patch)

Comparing jsr166/src/test/tck/LinkedBlockingDequeTest.java (file contents):
Revision 1.39 by jsr166, Fri May 27 20:07:24 2011 UTC vs.
Revision 1.51 by jsr166, Wed Dec 31 19:05:42 2014 UTC

# Line 4 | Line 4
4   * http://creativecommons.org/publicdomain/zero/1.0/
5   */
6  
7 import junit.framework.*;
8 import java.util.*;
9 import java.util.concurrent.*;
7   import static java.util.concurrent.TimeUnit.MILLISECONDS;
8 < import java.io.*;
8 >
9 > import java.util.ArrayList;
10 > import java.util.Arrays;
11 > import java.util.Collection;
12 > import java.util.Deque;
13 > import java.util.Iterator;
14 > import java.util.NoSuchElementException;
15 > import java.util.Queue;
16 > import java.util.concurrent.BlockingDeque;
17 > import java.util.concurrent.BlockingQueue;
18 > import java.util.concurrent.CountDownLatch;
19 > import java.util.concurrent.Executors;
20 > import java.util.concurrent.ExecutorService;
21 > import java.util.concurrent.LinkedBlockingDeque;
22 >
23 > import junit.framework.Test;
24  
25   public class LinkedBlockingDequeTest extends JSR166TestCase {
26  
# Line 20 | Line 32 | public class LinkedBlockingDequeTest ext
32  
33      public static class Bounded extends BlockingQueueTest {
34          protected BlockingQueue emptyCollection() {
35 <            return new LinkedBlockingDeque(20);
35 >            return new LinkedBlockingDeque(SIZE);
36          }
37      }
38  
# Line 35 | Line 47 | public class LinkedBlockingDequeTest ext
47      }
48  
49      /**
50 <     * Create a deque of given size containing consecutive
50 >     * Returns a new deque of given size containing consecutive
51       * Integers 0 ... n.
52       */
53      private LinkedBlockingDeque<Integer> populatedDeque(int n) {
# Line 80 | Line 92 | public class LinkedBlockingDequeTest ext
92      }
93  
94      /**
95 <     * offer(null) throws NPE
95 >     * offerFirst(null) throws NullPointerException
96       */
97      public void testOfferFirstNull() {
98 +        LinkedBlockingDeque q = new LinkedBlockingDeque();
99          try {
87            LinkedBlockingDeque q = new LinkedBlockingDeque();
100              q.offerFirst(null);
101              shouldThrow();
102          } catch (NullPointerException success) {}
103      }
104  
105      /**
106 +     * offerLast(null) throws NullPointerException
107 +     */
108 +    public void testOfferLastNull() {
109 +        LinkedBlockingDeque q = new LinkedBlockingDeque();
110 +        try {
111 +            q.offerLast(null);
112 +            shouldThrow();
113 +        } catch (NullPointerException success) {}
114 +    }
115 +
116 +    /**
117       * OfferFirst succeeds
118       */
119      public void testOfferFirst() {
# Line 308 | Line 331 | public class LinkedBlockingDequeTest ext
331      }
332  
333      /**
334 <     * Constructor throws IAE if capacity argument nonpositive
334 >     * Constructor throws IllegalArgumentException if capacity argument nonpositive
335       */
336      public void testConstructor2() {
337          try {
338 <            LinkedBlockingDeque q = new LinkedBlockingDeque(0);
338 >            new LinkedBlockingDeque(0);
339              shouldThrow();
340          } catch (IllegalArgumentException success) {}
341      }
342  
343      /**
344 <     * Initializing from null Collection throws NPE
344 >     * Initializing from null Collection throws NullPointerException
345       */
346      public void testConstructor3() {
347          try {
348 <            LinkedBlockingDeque q = new LinkedBlockingDeque(null);
348 >            new LinkedBlockingDeque(null);
349              shouldThrow();
350          } catch (NullPointerException success) {}
351      }
352  
353      /**
354 <     * Initializing from Collection of null elements throws NPE
354 >     * Initializing from Collection of null elements throws NullPointerException
355       */
356      public void testConstructor4() {
357 +        Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
358          try {
359 <            Integer[] ints = new Integer[SIZE];
336 <            LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
359 >            new LinkedBlockingDeque(elements);
360              shouldThrow();
361          } catch (NullPointerException success) {}
362      }
363  
364      /**
365 <     * Initializing from Collection with some null elements throws NPE
365 >     * Initializing from Collection with some null elements throws
366 >     * NullPointerException
367       */
368      public void testConstructor5() {
369 +        Integer[] ints = new Integer[SIZE];
370 +        for (int i = 0; i < SIZE-1; ++i)
371 +            ints[i] = i;
372 +        Collection<Integer> elements = Arrays.asList(ints);
373          try {
374 <            Integer[] ints = new Integer[SIZE];
347 <            for (int i = 0; i < SIZE-1; ++i)
348 <                ints[i] = new Integer(i);
349 <            LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
374 >            new LinkedBlockingDeque(elements);
375              shouldThrow();
376          } catch (NullPointerException success) {}
377      }
# Line 357 | Line 382 | public class LinkedBlockingDequeTest ext
382      public void testConstructor6() {
383          Integer[] ints = new Integer[SIZE];
384          for (int i = 0; i < SIZE; ++i)
385 <            ints[i] = new Integer(i);
385 >            ints[i] = i;
386          LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
387          for (int i = 0; i < SIZE; ++i)
388              assertEquals(ints[i], q.poll());
# Line 396 | Line 421 | public class LinkedBlockingDequeTest ext
421      }
422  
423      /**
399     * offer(null) throws NPE
400     */
401    public void testOfferNull() {
402        try {
403            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
404            q.offer(null);
405            shouldThrow();
406        } catch (NullPointerException success) {}
407    }
408
409    /**
410     * add(null) throws NPE
411     */
412    public void testAddNull() {
413        try {
414            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
415            q.add(null);
416            shouldThrow();
417        } catch (NullPointerException success) {}
418    }
419
420    /**
424       * push(null) throws NPE
425       */
426      public void testPushNull() {
# Line 482 | Line 485 | public class LinkedBlockingDequeTest ext
485       * add succeeds if not full; throws ISE if full
486       */
487      public void testAdd() {
488 +        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
489 +        for (int i = 0; i < SIZE; ++i)
490 +            assertTrue(q.add(new Integer(i)));
491 +        assertEquals(0, q.remainingCapacity());
492          try {
486            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
487            for (int i = 0; i < SIZE; ++i) {
488                assertTrue(q.add(new Integer(i)));
489            }
490            assertEquals(0, q.remainingCapacity());
493              q.add(new Integer(SIZE));
494              shouldThrow();
495          } catch (IllegalStateException success) {}
496      }
497  
498      /**
497     * addAll(null) throws NPE
498     */
499    public void testAddAll1() {
500        try {
501            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
502            q.addAll(null);
503            shouldThrow();
504        } catch (NullPointerException success) {}
505    }
506
507    /**
499       * addAll(this) throws IAE
500       */
501      public void testAddAllSelf() {
502 +        LinkedBlockingDeque q = populatedDeque(SIZE);
503          try {
512            LinkedBlockingDeque q = populatedDeque(SIZE);
504              q.addAll(q);
505              shouldThrow();
506          } catch (IllegalArgumentException success) {}
507      }
508  
509      /**
519     * addAll of a collection with null elements throws NPE
520     */
521    public void testAddAll2() {
522        try {
523            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
524            Integer[] ints = new Integer[SIZE];
525            q.addAll(Arrays.asList(ints));
526            shouldThrow();
527        } catch (NullPointerException success) {}
528    }
529
530    /**
510       * addAll of a collection with any null elements throws NPE after
511       * possibly adding some elements
512       */
513      public void testAddAll3() {
514 +        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
515 +        Integer[] ints = new Integer[SIZE];
516 +        for (int i = 0; i < SIZE-1; ++i)
517 +            ints[i] = new Integer(i);
518 +        Collection<Integer> elements = Arrays.asList(ints);
519          try {
520 <            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
537 <            Integer[] ints = new Integer[SIZE];
538 <            for (int i = 0; i < SIZE-1; ++i)
539 <                ints[i] = new Integer(i);
540 <            q.addAll(Arrays.asList(ints));
520 >            q.addAll(elements);
521              shouldThrow();
522          } catch (NullPointerException success) {}
523      }
524  
525      /**
526 <     * addAll throws ISE if not enough room
526 >     * addAll throws IllegalStateException if not enough room
527       */
528      public void testAddAll4() {
529 +        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE - 1);
530 +        Integer[] ints = new Integer[SIZE];
531 +        for (int i = 0; i < SIZE; ++i)
532 +            ints[i] = new Integer(i);
533 +        Collection<Integer> elements = Arrays.asList(ints);
534          try {
535 <            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
551 <            Integer[] ints = new Integer[SIZE];
552 <            for (int i = 0; i < SIZE; ++i)
553 <                ints[i] = new Integer(i);
554 <            q.addAll(Arrays.asList(ints));
535 >            q.addAll(elements);
536              shouldThrow();
537          } catch (IllegalStateException success) {}
538      }
# Line 572 | Line 553 | public class LinkedBlockingDequeTest ext
553      }
554  
555      /**
575     * put(null) throws NPE
576     */
577    public void testPutNull() throws InterruptedException {
578        try {
579            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
580            q.put(null);
581            shouldThrow();
582        } catch (NullPointerException success) {}
583    }
584
585    /**
556       * all elements successfully put are contained
557       */
558      public void testPut() throws InterruptedException {
# Line 655 | Line 625 | public class LinkedBlockingDequeTest ext
625              }});
626  
627          await(pleaseTake);
628 <        assertEquals(q.remainingCapacity(), 0);
628 >        assertEquals(0, q.remainingCapacity());
629          assertEquals(0, q.take());
630  
631          await(pleaseInterrupt);
632          assertThreadStaysAlive(t);
633          t.interrupt();
634          awaitTermination(t);
635 <        assertEquals(q.remainingCapacity(), 0);
635 >        assertEquals(0, q.remainingCapacity());
636      }
637  
638      /**
# Line 807 | Line 777 | public class LinkedBlockingDequeTest ext
777       * putFirst(null) throws NPE
778       */
779      public void testPutFirstNull() throws InterruptedException {
780 +        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
781          try {
811            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
782              q.putFirst(null);
783              shouldThrow();
784          } catch (NullPointerException success) {}
# Line 887 | Line 857 | public class LinkedBlockingDequeTest ext
857              }});
858  
859          await(pleaseTake);
860 <        assertEquals(q.remainingCapacity(), 0);
860 >        assertEquals(0, q.remainingCapacity());
861          assertEquals(capacity - 1, q.take());
862  
863          await(pleaseInterrupt);
864          assertThreadStaysAlive(t);
865          t.interrupt();
866          awaitTermination(t);
867 <        assertEquals(q.remainingCapacity(), 0);
867 >        assertEquals(0, q.remainingCapacity());
868      }
869  
870      /**
# Line 1097 | Line 1067 | public class LinkedBlockingDequeTest ext
1067  
1068                  pleaseInterrupt.countDown();
1069                  try {
1070 <                    q.pollFirst(SMALL_DELAY_MS, MILLISECONDS);
1070 >                    q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
1071                      shouldThrow();
1072                  } catch (InterruptedException success) {}
1073                  assertFalse(Thread.interrupted());
# Line 1154 | Line 1124 | public class LinkedBlockingDequeTest ext
1124       * putLast(null) throws NPE
1125       */
1126      public void testPutLastNull() throws InterruptedException {
1127 +        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1128          try {
1158            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
1129              q.putLast(null);
1130              shouldThrow();
1131          } catch (NullPointerException success) {}
# Line 1234 | Line 1204 | public class LinkedBlockingDequeTest ext
1204              }});
1205  
1206          await(pleaseTake);
1207 <        assertEquals(q.remainingCapacity(), 0);
1207 >        assertEquals(0, q.remainingCapacity());
1208          assertEquals(0, q.take());
1209  
1210          await(pleaseInterrupt);
1211          assertThreadStaysAlive(t);
1212          t.interrupt();
1213          awaitTermination(t);
1214 <        assertEquals(q.remainingCapacity(), 0);
1214 >        assertEquals(0, q.remainingCapacity());
1215      }
1216  
1217      /**
# Line 1433 | Line 1403 | public class LinkedBlockingDequeTest ext
1403      }
1404  
1405      /**
1436     * remove(x) removes x and returns true if present
1437     */
1438    public void testRemoveElement() {
1439        LinkedBlockingDeque q = populatedDeque(SIZE);
1440        for (int i = 1; i < SIZE; i+=2) {
1441            assertTrue(q.contains(i));
1442            assertTrue(q.remove(i));
1443            assertFalse(q.contains(i));
1444            assertTrue(q.contains(i-1));
1445        }
1446        for (int i = 0; i < SIZE; i+=2) {
1447            assertTrue(q.contains(i));
1448            assertTrue(q.remove(i));
1449            assertFalse(q.contains(i));
1450            assertFalse(q.remove(i+1));
1451            assertFalse(q.contains(i+1));
1452        }
1453        assertTrue(q.isEmpty());
1454    }
1455
1456    /**
1406       * contains(x) reports true when elements added but not yet removed
1407       */
1408      public void testContains() {
# Line 1533 | Line 1482 | public class LinkedBlockingDequeTest ext
1482      /**
1483       * toArray contains all elements in FIFO order
1484       */
1485 <    public void testToArray() throws InterruptedException{
1485 >    public void testToArray() throws InterruptedException {
1486          LinkedBlockingDeque q = populatedDeque(SIZE);
1487          Object[] o = q.toArray();
1488          for (int i = 0; i < o.length; i++)
# Line 1553 | Line 1502 | public class LinkedBlockingDequeTest ext
1502      }
1503  
1504      /**
1556     * toArray(null) throws NullPointerException
1557     */
1558    public void testToArray_NullArg() {
1559        LinkedBlockingDeque q = populatedDeque(SIZE);
1560        try {
1561            q.toArray(null);
1562            shouldThrow();
1563        } catch (NullPointerException success) {}
1564    }
1565
1566    /**
1505       * toArray(incompatible array type) throws ArrayStoreException
1506       */
1507      public void testToArray1_BadArg() {
# Line 1762 | Line 1700 | public class LinkedBlockingDequeTest ext
1700       * A deserialized serialized deque has same elements in same order
1701       */
1702      public void testSerialization() throws Exception {
1703 <        LinkedBlockingDeque q = populatedDeque(SIZE);
1703 >        Queue x = populatedDeque(SIZE);
1704 >        Queue y = serialClone(x);
1705  
1706 <        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
1707 <        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
1708 <        out.writeObject(q);
1709 <        out.close();
1710 <
1711 <        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
1712 <        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
1713 <        LinkedBlockingDeque r = (LinkedBlockingDeque)in.readObject();
1714 <        assertEquals(q.size(), r.size());
1776 <        while (!q.isEmpty())
1777 <            assertEquals(q.remove(), r.remove());
1778 <    }
1779 <
1780 <    /**
1781 <     * drainTo(null) throws NPE
1782 <     */
1783 <    public void testDrainToNull() {
1784 <        LinkedBlockingDeque q = populatedDeque(SIZE);
1785 <        try {
1786 <            q.drainTo(null);
1787 <            shouldThrow();
1788 <        } catch (NullPointerException success) {}
1789 <    }
1790 <
1791 <    /**
1792 <     * drainTo(this) throws IAE
1793 <     */
1794 <    public void testDrainToSelf() {
1795 <        LinkedBlockingDeque q = populatedDeque(SIZE);
1796 <        try {
1797 <            q.drainTo(q);
1798 <            shouldThrow();
1799 <        } catch (IllegalArgumentException success) {}
1706 >        assertNotSame(y, x);
1707 >        assertEquals(x.size(), y.size());
1708 >        assertEquals(x.toString(), y.toString());
1709 >        assertTrue(Arrays.equals(x.toArray(), y.toArray()));
1710 >        while (!x.isEmpty()) {
1711 >            assertFalse(y.isEmpty());
1712 >            assertEquals(x.remove(), y.remove());
1713 >        }
1714 >        assertTrue(y.isEmpty());
1715      }
1716  
1717      /**
# Line 1806 | Line 1721 | public class LinkedBlockingDequeTest ext
1721          LinkedBlockingDeque q = populatedDeque(SIZE);
1722          ArrayList l = new ArrayList();
1723          q.drainTo(l);
1724 <        assertEquals(q.size(), 0);
1725 <        assertEquals(l.size(), SIZE);
1724 >        assertEquals(0, q.size());
1725 >        assertEquals(SIZE, l.size());
1726          for (int i = 0; i < SIZE; ++i)
1727              assertEquals(l.get(i), new Integer(i));
1728          q.add(zero);
# Line 1817 | Line 1732 | public class LinkedBlockingDequeTest ext
1732          assertTrue(q.contains(one));
1733          l.clear();
1734          q.drainTo(l);
1735 <        assertEquals(q.size(), 0);
1736 <        assertEquals(l.size(), 2);
1735 >        assertEquals(0, q.size());
1736 >        assertEquals(2, l.size());
1737          for (int i = 0; i < 2; ++i)
1738              assertEquals(l.get(i), new Integer(i));
1739      }
# Line 1844 | Line 1759 | public class LinkedBlockingDequeTest ext
1759      }
1760  
1761      /**
1847     * drainTo(null, n) throws NPE
1848     */
1849    public void testDrainToNullN() {
1850        LinkedBlockingDeque q = populatedDeque(SIZE);
1851        try {
1852            q.drainTo(null, 0);
1853            shouldThrow();
1854        } catch (NullPointerException success) {}
1855    }
1856
1857    /**
1858     * drainTo(this, n) throws IAE
1859     */
1860    public void testDrainToSelfN() {
1861        LinkedBlockingDeque q = populatedDeque(SIZE);
1862        try {
1863            q.drainTo(q, 0);
1864            shouldThrow();
1865        } catch (IllegalArgumentException success) {}
1866    }
1867
1868    /**
1762       * drainTo(c, n) empties first min(n, size) elements of queue into c
1763       */
1764      public void testDrainToN() {
# Line 1876 | Line 1769 | public class LinkedBlockingDequeTest ext
1769              ArrayList l = new ArrayList();
1770              q.drainTo(l, i);
1771              int k = (i < SIZE) ? i : SIZE;
1772 <            assertEquals(l.size(), k);
1773 <            assertEquals(q.size(), SIZE-k);
1772 >            assertEquals(k, l.size());
1773 >            assertEquals(SIZE-k, q.size());
1774              for (int j = 0; j < k; ++j)
1775                  assertEquals(l.get(j), new Integer(j));
1776              while (q.poll() != null) ;
1777          }
1778      }
1779  
1780 +    /**
1781 +     * remove(null), contains(null) always return false
1782 +     */
1783 +    public void testNeverContainsNull() {
1784 +        Deque<?>[] qs = {
1785 +            new LinkedBlockingDeque<Object>(),
1786 +            populatedDeque(2),
1787 +        };
1788 +
1789 +        for (Deque<?> q : qs) {
1790 +            assertFalse(q.contains(null));
1791 +            assertFalse(q.remove(null));
1792 +            assertFalse(q.removeFirstOccurrence(null));
1793 +            assertFalse(q.removeLastOccurrence(null));
1794 +        }
1795 +    }
1796 +
1797   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines