|
|
package unpacker
|
|
|
|
|
|
import (
|
|
|
"testing"
|
|
|
|
|
|
unpackerpkg "github.com/noahlann/nnet/pkg/unpacker"
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
"github.com/stretchr/testify/require"
|
|
|
)
|
|
|
|
|
|
func TestLengthFieldUnpacker(t *testing.T) {
|
|
|
config := unpackerpkg.LengthFieldUnpacker{
|
|
|
LengthFieldOffset: 0,
|
|
|
LengthFieldLength: 4,
|
|
|
LengthAdjustment: 0,
|
|
|
InitialBytesToStrip: 4, // 跳过长度字段,只返回数据部分
|
|
|
MaxBufferSize: 1024,
|
|
|
}
|
|
|
u := NewLengthFieldUnpacker(config)
|
|
|
|
|
|
// 创建测试数据:4字节长度 + 数据
|
|
|
data := make([]byte, 8)
|
|
|
data[0] = 0
|
|
|
data[1] = 0
|
|
|
data[2] = 0
|
|
|
data[3] = 4 // 长度 = 4
|
|
|
copy(data[4:], []byte("test"))
|
|
|
|
|
|
messages, remaining, consumed, err := u.Unpack(data)
|
|
|
require.NoError(t, err, "Expected no error")
|
|
|
assert.Equal(t, 1, len(messages), "Expected 1 message")
|
|
|
assert.Equal(t, "test", string(messages[0]), "Expected 'test'")
|
|
|
assert.Equal(t, 0, len(remaining), "Expected no remaining data")
|
|
|
assert.Equal(t, len(data), consumed, "Expected consumed equals input data length")
|
|
|
}
|
|
|
|
|
|
func TestLengthFieldUnpackerMultipleMessages(t *testing.T) {
|
|
|
config := unpackerpkg.LengthFieldUnpacker{
|
|
|
LengthFieldOffset: 0,
|
|
|
LengthFieldLength: 4,
|
|
|
LengthAdjustment: 0,
|
|
|
InitialBytesToStrip: 4, // 跳过长度字段,只返回数据部分
|
|
|
MaxBufferSize: 1024,
|
|
|
}
|
|
|
u := NewLengthFieldUnpacker(config)
|
|
|
|
|
|
// 创建多个消息
|
|
|
data := make([]byte, 16)
|
|
|
// 第一个消息:长度4,数据"test"
|
|
|
data[0] = 0
|
|
|
data[1] = 0
|
|
|
data[2] = 0
|
|
|
data[3] = 4
|
|
|
copy(data[4:], []byte("test"))
|
|
|
// 第二个消息:长度4,数据"data"
|
|
|
data[8] = 0
|
|
|
data[9] = 0
|
|
|
data[10] = 0
|
|
|
data[11] = 4
|
|
|
copy(data[12:], []byte("data"))
|
|
|
|
|
|
messages, _, consumed, err := u.Unpack(data)
|
|
|
require.NoError(t, err, "Expected no error")
|
|
|
assert.Equal(t, 2, len(messages), "Expected 2 messages")
|
|
|
assert.Equal(t, "test", string(messages[0]), "Expected 'test'")
|
|
|
assert.Equal(t, "data", string(messages[1]), "Expected 'data'")
|
|
|
assert.Equal(t, len(data), consumed, "Expected consumed equals input data length")
|
|
|
}
|
|
|
|
|
|
func TestLengthFieldUnpackerIncompleteMessage(t *testing.T) {
|
|
|
config := unpackerpkg.LengthFieldUnpacker{
|
|
|
LengthFieldOffset: 0,
|
|
|
LengthFieldLength: 4,
|
|
|
LengthAdjustment: 0,
|
|
|
InitialBytesToStrip: 0,
|
|
|
MaxBufferSize: 1024,
|
|
|
}
|
|
|
u := NewLengthFieldUnpacker(config)
|
|
|
|
|
|
// 测试不完整的消息(只有长度字段)
|
|
|
data := []byte{0, 0, 0, 4}
|
|
|
messages, remaining, consumed, err := u.Unpack(data)
|
|
|
require.NoError(t, err, "Expected no error")
|
|
|
assert.Equal(t, 0, len(messages), "Expected 0 messages")
|
|
|
assert.Equal(t, 4, len(remaining), "Expected 4 bytes remaining")
|
|
|
assert.Equal(t, len(data), consumed, "Expected all data consumed when no complete message")
|
|
|
}
|
|
|
|
|
|
func TestLengthFieldUnpackerPack(t *testing.T) {
|
|
|
config := unpackerpkg.LengthFieldUnpacker{
|
|
|
LengthFieldOffset: 0,
|
|
|
LengthFieldLength: 4,
|
|
|
LengthAdjustment: 0,
|
|
|
InitialBytesToStrip: 0,
|
|
|
MaxBufferSize: 1024,
|
|
|
}
|
|
|
u := NewLengthFieldUnpacker(config)
|
|
|
|
|
|
// 测试打包
|
|
|
data := []byte("test")
|
|
|
packed, err := u.Pack(data)
|
|
|
require.NoError(t, err, "Expected no error")
|
|
|
assert.Equal(t, 8, len(packed), "Expected 8 bytes")
|
|
|
assert.Equal(t, byte(4), packed[3], "Expected length 4")
|
|
|
assert.Equal(t, "test", string(packed[4:]), "Expected 'test'")
|
|
|
}
|
|
|
|
|
|
func TestLengthFieldUnpackerBufferSizeLimit(t *testing.T) {
|
|
|
// 测试缓冲区大小限制
|
|
|
config := unpackerpkg.LengthFieldUnpacker{
|
|
|
LengthFieldOffset: 0,
|
|
|
LengthFieldLength: 4,
|
|
|
LengthAdjustment: 0,
|
|
|
InitialBytesToStrip: 0,
|
|
|
MaxBufferSize: 10, // 小缓冲区
|
|
|
}
|
|
|
u := NewLengthFieldUnpacker(config)
|
|
|
|
|
|
// 创建超过缓冲区大小的数据
|
|
|
data := make([]byte, 20)
|
|
|
data[0] = 0
|
|
|
data[1] = 0
|
|
|
data[2] = 0
|
|
|
data[3] = 20 // 长度 = 20
|
|
|
|
|
|
_, _, _, err := u.Unpack(data)
|
|
|
assert.Error(t, err, "Expected error for buffer size exceeded")
|
|
|
}
|
|
|
|