github.com/kata-containers/tests@v0.0.0-20240307153542-772105b56064/cmd/checkmetrics/compare_test.go (about) 1 // Copyright (c) 2018 Intel Corporation 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package main 6 7 import ( 8 "math" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 // Pre-filled out metrics (apart from the calculated stats) 15 // This should **pass** the "mean" metrics checks by default 16 var exampleM = metrics{ 17 Name: "name", 18 Description: "desc", 19 Type: "type", 20 CheckType: "json", 21 CheckVar: "Results", 22 MinVal: 0.9, 23 MaxVal: 3.1, 24 Gap: 0, 25 stats: statistics{ 26 Results: []float64{1.0, 2.0, 3.0}, 27 Iterations: 3, 28 Mean: 0.0, 29 Min: 0.0, 30 Max: 0.0, 31 Range: 0.0, 32 RangeSpread: 0.0, 33 SD: 0.0, 34 CoV: 0.0}} 35 36 func TestGenSummaryLine(t *testing.T) { 37 38 assert := assert.New(t) 39 40 var args = []string{ 41 "name", 42 "minval", 43 "mean", 44 "maxval", 45 "gap", 46 "min", 47 "max", 48 "rnge", 49 "cov", 50 "iterations"} 51 52 // Check for the 'passed' case 53 s := (&metricsCheck{}).genSummaryLine( 54 true, //passed 55 args[0], //name 56 args[1], //minval 57 args[2], //mean 58 args[3], //maxval 59 args[4], //gap 60 args[5], //min 61 args[6], //max 62 args[7], //rnge 63 args[8], //cov 64 args[9]) //iterations 65 66 for n, i := range s { 67 if n == 0 { 68 assert.Equal("P", i, "Should be equal") 69 } else { 70 assert.Equal(args[n-1], i, "Should be equal") 71 } 72 } 73 74 // Check for the 'failed' case 75 s = (&metricsCheck{}).genSummaryLine( 76 false, //passed 77 args[0], //name 78 args[1], //minval 79 args[2], //mean 80 args[3], //maxval 81 args[4], //gap 82 args[5], //min 83 args[6], //max 84 args[7], //rnge 85 args[8], //cov 86 args[9]) //iterations 87 88 for n, i := range s { 89 if n == 0 { 90 assert.Equal("*F*", i, "Should be equal") 91 } else { 92 assert.Equal(args[n-1], i, "Should be equal") 93 } 94 } 95 } 96 97 func TestCheckStats(t *testing.T) { 98 assert := assert.New(t) 99 100 var m = exampleM 101 m.Name = "CheckStats" 102 103 //Check before we have done the calculations - should fail 104 _, err := (&metricsCheck{}).checkstats(m) 105 assert.Error(err) 106 107 m.calculate() 108 109 // Constants here calculated from info coded in struct above 110 111 // Funky rounding of Gap, as float imprecision actually gives us 112 // 110.00000000000001 - check to within 0.1% then... 113 roundedGap := math.Round(m.Gap/0.001) * 0.001 114 assert.Equal(110.0, roundedGap, "Should be equal") 115 assert.Equal(2.0, m.stats.Mean, "Should be equal") 116 assert.Equal(1.0, m.stats.Min, "Should be equal") 117 assert.Equal(3.0, m.stats.Max, "Should be equal") 118 assert.Equal(2.0, m.stats.Range, "Should be equal") 119 assert.Equal(200.0, m.stats.RangeSpread, "Should be equal") 120 assert.Equal(0.816496580927726, m.stats.SD, "Should be equal") 121 assert.Equal(40.8248290463863, m.stats.CoV, "Should be equal") 122 123 s, err := (&metricsCheck{}).checkstats(m) 124 assert.NoError(err) 125 126 assert.Equal("P", s[0], "Should be equal") // Pass 127 assert.Equal("CheckStats", s[1], "Should be equal") // test name 128 assert.Equal("0.90", s[2], "Should be equal") // Floor 129 assert.Equal("2.00", s[3], "Should be equal") // Mean 130 assert.Equal("3.10", s[4], "Should be equal") // Ceiling 131 assert.Equal("110.0%", s[5], "Should be equal") // Gap 132 assert.Equal("1.00", s[6], "Should be equal") // Min 133 assert.Equal("3.00", s[7], "Should be equal") // Max 134 assert.Equal("200.0%", s[8], "Should be equal") // Range % 135 assert.Equal("40.8%", s[9], "Should be equal") // CoV 136 assert.Equal("3", s[10], "Should be equal") // Iterations 137 138 // And check in percentage presentation mode 139 showPercentage = true 140 s, err = (&metricsCheck{}).checkstats(m) 141 assert.NoError(err) 142 143 assert.Equal("P", s[0], "Should be equal") // Pass 144 assert.Equal("CheckStats", s[1], "Should be equal") // test name 145 assert.Equal("45.0%", s[2], "Should be equal") // Floor 146 assert.Equal("100.0%", s[3], "Should be equal") // Mean 147 assert.Equal("155.0%", s[4], "Should be equal") // Ceiling 148 assert.Equal("110.0%", s[5], "Should be equal") // Gap 149 assert.Equal("50.0%", s[6], "Should be equal") // Min 150 assert.Equal("150.0%", s[7], "Should be equal") // Max 151 assert.Equal("200.0%", s[8], "Should be equal") // Range % 152 assert.Equal("40.8%", s[9], "Should be equal") // CoV 153 assert.Equal("3", s[10], "Should be equal") // Iterations 154 155 // And put the default back 156 showPercentage = false 157 158 // Funcs called with a Min that fails and a Max that fails 159 // Presumption is that unmodified metrics should pass 160 161 // FIXME - we don't test the actual < vs <= boudary type conditions 162 163 // Mean is 2.0 164 CheckMean(assert, 3.0, 1.0) 165 166 // Min is 1.0 167 CheckMin(assert, 3.0, 0.5) 168 169 // Max is 3.0 170 CheckMax(assert, 4.0, 1.0) 171 172 // CoV is 40.8 173 CheckCoV(assert, 50.0, 1.0) 174 175 // SD is 0.8165 176 CheckSD(assert, 1.0, 0.5) 177 } 178 179 func CheckMean(assert *assert.Assertions, badmin float64, badmax float64) { 180 m := exampleM 181 m.CheckType = "mean" 182 m.Name = "CheckMean" 183 // Do the stats 184 m.calculate() 185 186 // Defaults should pass 187 _, err := (&metricsCheck{}).checkstats(m) 188 assert.NoError(err) 189 190 // badmin should fail 191 old := m.MinVal 192 m.MinVal = badmin 193 _, err = (&metricsCheck{}).checkstats(m) 194 assert.Error(err) 195 m.MinVal = old 196 197 // badmax should fail 198 m.MaxVal = badmax 199 _, err = (&metricsCheck{}).checkstats(m) 200 assert.Error(err) 201 } 202 203 func CheckMin(assert *assert.Assertions, badmin float64, badmax float64) { 204 205 m := exampleM 206 m.CheckType = "min" 207 m.Name = "CheckMin" 208 // Do the stats 209 m.calculate() 210 211 // Defaults should pass 212 _, err := (&metricsCheck{}).checkstats(m) 213 assert.NoError(err) 214 215 // badmin should fail 216 old := m.MinVal 217 m.MinVal = badmin 218 _, err = (&metricsCheck{}).checkstats(m) 219 assert.Error(err) 220 m.MinVal = old 221 222 // badmax should fail 223 m.MaxVal = badmax 224 _, err = (&metricsCheck{}).checkstats(m) 225 assert.Error(err) 226 } 227 228 func CheckMax(assert *assert.Assertions, badmin float64, badmax float64) { 229 m := exampleM 230 m.CheckType = "max" 231 m.Name = "CheckMax" 232 // Do the stats 233 m.calculate() 234 235 // Defaults should pass 236 _, err := (&metricsCheck{}).checkstats(m) 237 assert.NoError(err) 238 239 // badmin should fail 240 old := m.MinVal 241 m.MinVal = badmin 242 _, err = (&metricsCheck{}).checkstats(m) 243 assert.Error(err) 244 m.MinVal = old 245 246 // badmax should fail 247 m.MaxVal = badmax 248 _, err = (&metricsCheck{}).checkstats(m) 249 assert.Error(err) 250 } 251 252 func CheckSD(assert *assert.Assertions, badmin float64, badmax float64) { 253 m := exampleM 254 m.CheckType = "sd" 255 m.Name = "CheckSD" 256 // Do the stats 257 m.calculate() 258 259 // Set it up to pass by default 260 m.MinVal = 0.9 * m.stats.SD 261 m.MaxVal = 1.1 * m.stats.SD 262 263 oldMin := m.MinVal 264 oldMax := m.MinVal 265 266 // Defaults should pass 267 _, err := (&metricsCheck{}).checkstats(m) 268 assert.NoError(err) 269 270 // badmin should fail 271 m.MinVal = badmin 272 _, err = (&metricsCheck{}).checkstats(m) 273 assert.Error(err) 274 m.MinVal = oldMin 275 276 // badmax should fail 277 m.MaxVal = badmax 278 _, err = (&metricsCheck{}).checkstats(m) 279 assert.Error(err) 280 m.MaxVal = oldMax 281 } 282 283 func CheckCoV(assert *assert.Assertions, badmin float64, badmax float64) { 284 m := exampleM 285 m.CheckType = "cov" 286 m.Name = "CheckCoV" 287 // Do the stats 288 m.calculate() 289 290 // Set it up to pass by default 291 m.MinVal = 0.9 * m.stats.CoV 292 m.MaxVal = 1.1 * m.stats.CoV 293 294 oldMin := m.MinVal 295 oldMax := m.MinVal 296 297 // Defaults should pass 298 _, err := (&metricsCheck{}).checkstats(m) 299 assert.NoError(err) 300 301 // badmin should fail 302 m.MinVal = badmin 303 _, err = (&metricsCheck{}).checkstats(m) 304 assert.Error(err) 305 m.MinVal = oldMin 306 307 // badmax should fail 308 m.MaxVal = badmax 309 _, err = (&metricsCheck{}).checkstats(m) 310 assert.Error(err) 311 m.MaxVal = oldMax 312 }