master
go 414 lines 6.72 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package stm_test
4
5 import (
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9
10 "github.com/netdata/netdata/go/plugins/pkg/stm"
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/oldmetrix"
12 )
13
14 func TestToMap_empty(t *testing.T) {
15 s := struct{}{}
16
17 expected := map[string]int64{}
18
19 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
20 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
21 }
22
23 func TestToMap_metrics(t *testing.T) {
24 s := struct {
25 C oldmetrix.Counter `stm:"c"`
26 G oldmetrix.Gauge `stm:"g,100"`
27 H oldmetrix.Histogram `stm:"h,100"`
28 S oldmetrix.Summary `stm:"s,200,2"`
29 }{}
30 s.C.Inc()
31 s.G.Set(3.14)
32 s.H = oldmetrix.NewHistogram([]float64{1, 5, 10})
33
34 s.H.Observe(3.14)
35 s.H.Observe(6.28)
36 s.H.Observe(20)
37
38 s.S = oldmetrix.NewSummary()
39 s.S.Observe(3.14)
40 s.S.Observe(6.28)
41
42 expected := map[string]int64{
43 "c": 1,
44 "g": 314,
45
46 "h_count": 3,
47 "h_sum": 2942,
48 "h_bucket_1": 0,
49 "h_bucket_2": 1,
50 "h_bucket_3": 2,
51
52 "s_count": 2,
53 "s_sum": 942,
54 "s_min": 314,
55 "s_max": 628,
56 "s_avg": 471,
57 }
58
59 assert.Equal(t, expected, stm.ToMap(s), "value test")
60 assert.Equal(t, expected, stm.ToMap(&s), "ptr test")
61 }
62
63 func TestToMap_int(t *testing.T) {
64 s := struct {
65 I int `stm:"int"`
66 I8 int8 `stm:"int8"`
67 I16 int16 `stm:"int16"`
68 I32 int32 `stm:"int32"`
69 I64 int64 `stm:"int64"`
70 }{
71 I: 1, I8: 2, I16: 3, I32: 4, I64: 5,
72 }
73
74 expected := map[string]int64{
75 "int": 1, "int8": 2, "int16": 3, "int32": 4, "int64": 5,
76 }
77
78 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
79 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
80 }
81
82 func TestToMap_float(t *testing.T) {
83 s := struct {
84 F32 float32 `stm:"f32,100"`
85 F64 float64 `stm:"f64"`
86 }{
87 3.14, 628,
88 }
89
90 expected := map[string]int64{
91 "f32": 314, "f64": 628,
92 }
93
94 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
95 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
96 }
97
98 func TestToMap_struct(t *testing.T) {
99 type pair struct {
100 Left int `stm:"left"`
101 Right int `stm:"right"`
102 }
103 s := struct {
104 I int `stm:"int"`
105 Pempty pair `stm:""`
106 Ps pair `stm:"s"`
107 Notag int
108 }{
109 I: 1,
110 Pempty: pair{2, 3},
111 Ps: pair{4, 5},
112 Notag: 6,
113 }
114
115 expected := map[string]int64{
116 "int": 1,
117 "left": 2, "right": 3,
118 "s_left": 4, "s_right": 5,
119 }
120
121 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
122 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
123 }
124
125 func TestToMap_tree(t *testing.T) {
126 type node struct {
127 Value int `stm:"v"`
128 Left *node `stm:"left"`
129 Right *node `stm:"right"`
130 }
131 s := node{1,
132 &node{2, nil, nil},
133 &node{3,
134 &node{4, nil, nil},
135 nil,
136 },
137 }
138 expected := map[string]int64{
139 "v": 1,
140 "left_v": 2,
141 "right_v": 3,
142 "right_left_v": 4,
143 }
144
145 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
146 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
147 }
148
149 func TestToMap_map(t *testing.T) {
150 s := struct {
151 I int `stm:"int"`
152 M map[string]int64 `stm:""`
153 }{
154 I: 1,
155 M: map[string]int64{
156 "a": 2,
157 "b": 3,
158 },
159 }
160
161 expected := map[string]int64{
162 "int": 1,
163 "a": 2,
164 "b": 3,
165 }
166
167 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
168 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
169 }
170
171 func TestToMap_nestMap(t *testing.T) {
172 s := struct {
173 I int `stm:"int"`
174 M map[string]any `stm:""`
175 }{
176 I: 1,
177 M: map[string]any{
178 "a": 2,
179 "b": 3,
180 "m": map[string]any{
181 "c": 4,
182 },
183 },
184 }
185
186 expected := map[string]int64{
187 "int": 1,
188 "a": 2,
189 "b": 3,
190 "m_c": 4,
191 }
192
193 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
194 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
195 }
196
197 func TestToMap_ptr(t *testing.T) {
198 two := 2
199 s := struct {
200 I int `stm:"int"`
201 Ptr *int `stm:"ptr"`
202 Nil *int `stm:"nil"`
203 }{
204 I: 1,
205 Ptr: &two,
206 Nil: nil,
207 }
208
209 expected := map[string]int64{
210 "int": 1,
211 "ptr": 2,
212 }
213
214 assert.EqualValuesf(t, expected, stm.ToMap(s), "value test")
215 assert.EqualValuesf(t, expected, stm.ToMap(&s), "ptr test")
216 }
217
218 func TestToMap_invalidType(t *testing.T) {
219 s := struct {
220 Str string `stm:"int"`
221 }{
222 Str: "abc",
223 }
224
225 assert.Panics(t, func() {
226 stm.ToMap(s)
227 }, "value test")
228 assert.Panics(t, func() {
229 stm.ToMap(&s)
230 }, "ptr test")
231 }
232
233 func TestToMap_duplicateKey(t *testing.T) {
234 {
235 s := struct {
236 Key int `stm:"key"`
237 M map[string]int `stm:""`
238 }{
239 Key: 1,
240 M: map[string]int{
241 "key": 2,
242 },
243 }
244
245 assert.Panics(t, func() {
246 stm.ToMap(s)
247 }, "value test")
248 assert.Panics(t, func() {
249 stm.ToMap(&s)
250 }, "ptr test")
251 }
252 {
253 s := struct {
254 Key float64 `stm:"key"`
255 M map[string]float64 `stm:""`
256 }{
257 Key: 1,
258 M: map[string]float64{
259 "key": 2,
260 },
261 }
262
263 assert.Panics(t, func() {
264 stm.ToMap(s)
265 }, "value test")
266 assert.Panics(t, func() {
267 stm.ToMap(&s)
268 }, "ptr test")
269 }
270 }
271
272 func TestToMap_Variadic(t *testing.T) {
273 s1 := struct {
274 Key1 int `stm:"key1"`
275 }{
276 Key1: 1,
277 }
278 s2 := struct {
279 Key2 int `stm:"key2"`
280 }{
281 Key2: 2,
282 }
283 s3 := struct {
284 Key3 int `stm:"key3"`
285 }{
286 Key3: 3,
287 }
288
289 assert.Equal(
290 t,
291 map[string]int64{
292 "key1": 1,
293 "key2": 2,
294 "key3": 3,
295 },
296 stm.ToMap(s1, s2, s3),
297 )
298 }
299
300 func TestToMap_badTag(t *testing.T) {
301 assert.Panics(t, func() {
302 s := struct {
303 A int `stm:"a,not_int"`
304 }{1}
305 stm.ToMap(s)
306 })
307 assert.Panics(t, func() {
308 s := struct {
309 A int `stm:"a,1,not_int"`
310 }{1}
311 stm.ToMap(s)
312 })
313 assert.Panics(t, func() {
314 s := struct {
315 A int `stm:"a,not_int,1"`
316 }{1}
317 stm.ToMap(s)
318 })
319 assert.Panics(t, func() {
320 s := struct {
321 A int `stm:"a,1,2,3"`
322 }{1}
323 stm.ToMap(s)
324 })
325 }
326
327 func TestToMap_nilValue(t *testing.T) {
328 assert.Panics(t, func() {
329 s := struct {
330 a oldmetrix.CounterVec `stm:"a"`
331 }{nil}
332 stm.ToMap(s)
333 })
334 }
335 func TestToMap_bool(t *testing.T) {
336 s := struct {
337 A bool `stm:"a"`
338 B bool `stm:"b"`
339 }{
340 A: true,
341 B: false,
342 }
343 assert.Equal(
344 t,
345 map[string]int64{
346 "a": 1,
347 "b": 0,
348 },
349 stm.ToMap(s),
350 )
351 }
352
353 func TestToMap_ArraySlice(t *testing.T) {
354 s := [4]any{
355 map[string]int{
356 "B": 1,
357 "C": 2,
358 },
359 struct {
360 D int `stm:"D"`
361 E int `stm:"E"`
362 }{
363 D: 3,
364 E: 4,
365 },
366 struct {
367 STMKey string
368 F int `stm:"F"`
369 G int `stm:"G"`
370 }{
371 F: 5,
372 G: 6,
373 },
374 struct {
375 STMKey string
376 H int `stm:"H"`
377 I int `stm:"I"`
378 }{
379 STMKey: "KEY",
380 H: 7,
381 I: 8,
382 },
383 }
384
385 assert.Equal(
386 t,
387 map[string]int64{
388 "B": 1,
389 "C": 2,
390 "D": 3,
391 "E": 4,
392 "F": 5,
393 "G": 6,
394 "KEY_H": 7,
395 "KEY_I": 8,
396 },
397 stm.ToMap(s),
398 )
399
400 assert.Equal(
401 t,
402 map[string]int64{
403 "B": 1,
404 "C": 2,
405 "D": 3,
406 "E": 4,
407 "F": 5,
408 "G": 6,
409 "KEY_H": 7,
410 "KEY_I": 8,
411 },
412 stm.ToMap(s[:]),
413 )
414 }