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