2022-11-30 06:22:12 +01:00
|
|
|
package promutils
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"gopkg.in/yaml.v2"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestLabels(t *testing.T) {
|
|
|
|
x := NewLabels(2)
|
|
|
|
x.Add("job", "bar")
|
|
|
|
x.Add("instance", "foo")
|
|
|
|
v := x.Get("instance")
|
|
|
|
if v != "foo" {
|
|
|
|
t.Fatalf("unexpected value obtained; got %q; want %q", v, "foo")
|
|
|
|
}
|
|
|
|
v = x.Get("non-existing-label")
|
|
|
|
if v != "" {
|
|
|
|
t.Fatalf("unexpected non-empty value obtained for non-existing label: %q", v)
|
|
|
|
}
|
|
|
|
n := x.Len()
|
|
|
|
if n != 2 {
|
|
|
|
t.Fatalf("unexpected labels len; got %d; want 2", n)
|
|
|
|
}
|
|
|
|
x.Sort()
|
|
|
|
x.SortStable()
|
|
|
|
s, err := yaml.Marshal(x)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unexpected error in yaml.Marshal: %s", err)
|
|
|
|
}
|
|
|
|
sExpected := "instance: foo\njob: bar\n"
|
|
|
|
if string(s) != sExpected {
|
|
|
|
t.Fatalf("unexpected marshaled value;\ngot\n%s\nwant\n%q", s, sExpected)
|
|
|
|
}
|
|
|
|
x1 := GetLabels()
|
|
|
|
if err := yaml.Unmarshal(s, &x1); err != nil {
|
|
|
|
t.Fatalf("unexpected error in yaml.Unmarshal: %s", err)
|
|
|
|
}
|
|
|
|
x1.InternStrings()
|
|
|
|
s, err = yaml.Marshal(&x1)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unexpected error in yaml.Marshal: %s", err)
|
|
|
|
}
|
|
|
|
if string(s) != sExpected {
|
|
|
|
t.Fatalf("unexpected marshaled value;\ngot\n%s\nwant\n%q", s, sExpected)
|
|
|
|
}
|
|
|
|
PutLabels(x1)
|
|
|
|
x1 = nil
|
|
|
|
if n = x1.Len(); n != 0 {
|
|
|
|
t.Fatalf("unexpected len for empty labels: %d", n)
|
|
|
|
}
|
|
|
|
x1 = GetLabels()
|
|
|
|
x2 := x.Clone()
|
|
|
|
s, err = yaml.Marshal(x2)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("cannot marshal cloned labels")
|
|
|
|
}
|
|
|
|
if string(s) != sExpected {
|
|
|
|
t.Fatalf("unexpected marshaled value;\ngot\n%s\nwant\n%q", s, sExpected)
|
|
|
|
}
|
|
|
|
s2 := x2.String()
|
|
|
|
s2Expected := `{instance="foo",job="bar"}`
|
|
|
|
if s2 != s2Expected {
|
|
|
|
t.Fatalf("unexpected string representation for labels;\ngot\n%s\nwant\n%s", s2, s2Expected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelsUnmarshalYAMLFailure(t *testing.T) {
|
|
|
|
f := func(s string) {
|
|
|
|
t.Helper()
|
|
|
|
var x Labels
|
|
|
|
if err := yaml.Unmarshal([]byte(s), &x); err == nil {
|
|
|
|
t.Fatalf("expecting non-nil error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f("foobar")
|
|
|
|
f("[foo,bar]")
|
|
|
|
f("{foo:[bar]}")
|
|
|
|
f("[aa")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelsUnmarshalJSONSuccess(t *testing.T) {
|
|
|
|
f := func(s string) {
|
|
|
|
t.Helper()
|
|
|
|
var x Labels
|
|
|
|
if err := json.Unmarshal([]byte(s), &x); err != nil {
|
|
|
|
t.Fatalf("unexpected error in json.Unmarshal: %s", err)
|
|
|
|
}
|
|
|
|
data, err := json.Marshal(&x)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("json.Marshal error: %s", err)
|
|
|
|
}
|
|
|
|
if string(data) != s {
|
|
|
|
t.Fatalf("unexpected marshaled JSON;\ngot\n%s\nwant\n%s", data, s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f(`{}`)
|
|
|
|
f(`{"foo":"bar"}`)
|
|
|
|
f(`{"a":"y","x":"b"}`)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelsUnmarshalJSONFailure(t *testing.T) {
|
|
|
|
f := func(s string) {
|
|
|
|
t.Helper()
|
|
|
|
var x Labels
|
|
|
|
if err := json.Unmarshal([]byte(s), &x); err == nil {
|
|
|
|
t.Fatalf("expecting non-nil error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f("foobar")
|
|
|
|
f("[1,2]")
|
|
|
|
f(`{"foo":123}`)
|
|
|
|
f(`{"foo"`)
|
|
|
|
f(`"ff`)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelsRemoveDuplicates(t *testing.T) {
|
|
|
|
var x Labels
|
|
|
|
x.Add("foo", "bar")
|
|
|
|
x.Add("foo", "baz")
|
|
|
|
x.Add("foo", "123")
|
|
|
|
x.Add("bar", "a")
|
|
|
|
x.RemoveDuplicates()
|
|
|
|
s := x.String()
|
|
|
|
sExpected := `{bar="a",foo="123"}`
|
|
|
|
if s != sExpected {
|
|
|
|
t.Fatalf("unexpected result;\ngot\n%s\nwant\n%s", s, sExpected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelsAddFrom(t *testing.T) {
|
|
|
|
var a, b Labels
|
|
|
|
a.Add("z", "x")
|
|
|
|
a.Add("foo", "bar")
|
|
|
|
b.Add("foo", "baz")
|
|
|
|
b.Add("x", "y")
|
|
|
|
a.AddFrom(&b)
|
|
|
|
a.RemoveDuplicates()
|
|
|
|
s := a.String()
|
|
|
|
sExpected := `{foo="baz",x="y",z="x"}`
|
|
|
|
if s != sExpected {
|
|
|
|
t.Fatalf("unexpected result;\ngot\n%s\nwant\n%s", s, sExpected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelsRemoveMetaLabels(t *testing.T) {
|
|
|
|
f := func(metric, resultExpected string) {
|
|
|
|
t.Helper()
|
2022-12-10 11:09:21 +01:00
|
|
|
labels := MustNewLabelsFromString(metric)
|
2022-11-30 06:22:12 +01:00
|
|
|
labels.RemoveMetaLabels()
|
|
|
|
result := labels.String()
|
|
|
|
if result != resultExpected {
|
|
|
|
t.Fatalf("unexpected result of RemoveMetaLabels;\ngot\n%s\nwant\n%s", result, resultExpected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f(`{}`, `{}`)
|
|
|
|
f(`{foo="bar"}`, `{foo="bar"}`)
|
|
|
|
f(`{__meta_foo="bar"}`, `{}`)
|
|
|
|
f(`{__meta_foo="bdffr",foo="bar",__meta_xxx="basd"}`, `{foo="bar"}`)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelsRemoveLabelsWithDoubleUnderscorePrefix(t *testing.T) {
|
|
|
|
f := func(metric, resultExpected string) {
|
|
|
|
t.Helper()
|
2022-12-10 11:09:21 +01:00
|
|
|
labels := MustNewLabelsFromString(metric)
|
2022-11-30 06:22:12 +01:00
|
|
|
labels.RemoveLabelsWithDoubleUnderscorePrefix()
|
|
|
|
result := labels.String()
|
|
|
|
if result != resultExpected {
|
|
|
|
t.Fatalf("unexpected result of RemoveLabelsWithDoubleUnderscorePrefix;\ngot\n%s\nwant\n%s", result, resultExpected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f(`{}`, `{}`)
|
|
|
|
f(`{foo="bar"}`, `{foo="bar"}`)
|
2023-04-03 06:05:01 +02:00
|
|
|
f(`{__meta_foo="bar",a="b",__name__="foo",__vm_filepath="aa"}`, `{a="b"}`)
|
2022-11-30 06:22:12 +01:00
|
|
|
f(`{__meta_foo="bdffr",foo="bar",__meta_xxx="basd"}`, `{foo="bar"}`)
|
|
|
|
}
|
2023-04-07 00:06:52 +02:00
|
|
|
|
|
|
|
func TestLabels_Set(t *testing.T) {
|
|
|
|
f := func(metric, name, value, resultExpected string) {
|
|
|
|
t.Helper()
|
|
|
|
labels := MustNewLabelsFromString(metric)
|
|
|
|
labels.Set(name, value)
|
|
|
|
result := labels.String()
|
|
|
|
if result != resultExpected {
|
|
|
|
t.Fatalf("unexpected result of RemoveLabelsWithDoubleUnderscorePrefix;\ngot\n%s\nwant\n%s", result, resultExpected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f(`{}`, ``, ``, `{}`)
|
|
|
|
f(`{foo="bar"}`, `bar`, `baz`, `{foo="bar",bar="baz"}`)
|
|
|
|
f(`{__meta_foo="bar",a="b",__name__="foo",__vm_filepath="aa"}`, `__name__`, `bar`, `{__meta_foo="bar",a="b",__name__="bar",__vm_filepath="aa"}`)
|
|
|
|
f(`{__meta_foo="bdffr",foo="bar",__meta_xxx="basd"}`, `__name__`, `baz`, `{__meta_foo="bdffr",foo="bar",__meta_xxx="basd",__name__="baz"}`)
|
|
|
|
f(`http_request_total{a="b"}`, `__name__`, `metric`, `{__name__="metric",a="b"}`)
|
|
|
|
f(`http_request_total{a="b"}`, `a`, `c`, `{__name__="http_request_total",a="c"}`)
|
|
|
|
f(`http_request_total{a="b"}`, `ip`, `127.0.0.1`, `{__name__="http_request_total",a="b",ip="127.0.0.1"}`)
|
|
|
|
}
|
2023-05-13 01:52:09 +02:00
|
|
|
|
|
|
|
func TestNewLabelsFromStringSuccess(t *testing.T) {
|
|
|
|
f := func(s, resultExpected string) {
|
|
|
|
t.Helper()
|
|
|
|
labels, err := NewLabelsFromString(s)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unexpected error: %s", err)
|
|
|
|
}
|
|
|
|
result := labels.String()
|
|
|
|
if result != resultExpected {
|
|
|
|
t.Fatalf("unexpected result;\ngot\n%s\nwant\n%s", result, resultExpected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
f("{}", "{}")
|
|
|
|
f("foo", `{__name__="foo"}`)
|
|
|
|
f(`foo{bar="baz"}`, `{__name__="foo",bar="baz"}`)
|
|
|
|
f(`foo {bar="baz", a="b"}`, `{__name__="foo",bar="baz",a="b"}`)
|
|
|
|
f(`{foo="bar", baz="a"}`, `{foo="bar",baz="a"}`)
|
|
|
|
f(`{__name__="aaa"}`, `{__name__="aaa"}`)
|
|
|
|
f(`{__name__="abc",de="fg"}`, `{__name__="abc",de="fg"}`)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNewLabelsFromStringFailure(t *testing.T) {
|
|
|
|
f := func(s string) {
|
|
|
|
t.Helper()
|
|
|
|
labels, err := NewLabelsFromString(s)
|
|
|
|
if labels != nil {
|
|
|
|
t.Fatalf("unexpected non-nil labels: %s", labels)
|
|
|
|
}
|
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("expecting non-nil error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
f("")
|
|
|
|
f("foo bar")
|
|
|
|
f(`foo{`)
|
|
|
|
f(`foo{bar`)
|
|
|
|
f(`foo{bar=`)
|
|
|
|
f(`foo{bar="`)
|
|
|
|
f(`foo{bar="baz`)
|
|
|
|
f(`foo{bar="baz"`)
|
|
|
|
f(`foo{bar="baz",`)
|
|
|
|
f(`foo{"bar"="baz"}`)
|
|
|
|
f(`{"bar":"baz"}`)
|
|
|
|
f(`{bar:"baz"}`)
|
|
|
|
f(`{bar=~"baz"}`)
|
|
|
|
}
|