github.com/go-graphite/carbonapi@v0.17.0/expr/functions/holtWintersConfidenceBands/function_test.go (about) 1 package holtWintersConfidenceBands 2 3 import ( 4 "testing" 5 6 "github.com/go-graphite/carbonapi/expr/holtwinters" 7 "github.com/go-graphite/carbonapi/expr/interfaces" 8 9 "github.com/go-graphite/carbonapi/expr/metadata" 10 "github.com/go-graphite/carbonapi/expr/types" 11 "github.com/go-graphite/carbonapi/pkg/parser" 12 th "github.com/go-graphite/carbonapi/tests" 13 ) 14 15 var ( 16 md []interfaces.FunctionMetadata = New("") 17 ) 18 19 func init() { 20 for _, m := range md { 21 metadata.RegisterFunction(m.Name, m.F) 22 } 23 } 24 25 func TestHoltWintersConfidenceBands(t *testing.T) { 26 var startTime int64 = 2678400 27 var step int64 = 600 28 var points int64 = 10 29 30 tests := []th.EvalTestItemWithRange{ 31 { 32 Target: "holtWintersConfidenceBands(metric1)", 33 M: map[parser.MetricRequest][]*types.MetricData{ 34 {Metric: "metric1", From: startTime - holtwinters.DefaultBootstrapInterval, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, (((holtwinters.DefaultBootstrapInterval)/step)+points)*step, step), step, startTime-(holtwinters.DefaultBootstrapInterval))}, 35 }, 36 Want: []*types.MetricData{ 37 types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{0.2841206166091448, 1.0581027098774411, 0.3338172102994683, 0.5116859493263242, -0.18199175514936972, 0.2366173792019426, -1.2941554508809152, -0.513426806531049, -0.7970905542723132, 0.09868900726536012}, step, startTime).SetTag("holtWintersConfidenceLower", "1"), 38 types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{8.424944558327624, 9.409422251880809, 10.607070189221787, 10.288439865038768, 9.491556863132963, 9.474595784593738, 8.572310478053845, 8.897670449095346, 8.941566968508148, 9.409728797779282}, step, startTime).SetTag("holtWintersConfidenceUpper", "1"), 39 }, 40 From: startTime, 41 Until: startTime + step*points, 42 }, 43 { 44 Target: "holtWintersConfidenceBands(metric1,4,'6d')", 45 M: map[parser.MetricRequest][]*types.MetricData{ 46 {Metric: "metric1", From: startTime - 6*holtwinters.SecondsPerDay, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, ((6*holtwinters.SecondsPerDay/step)+points)*step, step), step, startTime-6*holtwinters.SecondsPerDay)}, 47 }, 48 Want: []*types.MetricData{ 49 types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{-0.6535362793382391, -0.26554972418633316, -1.1060549683277792, -0.5788026852576289, -1.4594446935142829, -0.6933311085203409, -1.6566119269969288, -1.251651025511391, -1.7938581852717226, -1.1791817117029604}, step, startTime).SetTag("holtWintersConfidenceLower", "1"), 50 types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{8.166528156512886, 8.759008839563066, 9.250962452510654, 9.994110161265208, 10.511931730022393, 11.34313475259535, 12.639554646464758, 11.972601342482212, 10.920216551100442, 10.618692557967133}, step, startTime).SetTag("holtWintersConfidenceUpper", "1"), 51 }, 52 From: startTime, 53 Until: startTime + step*points, 54 }, 55 { 56 Target: "holtWintersConfidenceBands(metric1,4,'1d','2d')", 57 M: map[parser.MetricRequest][]*types.MetricData{ 58 {Metric: "metric1", From: startTime - holtwinters.SecondsPerDay, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, ((holtwinters.SecondsPerDay/step)+points)*step, step), step, startTime-holtwinters.SecondsPerDay)}, 59 }, 60 Want: []*types.MetricData{ 61 types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{4.106587168490873, 3.8357974803355406, 3.564589629688576, 3.421354957735917, 3.393696278743315, 3.470415673952413, 3.2748850646377368, 3.3539750816574316, 3.5243322056965765, 3.7771201010598134}, step, startTime).SetTag("holtWintersConfidenceLower", "1"), 62 types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{4.24870339314537, 4.501056063000946, 4.956252698437961, 5.466294981886822, 6.0258698337471355, 6.630178145979606, 7.6413984841547204, 6.492608523867341, 5.556775146625346, 4.813280235806231}, step, startTime).SetTag("holtWintersConfidenceUpper", "1"), 63 }, 64 From: startTime, 65 Until: startTime + step*points, 66 }, 67 } 68 69 for _, tt := range tests { 70 testName := tt.Target 71 t.Run(testName, func(t *testing.T) { 72 eval := th.EvaluatorFromFunc(md[0].F) 73 th.TestEvalExprWithRange(t, eval, &tt) 74 }) 75 } 76 } 77 78 func TestNoPanicOnBigStep(t *testing.T) { 79 80 // NOTE: the expected values of this test are not meaningful, its purpose is to reproduce a panic 81 test := th.EvalTestItem{ 82 "holtWintersConfidenceBands(metric1,3)", 83 map[parser.MetricRequest][]*types.MetricData{ 84 {Metric: "metric1", From: -604800, Until: 1}: {types.MakeMetricData("metric1", []float64{1}, 604800, -604800)}, 85 }, 86 []*types.MetricData{ 87 types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{}, 604800, 0).SetTag("holtWintersConfidenceLower", "1"), 88 types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{}, 604800, 0).SetTag("holtWintersConfidenceUpper", "1"), 89 }, 90 } 91 92 eval := th.EvaluatorFromFunc(md[0].F) 93 th.TestEvalExpr(t, eval, &test) 94 95 } 96 97 func generateHwRange(x, y, jump int64) []float64 { 98 var valuesList []float64 99 for x < y { 100 val := float64((x / jump) % 10) 101 valuesList = append(valuesList, val) 102 x += jump 103 } 104 return valuesList 105 }