github.com/verrazzano/verrazzano@v1.7.1/tools/psr/backend/workers/http/get/get_test.go (about) 1 // Copyright (c) 2022, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package get 5 6 import ( 7 "errors" 8 "github.com/stretchr/testify/assert" 9 "github.com/verrazzano/verrazzano/pkg/log/vzlog" 10 "github.com/verrazzano/verrazzano/tools/psr/backend/config" 11 "github.com/verrazzano/verrazzano/tools/psr/backend/osenv" 12 "net/http" 13 "strings" 14 "testing" 15 ) 16 17 type fakeHTTP struct { 18 error 19 resp *http.Response 20 bodyData string 21 } 22 23 type fakeBody struct { 24 data string 25 } 26 27 type fakeEnv struct { 28 data map[string]string 29 } 30 31 // TestGetters tests the worker getters 32 // GIVEN a worker 33 // 34 // WHEN the getter methods are calls 35 // THEN ensure that the correct results are returned 36 func TestGetters(t *testing.T) { 37 envMap := map[string]string{ 38 ServiceName: "test-service-name", 39 ServiceNamespace: "test-namespace", 40 ServicePort: "1", 41 Path: "test-path", 42 } 43 f := fakeEnv{data: envMap} 44 saveEnv := osenv.GetEnvFunc 45 osenv.GetEnvFunc = f.GetEnv 46 defer func() { 47 osenv.GetEnvFunc = saveEnv 48 }() 49 50 w, err := NewHTTPGetWorker() 51 assert.NoError(t, err) 52 53 wd := w.GetWorkerDesc() 54 assert.Equal(t, config.WorkerTypeHTTPGet, wd.WorkerType) 55 assert.Equal(t, "The get worker makes GET request on the given endpoint", wd.Description) 56 assert.Equal(t, metricsPrefix, wd.MetricsPrefix) 57 58 logged := w.WantLoopInfoLogged() 59 assert.False(t, logged) 60 } 61 62 func TestGetMetricDescList(t *testing.T) { 63 envMap := map[string]string{ 64 ServiceName: "test-service-name", 65 ServiceNamespace: "test-namespace", 66 ServicePort: "1", 67 Path: "test-path", 68 } 69 f := fakeEnv{data: envMap} 70 saveEnv := osenv.GetEnvFunc 71 osenv.GetEnvFunc = f.GetEnv 72 defer func() { 73 osenv.GetEnvFunc = saveEnv 74 }() 75 76 tests := []struct { 77 name string 78 fqName string 79 help string 80 }{ 81 {name: "1", fqName: "http_get_request_count_total", help: "The total number of GET requests"}, 82 {name: "2", fqName: "http_get_request_succeeded_count_total", help: "The total number of successful GET requests"}, 83 {name: "3", fqName: "http_get_request_failed_count_total", help: "The total number of failed GET requests"}, 84 } 85 for _, test := range tests { 86 t.Run(test.name, func(t *testing.T) { 87 88 wi, err := NewHTTPGetWorker() 89 w := wi.(worker) 90 assert.NoError(t, err) 91 dl := w.GetMetricDescList() 92 var found int 93 for _, d := range dl { 94 s := d.String() 95 if strings.Contains(s, test.fqName) && strings.Contains(s, test.help) { 96 found++ 97 } 98 } 99 assert.Equal(t, 1, found) 100 }) 101 } 102 } 103 104 func TestGetMetricList(t *testing.T) { 105 envMap := map[string]string{ 106 ServiceName: "test-service-name", 107 ServiceNamespace: "test-namespace", 108 ServicePort: "1", 109 Path: "test-path", 110 } 111 f := fakeEnv{data: envMap} 112 saveEnv := osenv.GetEnvFunc 113 osenv.GetEnvFunc = f.GetEnv 114 defer func() { 115 osenv.GetEnvFunc = saveEnv 116 }() 117 118 tests := []struct { 119 name string 120 fqName string 121 help string 122 }{ 123 {name: "1", fqName: "http_get_request_count_total", help: "The total number of GET requests"}, 124 {name: "2", fqName: "http_get_request_succeeded_count_total", help: "The total number of successful GET requests"}, 125 {name: "3", fqName: "http_get_request_failed_count_total", help: "The total number of failed GET requests"}, 126 } 127 for _, test := range tests { 128 t.Run(test.name, func(t *testing.T) { 129 wi, err := NewHTTPGetWorker() 130 w := wi.(worker) 131 assert.NoError(t, err) 132 ml := w.GetMetricList() 133 var found int 134 for _, m := range ml { 135 s := m.Desc().String() 136 if strings.Contains(s, test.fqName) && strings.Contains(s, test.help) { 137 found++ 138 } 139 } 140 assert.Equal(t, 1, found) 141 }) 142 } 143 } 144 145 // TestGetEnvDescList tests the GetEnvDescList method 146 // GIVEN a worker 147 // 148 // WHEN the GetEnvDescList methods is called 149 // THEN ensure that the correct results are returned 150 func TestGetEnvDescList(t *testing.T) { 151 envMap := map[string]string{ 152 ServiceName: "test-service-name", 153 ServiceNamespace: "test-namespace", 154 ServicePort: "1", 155 Path: "test-path", 156 } 157 f := fakeEnv{data: envMap} 158 saveEnv := osenv.GetEnvFunc 159 osenv.GetEnvFunc = f.GetEnv 160 defer func() { 161 osenv.GetEnvFunc = saveEnv 162 }() 163 164 tests := []struct { 165 name string 166 key string 167 defval string 168 required bool 169 }{ 170 {name: "1", 171 key: ServiceName, 172 defval: "", 173 required: true, 174 }, 175 {name: "2", 176 key: ServiceNamespace, 177 defval: "", 178 required: true, 179 }, 180 {name: "3", 181 key: ServicePort, 182 defval: "", 183 required: true, 184 }, 185 {name: "4", 186 key: Path, 187 defval: "", 188 required: true, 189 }, 190 } 191 192 for _, test := range tests { 193 t.Run(test.name, func(t *testing.T) { 194 w, err := NewHTTPGetWorker() 195 assert.NoError(t, err) 196 el := w.GetEnvDescList() 197 for _, e := range el { 198 if e.Key == test.key { 199 assert.Equal(t, test.defval, e.DefaultVal) 200 assert.Equal(t, test.required, e.Required) 201 } 202 } 203 }) 204 } 205 } 206 207 // TestDoWork tests the DoWork method 208 // GIVEN a worker 209 // 210 // WHEN the DoWork methods is called 211 // THEN ensure that the correct results are returned 212 func TestDoWork(t *testing.T) { 213 envMap := map[string]string{ 214 ServiceName: "test-service-name", 215 ServiceNamespace: "test-namespace", 216 ServicePort: "1", 217 Path: "test-path", 218 } 219 f := fakeEnv{data: envMap} 220 saveEnv := osenv.GetEnvFunc 221 osenv.GetEnvFunc = f.GetEnv 222 defer func() { 223 osenv.GetEnvFunc = saveEnv 224 }() 225 226 tests := []struct { 227 name string 228 bodyData string 229 getError error 230 doworkError error 231 statusCode int 232 nilResp bool 233 reqCount int 234 successCount int 235 failureCount int 236 }{ 237 { 238 name: "1", 239 bodyData: "testsuccess", 240 statusCode: 200, 241 reqCount: 1, 242 successCount: 1, 243 failureCount: 0, 244 }, 245 { 246 name: "2", 247 bodyData: "testerror", 248 getError: errors.New("error"), 249 reqCount: 1, 250 successCount: 0, 251 failureCount: 1, 252 }, 253 { 254 name: "3", 255 bodyData: "testRespError", 256 statusCode: 500, 257 reqCount: 1, 258 successCount: 0, 259 failureCount: 1, 260 }, 261 { 262 name: "4", 263 bodyData: "testNilResp", 264 doworkError: errors.New("GET request to endpoint received a nil response"), 265 nilResp: true, 266 reqCount: 1, 267 successCount: 0, 268 failureCount: 1, 269 }, 270 } 271 for _, test := range tests { 272 t.Run(test.name, func(t *testing.T) { 273 f := httpGetFunc 274 defer func() { 275 httpGetFunc = f 276 }() 277 var resp *http.Response 278 if !test.nilResp { 279 resp = &http.Response{ 280 StatusCode: test.statusCode, 281 Body: &fakeBody{data: test.bodyData}, 282 ContentLength: int64(len(test.bodyData)), 283 } 284 } 285 httpGetFunc = fakeHTTP{ 286 bodyData: test.bodyData, 287 error: test.getError, 288 resp: resp, 289 }.Get 290 291 wi, err := NewHTTPGetWorker() 292 assert.NoError(t, err) 293 w := wi.(worker) 294 err = w.DoWork(config.CommonConfig{ 295 WorkerType: "Fake", 296 }, vzlog.DefaultLogger()) 297 if test.doworkError == nil && test.getError == nil { 298 assert.NoError(t, err) 299 } else { 300 assert.Error(t, err) 301 } 302 303 assert.Equal(t, int64(test.reqCount), w.getRequestsCountTotal.Val) 304 assert.Equal(t, int64(test.successCount), w.getRequestsSucceededCountTotal.Val) 305 assert.Equal(t, int64(test.failureCount), w.getRequestsFailedCountTotal.Val) 306 }) 307 } 308 } 309 310 func (f fakeHTTP) Get(url string) (resp *http.Response, err error) { 311 return f.resp, f.error 312 } 313 314 func (f fakeBody) Read(d []byte) (n int, err error) { 315 copy(d, f.data) 316 return len(f.data), nil 317 } 318 319 func (f fakeBody) Close() error { 320 return nil 321 } 322 323 func (f *fakeEnv) GetEnv(key string) string { 324 return f.data[key] 325 }