...
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()
33 md := &sources.SourceConn{Conn: conn}
34 for _, m := range directlyFetchableOSMetrics {
35 a.True(IsDirectlyFetchableMetric(m), "Expected %s to be directly fetchable", m)
36 a.NotPanics(func() {
37 _, _ = r.FetchStatsDirectlyFromOS(context.Background(), md, m)
38 })
39 }
40 }
41
42 func TestConcurrentMetricDefs_Assign(t *testing.T) {
43 concurrentDefs := NewConcurrentMetricDefs()
44 concurrentDefs.Assign(&metrics.Metrics{
45 MetricDefs: initialMetricDefs,
46 PresetDefs: initialPresetDefs,
47 })
48
49 concurrentDefs.Assign(&metrics.Metrics{
50 MetricDefs: newMetricDefs,
51 PresetDefs: newPresetDefs,
52 })
53
54 assert.Equal(t, newMetricDefs, concurrentDefs.MetricDefs, "MetricDefs should be updated")
55 assert.Equal(t, newPresetDefs, concurrentDefs.PresetDefs, "PresetDefs should be updated")
56 }
57
58 func TestConcurrentMetricDefs_RandomAccess(t *testing.T) {
59 a := assert.New(t)
60
61 concurrentDefs := NewConcurrentMetricDefs()
62 concurrentDefs.Assign(&metrics.Metrics{
63 MetricDefs: initialMetricDefs,
64 PresetDefs: initialPresetDefs,
65 })
66
67 go a.NotPanics(func() {
68 for range 1000 {
69 _, ok1 := concurrentDefs.GetMetricDef("metric1")
70 _, ok2 := concurrentDefs.GetMetricDef("metric2")
71 a.True(ok1 || ok2, "Expected metric1 or metric3 to exist at any time")
72 _, ok1 = concurrentDefs.GetPresetDef("preset1")
73 _, ok2 = concurrentDefs.GetPresetDef("preset2")
74 a.True(ok1 || ok2, "Expected preset1 or preset2 to exist at any time")
75 m1 := concurrentDefs.GetPresetMetrics("preset1")
76 m2 := concurrentDefs.GetPresetMetrics("preset2")
77 a.True(m1 != nil || m2 != nil, "Expected preset1 or preset2 metrics to be non-empty")
78 }
79 })
80
81 go a.NotPanics(func() {
82 for range 1000 {
83 concurrentDefs.Assign(&metrics.Metrics{
84 MetricDefs: newMetricDefs,
85 PresetDefs: newPresetDefs,
86 })
87 }
88 })
89 }
90