master
go 197 lines 5.5 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package mysql
4
5 import (
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10
11 "github.com/netdata/netdata/go/plugins/pkg/metrix"
12 )
13
14 func TestCollectorMetricsSetCoverage(t *testing.T) {
15 store := metrix.NewCollectorStore()
16 mx := newCollectorMetrics(store)
17 require.NotNil(t, mx)
18
19 fixedCases := map[string]struct {
20 name string
21 value int64
22 }{}
23
24 for key := range mx.globalStatus.gauges {
25 fixedCases["global_status_"+key] = struct {
26 name string
27 value int64
28 }{name: key, value: 1}
29 }
30
31 for key := range mx.globalStatus.counters {
32 fixedCases["global_status_"+key] = struct {
33 name string
34 value int64
35 }{name: key, value: 1}
36 }
37
38 for testName, tc := range fixedCases {
39 t.Run(testName, func(t *testing.T) {
40 assert.NotPanics(t, func() {
41 runCollectorCycle(t, store, func() {
42 mx.set(tc.name, tc.value)
43 })
44 })
45 })
46 }
47
48 t.Run("unknown_metric_is_ignored", func(t *testing.T) {
49 assert.NotPanics(t, func() {
50 mx.set("unknown", 1)
51 })
52 })
53 }
54
55 func TestCollectorMetricsSetReplicationCoverage(t *testing.T) {
56 store := metrix.NewCollectorStore()
57 mx := newCollectorMetrics(store)
58 require.NotNil(t, mx)
59
60 tests := map[string]struct {
61 name string
62 connection string
63 value int64
64 }{
65 "seconds_behind_master": {
66 name: "seconds_behind_master",
67 connection: "MyConn",
68 value: 1,
69 },
70 "slave_sql_running": {
71 name: "slave_sql_running",
72 connection: "MyConn",
73 value: 1,
74 },
75 "slave_io_running": {
76 name: "slave_io_running",
77 connection: "MyConn",
78 value: 1,
79 },
80 }
81
82 for testName, tc := range tests {
83 t.Run(testName, func(t *testing.T) {
84 assert.NotPanics(t, func() {
85 runCollectorCycle(t, store, func() {
86 mx.setReplication(tc.name, tc.connection, tc.value)
87 })
88 })
89 })
90 }
91
92 t.Run("unknown_metric_is_ignored", func(t *testing.T) {
93 assert.NotPanics(t, func() {
94 mx.setReplication("unknown", "conn", 1)
95 })
96 })
97 }
98
99 func TestCollectorMetricsSetUserCoverage(t *testing.T) {
100 store := metrix.NewCollectorStore()
101 mx := newCollectorMetrics(store)
102 require.NotNil(t, mx)
103
104 tests := map[string]struct {
105 name string
106 user string
107 value int64
108 }{
109 "userstats_total_connections": {name: "userstats_total_connections", user: "MyUser", value: 1},
110 "userstats_lost_connections": {name: "userstats_lost_connections", user: "MyUser", value: 1},
111 "userstats_denied_connections": {name: "userstats_denied_connections", user: "MyUser", value: 1},
112 "userstats_empty_queries": {name: "userstats_empty_queries", user: "MyUser", value: 1},
113 "userstats_binlog_bytes_written": {name: "userstats_binlog_bytes_written", user: "MyUser", value: 1},
114 "userstats_rows_read": {name: "userstats_rows_read", user: "MyUser", value: 1},
115 "userstats_rows_sent": {name: "userstats_rows_sent", user: "MyUser", value: 1},
116 "userstats_rows_deleted": {name: "userstats_rows_deleted", user: "MyUser", value: 1},
117 "userstats_rows_inserted": {name: "userstats_rows_inserted", user: "MyUser", value: 1},
118 "userstats_rows_updated": {name: "userstats_rows_updated", user: "MyUser", value: 1},
119 "userstats_rows_fetched": {name: "userstats_rows_fetched", user: "MyUser", value: 1},
120 "userstats_select_commands": {name: "userstats_select_commands", user: "MyUser", value: 1},
121 "userstats_update_commands": {name: "userstats_update_commands", user: "MyUser", value: 1},
122 "userstats_other_commands": {name: "userstats_other_commands", user: "MyUser", value: 1},
123 "userstats_access_denied": {name: "userstats_access_denied", user: "MyUser", value: 1},
124 "userstats_commit_transactions": {name: "userstats_commit_transactions", user: "MyUser", value: 1},
125 "userstats_rollback_transactions": {name: "userstats_rollback_transactions", user: "MyUser", value: 1},
126 "userstats_cpu_time": {name: "userstats_cpu_time", user: "MyUser", value: 1},
127 }
128
129 for testName, tc := range tests {
130 t.Run(testName, func(t *testing.T) {
131 assert.NotPanics(t, func() {
132 runCollectorCycle(t, store, func() {
133 mx.setUser(tc.name, tc.user, tc.value)
134 })
135 })
136 })
137 }
138
139 t.Run("unknown_metric_is_ignored", func(t *testing.T) {
140 assert.NotPanics(t, func() {
141 mx.setUser("unknown", "user", 1)
142 })
143 })
144 }
145
146 func TestCollectorMetricsWSREPStateSetCoverage(t *testing.T) {
147 store := metrix.NewCollectorStore()
148 mx := newCollectorMetrics(store)
149 require.NotNil(t, mx)
150
151 localStateTests := map[string]string{
152 "undefined": "0",
153 "joining": "1",
154 "donor": "2",
155 "joined": "3",
156 "synced": "4",
157 "error": "5",
158 "fallback": "invalid",
159 }
160 for testName, raw := range localStateTests {
161 t.Run("wsrep_local_state_"+testName, func(t *testing.T) {
162 assert.NotPanics(t, func() {
163 runCollectorCycle(t, store, func() {
164 mx.setWsrepLocalState(raw)
165 })
166 })
167 })
168 }
169
170 clusterStatusTests := map[string]string{
171 "primary": "PRIMARY",
172 "non_primary": "NON-PRIMARY",
173 "disconnected": "DISCONNECTED",
174 "fallback": "SOMETHING_ELSE",
175 }
176 for testName, raw := range clusterStatusTests {
177 t.Run("wsrep_cluster_status_"+testName, func(t *testing.T) {
178 assert.NotPanics(t, func() {
179 runCollectorCycle(t, store, func() {
180 mx.setWsrepClusterStatus(raw)
181 })
182 })
183 })
184 }
185 }
186
187 func runCollectorCycle(t *testing.T, s metrix.CollectorStore, fn func()) {
188 t.Helper()
189
190 managed, ok := metrix.AsCycleManagedStore(s)
191 require.True(t, ok)
192
193 cc := managed.CycleController()
194 cc.BeginCycle()
195 fn()
196 cc.CommitCycleSuccess()
197 }