...
1 package reaper
2
3 import (
4 "context"
5 "testing"
6
7 "github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
8 "github.com/cybertec-postgresql/pgwatch/v3/internal/sources"
9 "github.com/pashagolub/pgxmock/v4"
10 "github.com/stretchr/testify/assert"
11 )
12
13 var (
14 initialMetricDefs = metrics.MetricDefs{
15 "metric1": metrics.Metric{Description: "metric1"},
16 }
17 initialPresetDefs = metrics.PresetDefs{
18 "preset1": metrics.Preset{Description: "preset1", Metrics: map[string]float64{"metric1": 1.0}},
19 }
20
21 newMetricDefs = metrics.MetricDefs{
22 "metric2": metrics.Metric{Description: "metric2"},
23 }
24 newPresetDefs = metrics.PresetDefs{
25 "preset2": metrics.Preset{Description: "preset2", Metrics: map[string]float64{"metric2": 2.0}},
26 }
27 )
28
29 func TestReaper_FetchStatsDirectlyFromOS(t *testing.T) {
30 a := assert.New(t)
31 r := &Reaper{}
32 conn, _ := pgxmock.NewPool(pgxmock.QueryMatcherOption(pgxmock.QueryMatcherEqual))
33 expq := conn.ExpectQuery("SELECT COALESCE(inet_client_addr(), inet_server_addr()) IS NULL")
34 expq.Times(uint(len(directlyFetchableOSMetrics)))
35 md := &sources.SourceConn{Conn: conn}
36 for _, m := range directlyFetchableOSMetrics {
37 expq.WillReturnRows(pgxmock.NewRows([]string{"is_unix_socket"}).AddRow(true))
38 a.True(IsDirectlyFetchableMetric(md, m), "Expected %s to be directly fetchable", m)
39 a.NotPanics(func() {
40 _, _ = r.FetchStatsDirectlyFromOS(context.Background(), md, m)
41 })
42 }
43 }
44
45 func TestConcurrentMetricDefs_Assign(t *testing.T) {
46 concurrentDefs := NewConcurrentMetricDefs()
47 concurrentDefs.Assign(&metrics.Metrics{
48 MetricDefs: initialMetricDefs,
49 PresetDefs: initialPresetDefs,
50 })
51
52 concurrentDefs.Assign(&metrics.Metrics{
53 MetricDefs: newMetricDefs,
54 PresetDefs: newPresetDefs,
55 })
56
57 assert.Equal(t, newMetricDefs, concurrentDefs.MetricDefs, "MetricDefs should be updated")
58 assert.Equal(t, newPresetDefs, concurrentDefs.PresetDefs, "PresetDefs should be updated")
59 }
60
61 func TestConcurrentMetricDefs_RandomAccess(t *testing.T) {
62 a := assert.New(t)
63
64 concurrentDefs := NewConcurrentMetricDefs()
65 concurrentDefs.Assign(&metrics.Metrics{
66 MetricDefs: initialMetricDefs,
67 PresetDefs: initialPresetDefs,
68 })
69
70 go a.NotPanics(func() {
71 for range 1000 {
72 _, ok1 := concurrentDefs.GetMetricDef("metric1")
73 _, ok2 := concurrentDefs.GetMetricDef("metric2")
74 a.True(ok1 || ok2, "Expected metric1 or metric3 to exist at any time")
75 _, ok1 = concurrentDefs.GetPresetDef("preset1")
76 _, ok2 = concurrentDefs.GetPresetDef("preset2")
77 a.True(ok1 || ok2, "Expected preset1 or preset2 to exist at any time")
78 m1 := concurrentDefs.GetPresetMetrics("preset1")
79 m2 := concurrentDefs.GetPresetMetrics("preset2")
80 a.True(m1 != nil || m2 != nil, "Expected preset1 or preset2 metrics to be non-empty")
81 }
82 })
83
84 go a.NotPanics(func() {
85 for range 1000 {
86 concurrentDefs.Assign(&metrics.Metrics{
87 MetricDefs: newMetricDefs,
88 PresetDefs: newPresetDefs,
89 })
90 }
91 })
92 }
93