You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.7 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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")
}