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