mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
148 lines
4.7 KiB
Go
148 lines
4.7 KiB
Go
package storage
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestMetricNameSortTags(t *testing.T) {
|
|
testMetricNameSortTags(t, []string{}, []string{})
|
|
testMetricNameSortTags(t, []string{"foo"}, []string{"foo"})
|
|
testMetricNameSortTags(t, []string{"job"}, []string{"job"})
|
|
testMetricNameSortTags(t, []string{"server"}, []string{"server"})
|
|
testMetricNameSortTags(t, []string{"host", "foo", "bar", "service"}, []string{"service", "host", "bar", "foo"})
|
|
testMetricNameSortTags(t, []string{"model", "foo", "job", "host", "server", "instance"},
|
|
[]string{"job", "model", "instance", "host", "server", "foo"})
|
|
}
|
|
|
|
func testMetricNameSortTags(t *testing.T, tags, expectedTags []string) {
|
|
t.Helper()
|
|
|
|
var mn MetricName
|
|
for _, t := range tags {
|
|
mn.AddTag(t, "")
|
|
}
|
|
mn.sortTags()
|
|
|
|
resultTags := []string{}
|
|
for i := range mn.Tags {
|
|
resultTags = append(resultTags, string(mn.Tags[i].Key))
|
|
}
|
|
if !reflect.DeepEqual(resultTags, expectedTags) {
|
|
t.Fatalf("unexpected resultTags\ngot\n%q\nwant\n%q", resultTags, expectedTags)
|
|
}
|
|
}
|
|
|
|
func TestMetricNameMarshalDuplicateKeys(t *testing.T) {
|
|
var mn MetricName
|
|
mn.AccountID = 123
|
|
mn.ProjectID = 324
|
|
mn.MetricGroup = []byte("xxx")
|
|
mn.AddTag("foo", "bar")
|
|
mn.AddTag("duplicate", "tag")
|
|
mn.AddTag("duplicate", "tag")
|
|
mn.AddTag("tt", "xx")
|
|
mn.AddTag("duplicate", "tag2")
|
|
|
|
var mnExpected MetricName
|
|
mnExpected.AccountID = 123
|
|
mnExpected.ProjectID = 324
|
|
mnExpected.MetricGroup = []byte("xxx")
|
|
mnExpected.AddTag("duplicate", "tag")
|
|
mnExpected.AddTag("foo", "bar")
|
|
mnExpected.AddTag("tt", "xx")
|
|
|
|
mn.sortTags()
|
|
data := mn.Marshal(nil)
|
|
var mn1 MetricName
|
|
if err := mn1.Unmarshal(data); err != nil {
|
|
t.Fatalf("cannot unmarshal mn %s: %s", &mn, err)
|
|
}
|
|
if !reflect.DeepEqual(&mnExpected, &mn1) {
|
|
t.Fatalf("unexpected mn unmarshaled;\ngot\n%+v\nwant\n%+v", &mn1, &mnExpected)
|
|
}
|
|
}
|
|
|
|
func TestMetricNameMarshalUnmarshal(t *testing.T) {
|
|
for i := 0; i < 10; i++ {
|
|
for tagsCount := 0; tagsCount < 10; tagsCount++ {
|
|
var mn MetricName
|
|
for j := 0; j < tagsCount; j++ {
|
|
key := fmt.Sprintf("key_%d_%d_\x00\x01\x02", i, j)
|
|
value := fmt.Sprintf("\x02\x00\x01value_%d_%d", i, j)
|
|
mn.AddTag(key, value)
|
|
}
|
|
mn.sortTags()
|
|
data := mn.Marshal(nil)
|
|
var mn1 MetricName
|
|
if err := mn1.Unmarshal(data); err != nil {
|
|
t.Fatalf("cannot unmarshal mn %s: %s", &mn, err)
|
|
}
|
|
if !reflect.DeepEqual(&mn, &mn1) {
|
|
t.Fatalf("unexpected mn unmarshaled;\ngot\n%+v\nwant\n%+v", &mn1, &mn)
|
|
}
|
|
|
|
// Try unmarshaling MetricName without tag value.
|
|
brokenData := marshalTagValue(data, []byte("foobar"))
|
|
if err := mn1.Unmarshal(brokenData); err == nil {
|
|
t.Fatalf("expecting non-zero error when unmarshaling MetricName without tag value")
|
|
}
|
|
|
|
// Try unmarshaling MetricName with invalid tag key.
|
|
brokenData[len(brokenData)-1] = 123
|
|
if err := mn1.Unmarshal(brokenData); err == nil {
|
|
t.Fatalf("expecting non-zero error when unmarshaling MetricName with invalid tag key")
|
|
}
|
|
|
|
// Try unmarshaling MetricName with invalid tag value.
|
|
brokenData = marshalTagValue(data, []byte("foobar"))
|
|
brokenData = marshalTagValue(brokenData, []byte("aaa"))
|
|
brokenData[len(brokenData)-1] = 123
|
|
if err := mn1.Unmarshal(brokenData); err == nil {
|
|
t.Fatalf("expecting non-zero error when unmarshaling MetricName with invalid tag value")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMetricNameMarshalUnmarshalRaw(t *testing.T) {
|
|
for i := 0; i < 10; i++ {
|
|
for tagsCount := 0; tagsCount < 10; tagsCount++ {
|
|
var mn MetricName
|
|
for j := 0; j < tagsCount; j++ {
|
|
key := fmt.Sprintf("key_%d_%d_\x00\x01\x02", i, j)
|
|
value := fmt.Sprintf("\x02\x00\x01value_%d_%d", i, j)
|
|
mn.AddTag(key, value)
|
|
}
|
|
data := mn.marshalRaw(nil)
|
|
var mn1 MetricName
|
|
if err := mn1.unmarshalRaw(data); err != nil {
|
|
t.Fatalf("cannot unmarshal mn %s: %s", &mn, err)
|
|
}
|
|
if !reflect.DeepEqual(&mn, &mn1) {
|
|
t.Fatalf("unexpected mn unmarshaled;\ngot\n%+v\nwant\n%+v", &mn1, &mn)
|
|
}
|
|
|
|
// Try unmarshaling MetricName without tag value.
|
|
brokenData := marshalTagValue(data, []byte("foobar"))
|
|
if err := mn1.unmarshalRaw(brokenData); err == nil {
|
|
t.Fatalf("expecting non-zero error when unmarshaling MetricName without tag value")
|
|
}
|
|
|
|
// Try unmarshaling MetricName with invalid tag key.
|
|
brokenData[len(brokenData)-1] = 123
|
|
if err := mn1.unmarshalRaw(brokenData); err == nil {
|
|
t.Fatalf("expecting non-zero error when unmarshaling MetricName with invalid tag key")
|
|
}
|
|
|
|
// Try unmarshaling MetricName with invalid tag value.
|
|
brokenData = marshalTagValue(data, []byte("foobar"))
|
|
brokenData = marshalTagValue(brokenData, []byte("aaa"))
|
|
brokenData[len(brokenData)-1] = 123
|
|
if err := mn1.unmarshalRaw(brokenData); err == nil {
|
|
t.Fatalf("expecting non-zero error when unmarshaling MetricName with invalid tag value")
|
|
}
|
|
}
|
|
}
|
|
}
|