/*
* 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 io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for {@link RPCFileReadRequestTest}.
*/
public class RPCFileReadRequestTest {
private static final long TEMP_UFS_FILE_ID = 11;
private static final long OFFSET = 22;
private static final long LENGTH = 33;
private ByteBuf mBuffer = null;
private void assertValid(long tempUfsFileId, long offset, long length, RPCFileReadRequest req) {
Assert.assertEquals(RPCMessage.Type.RPC_FILE_READ_REQUEST, req.getType());
Assert.assertEquals(tempUfsFileId, req.getTempUfsFileId());
Assert.assertEquals(offset, req.getOffset());
Assert.assertEquals(length, req.getLength());
}
private void assertValid(RPCFileReadRequest req) {
try {
req.validate();
} catch (Exception e) {
Assert.fail("request should be valid.");
}
}
private void assertInvalid(RPCFileReadRequest 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() {
RPCFileReadRequest req = new RPCFileReadRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH);
int encodedLength = req.getEncodedLength();
req.encode(mBuffer);
Assert.assertEquals(encodedLength, mBuffer.readableBytes());
}
/**
* Tests the {@link RPCFileReadRequest#encode(ByteBuf)} and
* {@link RPCFileReadRequest#decode(ByteBuf)} methods.
*/
@Test
public void encodeDecode() {
RPCFileReadRequest req = new RPCFileReadRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH);
req.encode(mBuffer);
RPCFileReadRequest req2 = RPCFileReadRequest.decode(mBuffer);
assertValid(TEMP_UFS_FILE_ID, OFFSET, LENGTH, req);
assertValid(TEMP_UFS_FILE_ID, OFFSET, LENGTH, req2);
}
/**
* Tests the {@link RPCFileReadRequest#validate()} method.
*/
@Test
public void validate() {
RPCFileReadRequest req = new RPCFileReadRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH);
assertValid(req);
}
/**
* Tests the {@link RPCFileReadRequest#RPCFileReadRequest(long, long, long)} constructor with a
* valid length.
*/
@Test
public void validLength() {
RPCFileReadRequest req = new RPCFileReadRequest(TEMP_UFS_FILE_ID, OFFSET, LENGTH);
assertValid(req);
req = new RPCFileReadRequest(TEMP_UFS_FILE_ID, OFFSET, 0);
assertValid(req);
}
/**
* Tests the {@link RPCFileReadRequest#RPCFileReadRequest(long, long, long)} constructor with a
* negative offset.
*/
@Test
public void negativeOffset() {
RPCFileReadRequest req = new RPCFileReadRequest(TEMP_UFS_FILE_ID, -1, LENGTH);
assertInvalid(req);
}
/**
* Tests the {@link RPCFileReadRequest#RPCFileReadRequest(long, long, long)}
* constructor with an invalid length.
*/
@Test
public void invalidLength() {
RPCFileReadRequest req = new RPCFileReadRequest(TEMP_UFS_FILE_ID, OFFSET, -100);
assertInvalid(req);
}
}