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 }