1// This file and its contents are licensed under the Apache License 2.0.
2// Please see the included NOTICE for copyright information and
3// LICENSE for a copy of the license.
4
5package ingestor
6
7import (
8	"testing"
9
10	"github.com/prometheus/prometheus/pkg/labels"
11	"github.com/stretchr/testify/require"
12	"github.com/timescale/promscale/pkg/pgmodel/cache"
13	"github.com/timescale/promscale/pkg/pgmodel/model"
14)
15
16func getSeries(t *testing.T, scache *cache.SeriesCacheImpl, labels labels.Labels) *model.Series {
17	series, err := scache.GetSeriesFromLabels(labels)
18	require.NoError(t, err)
19	return series
20}
21
22func makeLabelKey(l labels.Label) labelKey {
23	return labelKey{MetricName: "metric", Name: l.Name, Value: l.Value}
24}
25
26func TestLabelArrayCreator(t *testing.T) {
27	scache := cache.NewSeriesCache(cache.DefaultConfig, nil)
28	metricNameLabel := labels.Label{Name: "__name__", Value: "metric"}
29	valOne := labels.Label{Name: "key", Value: "one"}
30	valTwo := labels.Label{Name: "key", Value: "two"}
31	seriesSet := []*model.Series{
32		getSeries(t, scache, labels.Labels{metricNameLabel, valOne}),
33	}
34	labelMap := map[labelKey]labelInfo{
35		makeLabelKey(metricNameLabel): {2, 1},
36		makeLabelKey(valOne):          {3, 2},
37	}
38
39	res, _, err := createLabelArrays(seriesSet, labelMap, 2)
40	require.NoError(t, err)
41	expected := [][]int32{{2, 3}}
42	require.Equal(t, res, expected)
43
44	res, _, err = createLabelArrays(seriesSet, labelMap, 3)
45	require.NoError(t, err)
46	expected = [][]int32{{2, 3}}
47	require.Equal(t, res, expected)
48
49	labelMap[makeLabelKey(valOne)] = labelInfo{3, 3}
50	res, _, err = createLabelArrays(seriesSet, labelMap, 3)
51	require.NoError(t, err)
52	expected = [][]int32{{2, 0, 3}}
53	require.Equal(t, res, expected)
54
55	/* test two series */
56	seriesSet = []*model.Series{
57		getSeries(t, scache, labels.Labels{metricNameLabel, valOne}),
58		getSeries(t, scache, labels.Labels{metricNameLabel, valTwo}),
59	}
60	labelMap = map[labelKey]labelInfo{
61		makeLabelKey(metricNameLabel): {100, 1},
62		makeLabelKey(valOne):          {1, 5},
63		makeLabelKey(valTwo):          {2, 5},
64	}
65
66	res, ser, err := createLabelArrays(seriesSet, labelMap, 5)
67	require.NoError(t, err)
68	require.Equal(t, len(ser), 2)
69	expected = [][]int32{
70		{100, 0, 0, 0, 1},
71		{100, 0, 0, 0, 2},
72	}
73	require.Equal(t, res, expected)
74
75	/* test one series already set */
76	setSeries := getSeries(t, scache, labels.Labels{metricNameLabel, valTwo})
77	setSeries.SetSeriesID(5, 4)
78	seriesSet = []*model.Series{
79		getSeries(t, scache, labels.Labels{metricNameLabel, valOne}),
80		setSeries,
81	}
82	labelMap = map[labelKey]labelInfo{
83		makeLabelKey(metricNameLabel): {100, 1},
84		makeLabelKey(valOne):          {1, 5},
85		makeLabelKey(valTwo):          {2, 5},
86	}
87	res, ser, err = createLabelArrays(seriesSet, labelMap, 5)
88	require.NoError(t, err)
89	require.Equal(t, len(ser), 1)
90	expected = [][]int32{{100, 0, 0, 0, 1}}
91	require.Equal(t, res, expected)
92}
93