--- jsr166/src/test/tck/ArrayBlockingQueueTest.java 2016/11/06 02:40:38 1.76 +++ jsr166/src/test/tck/ArrayBlockingQueueTest.java 2017/05/13 22:17:12 1.84 @@ -11,6 +11,7 @@ import static java.util.concurrent.TimeU import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Queue; @@ -104,17 +105,25 @@ public class ArrayBlockingQueueTest exte /** * Constructor throws IAE if capacity argument nonpositive */ - public void testConstructor2() { - try { - new ArrayBlockingQueue(0); - shouldThrow(); - } catch (IllegalArgumentException success) {} + public void testConstructor_nonPositiveCapacity() { + for (int i : new int[] { 0, -1, Integer.MIN_VALUE }) { + try { + new ArrayBlockingQueue(i); + shouldThrow(); + } catch (IllegalArgumentException success) {} + for (boolean fair : new boolean[] { true, false }) { + try { + new ArrayBlockingQueue(i, fair); + shouldThrow(); + } catch (IllegalArgumentException success) {} + } + } } /** * Initializing from null Collection throws NPE */ - public void testConstructor3() { + public void testConstructor_nullCollection() { try { new ArrayBlockingQueue(1, true, null); shouldThrow(); @@ -149,13 +158,13 @@ public class ArrayBlockingQueueTest exte /** * Initializing from too large collection throws IAE */ - public void testConstructor6() { - Integer[] ints = new Integer[SIZE]; - for (int i = 0; i < SIZE; ++i) - ints[i] = i; - Collection elements = Arrays.asList(ints); + public void testConstructor_collectionTooLarge() { + // just barely fits - succeeds + new ArrayBlockingQueue(SIZE, false, + Collections.nCopies(SIZE, "")); try { - new ArrayBlockingQueue(SIZE - 1, false, elements); + new ArrayBlockingQueue(SIZE - 1, false, + Collections.nCopies(SIZE, "")); shouldThrow(); } catch (IllegalArgumentException success) {} } @@ -177,12 +186,12 @@ public class ArrayBlockingQueueTest exte * Queue transitions from empty to full when elements added */ public void testEmptyFull() { - ArrayBlockingQueue q = new ArrayBlockingQueue(2); + BlockingQueue q = populatedQueue(0, 2, 2, false); assertTrue(q.isEmpty()); assertEquals(2, q.remainingCapacity()); q.add(one); assertFalse(q.isEmpty()); - q.add(two); + assertTrue(q.offer(two)); assertFalse(q.isEmpty()); assertEquals(0, q.remainingCapacity()); assertFalse(q.offer(three)); @@ -192,15 +201,18 @@ public class ArrayBlockingQueueTest exte * remainingCapacity decreases on add, increases on remove */ public void testRemainingCapacity() { - BlockingQueue q = populatedQueue(SIZE); - for (int i = 0; i < SIZE; ++i) { - assertEquals(i, q.remainingCapacity()); - assertEquals(SIZE, q.size() + q.remainingCapacity()); + int size = ThreadLocalRandom.current().nextInt(1, SIZE); + BlockingQueue q = populatedQueue(size, size, 2 * size, false); + int spare = q.remainingCapacity(); + int capacity = spare + size; + for (int i = 0; i < size; i++) { + assertEquals(spare + i, q.remainingCapacity()); + assertEquals(capacity, q.size() + q.remainingCapacity()); assertEquals(i, q.remove()); } - for (int i = 0; i < SIZE; ++i) { - assertEquals(SIZE - i, q.remainingCapacity()); - assertEquals(SIZE, q.size() + q.remainingCapacity()); + for (int i = 0; i < size; i++) { + assertEquals(capacity - i, q.remainingCapacity()); + assertEquals(capacity, q.size() + q.remainingCapacity()); assertTrue(q.add(i)); } } @@ -219,12 +231,10 @@ public class ArrayBlockingQueueTest exte */ public void testAdd() { ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE); - for (int i = 0; i < SIZE; ++i) { - assertTrue(q.add(new Integer(i))); - } + for (int i = 0; i < SIZE; i++) assertTrue(q.add((Integer) i)); assertEquals(0, q.remainingCapacity()); try { - q.add(new Integer(SIZE)); + q.add((Integer) SIZE); shouldThrow(); } catch (IllegalStateException success) {} } @@ -258,13 +268,17 @@ public class ArrayBlockingQueueTest exte /** * addAll throws ISE if not enough room */ - public void testAddAll4() { - ArrayBlockingQueue q = new ArrayBlockingQueue(1); - Integer[] ints = new Integer[SIZE]; - for (int i = 0; i < SIZE; ++i) - ints[i] = new Integer(i); + public void testAddAll_insufficientSpace() { + int size = ThreadLocalRandom.current().nextInt(1, SIZE); + ArrayBlockingQueue q = populatedQueue(0, size, size, false); + // Just fits: + q.addAll(populatedQueue(size, size, 2 * size, false)); + assertEquals(0, q.remainingCapacity()); + assertEquals(size, q.size()); + assertEquals(0, q.peek()); try { - q.addAll(Arrays.asList(ints)); + q = populatedQueue(0, size, size, false); + q.addAll(Collections.nCopies(size + 1, 42)); shouldThrow(); } catch (IllegalStateException success) {} } @@ -326,7 +340,7 @@ public class ArrayBlockingQueueTest exte }}); await(pleaseInterrupt); - assertThreadStaysAlive(t); + assertThreadBlocks(t, Thread.State.WAITING); t.interrupt(); awaitTermination(t); assertEquals(SIZE, q.size()); @@ -361,7 +375,7 @@ public class ArrayBlockingQueueTest exte assertEquals(0, q.take()); await(pleaseInterrupt); - assertThreadStaysAlive(t); + assertThreadBlocks(t, Thread.State.WAITING); t.interrupt(); awaitTermination(t); assertEquals(0, q.remainingCapacity()); @@ -388,7 +402,7 @@ public class ArrayBlockingQueueTest exte }}); await(pleaseInterrupt); - assertThreadStaysAlive(t); + assertThreadBlocks(t, Thread.State.TIMED_WAITING); t.interrupt(); awaitTermination(t); } @@ -411,9 +425,7 @@ public class ArrayBlockingQueueTest exte final CountDownLatch pleaseInterrupt = new CountDownLatch(1); Thread t = newStartedThread(new CheckedRunnable() { public void realRun() throws InterruptedException { - for (int i = 0; i < SIZE; ++i) { - assertEquals(i, q.take()); - } + for (int i = 0; i < SIZE; i++) assertEquals(i, q.take()); Thread.currentThread().interrupt(); try { @@ -431,7 +443,7 @@ public class ArrayBlockingQueueTest exte }}); await(pleaseInterrupt); - assertThreadStaysAlive(t); + assertThreadBlocks(t, Thread.State.WAITING); t.interrupt(); awaitTermination(t); } @@ -551,8 +563,10 @@ public class ArrayBlockingQueueTest exte * contains(x) reports true when elements added but not yet removed */ public void testContains() { - ArrayBlockingQueue q = populatedQueue(SIZE); - for (int i = 0; i < SIZE; ++i) { + int size = ThreadLocalRandom.current().nextInt(1, SIZE); + ArrayBlockingQueue q = populatedQueue(size, size, 2 * size, false); + assertFalse(q.contains(null)); + for (int i = 0; i < size; ++i) { assertTrue(q.contains(new Integer(i))); assertEquals(i, q.poll()); assertFalse(q.contains(new Integer(i))); @@ -563,11 +577,13 @@ public class ArrayBlockingQueueTest exte * clear removes all elements */ public void testClear() { - ArrayBlockingQueue q = populatedQueue(SIZE); + int size = ThreadLocalRandom.current().nextInt(1, 5); + ArrayBlockingQueue q = populatedQueue(size, size, 2 * size, false); + int capacity = size + q.remainingCapacity(); q.clear(); assertTrue(q.isEmpty()); assertEquals(0, q.size()); - assertEquals(SIZE, q.remainingCapacity()); + assertEquals(capacity, q.remainingCapacity()); q.add(one); assertFalse(q.isEmpty()); assertTrue(q.contains(one)); @@ -921,8 +937,8 @@ public class ArrayBlockingQueueTest exte */ public void testNeverContainsNull() { Collection[] qs = { - new ArrayBlockingQueue(10), - populatedQueue(2), + populatedQueue(0, 1, 10, false), + populatedQueue(2, 2, 10, true), }; for (Collection q : qs) {