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.

97 lines
3.3 KiB
Go

package unpacker
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestDelimiterUnpacker(t *testing.T) {
u := NewDelimiterUnpacker([]byte("\n"))
// 测试单个消息
data := []byte("hello\n")
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, "hello\n", string(messages[0]), "Expected 'hello\\n'")
assert.Equal(t, 0, len(remaining), "Expected no remaining data")
assert.Equal(t, len(data), consumed, "Expected consumed equals input data length")
}
func TestDelimiterUnpackerMultipleMessages(t *testing.T) {
u := NewDelimiterUnpacker([]byte("\n"))
// 测试多个消息
data := []byte("hello\nworld\ntest\n")
messages, remaining, consumed, err := u.Unpack(data)
require.NoError(t, err, "Expected no error")
assert.Equal(t, 3, len(messages), "Expected 3 messages")
assert.Equal(t, "hello\n", string(messages[0]), "Expected 'hello\\n'")
assert.Equal(t, "world\n", string(messages[1]), "Expected 'world\\n'")
assert.Equal(t, "test\n", string(messages[2]), "Expected 'test\\n'")
assert.Equal(t, 0, len(remaining), "Expected no remaining data")
assert.Equal(t, len(data), consumed, "Expected consumed equals input data length")
}
func TestDelimiterUnpackerIncompleteMessage(t *testing.T) {
u := NewDelimiterUnpacker([]byte("\n"))
// 测试不完整的消息
data := []byte("hello")
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, "hello", string(remaining), "Expected 'hello' as remaining")
assert.Equal(t, len(data), consumed, "Expected all data consumed when no complete message")
// 添加分隔符,应该完成消息
data2 := []byte("\n")
messages, remaining, consumed, err = u.Unpack(data2)
require.NoError(t, err, "Expected no error")
assert.Equal(t, 1, len(messages), "Expected 1 message")
assert.Equal(t, "hello\n", string(messages[0]), "Expected 'hello\\n'")
assert.Equal(t, len(data2), consumed, "Expected consumed equals input data length")
}
func TestDelimiterUnpackerPack(t *testing.T) {
u := NewDelimiterUnpacker([]byte("\n"))
// 测试打包
data := []byte("hello")
packed, err := u.Pack(data)
require.NoError(t, err, "Expected no error")
assert.Equal(t, "hello\n", string(packed), "Expected 'hello\\n'")
// 测试已包含分隔符的数据
data2 := []byte("world\n")
packed2, err := u.Pack(data2)
require.NoError(t, err, "Expected no error")
assert.Equal(t, "world\n", string(packed2), "Expected 'world\\n'")
}
func TestDelimiterUnpackerEmptyDelimiter(t *testing.T) {
// 测试空分隔符(应该使用默认换行符)
u := NewDelimiterUnpacker(nil)
data := []byte("hello\n")
messages, _, consumed, err := u.Unpack(data)
require.NoError(t, err)
assert.Equal(t, 1, len(messages))
assert.Equal(t, len(data), consumed, "Expected consumed equals input data length")
}
func TestDelimiterUnpackerBufferSizeLimit(t *testing.T) {
// 测试缓冲区大小限制
u := NewDelimiterUnpackerWithMaxBuffer([]byte("\n"), 10)
// 创建超过缓冲区大小的数据
data := make([]byte, 20)
for i := range data {
data[i] = 'a'
}
_, _, _, err := u.Unpack(data)
assert.Error(t, err, "Expected error for buffer size exceeded")
}