github.com/go-graphite/carbonapi@v0.17.0/expr/functions/powSeries/function_test.go (about) 1 package powSeries 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 ) 15 16 var ( 17 md []interfaces.FunctionMetadata = New("") 18 ) 19 20 func init() { 21 for _, m := range md { 22 metadata.RegisterFunction(m.Name, m.F) 23 } 24 } 25 26 var ( 27 now = time.Now().Unix() 28 tests = []th.EvalTestItem{ 29 { 30 "powSeries(collectd.test-db1.load.value, collectd.test-db2.load.value)", 31 map[parser.MetricRequest][]*types.MetricData{ 32 {Metric: "collectd.test-db1.load.value", From: 0, Until: 1}: {types.MakeMetricData("collectd.test-db1.load.value", []float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 312.1}, 1, now)}, 33 {Metric: "collectd.test-db2.load.value", From: 0, Until: 1}: {types.MakeMetricData("collectd.test-db1.load.value", []float64{1, 3, 5, 7, math.NaN(), 6, 4, 8, 0, 10, 234.2}, 1, now)}, 34 }, 35 []*types.MetricData{types.MakeMetricData("powSeries(collectd.test-db1.load.value, collectd.test-db2.load.value)", 36 []float64{1.0, 8.0, 243.0, 16384.0, math.NaN(), 46656.0, 2401.0, 16777216.0, 1.0, 0.0, math.NaN()}, 1, now).SetNameTag("powSeries(collectd.test-db1.load.value, collectd.test-db2.load.value)")}, 37 }, 38 { 39 "powSeries(collectd.test-db3.load.value, collectd.test-db4.load.value)", 40 map[parser.MetricRequest][]*types.MetricData{ 41 {Metric: "collectd.test-db3.load.value", From: 0, Until: 1}: {types.MakeMetricData("collectd.test-db3.load.value", []float64{1, 2, 666}, 1, now)}, 42 {Metric: "collectd.test-db4.load.value", From: 0, Until: 1}: {types.MakeMetricData("collectd.test-db4.load.value", []float64{1, 2}, 1, now)}, 43 }, 44 []*types.MetricData{types.MakeMetricData("powSeries(collectd.test-db3.load.value, collectd.test-db4.load.value)", 45 []float64{1.0, 4.0, math.NaN()}, 1, now).SetNameTag("powSeries(collectd.test-db3.load.value, collectd.test-db4.load.value)")}, 46 }, 47 { 48 "powSeries(collectd.test-db5.load.value, collectd.test-db6.load.value)", 49 map[parser.MetricRequest][]*types.MetricData{ 50 {Metric: "collectd.test-db5.load.value", From: 0, Until: 1}: {types.MakeMetricData("collectd.test-db5.load.value", []float64{1, 2}, 1, now)}, 51 {Metric: "collectd.test-db6.load.value", From: 0, Until: 1}: {types.MakeMetricData("collectd.test-db6.load.value", []float64{1, 2, 666}, 1, now)}, 52 }, 53 []*types.MetricData{types.MakeMetricData("powSeries(collectd.test-db5.load.value, collectd.test-db6.load.value)", 54 []float64{1.0, 4.0, math.NaN()}, 1, now).SetNameTag("powSeries(collectd.test-db5.load.value, collectd.test-db6.load.value)")}, 55 }, 56 } 57 ) 58 59 func TestFunction(t *testing.T) { 60 for _, test := range tests { 61 t.Run(test.Target, func(t *testing.T) { 62 eval := th.EvaluatorFromFunc(md[0].F) 63 th.TestEvalExpr(t, eval, &test) 64 }) 65 } 66 } 67 68 func BenchmarkFunction(b *testing.B) { 69 for _, test := range tests { 70 for i := 0; i < b.N; i++ { 71 b.Run(test.Target, func(b *testing.B) { 72 eval := th.EvaluatorFromFunc(md[0].F) 73 74 exp, _, err := parser.ParseExpr(test.Target) 75 if err != nil { 76 b.Fatalf("could not parse target expression %s", test.Target) 77 } 78 79 _, err = eval.Eval(context.Background(), exp, 0, 1, test.M) 80 if err != nil { 81 b.Fatalf("could not evaluate expression %s", test.Target) 82 } 83 }) 84 } 85 } 86 }