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