github.com/go-graphite/carbonapi@v0.17.0/expr/sort_test.go (about)

     1  package expr
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/go-graphite/carbonapi/expr/types"
     7  	"github.com/go-graphite/carbonapi/pkg/parser"
     8  )
     9  
    10  func TestSortMetrics(t *testing.T) {
    11  	const (
    12  		gold   = "a.gold.c.d"
    13  		silver = "a.silver.c.d"
    14  		bronze = "a.bronze.c.d"
    15  		first  = "a.first.c.d"
    16  		second = "a.second.c.d"
    17  		third  = "a.third.c.d"
    18  		fourth = "a.fourth.c.d"
    19  	)
    20  	tests := []struct {
    21  		metrics []*types.MetricData
    22  		mfetch  parser.MetricRequest
    23  		sorted  []*types.MetricData
    24  	}{
    25  		{
    26  			[]*types.MetricData{
    27  				//NOTE(nnuss): keep these lines lexically sorted ;)
    28  				types.MakeMetricData(bronze, []float64{}, 1, 0),
    29  				types.MakeMetricData(first, []float64{}, 1, 0),
    30  				types.MakeMetricData(fourth, []float64{}, 1, 0),
    31  				types.MakeMetricData(gold, []float64{}, 1, 0),
    32  				types.MakeMetricData(second, []float64{}, 1, 0),
    33  				types.MakeMetricData(silver, []float64{}, 1, 0),
    34  				types.MakeMetricData(third, []float64{}, 1, 0),
    35  			},
    36  			parser.MetricRequest{
    37  				Metric: "a.{first,second,third,fourth}.c.d",
    38  				From:   0,
    39  				Until:  1,
    40  			},
    41  			[]*types.MetricData{
    42  				//These are in the brace appearance order
    43  				types.MakeMetricData(first, []float64{}, 1, 0),
    44  				types.MakeMetricData(second, []float64{}, 1, 0),
    45  				types.MakeMetricData(third, []float64{}, 1, 0),
    46  				types.MakeMetricData(fourth, []float64{}, 1, 0),
    47  
    48  				//These are in the slice order as above and come after
    49  				types.MakeMetricData(bronze, []float64{}, 1, 0),
    50  				types.MakeMetricData(gold, []float64{}, 1, 0),
    51  				types.MakeMetricData(silver, []float64{}, 1, 0),
    52  			},
    53  		},
    54  
    55  		// With tags, it's now possible to have a query that returns metrics of different levels and level be higher
    56  		// or lower than the level for the metric request
    57  		{
    58  			[]*types.MetricData{
    59  				types.MakeMetricData("a.b.c", []float64{}, 1, 0),
    60  				types.MakeMetricData("a", []float64{}, 1, 0),
    61  				types.MakeMetricData("a.d", []float64{}, 1, 0),
    62  			},
    63  			parser.MetricRequest{
    64  				Metric: "seriesByTag(foo=~a.[bcd])",
    65  				From:   0,
    66  				Until:  1,
    67  			},
    68  			[]*types.MetricData{
    69  				types.MakeMetricData("a", []float64{}, 1, 0),
    70  				types.MakeMetricData("a.b.c", []float64{}, 1, 0),
    71  				types.MakeMetricData("a.d", []float64{}, 1, 0),
    72  			},
    73  		},
    74  	}
    75  	for i, test := range tests {
    76  		if len(test.metrics) != len(test.sorted) {
    77  			t.Skipf("Error in test %d : length mismatch %d vs. %d", i, len(test.metrics), len(test.sorted))
    78  		}
    79  		SortMetrics(test.metrics, test.mfetch)
    80  		for i := range test.metrics {
    81  			if test.metrics[i].Name != test.sorted[i].Name {
    82  				t.Errorf("[%d] Expected %q but have %q", i, test.sorted[i].Name, test.metrics[i].Name)
    83  			}
    84  		}
    85  	}
    86  }