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  }