github.com/netdata/go.d.plugin@v0.58.1/agent/module/job_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package module 4 5 import ( 6 "fmt" 7 "io" 8 "testing" 9 "time" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 const ( 15 pluginName = "plugin" 16 modName = "module" 17 jobName = "job" 18 ) 19 20 func newTestJob() *Job { 21 return NewJob( 22 JobConfig{ 23 PluginName: pluginName, 24 Name: jobName, 25 ModuleName: modName, 26 FullName: modName + "_" + jobName, 27 Module: nil, 28 Out: io.Discard, 29 UpdateEvery: 0, 30 AutoDetectEvery: 0, 31 Priority: 0, 32 }, 33 ) 34 } 35 36 func TestNewJob(t *testing.T) { 37 assert.IsType(t, (*Job)(nil), newTestJob()) 38 } 39 40 func TestJob_FullName(t *testing.T) { 41 job := newTestJob() 42 43 assert.Equal(t, job.FullName(), fmt.Sprintf("%s_%s", modName, jobName)) 44 } 45 46 func TestJob_ModuleName(t *testing.T) { 47 job := newTestJob() 48 49 assert.Equal(t, job.ModuleName(), modName) 50 } 51 52 func TestJob_Name(t *testing.T) { 53 job := newTestJob() 54 55 assert.Equal(t, job.Name(), jobName) 56 } 57 58 func TestJob_Panicked(t *testing.T) { 59 job := newTestJob() 60 61 assert.Equal(t, job.Panicked(), job.panicked) 62 job.panicked = true 63 assert.Equal(t, job.Panicked(), job.panicked) 64 } 65 66 func TestJob_AutoDetectionEvery(t *testing.T) { 67 job := newTestJob() 68 69 assert.Equal(t, job.AutoDetectionEvery(), job.AutoDetectEvery) 70 } 71 72 func TestJob_RetryAutoDetection(t *testing.T) { 73 job := newTestJob() 74 m := &MockModule{ 75 InitFunc: func() bool { 76 return true 77 }, 78 CheckFunc: func() bool { return false }, 79 ChartsFunc: func() *Charts { 80 return &Charts{} 81 }, 82 } 83 job.module = m 84 job.AutoDetectEvery = 1 85 86 assert.True(t, job.RetryAutoDetection()) 87 assert.Equal(t, infTries, job.AutoDetectTries) 88 for i := 0; i < 1000; i++ { 89 job.check() 90 } 91 assert.True(t, job.RetryAutoDetection()) 92 assert.Equal(t, infTries, job.AutoDetectTries) 93 94 job.AutoDetectTries = 10 95 for i := 0; i < 10; i++ { 96 job.check() 97 } 98 assert.False(t, job.RetryAutoDetection()) 99 assert.Equal(t, 0, job.AutoDetectTries) 100 } 101 102 func TestJob_AutoDetection(t *testing.T) { 103 job := newTestJob() 104 var v int 105 m := &MockModule{ 106 InitFunc: func() bool { 107 v++ 108 return true 109 }, 110 CheckFunc: func() bool { 111 v++ 112 return true 113 }, 114 ChartsFunc: func() *Charts { 115 v++ 116 return &Charts{} 117 }, 118 } 119 job.module = m 120 121 assert.True(t, job.AutoDetection()) 122 assert.Equal(t, 3, v) 123 } 124 125 func TestJob_AutoDetection_FailInit(t *testing.T) { 126 job := newTestJob() 127 m := &MockModule{ 128 InitFunc: func() bool { 129 return false 130 }, 131 } 132 job.module = m 133 134 assert.False(t, job.AutoDetection()) 135 assert.True(t, m.CleanupDone) 136 } 137 138 func TestJob_AutoDetection_FailCheck(t *testing.T) { 139 job := newTestJob() 140 m := &MockModule{ 141 InitFunc: func() bool { 142 return true 143 }, 144 CheckFunc: func() bool { 145 return false 146 }, 147 } 148 job.module = m 149 150 assert.False(t, job.AutoDetection()) 151 assert.True(t, m.CleanupDone) 152 } 153 154 func TestJob_AutoDetection_FailPostCheck(t *testing.T) { 155 job := newTestJob() 156 m := &MockModule{ 157 InitFunc: func() bool { 158 return true 159 }, 160 CheckFunc: func() bool { 161 return true 162 }, 163 ChartsFunc: func() *Charts { 164 return nil 165 }, 166 } 167 job.module = m 168 169 assert.False(t, job.AutoDetection()) 170 assert.True(t, m.CleanupDone) 171 } 172 173 func TestJob_AutoDetection_PanicInit(t *testing.T) { 174 job := newTestJob() 175 m := &MockModule{ 176 InitFunc: func() bool { 177 panic("panic in Init") 178 }, 179 } 180 job.module = m 181 182 assert.False(t, job.AutoDetection()) 183 assert.True(t, m.CleanupDone) 184 } 185 186 func TestJob_AutoDetection_PanicCheck(t *testing.T) { 187 job := newTestJob() 188 m := &MockModule{ 189 InitFunc: func() bool { 190 return true 191 }, 192 CheckFunc: func() bool { 193 panic("panic in Check") 194 }, 195 } 196 job.module = m 197 198 assert.False(t, job.AutoDetection()) 199 assert.True(t, m.CleanupDone) 200 } 201 202 func TestJob_AutoDetection_PanicPostCheck(t *testing.T) { 203 job := newTestJob() 204 m := &MockModule{ 205 InitFunc: func() bool { 206 return true 207 }, 208 CheckFunc: func() bool { 209 return true 210 }, 211 ChartsFunc: func() *Charts { 212 panic("panic in PostCheck") 213 }, 214 } 215 job.module = m 216 217 assert.False(t, job.AutoDetection()) 218 assert.True(t, m.CleanupDone) 219 } 220 221 func TestJob_Start(t *testing.T) { 222 m := &MockModule{ 223 ChartsFunc: func() *Charts { 224 return &Charts{ 225 &Chart{ 226 ID: "id", 227 Title: "title", 228 Units: "units", 229 Dims: Dims{ 230 {ID: "id1"}, 231 {ID: "id2"}, 232 }, 233 }, 234 } 235 }, 236 CollectFunc: func() map[string]int64 { 237 return map[string]int64{ 238 "id1": 1, 239 "id2": 2, 240 } 241 }, 242 } 243 job := newTestJob() 244 job.module = m 245 job.charts = job.module.Charts() 246 job.updateEvery = 1 247 248 go func() { 249 for i := 1; i < 3; i++ { 250 job.Tick(i) 251 time.Sleep(time.Second) 252 } 253 job.Stop() 254 }() 255 256 job.Start() 257 258 assert.True(t, m.CleanupDone) 259 } 260 261 func TestJob_MainLoop_Panic(t *testing.T) { 262 m := &MockModule{ 263 CollectFunc: func() map[string]int64 { 264 panic("panic in Collect") 265 }, 266 } 267 job := newTestJob() 268 job.module = m 269 job.updateEvery = 1 270 271 go func() { 272 for i := 1; i < 3; i++ { 273 time.Sleep(time.Second) 274 job.Tick(i) 275 } 276 job.Stop() 277 }() 278 279 job.Start() 280 281 assert.True(t, job.Panicked()) 282 assert.True(t, m.CleanupDone) 283 } 284 285 func TestJob_Tick(t *testing.T) { 286 job := newTestJob() 287 for i := 0; i < 3; i++ { 288 job.Tick(i) 289 } 290 }