milvus/pkg/streaming/util/message/message_builder_test.go
chyezh d2bc4a53be
enhance: implement rmq and pulsar as wal (#34046)
issue: #33285

- use reader but not consumer for pulsar
- advanced test framework
- move some streaming related package into pkg

---------

Signed-off-by: chyezh <chyezh@outlook.com>
2024-06-27 15:11:05 +08:00

106 lines
3.4 KiB
Go

package message_test
import (
"fmt"
"testing"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/assert"
"github.com/milvus-io/milvus/pkg/mocks/streaming/util/mock_message"
"github.com/milvus-io/milvus/pkg/streaming/util/message"
)
func TestMessage(t *testing.T) {
b := message.NewBuilder()
mutableMessage := b.WithMessageType(message.MessageTypeTimeTick).
WithPayload([]byte("payload")).
WithProperties(map[string]string{"key": "value"}).
BuildMutable()
assert.Equal(t, "payload", string(mutableMessage.Payload()))
assert.True(t, mutableMessage.Properties().Exist("key"))
v, ok := mutableMessage.Properties().Get("key")
assert.Equal(t, "value", v)
assert.True(t, ok)
assert.Equal(t, message.MessageTypeTimeTick, mutableMessage.MessageType())
assert.Equal(t, 21, mutableMessage.EstimateSize())
mutableMessage.WithTimeTick(123)
v, ok = mutableMessage.Properties().Get("_tt")
assert.True(t, ok)
tt, n := proto.DecodeVarint([]byte(v))
assert.Equal(t, uint64(123), tt)
assert.Equal(t, len([]byte(v)), n)
lcMsgID := mock_message.NewMockMessageID(t)
lcMsgID.EXPECT().Marshal().Return([]byte("lcMsgID"))
mutableMessage.WithLastConfirmed(lcMsgID)
v, ok = mutableMessage.Properties().Get("_lc")
assert.True(t, ok)
assert.Equal(t, v, "lcMsgID")
msgID := mock_message.NewMockMessageID(t)
msgID.EXPECT().EQ(msgID).Return(true)
msgID.EXPECT().WALName().Return("testMsgID")
message.RegisterMessageIDUnmsarshaler("testMsgID", func(data []byte) (message.MessageID, error) {
if string(data) == "lcMsgID" {
return msgID, nil
}
panic(fmt.Sprintf("unexpected data: %s", data))
})
b = message.NewBuilder()
immutableMessage := b.WithMessageID(msgID).
WithPayload([]byte("payload")).
WithProperties(map[string]string{
"key": "value",
"_t": "1",
"_tt": string(proto.EncodeVarint(456)),
"_v": "1",
"_lc": "lcMsgID",
}).
BuildImmutable()
assert.True(t, immutableMessage.MessageID().EQ(msgID))
assert.Equal(t, "payload", string(immutableMessage.Payload()))
assert.True(t, immutableMessage.Properties().Exist("key"))
v, ok = immutableMessage.Properties().Get("key")
assert.Equal(t, "value", v)
assert.True(t, ok)
assert.Equal(t, message.MessageTypeTimeTick, immutableMessage.MessageType())
assert.Equal(t, 36, immutableMessage.EstimateSize())
assert.Equal(t, message.Version(1), immutableMessage.Version())
assert.Equal(t, uint64(456), immutableMessage.TimeTick())
assert.NotNil(t, immutableMessage.LastConfirmedMessageID())
b = message.NewBuilder()
immutableMessage = b.WithMessageID(msgID).
WithPayload([]byte("payload")).
WithProperty("key", "value").
WithProperty("_t", "1").
BuildImmutable()
assert.True(t, immutableMessage.MessageID().EQ(msgID))
assert.Equal(t, "payload", string(immutableMessage.Payload()))
assert.True(t, immutableMessage.Properties().Exist("key"))
v, ok = immutableMessage.Properties().Get("key")
assert.Equal(t, "value", v)
assert.True(t, ok)
assert.Equal(t, message.MessageTypeTimeTick, immutableMessage.MessageType())
assert.Equal(t, 18, immutableMessage.EstimateSize())
assert.Equal(t, message.Version(0), immutableMessage.Version())
assert.Panics(t, func() {
immutableMessage.TimeTick()
})
assert.Panics(t, func() {
immutableMessage.LastConfirmedMessageID()
})
assert.Panics(t, func() {
message.NewBuilder().WithMessageID(msgID).BuildMutable()
})
assert.Panics(t, func() {
message.NewBuilder().BuildImmutable()
})
}