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.

96 lines
3.4 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"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestFixedLengthUnpacker(t *testing.T) {
u := NewFixedLengthUnpacker(4)
// 测试单个消息
data := []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 TestFixedLengthUnpackerMultipleMessages(t *testing.T) {
u := NewFixedLengthUnpacker(4)
// 测试多个消息
data := []byte("testdata")
messages, remaining, 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, 0, len(remaining), "Expected no remaining data")
assert.Equal(t, len(data), consumed, "Expected consumed equals input data length")
}
func TestFixedLengthUnpackerIncompleteMessage(t *testing.T) {
u := NewFixedLengthUnpacker(4)
// 测试不完整的消息
data := []byte("te")
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, "te", string(remaining), "Expected 'te' as remaining")
assert.Equal(t, len(data), consumed, "Expected all data consumed when no complete message")
}
func TestFixedLengthUnpackerPack(t *testing.T) {
u := NewFixedLengthUnpacker(4)
// 测试打包(数据长度匹配)
data := []byte("test")
packed, err := u.Pack(data)
require.NoError(t, err, "Expected no error")
assert.Equal(t, "test", string(packed), "Expected 'test'")
// 测试打包(数据长度不足,需要填充)
data2 := []byte("te")
packed2, err := u.Pack(data2)
require.NoError(t, err, "Expected no error")
assert.Equal(t, 4, len(packed2), "Expected 4 bytes")
assert.Equal(t, "te", string(packed2[:2]), "Expected 'te' prefix")
// 测试打包(数据长度超过,需要截断)
data3 := []byte("testdata")
packed3, err := u.Pack(data3)
require.NoError(t, err, "Expected no error")
assert.Equal(t, 4, len(packed3), "Expected 4 bytes")
assert.Equal(t, "test", string(packed3), "Expected 'test'")
}
func TestFixedLengthUnpackerPartialMessages(t *testing.T) {
u := NewFixedLengthUnpacker(4)
// 测试部分消息 + 完整消息
data1 := []byte("te")
messages, remaining, consumed, err := u.Unpack(data1)
require.NoError(t, err)
assert.Equal(t, 0, len(messages))
assert.Equal(t, "te", string(remaining))
assert.Equal(t, len(data1), consumed, "Expected all data consumed when no complete message")
// 添加更多数据完成第一个消息并开始第二个消息
data2 := []byte("stte")
messages, remaining, consumed, err = u.Unpack(data2)
require.NoError(t, err)
assert.Equal(t, 1, len(messages))
assert.Equal(t, "test", string(messages[0]))
assert.Equal(t, "te", string(remaining))
// consumed应该是2完成了"test"中的"st"部分,但"te"被保存到buffer中
assert.Greater(t, consumed, 0, "Expected some data consumed")
assert.LessOrEqual(t, consumed, len(data2), "Expected consumed <= input data length")
}