--- jsr166/src/test/tck/DelayQueueTest.java 2015/05/15 18:21:19 1.72 +++ jsr166/src/test/tck/DelayQueueTest.java 2017/01/04 06:09:58 1.81 @@ -39,25 +39,28 @@ public class DelayQueueTest extends JSR1 } public static Test suite() { + class Implementation implements CollectionImplementation { + public Class klazz() { return DelayQueue.class; } + public Collection emptyCollection() { return new DelayQueue(); } + public Object makeElement(int i) { return new PDelay(i); } + public boolean isConcurrent() { return true; } + public boolean permitsNulls() { return false; } + } return newTestSuite(DelayQueueTest.class, - new Generic().testSuite()); + new Generic().testSuite(), + CollectionTest.testSuite(new Implementation())); } /** - * A delayed implementation for testing. - * Most tests use Pseudodelays, where delays are all elapsed + * A fake Delayed implementation for testing. + * Most tests use PDelays, where delays are all elapsed * (so, no blocking solely for delays) but are still ordered */ static class PDelay implements Delayed { - int pseudodelay; - PDelay(int i) { pseudodelay = i; } - public int compareTo(PDelay other) { - int a = this.pseudodelay; - int b = other.pseudodelay; - return (a < b) ? -1 : (a > b) ? 1 : 0; - } + final int pseudodelay; + PDelay(int pseudodelay) { this.pseudodelay = pseudodelay; } public int compareTo(Delayed y) { - return compareTo((PDelay)y); + return Integer.compare(this.pseudodelay, ((PDelay)y).pseudodelay); } public boolean equals(Object other) { return (other instanceof PDelay) && @@ -77,27 +80,18 @@ public class DelayQueueTest extends JSR1 * Delayed implementation that actually delays */ static class NanoDelay implements Delayed { - long trigger; + final long trigger; NanoDelay(long i) { trigger = System.nanoTime() + i; } - public int compareTo(NanoDelay y) { - long i = trigger; - long j = y.trigger; - if (i < j) return -1; - if (i > j) return 1; - return 0; - } public int compareTo(Delayed y) { - return compareTo((NanoDelay)y); + return Long.compare(trigger, ((NanoDelay)y).trigger); } public boolean equals(Object other) { - return equals((NanoDelay)other); - } - public boolean equals(NanoDelay other) { - return other.trigger == trigger; + return (other instanceof NanoDelay) && + this.trigger == ((NanoDelay)other).trigger; } // suppress [overrides] javac warning @@ -119,18 +113,19 @@ public class DelayQueueTest extends JSR1 /** * Returns a new queue of given size containing consecutive - * PDelays 0 ... n. + * PDelays 0 ... n - 1. */ private DelayQueue populatedQueue(int n) { - DelayQueue q = new DelayQueue(); + DelayQueue q = new DelayQueue<>(); assertTrue(q.isEmpty()); - for (int i = n-1; i >= 0; i -= 2) + for (int i = n - 1; i >= 0; i -= 2) assertTrue(q.offer(new PDelay(i))); for (int i = (n & 1); i < n; i += 2) assertTrue(q.offer(new PDelay(i))); assertFalse(q.isEmpty()); assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); assertEquals(n, q.size()); + assertEquals(new PDelay(0), q.peek()); return q; } @@ -166,7 +161,7 @@ public class DelayQueueTest extends JSR1 */ public void testConstructor5() { PDelay[] a = new PDelay[SIZE]; - for (int i = 0; i < SIZE-1; ++i) + for (int i = 0; i < SIZE - 1; ++i) a[i] = new PDelay(i); try { new DelayQueue(Arrays.asList(a)); @@ -208,7 +203,7 @@ public class DelayQueueTest extends JSR1 BlockingQueue q = populatedQueue(SIZE); for (int i = 0; i < SIZE; ++i) { assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); - assertEquals(SIZE-i, q.size()); + assertEquals(SIZE - i, q.size()); assertTrue(q.remove() instanceof PDelay); } for (int i = 0; i < SIZE; ++i) { @@ -256,7 +251,7 @@ public class DelayQueueTest extends JSR1 public void testAddAll3() { DelayQueue q = new DelayQueue(); PDelay[] a = new PDelay[SIZE]; - for (int i = 0; i < SIZE-1; ++i) + for (int i = 0; i < SIZE - 1; ++i) a[i] = new PDelay(i); try { q.addAll(Arrays.asList(a)); @@ -270,7 +265,7 @@ public class DelayQueueTest extends JSR1 public void testAddAll5() { PDelay[] empty = new PDelay[0]; PDelay[] ints = new PDelay[SIZE]; - for (int i = SIZE-1; i >= 0; --i) + for (int i = SIZE - 1; i >= 0; --i) ints[i] = new PDelay(i); DelayQueue q = new DelayQueue(); assertFalse(q.addAll(Arrays.asList(empty))); @@ -412,11 +407,13 @@ public class DelayQueueTest extends JSR1 */ public void testInterruptedTimedPoll() throws InterruptedException { final CountDownLatch pleaseInterrupt = new CountDownLatch(1); + final DelayQueue q = populatedQueue(SIZE); Thread t = newStartedThread(new CheckedRunnable() { public void realRun() throws InterruptedException { - DelayQueue q = populatedQueue(SIZE); + long startTime = System.nanoTime(); for (int i = 0; i < SIZE; ++i) { - assertEquals(new PDelay(i), ((PDelay)q.poll(SHORT_DELAY_MS, MILLISECONDS))); + assertEquals(new PDelay(i), + ((PDelay)q.poll(LONG_DELAY_MS, MILLISECONDS))); } Thread.currentThread().interrupt(); @@ -432,12 +429,14 @@ public class DelayQueueTest extends JSR1 shouldThrow(); } catch (InterruptedException success) {} assertFalse(Thread.interrupted()); + assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); }}); await(pleaseInterrupt); assertThreadStaysAlive(t); t.interrupt(); awaitTermination(t); + checkEmpty(q); } /** @@ -542,7 +541,7 @@ public class DelayQueueTest extends JSR1 assertTrue(changed); assertTrue(q.containsAll(p)); - assertEquals(SIZE-i, q.size()); + assertEquals(SIZE - i, q.size()); p.remove(); } } @@ -555,7 +554,7 @@ public class DelayQueueTest extends JSR1 DelayQueue q = populatedQueue(SIZE); DelayQueue p = populatedQueue(i); assertTrue(q.removeAll(p)); - assertEquals(SIZE-i, q.size()); + assertEquals(SIZE - i, q.size()); for (int j = 0; j < i; ++j) { PDelay x = (PDelay)(p.remove()); assertFalse(q.contains(x)); @@ -653,29 +652,29 @@ public class DelayQueueTest extends JSR1 public void testPollInExecutor() { final DelayQueue q = new DelayQueue(); final CheckedBarrier threadsStarted = new CheckedBarrier(2); - ExecutorService executor = Executors.newFixedThreadPool(2); - executor.execute(new CheckedRunnable() { - public void realRun() throws InterruptedException { - assertNull(q.poll()); - threadsStarted.await(); - assertNotNull(q.poll(LONG_DELAY_MS, MILLISECONDS)); - checkEmpty(q); - }}); - - executor.execute(new CheckedRunnable() { - public void realRun() throws InterruptedException { - threadsStarted.await(); - q.put(new PDelay(1)); - }}); - - joinPool(executor); + final ExecutorService executor = Executors.newFixedThreadPool(2); + try (PoolCleaner cleaner = cleaner(executor)) { + executor.execute(new CheckedRunnable() { + public void realRun() throws InterruptedException { + assertNull(q.poll()); + threadsStarted.await(); + assertNotNull(q.poll(LONG_DELAY_MS, MILLISECONDS)); + checkEmpty(q); + }}); + + executor.execute(new CheckedRunnable() { + public void realRun() throws InterruptedException { + threadsStarted.await(); + q.put(new PDelay(1)); + }}); + } } /** * Delayed actions do not occur until their delay elapses */ public void testDelay() throws InterruptedException { - DelayQueue q = new DelayQueue(); + DelayQueue q = new DelayQueue<>(); for (int i = 0; i < SIZE; ++i) q.add(new NanoDelay(1000000L * (SIZE - i))); @@ -753,7 +752,7 @@ public class DelayQueueTest extends JSR1 final DelayQueue q = populatedQueue(SIZE); Thread t = new Thread(new CheckedRunnable() { public void realRun() { - q.put(new PDelay(SIZE+1)); + q.put(new PDelay(SIZE + 1)); }}); t.start(); @@ -773,7 +772,7 @@ public class DelayQueueTest extends JSR1 ArrayList l = new ArrayList(); q.drainTo(l, i); int k = (i < SIZE) ? i : SIZE; - assertEquals(SIZE-k, q.size()); + assertEquals(SIZE - k, q.size()); assertEquals(k, l.size()); } }