github.com/go-graphite/carbonapi@v0.17.0/expr/functions/holtWintersAberration/function_test.go (about) 1 package holtWintersAberration 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 TestHoltWintersAberration(t *testing.T) { 26 var startTime int64 = 2678400 27 var step int64 = 600 28 var points int64 = 10 29 var seconds int64 = 86400 30 31 tests := []th.EvalTestItemWithRange{ 32 { 33 Target: "holtWintersAberration(metric*)", 34 M: map[parser.MetricRequest][]*types.MetricData{ 35 {Metric: "metric*", From: startTime, Until: startTime + step*points}: { 36 types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime), 37 types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime), 38 }, 39 {Metric: "metric*", From: startTime - holtwinters.DefaultBootstrapInterval, Until: startTime + step*points}: { 40 types.MakeMetricData("metric1", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 0), step, startTime-holtwinters.DefaultBootstrapInterval), 41 types.MakeMetricData("metric2", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 10), step, startTime-holtwinters.DefaultBootstrapInterval), 42 }, 43 }, 44 Want: []*types.MetricData{ 45 types.MakeMetricData("holtWintersAberration(metric1)", []float64{-0.2841206166091448, -0.05810270987744115, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"), 46 types.MakeMetricData("holtWintersAberration(metric2)", []float64{-0.284120616609151, -0.05810270987744737, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"), 47 }, 48 From: startTime, 49 Until: startTime + step*points, 50 }, 51 { 52 Target: "holtWintersAberration(metric*,4,'4d')", 53 M: map[parser.MetricRequest][]*types.MetricData{ 54 {Metric: "metric*", From: startTime, Until: startTime + step*points}: { 55 types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime), 56 types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime), 57 }, 58 {Metric: "metric*", From: startTime - 4*seconds, Until: startTime + step*points}: { 59 types.MakeMetricData("metric1", generateHwRange(0, ((4*seconds/step)+points)*step, step, 0), step, startTime-4*seconds), 60 types.MakeMetricData("metric2", generateHwRange(0, ((4*seconds/step)+points)*step, step, 10), step, startTime-4*seconds), 61 }, 62 }, 63 Want: []*types.MetricData{ 64 types.MakeMetricData("holtWintersAberration(metric1)", []float64{-1.4410544085511923, -0.5199507849641569, 0, 0, 0, 0, 0, 0, 0, 0.09386319244056907}, step, startTime).SetTag("holtWintersAberration", "1"), 65 types.MakeMetricData("holtWintersAberration(metric2)", []float64{-1.4410544085511923, -0.5199507849641609, 0, 0, 0, 0, 0, 0, 0, 0.09386319244056551}, step, startTime).SetTag("holtWintersAberration", "1"), 66 }, 67 From: startTime, 68 Until: startTime + step*points, 69 }, 70 { 71 Target: "holtWintersAberration(metric*,4,'1d','2d')", 72 M: map[parser.MetricRequest][]*types.MetricData{ 73 {Metric: "metric*", From: startTime, Until: startTime + step*points}: { 74 types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime), 75 types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime), 76 }, 77 {Metric: "metric*", From: startTime - seconds, Until: startTime + step*points}: { 78 types.MakeMetricData("metric1", generateHwRange(0, ((seconds/step)+points)*step, step, 0), step, startTime-seconds), 79 types.MakeMetricData("metric2", generateHwRange(0, ((seconds/step)+points)*step, step, 10), step, startTime-seconds), 80 }, 81 }, 82 Want: []*types.MetricData{ 83 types.MakeMetricData("holtWintersAberration(metric1)", []float64{-4.106587168490873, -2.8357974803355406, -1.5645896296885762, -0.4213549577359168, 0, 0, 0, 0.5073914761326588, 2.4432248533746543, 4.186719764193769}, step, startTime).SetTag("holtWintersAberration", "1"), 84 types.MakeMetricData("holtWintersAberration(metric2)", []float64{-4.1065871684908775, -2.8357974803355486, -1.5645896296885837, -0.42135495773592346, 0, 0, 0, 0.5073914761326499, 2.4432248533746446, 4.186719764193759}, step, startTime).SetTag("holtWintersAberration", "1"), 85 }, 86 From: startTime, 87 Until: startTime + step*points, 88 }, 89 { 90 Target: "holtWintersAberration(metric*)", 91 M: map[parser.MetricRequest][]*types.MetricData{ 92 {Metric: "metric*", From: startTime, Until: startTime + step*points}: { 93 types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime), 94 types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime), 95 }, 96 {Metric: "metric*", From: startTime - holtwinters.DefaultBootstrapInterval, Until: startTime + step*points}: { 97 types.MakeMetricData("metric1", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 0), step, startTime-holtwinters.DefaultBootstrapInterval), 98 types.MakeMetricData("metric2", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 10), step, startTime-holtwinters.DefaultBootstrapInterval), 99 types.MakeMetricData("metric3", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 20), step, startTime-holtwinters.DefaultBootstrapInterval), // Verify that metrics that don't match those fetched with the unadjusted start time are not included in the results 100 }, 101 }, 102 Want: []*types.MetricData{ 103 types.MakeMetricData("holtWintersAberration(metric1)", []float64{-0.2841206166091448, -0.05810270987744115, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"), 104 types.MakeMetricData("holtWintersAberration(metric2)", []float64{-0.284120616609151, -0.05810270987744737, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"), 105 }, 106 From: startTime, 107 Until: startTime + step*points, 108 }, 109 } 110 111 for _, tt := range tests { 112 testName := tt.Target 113 t.Run(testName, func(t *testing.T) { 114 eval := th.EvaluatorFromFunc(md[0].F) 115 th.TestEvalExprWithRange(t, eval, &tt) 116 }) 117 } 118 } 119 120 func generateHwRange(x, y, jump, t int64) []float64 { 121 var valuesList []float64 122 for x < y { 123 val := float64(t + (x/jump)%10) 124 valuesList = append(valuesList, val) 125 x += jump 126 } 127 return valuesList 128 }