@Test
  public void testPeekAndPoll() {
    try {
      ClosableBlockingQueue<String> queue = new ClosableBlockingQueue<>();

      assertNull(queue.peek());
      assertNull(queue.peek());
      assertNull(queue.poll());
      assertNull(queue.poll());

      assertEquals(0, queue.size());

      queue.add("a");
      queue.add("b");
      queue.add("c");

      assertEquals(3, queue.size());

      assertEquals("a", queue.peek());
      assertEquals("a", queue.peek());
      assertEquals("a", queue.peek());

      assertEquals(3, queue.size());

      assertEquals("a", queue.poll());
      assertEquals("b", queue.poll());

      assertEquals(1, queue.size());

      assertEquals("c", queue.peek());
      assertEquals("c", queue.peek());

      assertEquals("c", queue.poll());

      assertEquals(0, queue.size());
      assertNull(queue.poll());
      assertNull(queue.peek());
      assertNull(queue.peek());

      assertTrue(queue.close());

      try {
        queue.peek();
        fail("should cause an exception");
      } catch (IllegalStateException ignored) {
        // expected
      }

      try {
        queue.poll();
        fail("should cause an exception");
      } catch (IllegalStateException ignored) {
        // expected
      }
    } catch (Exception e) {
      e.printStackTrace();
      fail(e.getMessage());
    }
  }
  @Test
  public void testCloseNonEmptyQueue() {
    try {
      ClosableBlockingQueue<Integer> queue = new ClosableBlockingQueue<>(asList(1, 2, 3));
      assertTrue(queue.isOpen());

      assertFalse(queue.close());
      assertFalse(queue.close());

      queue.poll();

      assertFalse(queue.close());
      assertFalse(queue.close());

      queue.pollBatch();

      assertTrue(queue.close());
      assertFalse(queue.isOpen());

      assertFalse(queue.addIfOpen(42));
      assertTrue(queue.isEmpty());

      try {
        queue.add(99);
        fail("should cause an exception");
      } catch (IllegalStateException ignored) {
        // expected
      }
    } catch (Exception e) {
      e.printStackTrace();
      fail(e.getMessage());
    }
  }