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

     1  package holtWintersAberration
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/go-graphite/carbonapi/expr/holtwinters"
     7  	"github.com/go-graphite/carbonapi/expr/interfaces"
     8  
     9  	"github.com/go-graphite/carbonapi/expr/metadata"
    10  	"github.com/go-graphite/carbonapi/expr/types"
    11  	"github.com/go-graphite/carbonapi/pkg/parser"
    12  	th "github.com/go-graphite/carbonapi/tests"
    13  )
    14  
    15  var (
    16  	md []interfaces.FunctionMetadata = New("")
    17  )
    18  
    19  func init() {
    20  	for _, m := range md {
    21  		metadata.RegisterFunction(m.Name, m.F)
    22  	}
    23  }
    24  
    25  func TestHoltWintersAberration(t *testing.T) {
    26  	var startTime int64 = 2678400
    27  	var step int64 = 600
    28  	var points int64 = 10
    29  	var seconds int64 = 86400
    30  
    31  	tests := []th.EvalTestItemWithRange{
    32  		{
    33  			Target: "holtWintersAberration(metric*)",
    34  			M: map[parser.MetricRequest][]*types.MetricData{
    35  				{Metric: "metric*", From: startTime, Until: startTime + step*points}: {
    36  					types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime),
    37  					types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime),
    38  				},
    39  				{Metric: "metric*", From: startTime - holtwinters.DefaultBootstrapInterval, Until: startTime + step*points}: {
    40  					types.MakeMetricData("metric1", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 0), step, startTime-holtwinters.DefaultBootstrapInterval),
    41  					types.MakeMetricData("metric2", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 10), step, startTime-holtwinters.DefaultBootstrapInterval),
    42  				},
    43  			},
    44  			Want: []*types.MetricData{
    45  				types.MakeMetricData("holtWintersAberration(metric1)", []float64{-0.2841206166091448, -0.05810270987744115, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"),
    46  				types.MakeMetricData("holtWintersAberration(metric2)", []float64{-0.284120616609151, -0.05810270987744737, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"),
    47  			},
    48  			From:  startTime,
    49  			Until: startTime + step*points,
    50  		},
    51  		{
    52  			Target: "holtWintersAberration(metric*,4,'4d')",
    53  			M: map[parser.MetricRequest][]*types.MetricData{
    54  				{Metric: "metric*", From: startTime, Until: startTime + step*points}: {
    55  					types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime),
    56  					types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime),
    57  				},
    58  				{Metric: "metric*", From: startTime - 4*seconds, Until: startTime + step*points}: {
    59  					types.MakeMetricData("metric1", generateHwRange(0, ((4*seconds/step)+points)*step, step, 0), step, startTime-4*seconds),
    60  					types.MakeMetricData("metric2", generateHwRange(0, ((4*seconds/step)+points)*step, step, 10), step, startTime-4*seconds),
    61  				},
    62  			},
    63  			Want: []*types.MetricData{
    64  				types.MakeMetricData("holtWintersAberration(metric1)", []float64{-1.4410544085511923, -0.5199507849641569, 0, 0, 0, 0, 0, 0, 0, 0.09386319244056907}, step, startTime).SetTag("holtWintersAberration", "1"),
    65  				types.MakeMetricData("holtWintersAberration(metric2)", []float64{-1.4410544085511923, -0.5199507849641609, 0, 0, 0, 0, 0, 0, 0, 0.09386319244056551}, step, startTime).SetTag("holtWintersAberration", "1"),
    66  			},
    67  			From:  startTime,
    68  			Until: startTime + step*points,
    69  		},
    70  		{
    71  			Target: "holtWintersAberration(metric*,4,'1d','2d')",
    72  			M: map[parser.MetricRequest][]*types.MetricData{
    73  				{Metric: "metric*", From: startTime, Until: startTime + step*points}: {
    74  					types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime),
    75  					types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime),
    76  				},
    77  				{Metric: "metric*", From: startTime - seconds, Until: startTime + step*points}: {
    78  					types.MakeMetricData("metric1", generateHwRange(0, ((seconds/step)+points)*step, step, 0), step, startTime-seconds),
    79  					types.MakeMetricData("metric2", generateHwRange(0, ((seconds/step)+points)*step, step, 10), step, startTime-seconds),
    80  				},
    81  			},
    82  			Want: []*types.MetricData{
    83  				types.MakeMetricData("holtWintersAberration(metric1)", []float64{-4.106587168490873, -2.8357974803355406, -1.5645896296885762, -0.4213549577359168, 0, 0, 0, 0.5073914761326588, 2.4432248533746543, 4.186719764193769}, step, startTime).SetTag("holtWintersAberration", "1"),
    84  				types.MakeMetricData("holtWintersAberration(metric2)", []float64{-4.1065871684908775, -2.8357974803355486, -1.5645896296885837, -0.42135495773592346, 0, 0, 0, 0.5073914761326499, 2.4432248533746446, 4.186719764193759}, step, startTime).SetTag("holtWintersAberration", "1"),
    85  			},
    86  			From:  startTime,
    87  			Until: startTime + step*points,
    88  		},
    89  		{
    90  			Target: "holtWintersAberration(metric*)",
    91  			M: map[parser.MetricRequest][]*types.MetricData{
    92  				{Metric: "metric*", From: startTime, Until: startTime + step*points}: {
    93  					types.MakeMetricData("metric1", generateHwRange(0, points*step, step, 0), step, startTime),
    94  					types.MakeMetricData("metric2", generateHwRange(0, points*step, step, 10), step, startTime),
    95  				},
    96  				{Metric: "metric*", From: startTime - holtwinters.DefaultBootstrapInterval, Until: startTime + step*points}: {
    97  					types.MakeMetricData("metric1", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 0), step, startTime-holtwinters.DefaultBootstrapInterval),
    98  					types.MakeMetricData("metric2", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 10), step, startTime-holtwinters.DefaultBootstrapInterval),
    99  					types.MakeMetricData("metric3", generateHwRange(0, ((holtwinters.DefaultBootstrapInterval/step)+points)*step, step, 20), step, startTime-holtwinters.DefaultBootstrapInterval), // Verify that metrics that don't match those fetched with the unadjusted start time are not included in the results
   100  				},
   101  			},
   102  			Want: []*types.MetricData{
   103  				types.MakeMetricData("holtWintersAberration(metric1)", []float64{-0.2841206166091448, -0.05810270987744115, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"),
   104  				types.MakeMetricData("holtWintersAberration(metric2)", []float64{-0.284120616609151, -0.05810270987744737, 0, 0, 0, 0, 0, 0, 0, 0}, step, startTime).SetTag("holtWintersAberration", "1"),
   105  			},
   106  			From:  startTime,
   107  			Until: startTime + step*points,
   108  		},
   109  	}
   110  
   111  	for _, tt := range tests {
   112  		testName := tt.Target
   113  		t.Run(testName, func(t *testing.T) {
   114  			eval := th.EvaluatorFromFunc(md[0].F)
   115  			th.TestEvalExprWithRange(t, eval, &tt)
   116  		})
   117  	}
   118  }
   119  
   120  func generateHwRange(x, y, jump, t int64) []float64 {
   121  	var valuesList []float64
   122  	for x < y {
   123  		val := float64(t + (x/jump)%10)
   124  		valuesList = append(valuesList, val)
   125  		x += jump
   126  	}
   127  	return valuesList
   128  }