master
go 343 lines 8.52 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package confgroup
4
5 import (
6 "testing"
7
8 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
9
10 "github.com/stretchr/testify/assert"
11 )
12
13 func TestConfig_Name(t *testing.T) {
14 tests := map[string]struct {
15 cfg Config
16 expected any
17 }{
18 "string": {cfg: Config{"name": "name"}, expected: "name"},
19 "empty string": {cfg: Config{"name": ""}, expected: ""},
20 "not string": {cfg: Config{"name": 0}, expected: ""},
21 "not set": {cfg: Config{}, expected: ""},
22 "nil cfg": {expected: ""},
23 }
24
25 for name, test := range tests {
26 t.Run(name, func(t *testing.T) {
27 assert.Equal(t, test.expected, test.cfg.Name())
28 })
29 }
30 }
31
32 func TestConfig_Module(t *testing.T) {
33 tests := map[string]struct {
34 cfg Config
35 expected any
36 }{
37 "string": {cfg: Config{"module": "module"}, expected: "module"},
38 "empty string": {cfg: Config{"module": ""}, expected: ""},
39 "not string": {cfg: Config{"module": 0}, expected: ""},
40 "not set": {cfg: Config{}, expected: ""},
41 "nil cfg": {expected: ""},
42 }
43
44 for name, test := range tests {
45 t.Run(name, func(t *testing.T) {
46 assert.Equal(t, test.expected, test.cfg.Module())
47 })
48 }
49 }
50
51 func TestConfig_FullName(t *testing.T) {
52 tests := map[string]struct {
53 cfg Config
54 expected any
55 }{
56 "name == module": {cfg: Config{"name": "name", "module": "name"}, expected: "name"},
57 "name != module": {cfg: Config{"name": "name", "module": "module"}, expected: "module_name"},
58 "nil cfg": {expected: ""},
59 }
60
61 for name, test := range tests {
62 t.Run(name, func(t *testing.T) {
63 assert.Equal(t, test.expected, test.cfg.FullName())
64 })
65 }
66 }
67
68 func TestConfig_UpdateEvery(t *testing.T) {
69 tests := map[string]struct {
70 cfg Config
71 expected any
72 }{
73 "int": {cfg: Config{"update_every": 1}, expected: 1},
74 "not int": {cfg: Config{"update_every": "1"}, expected: 0},
75 "not set": {cfg: Config{}, expected: 0},
76 "nil cfg": {expected: 0},
77 }
78
79 for name, test := range tests {
80 t.Run(name, func(t *testing.T) {
81 assert.Equal(t, test.expected, test.cfg.UpdateEvery())
82 })
83 }
84 }
85
86 func TestConfig_AutoDetectionRetry(t *testing.T) {
87 tests := map[string]struct {
88 cfg Config
89 expected any
90 }{
91 "int": {cfg: Config{"autodetection_retry": 1}, expected: 1},
92 "not int": {cfg: Config{"autodetection_retry": "1"}, expected: 0},
93 "not set": {cfg: Config{}, expected: 0},
94 "nil cfg": {expected: 0},
95 }
96
97 for name, test := range tests {
98 t.Run(name, func(t *testing.T) {
99 assert.Equal(t, test.expected, test.cfg.AutoDetectionRetry())
100 })
101 }
102 }
103
104 func TestConfig_Priority(t *testing.T) {
105 tests := map[string]struct {
106 cfg Config
107 expected any
108 }{
109 "int": {cfg: Config{"priority": 1}, expected: 1},
110 "not int": {cfg: Config{"priority": "1"}, expected: 0},
111 "not set": {cfg: Config{}, expected: 0},
112 "nil cfg": {expected: 0},
113 }
114
115 for name, test := range tests {
116 t.Run(name, func(t *testing.T) {
117 assert.Equal(t, test.expected, test.cfg.Priority())
118 })
119 }
120 }
121
122 func TestConfig_Hash(t *testing.T) {
123 tests := map[string]struct {
124 one, two Config
125 equal bool
126 }{
127 "same keys, no internal keys": {
128 one: Config{"name": "name"},
129 two: Config{"name": "name"},
130 equal: true,
131 },
132 "same keys, different internal keys": {
133 one: Config{"name": "name", "__key__": 1},
134 two: Config{"name": "name", "__value__": 1},
135 equal: true,
136 },
137 "same keys, same internal keys": {
138 one: Config{"name": "name", "__key__": 1},
139 two: Config{"name": "name", "__key__": 1},
140 equal: true,
141 },
142 "diff keys, no internal keys": {
143 one: Config{"name": "name1"},
144 two: Config{"name": "name2"},
145 equal: false,
146 },
147 "diff keys, different internal keys": {
148 one: Config{"name": "name1", "__key__": 1},
149 two: Config{"name": "name2", "__value__": 1},
150 equal: false,
151 },
152 "diff keys, same internal keys": {
153 one: Config{"name": "name1", "__key__": 1},
154 two: Config{"name": "name2", "__key__": 1},
155 equal: false,
156 },
157 }
158
159 for name, test := range tests {
160 t.Run(name, func(t *testing.T) {
161 if test.equal {
162 assert.Equal(t, test.one.Hash(), test.two.Hash())
163 } else {
164 assert.NotEqual(t, test.one.Hash(), test.two.Hash())
165 }
166 })
167 }
168 cfg := Config{"name": "name", "module": "module"}
169 assert.NotZero(t, cfg.Hash())
170 }
171
172 func TestConfig_SetModule(t *testing.T) {
173 cfg := Config{}
174 cfg.SetModule("name")
175
176 assert.Equal(t, cfg.Module(), "name")
177 }
178
179 func TestConfig_SetSource(t *testing.T) {
180 cfg := Config{}
181 cfg.SetSource("name")
182
183 assert.Equal(t, cfg.Source(), "name")
184 }
185
186 func TestConfig_SetProvider(t *testing.T) {
187 cfg := Config{}
188 cfg.SetProvider("name")
189
190 assert.Equal(t, cfg.Provider(), "name")
191 }
192
193 func TestConfig_Apply(t *testing.T) {
194 const jobDef = 11
195 const applyDef = 22
196 tests := map[string]struct {
197 def Default
198 origCfg Config
199 expectedCfg Config
200 }{
201 "+job +def": {
202 def: Default{
203 UpdateEvery: applyDef,
204 AutoDetectionRetry: applyDef,
205 Priority: applyDef,
206 },
207 origCfg: Config{
208 "name": "name",
209 "module": "module",
210 "update_every": jobDef,
211 "autodetection_retry": jobDef,
212 "priority": jobDef,
213 },
214 expectedCfg: Config{
215 "name": "name",
216 "module": "module",
217 "update_every": jobDef,
218 "autodetection_retry": jobDef,
219 "priority": jobDef,
220 },
221 },
222 "-job +def": {
223 def: Default{
224 UpdateEvery: applyDef,
225 AutoDetectionRetry: applyDef,
226 Priority: applyDef,
227 },
228 origCfg: Config{
229 "name": "name",
230 "module": "module",
231 },
232 expectedCfg: Config{
233 "name": "name",
234 "module": "module",
235 "update_every": applyDef,
236 "autodetection_retry": applyDef,
237 "priority": applyDef,
238 },
239 },
240 "-job -def (+global)": {
241 def: Default{},
242 origCfg: Config{
243 "name": "name",
244 "module": "module",
245 },
246 expectedCfg: Config{
247 "name": "name",
248 "module": "module",
249 "update_every": collectorapi.UpdateEvery,
250 "autodetection_retry": collectorapi.AutoDetectionRetry,
251 "priority": collectorapi.Priority,
252 },
253 },
254 "adjust update_every (update_every < min update every)": {
255 def: Default{
256 MinUpdateEvery: jobDef + 10,
257 },
258 origCfg: Config{
259 "name": "name",
260 "module": "module",
261 "update_every": jobDef,
262 },
263 expectedCfg: Config{
264 "name": "name",
265 "module": "module",
266 "update_every": jobDef + 10,
267 "autodetection_retry": collectorapi.AutoDetectionRetry,
268 "priority": collectorapi.Priority,
269 },
270 },
271 "do not adjust update_every (update_every > min update every)": {
272 def: Default{
273 MinUpdateEvery: 2,
274 },
275 origCfg: Config{
276 "name": "name",
277 "module": "module",
278 "update_every": jobDef,
279 },
280 expectedCfg: Config{
281 "name": "name",
282 "module": "module",
283 "update_every": jobDef,
284 "autodetection_retry": collectorapi.AutoDetectionRetry,
285 "priority": collectorapi.Priority,
286 },
287 },
288 "set name to module name if name not set": {
289 def: Default{},
290 origCfg: Config{
291 "module": "module",
292 },
293 expectedCfg: Config{
294 "name": "module",
295 "module": "module",
296 "update_every": collectorapi.UpdateEvery,
297 "autodetection_retry": collectorapi.AutoDetectionRetry,
298 "priority": collectorapi.Priority,
299 },
300 },
301 "clean name": {
302 def: Default{},
303 origCfg: Config{
304 "name": "na me",
305 "module": "module",
306 },
307 expectedCfg: Config{
308 "name": "na_me",
309 "module": "module",
310 "update_every": collectorapi.UpdateEvery,
311 "autodetection_retry": collectorapi.AutoDetectionRetry,
312 "priority": collectorapi.Priority,
313 },
314 },
315 }
316
317 for name, test := range tests {
318 t.Run(name, func(t *testing.T) {
319 test.origCfg.ApplyDefaults(test.def)
320
321 assert.Equal(t, test.expectedCfg, test.origCfg)
322 })
323 }
324 }
325
326 func TestConfig_FunctionOnly(t *testing.T) {
327 tests := map[string]struct {
328 cfg Config
329 expected bool
330 }{
331 "true": {cfg: Config{"function_only": true}, expected: true},
332 "false": {cfg: Config{"function_only": false}, expected: false},
333 "not bool": {cfg: Config{"function_only": "true"}, expected: false},
334 "not set": {cfg: Config{}, expected: false},
335 "nil cfg": {expected: false},
336 }
337
338 for name, test := range tests {
339 t.Run(name, func(t *testing.T) {
340 assert.Equal(t, test.expected, test.cfg.FunctionOnly())
341 })
342 }
343 }