/*
* 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;
import alluxio.network.protocol.databuffer.DataBuffer;
import alluxio.network.protocol.databuffer.DataByteBuffer;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.nio.ByteBuffer;
/**
* Unit tests for {@link RPCFileWriteRequest}.
*/
public class RPCFileWriteRequestTest {
private static final long TEMP_UFS_FILE_ID = 11;
private static final long OFFSET = 22;
private static final long LENGTH = 0;
private ByteBuf mBuffer = null;
private void assertValid(long tempUfsFileId, long offset, long length, RPCFileWriteRequest req) {
Assert.assertEquals(RPCMessage.Type.RPC_FILE_WRITE_REQUEST, req.getType());
Assert.assertEquals(tempUfsFileId, req.getTempUfsFileId());
Assert.assertEquals(offset, req.getOffset());
Assert.assertEquals(length, req.getLength());
}
private void assertValid(RPCFileWriteRequest req) {
try {
req.validate();
} catch (Exception e) {
Assert.fail("request should be valid.");
}
}
private void assertInvalid(RPCFileWriteRequest req) {
try {
req.validate();
Assert.fail("request should be invalid.");
} catch (Exception e) {
return;
}
}
/**
* Sets up the buffer before a test runs.
*/
@Before
public final void before() {
mBuffer = Unpooled.buffer();
}
/**
* Tests the {@link RPCFileReadRequest#getEncodedLength()} method.
*/
@Test
public void encodedLength() {
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH, null);
int encodedLength = req.getEncodedLength();
req.encode(mBuffer);
Assert.assertEquals(encodedLength, mBuffer.readableBytes());
}
/**
* Tests the {@link RPCFileWriteRequest#encode(ByteBuf)} and
* {@link RPCFileWriteRequest#decode(ByteBuf)} methods.
*/
@Test
public void encodeDecode() {
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH, null);
req.encode(mBuffer);
RPCFileWriteRequest req2 = RPCFileWriteRequest.decode(mBuffer);
assertValid(TEMP_UFS_FILE_ID, OFFSET, LENGTH, req);
assertValid(TEMP_UFS_FILE_ID, OFFSET, LENGTH, req2);
}
/**
* Tests the {@link RPCFileWriteRequest#encode(ByteBuf)} and
* {@link RPCFileWriteRequest#decode(ByteBuf)} methods with data.
*/
@Test
public void encodeDecodeData() {
int length = 10;
DataBuffer buffer = new DataByteBuffer(ByteBuffer.allocate(length), length);
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, length, buffer);
req.encode(mBuffer);
mBuffer.writeBytes(buffer.getReadOnlyByteBuffer());
RPCFileWriteRequest req2 = RPCFileWriteRequest.decode(mBuffer);
assertValid(TEMP_UFS_FILE_ID, OFFSET, length, req);
assertValid(TEMP_UFS_FILE_ID, OFFSET, length, req2);
}
/**
* Tests the {@link RPCFileWriteRequest#getPayloadDataBuffer()} method.
*/
@Test
public void getPayloadDataBuffer() {
int length = 10;
DataByteBuffer payload = new DataByteBuffer(ByteBuffer.allocate(length), length);
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH, payload);
assertValid(req);
Assert.assertEquals(payload, req.getPayloadDataBuffer());
}
/**
* Tests the {@link RPCFileReadRequest#validate()} method.
*/
@Test
public void validate() {
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH, null);
assertValid(req);
}
/**
* Tests the constructor with a valid length.
*/
@Test
public void validLength() {
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH, null);
assertValid(req);
req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, 0, null);
assertValid(req);
}
/**
* Tests the constructor with a negative offset.
*/
@Test
public void negativeOffset() {
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, -1, LENGTH, null);
assertInvalid(req);
}
/**
* Tests the constructor with an invalid length.
*/
@Test
public void invalidLength() {
RPCFileWriteRequest req = new RPCFileWriteRequest(TEMP_UFS_FILE_ID, OFFSET, -1, null);
assertInvalid(req);
}
}