vsphere-influxdb-go/vendor/github.com/influxdata/influxdb/tsdb/store_internal_test.go

168 lines
5.8 KiB
Go

package tsdb
import (
"fmt"
"reflect"
"sort"
"testing"
)
func TestStore_mergeTagValues(t *testing.T) {
examples := []struct {
in []tagValues
out TagValues
}{
{},
{in: make([]tagValues, 4), out: TagValues{Values: []KeyValue{}}},
{
in: []tagValues{createtagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c"}})},
out: createTagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c"}}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c"}}),
createtagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c"}}),
},
out: createTagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c"}}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c"}}),
createtagValues("m0", map[string][]string{"host": {"server-a", "server-d", "server-e"}}),
},
out: createTagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c", "server-d", "server-e"}}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"host": {"server-a"}}),
createtagValues("m0", map[string][]string{}),
createtagValues("m0", map[string][]string{"host": {"server-a"}}),
},
out: createTagValues("m0", map[string][]string{"host": {"server-a"}}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"host": {"server-q", "server-z"}}),
createtagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c"}}),
createtagValues("m0", map[string][]string{"host": {"server-a", "server-d", "server-e"}}),
createtagValues("m0", map[string][]string{"host": {"server-e", "server-q", "server-z"}}),
createtagValues("m0", map[string][]string{"host": {"server-a"}}),
},
out: createTagValues("m0", map[string][]string{"host": {"server-a", "server-b", "server-c", "server-d", "server-e", "server-q", "server-z"}}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"a": {"0", "1"}, "host1": {"server-q", "server-z"}}),
createtagValues("m0", map[string][]string{"a": {"0", "2"}, "host2": {"server-a", "server-b", "server-c"}}),
createtagValues("m0", map[string][]string{"a": {"0", "3"}, "host3": {"server-a", "server-d", "server-e"}}),
createtagValues("m0", map[string][]string{"a": {"0", "4"}, "host4": {"server-e", "server-q", "server-z"}}),
createtagValues("m0", map[string][]string{"a": {"0", "5"}, "host5": {"server-a"}}),
},
out: createTagValues("m0", map[string][]string{
"a": {"0", "1", "2", "3", "4", "5"},
"host1": {"server-q", "server-z"},
"host2": {"server-a", "server-b", "server-c"},
"host3": {"server-a", "server-d", "server-e"},
"host4": {"server-e", "server-q", "server-z"},
"host5": {"server-a"},
}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"region": {"east-1", "west-1"}, "host": {"server-a", "server-b", "server-c"}}),
createtagValues("m0", map[string][]string{"region": {"north-1", "west-1"}, "host": {"server-a", "server-d", "server-e"}}),
},
out: createTagValues("m0", map[string][]string{
"host": {"server-a", "server-b", "server-c", "server-d", "server-e"},
"region": {"east-1", "north-1", "west-1"},
}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"region": {"east-1", "west-1"}, "host": {"server-a", "server-b", "server-c"}}),
createtagValues("m0", map[string][]string{"city": {"Baltimore", "Las Vegas"}}),
},
out: createTagValues("m0", map[string][]string{
"city": {"Baltimore", "Las Vegas"},
"host": {"server-a", "server-b", "server-c"},
"region": {"east-1", "west-1"},
}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"city": {"Baltimore", "Las Vegas"}}),
createtagValues("m0", map[string][]string{"region": {"east-1", "west-1"}, "host": {"server-a", "server-b", "server-c"}}),
},
out: createTagValues("m0", map[string][]string{
"city": {"Baltimore", "Las Vegas"},
"host": {"server-a", "server-b", "server-c"},
"region": {"east-1", "west-1"},
}),
},
{
in: []tagValues{
createtagValues("m0", map[string][]string{"region": {"east-1", "west-1"}, "host": {"server-a", "server-b", "server-c"}}),
createtagValues("m0", map[string][]string{}),
},
out: createTagValues("m0", map[string][]string{
"host": {"server-a", "server-b", "server-c"},
"region": {"east-1", "west-1"},
}),
},
}
buf := make([][2]int, 10)
for i, example := range examples {
t.Run(fmt.Sprintf("example_%d", i+1), func(t *testing.T) {
if got, exp := mergeTagValues(buf, example.in...), example.out; !reflect.DeepEqual(got, exp) {
t.Fatalf("\ngot\n %#v\n\n expected\n %#v", got, exp)
}
})
}
}
// Helper to create some tagValues.
func createtagValues(mname string, kvs map[string][]string) tagValues {
out := tagValues{
name: []byte(mname),
keys: make([]string, 0, len(kvs)),
values: make([][]string, len(kvs)),
}
for k := range kvs {
out.keys = append(out.keys, k)
}
sort.Sort(sort.StringSlice(out.keys))
for i, k := range out.keys {
values := kvs[k]
sort.Sort(sort.StringSlice(values))
out.values[i] = values
}
return out
}
// Helper to create some TagValues
func createTagValues(mname string, kvs map[string][]string) TagValues {
var sz int
for _, v := range kvs {
sz += len(v)
}
out := TagValues{
Measurement: mname,
Values: make([]KeyValue, 0, sz),
}
for tk, tvs := range kvs {
for _, tv := range tvs {
out.Values = append(out.Values, KeyValue{Key: tk, Value: tv})
}
// We have to sort the KeyValues since that's how they're provided from
// the Store.
sort.Sort(KeyValues(out.Values))
}
return out
}