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

     1  package holtWintersConfidenceBands
     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 TestHoltWintersConfidenceBands(t *testing.T) {
    26  	var startTime int64 = 2678400
    27  	var step int64 = 600
    28  	var points int64 = 10
    29  
    30  	tests := []th.EvalTestItemWithRange{
    31  		{
    32  			Target: "holtWintersConfidenceBands(metric1)",
    33  			M: map[parser.MetricRequest][]*types.MetricData{
    34  				{Metric: "metric1", From: startTime - holtwinters.DefaultBootstrapInterval, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, (((holtwinters.DefaultBootstrapInterval)/step)+points)*step, step), step, startTime-(holtwinters.DefaultBootstrapInterval))},
    35  			},
    36  			Want: []*types.MetricData{
    37  				types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{0.2841206166091448, 1.0581027098774411, 0.3338172102994683, 0.5116859493263242, -0.18199175514936972, 0.2366173792019426, -1.2941554508809152, -0.513426806531049, -0.7970905542723132, 0.09868900726536012}, step, startTime).SetTag("holtWintersConfidenceLower", "1"),
    38  				types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{8.424944558327624, 9.409422251880809, 10.607070189221787, 10.288439865038768, 9.491556863132963, 9.474595784593738, 8.572310478053845, 8.897670449095346, 8.941566968508148, 9.409728797779282}, step, startTime).SetTag("holtWintersConfidenceUpper", "1"),
    39  			},
    40  			From:  startTime,
    41  			Until: startTime + step*points,
    42  		},
    43  		{
    44  			Target: "holtWintersConfidenceBands(metric1,4,'6d')",
    45  			M: map[parser.MetricRequest][]*types.MetricData{
    46  				{Metric: "metric1", From: startTime - 6*holtwinters.SecondsPerDay, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, ((6*holtwinters.SecondsPerDay/step)+points)*step, step), step, startTime-6*holtwinters.SecondsPerDay)},
    47  			},
    48  			Want: []*types.MetricData{
    49  				types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{-0.6535362793382391, -0.26554972418633316, -1.1060549683277792, -0.5788026852576289, -1.4594446935142829, -0.6933311085203409, -1.6566119269969288, -1.251651025511391, -1.7938581852717226, -1.1791817117029604}, step, startTime).SetTag("holtWintersConfidenceLower", "1"),
    50  				types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{8.166528156512886, 8.759008839563066, 9.250962452510654, 9.994110161265208, 10.511931730022393, 11.34313475259535, 12.639554646464758, 11.972601342482212, 10.920216551100442, 10.618692557967133}, step, startTime).SetTag("holtWintersConfidenceUpper", "1"),
    51  			},
    52  			From:  startTime,
    53  			Until: startTime + step*points,
    54  		},
    55  		{
    56  			Target: "holtWintersConfidenceBands(metric1,4,'1d','2d')",
    57  			M: map[parser.MetricRequest][]*types.MetricData{
    58  				{Metric: "metric1", From: startTime - holtwinters.SecondsPerDay, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, ((holtwinters.SecondsPerDay/step)+points)*step, step), step, startTime-holtwinters.SecondsPerDay)},
    59  			},
    60  			Want: []*types.MetricData{
    61  				types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{4.106587168490873, 3.8357974803355406, 3.564589629688576, 3.421354957735917, 3.393696278743315, 3.470415673952413, 3.2748850646377368, 3.3539750816574316, 3.5243322056965765, 3.7771201010598134}, step, startTime).SetTag("holtWintersConfidenceLower", "1"),
    62  				types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{4.24870339314537, 4.501056063000946, 4.956252698437961, 5.466294981886822, 6.0258698337471355, 6.630178145979606, 7.6413984841547204, 6.492608523867341, 5.556775146625346, 4.813280235806231}, step, startTime).SetTag("holtWintersConfidenceUpper", "1"),
    63  			},
    64  			From:  startTime,
    65  			Until: startTime + step*points,
    66  		},
    67  	}
    68  
    69  	for _, tt := range tests {
    70  		testName := tt.Target
    71  		t.Run(testName, func(t *testing.T) {
    72  			eval := th.EvaluatorFromFunc(md[0].F)
    73  			th.TestEvalExprWithRange(t, eval, &tt)
    74  		})
    75  	}
    76  }
    77  
    78  func TestNoPanicOnBigStep(t *testing.T) {
    79  
    80  	// NOTE: the expected values of this test are not meaningful, its purpose is to reproduce a panic
    81  	test := th.EvalTestItem{
    82  		"holtWintersConfidenceBands(metric1,3)",
    83  		map[parser.MetricRequest][]*types.MetricData{
    84  			{Metric: "metric1", From: -604800, Until: 1}: {types.MakeMetricData("metric1", []float64{1}, 604800, -604800)},
    85  		},
    86  		[]*types.MetricData{
    87  			types.MakeMetricData("holtWintersConfidenceLower(metric1)", []float64{}, 604800, 0).SetTag("holtWintersConfidenceLower", "1"),
    88  			types.MakeMetricData("holtWintersConfidenceUpper(metric1)", []float64{}, 604800, 0).SetTag("holtWintersConfidenceUpper", "1"),
    89  		},
    90  	}
    91  
    92  	eval := th.EvaluatorFromFunc(md[0].F)
    93  	th.TestEvalExpr(t, eval, &test)
    94  
    95  }
    96  
    97  func generateHwRange(x, y, jump int64) []float64 {
    98  	var valuesList []float64
    99  	for x < y {
   100  		val := float64((x / jump) % 10)
   101  		valuesList = append(valuesList, val)
   102  		x += jump
   103  	}
   104  	return valuesList
   105  }