import java.util.LinkedList; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; public class LinkedBlockingQueueTest { private static final int DELAY_TILL_ACTION = 10; public static void main(String[] args) throws InterruptedException { remainingCapacityTest(); QueueHelper.sizeTest(new LinkedBlockingQueue()); QueueHelper.isEmptyTest(new LinkedBlockingQueue()); QueueHelper.addTest(new LinkedBlockingQueue()); addCapacityFail(); offerTest(); offerWithTimeoutTest(); offerTimeoutTest(); putTest(); QueueHelper.addAllTest(new LinkedBlockingQueue()); addAllFail(); QueueHelper.elementTest(new LinkedBlockingQueue()); QueueHelper.elementFail(new LinkedBlockingQueue()); pollEmptyTest(); pollTest(); pollTimeoutTest(); takeTest(); QueueHelper.removeEmptyFail(new LinkedBlockingQueue()); QueueHelper.removeTest(new LinkedBlockingQueue()); drainToTest(); drainToLimitTest(); QueueHelper.containsTest(new LinkedBlockingQueue()); QueueHelper.containsAllTest(new LinkedBlockingQueue()); QueueHelper.removeObjectTest(new LinkedBlockingQueue()); QueueHelper.removeAllTest(new LinkedBlockingQueue()); QueueHelper.clearTest(new LinkedBlockingQueue()); QueueHelper.toArrayTest(new LinkedBlockingQueue()); } private static void verify(boolean val) { if (! val) { throw new RuntimeException(); } } private static void remainingCapacityTest() { LinkedBlockingQueue lbq = new LinkedBlockingQueue(2); verify(lbq.remainingCapacity() == 2); lbq.add(new Object()); verify(lbq.remainingCapacity() == 1); } private static void addCapacityFail() { LinkedBlockingQueue lbq = new LinkedBlockingQueue(1); Object testObject = new Object(); lbq.add(testObject); try { lbq.add(new Object()); throw new RuntimeException("Exception should have thrown"); } catch (IllegalStateException e) { // expected } verify(lbq.size() == 1); verify(lbq.peek() == testObject); } private static void offerTest() { LinkedBlockingQueue lbq = new LinkedBlockingQueue(1); Object testObject = new Object(); verify(lbq.offer(testObject)); verify(! lbq.offer(new Object())); verify(lbq.size() == 1); verify(lbq.peek() == testObject); } private static void offerWithTimeoutTest() throws InterruptedException { final LinkedBlockingQueue lbq = new LinkedBlockingQueue(1); lbq.add(new Object()); new Thread(new Runnable() { @Override public void run() { try { // sleep to make sure offer call starts first Thread.sleep(DELAY_TILL_ACTION); lbq.take(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start(); // should accept once thread starts verify(lbq.offer(new Object(), 10, TimeUnit.SECONDS)); } private static void offerTimeoutTest() throws InterruptedException { LinkedBlockingQueue lbq = new LinkedBlockingQueue(1); lbq.add(new Object()); verify(! lbq.offer(new Object(), 10, TimeUnit.MILLISECONDS)); } private static void putTest() throws InterruptedException { LinkedBlockingQueue lbq = new LinkedBlockingQueue(); Object testObject = new Object(); lbq.put(testObject); verify(lbq.size() == 1); verify(lbq.peek() == testObject); } private static void addAllFail() { LinkedBlockingQueue lbq = new LinkedBlockingQueue(1); LinkedList toAdd = new LinkedList(); toAdd.add(new Object()); toAdd.add(new Object()); try { lbq.addAll(toAdd); throw new RuntimeException("Exception should have thrown"); } catch (IllegalStateException e) { // expected } } private static void pollEmptyTest() { LinkedBlockingQueue lbq = new LinkedBlockingQueue(); verify(lbq.poll() == null); } private static void pollTest() { LinkedBlockingQueue lbq = new LinkedBlockingQueue(); Object testObject = new Object(); lbq.add(testObject); verify(lbq.poll() == testObject); } private static void pollTimeoutTest() throws InterruptedException { final LinkedBlockingQueue lbq = new LinkedBlockingQueue(); final Object testObject = new Object(); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(DELAY_TILL_ACTION); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } lbq.add(testObject); } }).start(); verify(lbq.poll(DELAY_TILL_ACTION * 10, TimeUnit.MILLISECONDS) == testObject); } private static void takeTest() throws InterruptedException { final LinkedBlockingQueue lbq = new LinkedBlockingQueue(); final Object testObject = new Object(); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(DELAY_TILL_ACTION); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } lbq.add(testObject); } }).start(); verify(lbq.take() == testObject); } private static void drainToTest() { int objQty = 2; LinkedBlockingQueue lbq = new LinkedBlockingQueue(); for (int i = 0; i < objQty; i++) { lbq.add(new Object()); } LinkedList drainToResult = new LinkedList(); verify(lbq.drainTo(drainToResult) == objQty); verify(drainToResult.size() == objQty); } private static void drainToLimitTest() { int objQty = 4; int limit = 2; LinkedBlockingQueue lbq = new LinkedBlockingQueue(); for (int i = 0; i < objQty; i++) { lbq.add(new Object()); } LinkedList drainToResult = new LinkedList(); verify(lbq.drainTo(drainToResult, limit) == limit); verify(drainToResult.size() == limit); verify(lbq.size() == objQty - limit); } }