github.com/go-graphite/carbonapi@v0.17.0/expr/functions/sortBy/function_test.go (about) 1 package sortBy 2 3 import ( 4 "math" 5 "testing" 6 "time" 7 8 "github.com/go-graphite/carbonapi/expr/consolidations" 9 "github.com/go-graphite/carbonapi/expr/interfaces" 10 11 "github.com/go-graphite/carbonapi/expr/metadata" 12 "github.com/go-graphite/carbonapi/expr/types" 13 "github.com/go-graphite/carbonapi/pkg/parser" 14 th "github.com/go-graphite/carbonapi/tests" 15 ) 16 17 var ( 18 md []interfaces.FunctionMetadata = New("") 19 nan = math.NaN() 20 ) 21 22 func init() { 23 for _, m := range md { 24 metadata.RegisterFunction(m.Name, m.F) 25 } 26 } 27 28 func TestFunction(t *testing.T) { 29 now32 := int64(time.Now().Unix()) 30 31 tests := []th.EvalTestItem{ 32 { 33 Target: "sortByTotal(metric1)", 34 M: map[parser.MetricRequest][]*types.MetricData{ 35 {Metric: "metric1", From: 0, Until: 1}: { 36 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 37 types.MakeMetricData("metricB", []float64{5, 5, 5, 5, 5, 5}, 1, now32), 38 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 4, 4}, 1, now32), 39 }, 40 }, 41 Want: []*types.MetricData{ 42 types.MakeMetricData("metricB", []float64{5, 5, 5, 5, 5, 5}, 1, now32), 43 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 4, 4}, 1, now32), 44 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 45 }, 46 }, 47 { 48 Target: "sortByMaxima(metric*)", 49 M: map[parser.MetricRequest][]*types.MetricData{ 50 {Metric: "metric*", From: 0, Until: 1}: { 51 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 52 types.MakeMetricData("metricB", []float64{5, 5, 5, 5, 5, 5}, 1, now32), 53 types.MakeMetricData("metricC", []float64{2, 2, 10, 5, 2, 2}, 1, now32), 54 }, 55 }, 56 Want: []*types.MetricData{ 57 types.MakeMetricData("metricC", []float64{2, 2, 10, 5, 2, 2}, 1, now32), 58 types.MakeMetricData("metricB", []float64{5, 5, 5, 5, 5, 5}, 1, now32), 59 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 60 }, 61 }, 62 { 63 Target: "sortByMinima(metric*)", 64 M: map[parser.MetricRequest][]*types.MetricData{ 65 {Metric: "metric*", From: 0, Until: 1}: { 66 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 67 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 68 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 69 }, 70 }, 71 Want: []*types.MetricData{ 72 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 73 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 74 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 75 }, 76 }, 77 { 78 Target: "sortBy(metric*)", 79 M: map[parser.MetricRequest][]*types.MetricData{ 80 {Metric: "metric*", From: 0, Until: 1}: { 81 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 82 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 83 types.MakeMetricData("metricC", []float64{1, 2, 3, 4, 5, 6}, 1, now32), 84 }, 85 }, 86 Want: []*types.MetricData{ 87 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 88 types.MakeMetricData("metricC", []float64{1, 2, 3, 4, 5, 6}, 1, now32), 89 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 90 }, 91 }, 92 { 93 Target: "sortBy(metric*, 'median')", 94 M: map[parser.MetricRequest][]*types.MetricData{ 95 {Metric: "metric*", From: 0, Until: 1}: { 96 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 97 types.MakeMetricData("metricB", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 98 types.MakeMetricData("metricC", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 99 }, 100 }, 101 Want: []*types.MetricData{ 102 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 103 types.MakeMetricData("metricB", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 104 types.MakeMetricData("metricC", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 105 }, 106 }, 107 { 108 Target: "sortBy(metric*, 'max', true)", 109 M: map[parser.MetricRequest][]*types.MetricData{ 110 {Metric: "metric*", From: 0, Until: 1}: { 111 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 112 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 113 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 114 }, 115 }, 116 Want: []*types.MetricData{ 117 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 118 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 119 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 120 }, 121 }, 122 { 123 Target: "sortBy(metric*, 'max', true)", 124 M: map[parser.MetricRequest][]*types.MetricData{ 125 {Metric: "metric*", From: 0, Until: 1}: { 126 types.MakeMetricData("metricA", []float64{nan, nan, nan, nan, nan, nan}, 1, now32), 127 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 128 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 129 }, 130 }, 131 Want: []*types.MetricData{ 132 types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 133 types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 134 types.MakeMetricData("metricA", []float64{nan, nan, nan, nan, nan, nan}, 1, now32), 135 }, 136 }, 137 } 138 139 for _, tt := range tests { 140 testName := tt.Target 141 t.Run(testName, func(t *testing.T) { 142 eval := th.EvaluatorFromFunc(md[0].F) 143 th.TestEvalExpr(t, eval, &tt) 144 }) 145 } 146 147 } 148 149 func TestErrorInvalidConsolidationFunction(t *testing.T) { 150 now32 := int64(time.Now().Unix()) 151 152 tests := []th.EvalTestItemWithError{ 153 { 154 Target: "sortBy(metric*, 'test')", 155 M: map[parser.MetricRequest][]*types.MetricData{ 156 {Metric: "metric*", From: 0, Until: 1}: { 157 types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32), 158 types.MakeMetricData("metricB", []float64{4, 4, 5, 5, 6, 6}, 1, now32), 159 types.MakeMetricData("metricC", []float64{3, 4, 5, 6, 7, 8}, 1, now32), 160 }, 161 }, 162 Want: nil, 163 Error: consolidations.ErrInvalidConsolidationFunc, 164 }, 165 } 166 167 for _, testCase := range tests { 168 testName := testCase.Target 169 t.Run(testName, func(t *testing.T) { 170 eval := th.EvaluatorFromFunc(md[0].F) 171 th.TestEvalExprWithError(t, eval, &testCase) 172 }) 173 } 174 }