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  }