github.com/go-graphite/carbonapi@v0.17.0/expr/functions/delay/function_test.go (about) 1 package delay 2 3 import ( 4 "context" 5 "math" 6 "testing" 7 "time" 8 9 "github.com/go-graphite/carbonapi/expr/interfaces" 10 "github.com/go-graphite/carbonapi/expr/metadata" 11 "github.com/go-graphite/carbonapi/expr/types" 12 "github.com/go-graphite/carbonapi/pkg/parser" 13 th "github.com/go-graphite/carbonapi/tests" 14 "github.com/go-graphite/carbonapi/tests/compare" 15 ) 16 17 var ( 18 md []interfaces.FunctionMetadata = New("") 19 ) 20 21 func init() { 22 for _, m := range md { 23 metadata.RegisterFunction(m.Name, m.F) 24 } 25 } 26 27 func TestDelay(t *testing.T) { 28 now32 := int64(time.Now().Unix()) 29 30 tests := []th.EvalTestItem{ 31 { 32 "delay(metric1,3)", 33 map[parser.MetricRequest][]*types.MetricData{ 34 {Metric: "metric1", From: 0, Until: 1}: {types.MakeMetricData("metric1", []float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32)}, 35 }, 36 []*types.MetricData{types.MakeMetricData("delay(metric1,3)", 37 []float64{math.NaN(), math.NaN(), math.NaN(), 1, 2, 3, math.NaN()}, 1, now32).SetTag("delay", "3").SetNameTag("metric1")}, 38 }, 39 { 40 "delay(metric1,-3)", 41 map[parser.MetricRequest][]*types.MetricData{ 42 {Metric: "metric1", From: 0, Until: 1}: {types.MakeMetricData("metric1", []float64{math.NaN(), math.NaN(), math.NaN(), 1, 2, 3, math.NaN()}, 1, now32)}, 43 }, 44 []*types.MetricData{types.MakeMetricData("delay(metric1,-3)", 45 []float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32).SetTag("delay", "-3").SetNameTag("metric1")}, 46 }, 47 { 48 "delay(metric1,0)", 49 map[parser.MetricRequest][]*types.MetricData{ 50 {Metric: "metric1", From: 0, Until: 1}: {types.MakeMetricData("metric1", []float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32)}, 51 }, 52 []*types.MetricData{types.MakeMetricData("delay(metric1,0)", 53 []float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32).SetTag("delay", "0").SetNameTag("metric1")}, 54 }, 55 } 56 57 for _, tt := range tests { 58 testName := tt.Target 59 t.Run(testName, func(t *testing.T) { 60 eval := th.EvaluatorFromFunc(md[0].F) 61 th.TestEvalExpr(t, eval, &tt) 62 }) 63 } 64 65 } 66 67 func BenchmarkDelay(b *testing.B) { 68 target := "delay(metric*,3)" 69 metrics := map[parser.MetricRequest][]*types.MetricData{ 70 {Metric: "metric*", From: 0, Until: 1}: { 71 types.MakeMetricData("metric1", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1), 72 types.MakeMetricData("metric2", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1), 73 }, 74 } 75 76 eval := th.EvaluatorFromFunc(md[0].F) 77 exp, _, err := parser.ParseExpr(target) 78 if err != nil { 79 b.Fatalf("failed to parse %s: %+v", target, err) 80 } 81 82 b.ResetTimer() 83 for n := 0; n < b.N; n++ { 84 g, err := eval.Eval(context.Background(), exp, 0, 1, metrics) 85 if err != nil { 86 b.Fatalf("failed to eval %s: %+v", target, err) 87 } 88 _ = g 89 } 90 } 91 92 func BenchmarkDelayReverse(b *testing.B) { 93 target := "delay(metric*,-3)" 94 metrics := map[parser.MetricRequest][]*types.MetricData{ 95 {Metric: "metric*", From: 0, Until: 1}: { 96 types.MakeMetricData("metric1", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1), 97 types.MakeMetricData("metric2", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1), 98 }, 99 } 100 101 eval := th.EvaluatorFromFunc(md[0].F) 102 exp, _, err := parser.ParseExpr(target) 103 if err != nil { 104 b.Fatalf("failed to parse %s: %+v", target, err) 105 } 106 107 b.ResetTimer() 108 for n := 0; n < b.N; n++ { 109 g, err := eval.Eval(context.Background(), exp, 0, 1, metrics) 110 if err != nil { 111 b.Fatalf("failed to eval %s: %+v", target, err) 112 } 113 _ = g 114 } 115 }