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