/** Tests that {@link StreamWriteFilter#setWriteBufferSize(int)} checks the specified size. */
  @Test
  public void testSetWriteBufferSize() {
    AbstractStreamWriteFilter<M> filter = createFilter();

    try {
      filter.setWriteBufferSize(0);
      fail("0 writeBuferSize specified. IllegalArgumentException expected.");
    } catch (IllegalArgumentException iae) {
      // Pass, exception was thrown
      // Signifies a successful test execution
      assertTrue(true);
    }

    try {
      filter.setWriteBufferSize(-100);
      fail("Negative writeBuferSize specified. IllegalArgumentException expected.");
    } catch (IllegalArgumentException iae) {
      // Pass, exception was thrown
      // Signifies a successful test execution
      assertTrue(true);
    }

    filter.setWriteBufferSize(1);
    assertEquals(1, filter.getWriteBufferSize());
    filter.setWriteBufferSize(1024);
    assertEquals(1024, filter.getWriteBufferSize());
  }
  /**
   * Tests when the contents of the file doesn't fit into one write buffer.
   *
   * @throws Exception when something goes wrong
   */
  @Test
  public void testWriteSeveralBuffersStream() throws Exception {
    AbstractStreamWriteFilter<M> filter = createFilter();
    filter.setWriteBufferSize(4);

    byte[] data = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    byte[] chunk1 = new byte[] {1, 2, 3, 4};
    byte[] chunk2 = new byte[] {5, 6, 7, 8};
    byte[] chunk3 = new byte[] {9, 10};

    M message = createMessage(data);
    WriteRequest writeRequest = new DefaultWriteRequest(message, new DummyWriteFuture());

    WriteRequest chunk1Request = new DefaultWriteRequest(IoBuffer.wrap(chunk1));
    WriteRequest chunk2Request = new DefaultWriteRequest(IoBuffer.wrap(chunk2));
    WriteRequest chunk3Request = new DefaultWriteRequest(IoBuffer.wrap(chunk3));

    NextFilter nextFilter = EasyMock.createMock(NextFilter.class);
    /*
     * Record expectations
     */
    nextFilter.filterWrite(EasyMock.eq(session), eqWriteRequest(chunk1Request));
    nextFilter.filterWrite(EasyMock.eq(session), eqWriteRequest(chunk2Request));
    nextFilter.filterWrite(EasyMock.eq(session), eqWriteRequest(chunk3Request));
    nextFilter.messageSent(EasyMock.eq(session), eqWriteRequest(writeRequest));

    /*
     * Replay.
     */
    EasyMock.replay(nextFilter);

    filter.filterWrite(nextFilter, session, writeRequest);
    filter.messageSent(nextFilter, session, chunk1Request);
    filter.messageSent(nextFilter, session, chunk2Request);
    filter.messageSent(nextFilter, session, chunk3Request);

    /*
     * Verify.
     */
    EasyMock.verify(nextFilter);

    assertTrue(writeRequest.getFuture().isWritten());
  }