github.com/go-graphite/carbonapi@v0.17.0/expr/functions/tukey/function_test.go (about)

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