diff --git a/state/service_test.go b/state/service_test.go index 21dc0bc..d545cb0 100644 --- a/state/service_test.go +++ b/state/service_test.go @@ -1,14 +1,31 @@ package state import ( + "bytes" "encoding/json" "expvar" "testing" + "github.com/prometheus/client_golang/prometheus" "github.com/spf13/viper" "github.com/stretchr/testify/require" ) +type testCollector struct { + testA *prometheus.Desc + testB *prometheus.Desc +} + +func (c *testCollector) Describe(ch chan<- *prometheus.Desc) { + ch <- c.testA + ch <- c.testB +} + +func (c *testCollector) Collect(ch chan<- prometheus.Metric) { + ch <- prometheus.MustNewConstMetric(c.testA, prometheus.GaugeValue, 1, "label_1") + ch <- prometheus.MustNewConstMetric(c.testB, prometheus.GaugeValue, 2, "label_2") +} + func TestEncodeVariables(t *testing.T) { dump := make(map[string]interface{}) @@ -47,3 +64,55 @@ func TestEncodeConfig(t *testing.T) { require.Contains(t, dump, "test2") require.Equal(t, dump["test2"], "test2") } + +func TestEncodeAndDecodeMetrics(t *testing.T) { + registry := prometheus.NewRegistry() + + collector := &testCollector{ + testA: prometheus.NewDesc("test1", "test1", []string{"test1"}, prometheus.Labels{"label_1": "test1"}), + testB: prometheus.NewDesc("test2", "test2", []string{"test2"}, prometheus.Labels{"label_2": "test2"}), + } + + require.NoError(t, registry.Register(collector)) + + gather, err := registry.Gather() + require.NoError(t, err) + + res, err := EncodeMetrics(registry) + require.NoError(t, err) + + metrics, err := DecodeMetrics(res) + require.NoError(t, err) + + require.Len(t, metrics, len(gather)) + + { // Check that JSON encoded metrics are equal: + expect := new(bytes.Buffer) + actual := new(bytes.Buffer) + + require.NoError(t, json.NewEncoder(expect).Encode(gather)) + require.NoError(t, json.NewEncoder(actual).Encode(metrics)) + + require.Equal(t, expect.Bytes(), actual.Bytes()) + } + + { // Deep comparison of metrics: + for i := range metrics { + require.Equal(t, gather[i].Help, metrics[i].Help) + require.Equal(t, gather[i].Name, metrics[i].Name) + require.Equal(t, gather[i].Type, metrics[i].Type) + + require.Len(t, metrics[i].Metric, len(gather[i].Metric)) + + for j := range metrics[i].Metric { + require.Equal(t, gather[i].Metric[j].Gauge, metrics[i].Metric[j].Gauge) + require.Len(t, metrics[i].Metric[j].Label, len(gather[i].Metric[j].Label)) + + for k := range metrics[i].Metric[j].Label { + require.Equal(t, gather[i].Metric[j].Label[k].Name, metrics[i].Metric[j].Label[k].Name) + require.Equal(t, gather[i].Metric[j].Label[k].Value, metrics[i].Metric[j].Label[k].Value) + } + } + } + } +}