zutil/test/zutil/parser/binary/serializer/TwoByteLengthPrefixedDataSerializerTest.java

96 lines
No EOL
4.1 KiB
Java

package zutil.parser.binary.serializer;
import org.junit.Test;
import zutil.ArrayUtil;
import zutil.ByteUtil;
import zutil.parser.binary.BinaryFieldData;
import zutil.parser.binary.BinaryStruct;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StreamCorruptedException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.*;
public class TwoByteLengthPrefixedDataSerializerTest implements BinaryStruct {
@BinaryField(index = 10, length = 1)
private String tmpStringField;
@BinaryField(index = 20, length = 1)
private byte[] tmpByteField;
@Test(expected = StreamCorruptedException.class)
public void readPrematureEnd0() throws IOException {
TwoByteLengthPrefixedDataSerializer serializer = new TwoByteLengthPrefixedDataSerializer();
// 0 length stream
ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]);
serializer.read(inputStream, null, this);
}
@Test(expected = StreamCorruptedException.class)
public void readPrematureEnd1() throws IOException {
TwoByteLengthPrefixedDataSerializer serializer = new TwoByteLengthPrefixedDataSerializer();
// 1 length stream
ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[]{0x00});
serializer.read(inputStream, null, this);
}
@Test
public void read() throws IOException, NoSuchFieldException {
TwoByteLengthPrefixedDataSerializer serializer = new TwoByteLengthPrefixedDataSerializer();
List<BinaryFieldData> fieldDataList = BinaryFieldData.getStructFieldList(this.getClass());
BinaryFieldData stringFieldData = fieldDataList.get(0);
BinaryFieldData byteFieldData = fieldDataList.get(1);
// 0 Length
ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[]{0x00, 0x00});
assertEquals("", serializer.read(inputStream, stringFieldData, this));
inputStream.reset();
assertArrayEquals(new byte[0], (byte[])serializer.read(inputStream, byteFieldData, this));
// String "1234"
inputStream = new ByteArrayInputStream(ArrayUtil.combine(new byte[]{0x00, 0x04}, "1234".getBytes(StandardCharsets.UTF_8)));
assertEquals("1234", serializer.read(inputStream, stringFieldData, this));
inputStream.reset();
assertArrayEquals("1234".getBytes(StandardCharsets.UTF_8), (byte[])serializer.read(inputStream, byteFieldData, this));
}
@Test
public void write() throws IOException {
TwoByteLengthPrefixedDataSerializer serializer = new TwoByteLengthPrefixedDataSerializer();
List<BinaryFieldData> fieldDataList = BinaryFieldData.getStructFieldList(this.getClass());
BinaryFieldData stringFieldData = fieldDataList.get(0);
BinaryFieldData byteFieldData = fieldDataList.get(1);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 0 Length
outputStream.reset();outputStream.reset();
serializer.write(outputStream, null, stringFieldData, this);
assertArrayEquals(new byte[]{0, 0}, outputStream.toByteArray());
outputStream.reset();
serializer.write(outputStream, null, byteFieldData, this);
assertArrayEquals(new byte[]{0, 0}, outputStream.toByteArray());
// 0 Length
outputStream.reset();
serializer.write(outputStream, "", stringFieldData, this);
assertArrayEquals(new byte[]{0, 0}, outputStream.toByteArray());
outputStream.reset();
serializer.write(outputStream, new byte[0], byteFieldData, this);
assertArrayEquals(new byte[]{0, 0}, outputStream.toByteArray());
// String "1234"
outputStream.reset();
serializer.write(outputStream, "1234", stringFieldData, this);
assertArrayEquals(new byte[]{0, 4, 49, 50, 51, 52}, outputStream.toByteArray());
outputStream.reset();
serializer.write(outputStream, "1234".getBytes(StandardCharsets.UTF_8), byteFieldData, this);
assertArrayEquals(new byte[]{0, 4, 49, 50, 51, 52}, outputStream.toByteArray());
}
}