master
go 266 lines 7.17 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package riakkv
4
5 import (
6 "context"
7 "net/http"
8 "net/http/httptest"
9 "os"
10 "testing"
11
12 "github.com/netdata/netdata/go/plugins/pkg/web"
13 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/collecttest"
14
15 "github.com/stretchr/testify/assert"
16 "github.com/stretchr/testify/require"
17 )
18
19 var (
20 dataConfigJSON, _ = os.ReadFile("testdata/config.json")
21 dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
22
23 dataStats, _ = os.ReadFile("testdata/stats.json")
24 )
25
26 func Test_testDataIsValid(t *testing.T) {
27 for name, data := range map[string][]byte{
28 "dataConfigJSON": dataConfigJSON,
29 "dataConfigYAML": dataConfigYAML,
30 "dataStats": dataStats,
31 } {
32 require.NotNil(t, data, name)
33
34 }
35 }
36
37 func TestCollector_ConfigurationSerialize(t *testing.T) {
38 collecttest.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 func TestCollector_Init(t *testing.T) {
42 tests := map[string]struct {
43 wantFail bool
44 config Config
45 }{
46 "success with default": {
47 wantFail: false,
48 config: New().Config,
49 },
50 "fail when URL not set": {
51 wantFail: true,
52 config: Config{
53 HTTPConfig: web.HTTPConfig{
54 RequestConfig: web.RequestConfig{URL: ""},
55 },
56 },
57 },
58 }
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 collr := New()
63 collr.Config = test.config
64
65 if test.wantFail {
66 assert.Error(t, collr.Init(context.Background()))
67 } else {
68 assert.NoError(t, collr.Init(context.Background()))
69 }
70 })
71 }
72 }
73
74 func TestCollector_Check(t *testing.T) {
75 tests := map[string]struct {
76 wantFail bool
77 prepare func(t *testing.T) (collr *Collector, cleanup func())
78 }{
79 "success on valid response": {
80 wantFail: false,
81 prepare: caseOkResponse,
82 },
83 "fail on invalid data response": {
84 wantFail: true,
85 prepare: caseInvalidDataResponse,
86 },
87 "fail on connection refused": {
88 wantFail: true,
89 prepare: caseConnectionRefused,
90 },
91 "fail on 404 response": {
92 wantFail: true,
93 prepare: case404,
94 },
95 }
96
97 for name, test := range tests {
98 t.Run(name, func(t *testing.T) {
99 collr, cleanup := test.prepare(t)
100 defer cleanup()
101
102 if test.wantFail {
103 assert.Error(t, collr.Check(context.Background()))
104 } else {
105 assert.NoError(t, collr.Check(context.Background()))
106 }
107 })
108 }
109 }
110
111 func TestCollector_Charts(t *testing.T) {
112 assert.NotNil(t, New().Charts())
113 }
114
115 func TestCollector_Collect(t *testing.T) {
116 tests := map[string]struct {
117 prepare func(t *testing.T) (collr *Collector, cleanup func())
118 wantMetrics map[string]int64
119 }{
120 "success on valid response": {
121 prepare: caseOkResponse,
122 wantMetrics: map[string]int64{
123 "consistent_get_time_100": 1,
124 "consistent_get_time_95": 1,
125 "consistent_get_time_99": 1,
126 "consistent_get_time_mean": 1,
127 "consistent_get_time_median": 1,
128 "consistent_gets_total": 1,
129 "consistent_put_time_100": 1,
130 "consistent_put_time_95": 1,
131 "consistent_put_time_99": 1,
132 "consistent_put_time_mean": 1,
133 "consistent_put_time_median": 1,
134 "consistent_puts_total": 1,
135 "index_fsm_active": 1,
136 "list_fsm_active": 1,
137 "memory_processes": 274468041,
138 "memory_processes_used": 274337336,
139 "node_get_fsm_active": 1,
140 "node_get_fsm_objsize_100": 1037,
141 "node_get_fsm_objsize_95": 1,
142 "node_get_fsm_objsize_99": 1025,
143 "node_get_fsm_objsize_mean": 791,
144 "node_get_fsm_objsize_median": 669,
145 "node_get_fsm_rejected": 1,
146 "node_get_fsm_siblings_100": 1,
147 "node_get_fsm_siblings_95": 1,
148 "node_get_fsm_siblings_99": 1,
149 "node_get_fsm_siblings_mean": 1,
150 "node_get_fsm_siblings_median": 1,
151 "node_get_fsm_time_100": 678351,
152 "node_get_fsm_time_95": 1,
153 "node_get_fsm_time_99": 10148,
154 "node_get_fsm_time_mean": 2161,
155 "node_get_fsm_time_median": 1022,
156 "node_gets_total": 422626,
157 "node_put_fsm_active": 1,
158 "node_put_fsm_rejected": 1,
159 "node_put_fsm_time_100": 1049568,
160 "node_put_fsm_time_95": 19609,
161 "node_put_fsm_time_99": 37735,
162 "node_put_fsm_time_mean": 11828,
163 "node_put_fsm_time_median": 5017,
164 "node_puts_total": 490965,
165 "object_counter_merge_time_100": 1,
166 "object_counter_merge_time_95": 1,
167 "object_counter_merge_time_99": 1,
168 "object_counter_merge_time_mean": 1,
169 "object_counter_merge_time_median": 1,
170 "object_map_merge_time_100": 1,
171 "object_map_merge_time_95": 1,
172 "object_map_merge_time_99": 1,
173 "object_map_merge_time_mean": 1,
174 "object_map_merge_time_median": 1,
175 "object_set_merge_time_100": 1,
176 "object_set_merge_time_95": 1,
177 "object_set_merge_time_99": 1,
178 "object_set_merge_time_mean": 1,
179 "object_set_merge_time_median": 1,
180 "pbc_active": 46,
181 "read_repairs": 1,
182 "vnode_counter_update_total": 1,
183 "vnode_map_update_total": 1,
184 "vnode_set_update_total": 1,
185 },
186 },
187 "fail on invalid data response": {
188 prepare: caseInvalidDataResponse,
189 wantMetrics: nil,
190 },
191 "fail on connection refused": {
192 prepare: caseConnectionRefused,
193 wantMetrics: nil,
194 },
195 "fail on 404 response": {
196 prepare: case404,
197 wantMetrics: nil,
198 },
199 }
200
201 for name, test := range tests {
202 t.Run(name, func(t *testing.T) {
203 collr, cleanup := test.prepare(t)
204 defer cleanup()
205
206 _ = collr.Check(context.Background())
207
208 mx := collr.Collect(context.Background())
209
210 require.Equal(t, test.wantMetrics, mx)
211
212 if len(test.wantMetrics) > 0 {
213 require.True(t, len(*collr.Charts()) > 0, "charts > 0")
214 collecttest.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
215 }
216 })
217 }
218 }
219
220 func caseOkResponse(t *testing.T) (*Collector, func()) {
221 t.Helper()
222 srv := httptest.NewServer(http.HandlerFunc(
223 func(w http.ResponseWriter, r *http.Request) {
224 _, _ = w.Write(dataStats)
225 }))
226 collr := New()
227 collr.URL = srv.URL
228 require.NoError(t, collr.Init(context.Background()))
229
230 return collr, srv.Close
231 }
232
233 func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
234 t.Helper()
235 srv := httptest.NewServer(http.HandlerFunc(
236 func(w http.ResponseWriter, r *http.Request) {
237 _, _ = w.Write([]byte("hello and\n goodbye"))
238 }))
239 collr := New()
240 collr.URL = srv.URL
241 require.NoError(t, collr.Init(context.Background()))
242
243 return collr, srv.Close
244 }
245
246 func caseConnectionRefused(t *testing.T) (*Collector, func()) {
247 t.Helper()
248 collr := New()
249 collr.URL = "http://127.0.0.1:65001"
250 require.NoError(t, collr.Init(context.Background()))
251
252 return collr, func() {}
253 }
254
255 func case404(t *testing.T) (*Collector, func()) {
256 t.Helper()
257 srv := httptest.NewServer(http.HandlerFunc(
258 func(w http.ResponseWriter, r *http.Request) {
259 w.WriteHeader(http.StatusNotFound)
260 }))
261 collr := New()
262 collr.URL = srv.URL
263 require.NoError(t, collr.Init(context.Background()))
264
265 return collr, srv.Close
266 }