VictoriaMetrics/lib/logstorage/stream_id_test.go
2024-09-24 18:31:38 +02:00

207 lines
4.4 KiB
Go

package logstorage
import (
"reflect"
"testing"
)
func TestStreamIDMarshalUnmarshalString(t *testing.T) {
f := func(sid *streamID, resultExpected string) {
t.Helper()
result := string(sid.marshalString(nil))
if result != resultExpected {
t.Fatalf("unexpected result\ngot\n%q\nwant\n%q", result, resultExpected)
}
var sid2 streamID
if !sid2.tryUnmarshalFromString(result) {
t.Fatalf("cannot unmarshal streamID from %q", result)
}
result2 := string(sid2.marshalString(nil))
if result != result2 {
t.Fatalf("unexpected marshaled streamID; got %s; want %s", result2, result)
}
}
f(&streamID{}, "000000000000000000000000000000000000000000000000")
f(&streamID{
tenantID: TenantID{
AccountID: 123,
ProjectID: 456,
},
id: u128{
lo: 89,
hi: 344334,
},
}, "0000007b000001c8000000000005410e0000000000000059")
}
func TestStreamIDMarshalUnmarshal(t *testing.T) {
f := func(sid *streamID, marshaledLen int) {
t.Helper()
data := sid.marshal(nil)
if len(data) != marshaledLen {
t.Fatalf("unexpected length of marshaled streamID; got %d; want %d", len(data), marshaledLen)
}
var sid2 streamID
tail, err := sid2.unmarshal(data)
if err != nil {
t.Fatalf("unexpected error on unmarshal(%s): %s", sid, err)
}
if len(tail) != 0 {
t.Fatalf("unexpected non-empty tail on unmarshal(%s): %X", sid, tail)
}
if !reflect.DeepEqual(sid, &sid2) {
t.Fatalf("unexpected result on unmarshal; got %s; want %s", &sid2, sid)
}
s1 := sid.String()
s2 := sid2.String()
if s1 != s2 {
t.Fatalf("unexpected string result on unmarshal; got %s; want %s", s2, s1)
}
}
f(&streamID{}, 24)
f(&streamID{
tenantID: TenantID{
AccountID: 123,
ProjectID: 456,
},
id: u128{
lo: 89,
hi: 344334,
},
}, 24)
}
func TestStreamIDUnmarshalFailure(t *testing.T) {
f := func(data []byte) {
t.Helper()
dataOrig := append([]byte{}, data...)
var sid streamID
tail, err := sid.unmarshal(data)
if err == nil {
t.Fatalf("expecting non-nil error")
}
if string(tail) != string(dataOrig) {
t.Fatalf("unexpected tail; got %q; want %q", tail, dataOrig)
}
}
f(nil)
f([]byte("foo"))
f([]byte("1234567890"))
}
func TestStreamIDLessEqual(t *testing.T) {
// compare equal values
sid1 := &streamID{}
sid2 := &streamID{}
if sid1.less(sid2) {
t.Fatalf("less for equal values must return false")
}
if sid2.less(sid1) {
t.Fatalf("less for equal values must return false")
}
if !sid1.equal(sid2) {
t.Fatalf("unexpected equal(%s, %s) result; got false; want true", sid1, sid2)
}
if !sid2.equal(sid1) {
t.Fatalf("unexpected equal(%s, %s) result; got false; want true", sid2, sid1)
}
sid1 = &streamID{
tenantID: TenantID{
AccountID: 1,
ProjectID: 2,
},
id: u128{
hi: 123,
lo: 456,
},
}
sid2 = &streamID{
tenantID: TenantID{
AccountID: 1,
ProjectID: 2,
},
id: u128{
hi: 123,
lo: 456,
},
}
if sid1.less(sid2) {
t.Fatalf("less for equal values must return false")
}
if sid2.less(sid1) {
t.Fatalf("less for equal values must return false")
}
if !sid1.equal(sid2) {
t.Fatalf("unexpected equal(%s, %s) result; got false; want true", sid1, sid2)
}
if !sid2.equal(sid1) {
t.Fatalf("unexpected equal(%s, %s) result; got false; want true", sid2, sid1)
}
// compare unequal values
sid1 = &streamID{
id: u128{
lo: 456,
},
}
sid2 = &streamID{
id: u128{
hi: 123,
},
}
if !sid1.less(sid2) {
t.Fatalf("unexpected result for less(%s, %s); got false; want true", sid1, sid2)
}
if sid2.less(sid1) {
t.Fatalf("unexpected result for less(%s, %s); got true; want false", sid2, sid1)
}
if sid1.equal(sid2) {
t.Fatalf("unexpected result for equal(%s, %s); got true; want false", sid1, sid2)
}
sid1 = &streamID{
id: u128{
hi: 123,
lo: 456,
},
}
sid2 = &streamID{
tenantID: TenantID{
AccountID: 123,
},
}
if !sid1.less(sid2) {
t.Fatalf("unexpected result for less(%s, %s); got false; want true", sid1, sid2)
}
if sid2.less(sid1) {
t.Fatalf("unexpected result for less(%s, %s); got true; want false", sid2, sid1)
}
if sid1.equal(sid2) {
t.Fatalf("unexpected result for equal(%s, %s); got true; want false", sid1, sid2)
}
}
func TestStreamIDReset(t *testing.T) {
sid := &streamID{
tenantID: TenantID{
AccountID: 123,
ProjectID: 456,
},
id: u128{
hi: 234,
lo: 9843,
},
}
sid.reset()
sidZero := &streamID{}
if !reflect.DeepEqual(sid, sidZero) {
t.Fatalf("non-zero streamID after reset(): %s", sid)
}
}