Files
min-dev-java/src/test/java/encoding/EncoderTest.java
T
2021-03-18 22:55:43 +08:00

526 lines
19 KiB
Java

package encoding;
import org.junit.Test;
import util.ByteHelper;
import java.math.BigInteger;
import static org.junit.Assert.*;
/*
* @Author: feng Zhao
* @Description:
* @Version: 1.0.0
* @Date: 22:40 2021/3/14
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class EncoderTest {
int MaxPacketSize = 8800;
@Test
public void TestEmpty() {
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
estimator.estimatorReset();
assertTrue(encoder.empty());
assertTrue(estimator.empty());
encoder.prependByte((byte)20);
estimator.prependByte((byte)20);
assertFalse(encoder.empty());
assertFalse(estimator.empty());
}
@Test
public void TestEncoder_PrependByte(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
estimator.estimatorReset();
// 测试前向添加 MaxPacketSize 次是否正常
for (int i = 0; i < MaxPacketSize; i++) {
int num = encoder.prependByte((byte) 97);
estimator.prependByte((byte) 97);
assertEquals(encoder.left,MaxPacketSize-i-2);
assertEquals(encoder.buffer[MaxPacketSize-i-1],(byte)97);
//todo 这里要用encoder.size().getVlIntValue2Int(),还是encoder.size().size()
// assertEquals(encoder.size().size(),i+1);
// assertEquals(estimator.size().size(),i+1);
assertEquals(encoder.size().getVlIntValue2Int(),i+1);
assertEquals(estimator.size().getVlIntValue2Int(),i+1);
assertFalse(encoder.empty());
assertFalse(estimator.empty());
assertEquals(num,1);
}
// for (int i = 0; i < MaxPacketSize; i++) {
// int num = encoder.prependByte((byte) 97);
// estimator.prependByte((byte) 97);
// if ((encoder.left == MaxPacketSize-i-2) ||
// (encoder.buffer[MaxPacketSize-i-1] != (byte)97) ||
// (encoder.size() != new SizeT(i+1)) ||
// (estimator.size() != new SizeT(i+1)) ||
// encoder.empty() || estimator.empty()|| (num != 1))
// {
// System.out.println("PrependByte Failed"+ i);
// return;
// }
// }
// 测试超出最大包大小的情况
int a = encoder.prependByte((byte)1);
assertEquals(a,0);
}
@Test
public void TestEncoder_AppendByte(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(MaxPacketSize));
estimator.estimatorReset();
// 测试后向添加 MaxPacketSize 次是否正常
for (int i = 0; i < MaxPacketSize; i++) {
int num = encoder.appendByte((byte) 97);
estimator.appendByte((byte) 97);
assertEquals(encoder.right, i + 1);
assertEquals(encoder.buffer[i],(byte)97);
//todo 这里要用encoder.size().getVlIntValue2Int(),还是encoder.size().size()
// assertEquals(encoder.size().size(),i+1);
// assertEquals(estimator.size().size(),i+1);
assertEquals(encoder.size().getVlIntValue2Int(),i+1);
assertEquals(estimator.size().getVlIntValue2Int(),i+1);
assertFalse(encoder.empty());
assertFalse(estimator.empty());
assertEquals(num,1);
}
// 测试超出最大包大小的情况
int a = encoder.appendByte((byte) 1);
assertEquals(a,0);
int b = encoder.prependByte((byte) 1);
assertEquals(b,0);
}
@Test
public void TestEncoder_PrependByteArray(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
estimator.estimatorReset();
byte[] arr = new byte[]{1,2,3,4,5};
int length = arr.length;
// 测试prepend,没有超过MaxPacketSize
int num1 = encoder.prependByteArray(arr, new SizeT(length));
estimator.prependByteArray(arr, new SizeT(length));
assertEquals(encoder.size().getVlIntValue2Int(), length);
assertEquals(estimator.size().getVlIntValue2Int(), length);
assertEquals(num1,length);
// 检查插入的数据是否正确
byte[] newSlice = ByteHelper.getLenBytes(encoder.buffer, new VlInt(MaxPacketSize - length), length);
for (int i = 0; i < length; i++) {
assertEquals(arr[i],newSlice[i]);
}
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(0));
// 测试prepend,超过MaxPacketSize的情况
int times = MaxPacketSize / arr.length + 1;
for (int i = 0; i < times - 1; i++) {
int num2 = encoder.prependByteArray(arr, new SizeT(length));
assertEquals(num2,length);
}
int num3 = encoder.prependByteArray(arr, new SizeT(length));
assertEquals(num3,0);
}
@Test
public void TestEncoder_AppendByteArray(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(MaxPacketSize));
estimator.estimatorReset();
byte[] arr = new byte[]{1, 2, 3, 4, 5};
int length = arr.length;
// 测试append,没有超过MaxPacketSize
int num1 = encoder.appendByteArray(arr, new SizeT(length));
estimator.appendByteArray(arr, new SizeT(length));
assertEquals(encoder.size().getVlIntValue2Int(), length);
assertEquals(estimator.size().getVlIntValue2Int(), length);
assertEquals(num1, length);
// 检查插入的数据是否正确
byte[] newSlice = ByteHelper.getLenBytes(encoder.buffer, new VlInt(0), length);
for (int i = 0; i < length; i++) {
assertEquals(arr[i],newSlice[i]);
}
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(MaxPacketSize));
// 测试prepend,超过MaxPacketSize的情况
int times = MaxPacketSize / arr.length + 1;
for (int i = 0; i < times - 1; i++) {
int num2 = encoder.appendByteArray(arr, new SizeT(length));
assertEquals(num2,length);
}
int num3 = encoder.appendByteArray(arr, new SizeT(length));
assertEquals(num3,0);
}
//error
@Test
public void TestPrependVarNumber(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
estimator.estimatorReset();
// 测试添加240
int addLen = encoder.prependVarNumber(new VlInt(240));
byte[] buffer1 = encoder.getBuffer();
assertEquals(buffer1[0], (byte) 240);
assertEquals(buffer1.length,1);
assertEquals(addLen, 1);
// 测试添加16位整型所能表示的最大值
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
encoder.prependVarNumber(new VlInt(65535));
buffer1 = encoder.getBuffer();
byte[] buf_tmp = ByteHelper.getLenBytes(buffer1, new VlInt(1), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(buffer1.length,3);
assertEquals(buffer1[0], (byte) 241);
assertEquals(num1,65535);
// 测试添加16位整型所能表示的最大值 + 1
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
encoder.prependVarNumber(new VlInt(65536));
buffer1 = encoder.getBuffer();
byte[] buf_tmp2 = ByteHelper.getLenBytes(buffer1, new VlInt(1), 4);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(buffer1.length,5);
assertEquals(buffer1[0], (byte) 242);
assertEquals(num2,65536);
// 测试添加32位整型所能表示的最大值 + 1
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
encoder.prependVarNumber(new VlInt(4294967296L));
buffer1 = encoder.getBuffer();
byte[] buf_tmp3 = ByteHelper.getLenBytes(buffer1, new VlInt(1), 8);
// for (int i = 0; i < buf_tmp3.length; i++) {
// System.out.println(buf_tmp3[i]);
// }
// System.out.println("buf_tmp3.length:"+buf_tmp3.length);
long num3 = ByteHelper.uint64ToLong(buf_tmp3);
System.out.println("num3:"+num3);
assertEquals(buffer1.length,9);
assertEquals(buffer1[0], (byte) 243);
assertEquals(num3,4294967296L);
// TODO 测试添加64位整型所能表示的最大值
// uint64最大值在java中无法表示
}
@Test
public void TestAppendVarNumber(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(MaxPacketSize));
estimator.estimatorReset();
// 测试添加240
int addLen = encoder.appendVarNumber(new VlInt(240));
byte[] buffer1 = encoder.getBuffer();
assertEquals(buffer1[0], (byte) 240);
assertEquals(buffer1.length,1);
assertEquals(addLen, 1);
// 测试添加16位整型所能表示的最大值
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
encoder.appendVarNumber(new VlInt(65535));
buffer1 = encoder.getBuffer();
byte[] buf_tmp = ByteHelper.getLenBytes(buffer1, new VlInt(1), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(buffer1.length,3);
assertEquals(buffer1[0], (byte) 241);
assertEquals(num1,65535);
// 测试添加16位整型所能表示的最大值 + 1
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
encoder.appendVarNumber(new VlInt(65536));
buffer1 = encoder.getBuffer();
byte[] buf_tmp2 = ByteHelper.getLenBytes(buffer1, new VlInt(1), 4);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(buffer1.length,5);
assertEquals(buffer1[0], (byte) 242);
assertEquals(num2,65536);
// 测试添加32位整型所能表示的最大值 + 1
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
encoder.appendVarNumber(new VlInt(4294967296L));
buffer1 = encoder.getBuffer();
byte[] buf_tmp3 = ByteHelper.getLenBytes(buffer1, new VlInt(1), 8);
long num3 = ByteHelper.uint64ToLong(buf_tmp3);
System.out.println("num3:"+num3);
assertEquals(buffer1.length,9);
assertEquals(buffer1[0], (byte) 243);
assertEquals(num3,4294967296L);
// TODO 测试添加64位整型所能表示的最大值
// uint64最大值在java中无法表示
}
@Test
public void TestPrependNonNegativeInteger(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(0));
estimator.estimatorReset();
// 测试添加255
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(0));
int addLen1 = encoder.prependNonNegativeInteger(255);
assertEquals(addLen1, 1);
byte[] buffer1 = encoder.getBuffer();
assertEquals(buffer1[0], (byte) 255);
assertEquals(buffer1.length,1);
// 添加 MaxUint16
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
int addLen2 = encoder.prependNonNegativeInteger(65535);
assertEquals(addLen2, 2);
buffer1 = encoder.getBuffer();
byte[] buf_tmp = ByteHelper.getLenBytes(buffer1, new VlInt(0), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(buffer1.length,2);
assertEquals(num1,65535);
// 添加 MaxUint32
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
int addLen3 = encoder.prependNonNegativeInteger(4294967295L);
assertEquals(addLen3, 4);
buffer1 = encoder.getBuffer();
byte[] buf_tmp2 = ByteHelper.getLenBytes(buffer1, new VlInt(0), 4);
// long num2 = ByteHelper.new_byteArrayToLong(buf_tmp2);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(buffer1.length,4);
assertEquals(num2,4294967295L);
// 添加 MaxUint64
// TODO 测试添加64位整型所能表示的最大值
}
@Test
public void TestAppendNonNegativeInteger(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(MaxPacketSize));
estimator.estimatorReset();
// 测试添加255
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(0));
int addLen1 = encoder.appendNonNegativeInteger(255);
assertEquals(addLen1, 1);
byte[] buffer1 = encoder.getBuffer();
assertEquals(buffer1[0], (byte) 255);
assertEquals(buffer1.length,1);
// 添加 MaxUint16
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
int addLen2 = encoder.appendNonNegativeInteger(65535);
assertEquals(addLen2, 2);
buffer1 = encoder.getBuffer();
byte[] buf_tmp = ByteHelper.getLenBytes(buffer1, new VlInt(0), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(buffer1.length,2);
assertEquals(num1,65535);
// 添加 MaxUint32
encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
int addLen3 = encoder.appendNonNegativeInteger(4294967295L);
assertEquals(addLen3, 4);
buffer1 = encoder.getBuffer();
byte[] buf_tmp2 = ByteHelper.getLenBytes(buffer1, new VlInt(0), 4);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(buffer1.length,4);
assertEquals(num2,4294967295L);
// 添加 MaxUint64
// TODO 测试添加64位整型所能表示的最大值
// encoder.encoderReset(new SizeT(MaxPacketSize),new SizeT(0));
// int addLen4 = encoder.appendNonNegativeInteger(18446744073709551615L);
// assertEquals(addLen4, 8);
// buffer1 = encoder.getBuffer();
// byte[] buf_tmp3 = ByteHelper.getLenBytes(buffer1, new VlInt(0), 8);
// long num3 = ByteHelper.new_byteArrayToLong(buf_tmp3);
// assertEquals(buffer1.length,8);
// assertEquals(num2,18446744073709551615L);
}
@Test
public void TestPrependByteArrayBlock(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(0));
estimator.estimatorReset();
byte[] buf = new byte[8000];
for (int i = 1; i < 8000; i++) {
buf[i] = (byte)(buf[i-1] +1);
}
//测试插入数据正确性
int addLen = encoder.prependByteArrayBlock(new VlInt(241), buf, new SizeT(buf.length));
assertEquals(addLen,3+8000+3);
byte[] buf1 = encoder.getBuffer();
assertEquals(addLen,8006);
assertEquals(buf1.length,8006);
assertEquals(buf1[0],(byte)241);
assertEquals(buf1[3],(byte)241);
//buf1[1:3] == 241
byte[] buf_tmp = ByteHelper.getLenBytes(buf1, new VlInt(1), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(num1,241);
//buf1[4:6]==8000
byte[] buf_tmp2 = ByteHelper.getLenBytes(buf1, new VlInt(4), 2);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(num2,8000);
//测试字节数组插入数据是否正确
int std = 0; //uint:std
for (int i = 0; i < 8000; i++) {
assertEquals(buf1[6+i],std);
std = (std+1)%256;
}
}
@Test
public void TestAppendByteArrayBlock(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(MaxPacketSize));
estimator.estimatorReset();
byte[] buf = new byte[8000];
for (int i = 1; i < 8000; i++) {
buf[i] = (byte)(buf[i-1] +1);
}
//测试插入数据正确性
int addLen = encoder.appendByteArrayBlock(new VlInt(241), buf, new SizeT(buf.length));
assertEquals(addLen,3+8000+3);
byte[] buf1 = encoder.getBuffer();
assertEquals(addLen,8006);
assertEquals(buf1.length,8006);
assertEquals(buf1[0],(byte)241);
assertEquals(buf1[3],(byte)241);
//buf1[1:3] == 241
byte[] buf_tmp = ByteHelper.getLenBytes(buf1, new VlInt(1), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(num1,241);
//buf1[4:6]==8000
byte[] buf_tmp2 = ByteHelper.getLenBytes(buf1, new VlInt(4), 2);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(num2,8000);
//测试字节数组插入数据是否正确
int std = 0; //uint:std
for (int i = 0; i < 8000; i++) {
assertEquals(buf1[6+i],std);
std = (std+1)%256;
}
}
@Test
public void TestPrependBlock(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(0));
estimator.estimatorReset();
byte[] buf = new byte[8000];
Block block = new Block();
block.setType(new VlInt(241));
block.setLength(new VlInt(8000));
block.setValue(buf);
int addLen = encoder.prependBlock(block);
assertEquals(addLen,8006);
byte[] buf1 = encoder.getBuffer();
assertEquals(addLen,8006);
assertEquals(buf1.length,8006);
assertEquals(buf1[0],(byte)241);
assertEquals(buf1[3],(byte)241);
//buf1[1:3] == 241
byte[] buf_tmp = ByteHelper.getLenBytes(buf1, new VlInt(1), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(num1,241);
//buf1[4:6]==8000
byte[] buf_tmp2 = ByteHelper.getLenBytes(buf1, new VlInt(4), 2);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(num2,8000);
}
@Test
public void TestAppendBlock(){
Encoder encoder = new Encoder();
Encoder estimator = new Encoder();
encoder.encoderReset(new SizeT(MaxPacketSize), new SizeT(MaxPacketSize));
estimator.estimatorReset();
byte[] buf = new byte[8000];
Block block = new Block();
block.setType(new VlInt(241));
block.setLength(new VlInt(8000));
block.setValue(buf);
int addLen = encoder.appendBlock(block);
assertEquals(addLen,8006);
byte[] buf1 = encoder.getBuffer();
assertEquals(addLen,8006);
assertEquals(buf1.length,8006);
assertEquals(buf1[0],(byte)241);
assertEquals(buf1[3],(byte)241);
//buf1[1:3] == 241
byte[] buf_tmp = ByteHelper.getLenBytes(buf1, new VlInt(1), 2);
int num1 = ByteHelper.new_byteArrayToInt(buf_tmp);
assertEquals(num1,241);
//buf1[4:6]==8000
byte[] buf_tmp2 = ByteHelper.getLenBytes(buf1, new VlInt(4), 2);
int num2 = ByteHelper.new_byteArrayToInt(buf_tmp2);
assertEquals(num2,8000);
}
}