/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.network.protocol.databuffer;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.nio.ByteBuffer;
/**
* Tests for the {@link DataNettyBuffer} class.
*/
public class DataNettyBufferTest {
private static final int LENGTH = 4;
private ByteBuf mBuffer = null;
/** The exception expected to be thrown. */
@Rule
public ExpectedException mThrown = ExpectedException.none();
/**
* Sets up the buffer before a test runs.
*/
@Before
public final void before() {
mBuffer = Unpooled.buffer(LENGTH);
}
/**
* Releases the buffer a test ran.
*/
@After
public final void after() {
releaseBufferHelper();
}
private void releaseBufferHelper() {
if (mBuffer != null && mBuffer.refCnt() > 0) {
mBuffer.release(mBuffer.refCnt());
}
}
/**
* Tests that an exception is thrown when two NIO buffers are used.
*/
@Test
public void singleNioBufferCheckFailed() {
mThrown.expect(IllegalArgumentException.class);
mThrown.expectMessage("Number of nioBuffers of this bytebuf is 2 (1 expected).");
releaseBufferHelper(); // not using the default ByteBuf given in Before()
// creating a CompositeByteBuf with 2 NIO buffers
mBuffer = Unpooled.compositeBuffer();
((CompositeByteBuf) mBuffer).addComponent(Unpooled.buffer(LENGTH));
((CompositeByteBuf) mBuffer).addComponent(Unpooled.buffer(LENGTH));
new DataNettyBuffer(mBuffer, LENGTH);
}
/**
* Tests that an exception is thrown when the reference count is two.
*/
@Test
public void refCountCheckFailed() {
mThrown.expect(IllegalArgumentException.class);
mThrown.expectMessage("Reference count of this bytebuf is 2 (1 expected).");
mBuffer.retain(); // increase reference count by 1
new DataNettyBuffer(mBuffer, LENGTH);
}
/**
* Tests that an exception is thrown when the unsupported {@link DataNettyBuffer#getNettyOutput()}
* method is used.
*/
@Test
public void getNettyOutputNotSupported() {
mThrown.expect(UnsupportedOperationException.class);
mThrown.expectMessage("DataNettyBuffer doesn't support getNettyOutput()");
DataNettyBuffer data = new DataNettyBuffer(mBuffer, LENGTH);
data.getNettyOutput();
}
/**
* Tests the {@link DataNettyBuffer#getLength()} method.
*/
@Test
public void length() {
DataNettyBuffer data = new DataNettyBuffer(mBuffer, LENGTH);
Assert.assertEquals(LENGTH, data.getLength());
}
/**
* Tests the {@link DataNettyBuffer#getReadOnlyByteBuffer()} method.
*/
@Test
public void readOnlyByteBuffer() {
DataNettyBuffer data = new DataNettyBuffer(mBuffer, LENGTH);
ByteBuffer readOnlyBuffer = data.getReadOnlyByteBuffer();
Assert.assertTrue(readOnlyBuffer.isReadOnly());
Assert.assertEquals(mBuffer.nioBuffer(), readOnlyBuffer);
}
/**
* Tests the {@link DataNettyBuffer#release()} method.
*/
@Test
public void releaseBuffer() {
DataNettyBuffer data = new DataNettyBuffer(mBuffer, LENGTH);
mBuffer.release(); // this simulates a release performed by message channel
data.release();
}
/**
* Tests that an exception is thrown when the {@link DataNettyBuffer#release()} method fails with
* a reference count of two netty buffers.
*/
@Test
public void releaseBufferFail() {
mThrown.expect(IllegalStateException.class);
mThrown.expectMessage("Reference count of the netty buffer is 2 (1 expected).");
DataNettyBuffer data = new DataNettyBuffer(mBuffer, LENGTH);
data.release();
}
/**
* Tests that an exception is thrown when the buffer was already released via the
* {@link DataNettyBuffer#release()} method.
*/
@Test
public void bufferAlreadyReleased() {
mThrown.expect(IllegalStateException.class);
mThrown.expectMessage("Reference count of the netty buffer is 0 (1 expected).");
DataNettyBuffer data = new DataNettyBuffer(mBuffer, LENGTH);
mBuffer.release(); // this simulates a release performed by message channel
mBuffer.release(); // this simulates an additional release
data.release();
}
}