|
|
@@ -1,6 +1,11 @@
|
|
|
package prom
|
|
|
|
|
|
-import "testing"
|
|
|
+import (
|
|
|
+ "github.com/prometheus/client_golang/api"
|
|
|
+ "reflect"
|
|
|
+ "testing"
|
|
|
+ "time"
|
|
|
+)
|
|
|
|
|
|
func TestWarningsFrom(t *testing.T) {
|
|
|
var results interface{}
|
|
|
@@ -25,3 +30,156 @@ func TestWarningsFrom(t *testing.T) {
|
|
|
t.Errorf("Unexpected second warning: %s", warnings[1])
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestContext_isRequestStepAligned(t *testing.T) {
|
|
|
+ type fields struct {
|
|
|
+ Client api.Client
|
|
|
+ name string
|
|
|
+ errorCollector *QueryErrorCollector
|
|
|
+ }
|
|
|
+ type args struct {
|
|
|
+ start time.Time
|
|
|
+ end time.Time
|
|
|
+ step time.Duration
|
|
|
+ }
|
|
|
+ tests := []struct {
|
|
|
+ name string
|
|
|
+ fields fields
|
|
|
+ args args
|
|
|
+ want bool
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ name: "Test with times that are not step aligned to the hour",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 59, 30, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 59, 30, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ want: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Test with times that are step aligned to the hour",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ want: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Test with times where start is aligned to the hour but end is not",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 59, 0, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ want: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Test with times where end is aligned to the hour but start is not",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 59, 0, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ want: false,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, tt := range tests {
|
|
|
+ t.Run(tt.name, func(t *testing.T) {
|
|
|
+ ctx := &Context{
|
|
|
+ Client: tt.fields.Client,
|
|
|
+ name: tt.fields.name,
|
|
|
+ errorCollector: tt.fields.errorCollector,
|
|
|
+ }
|
|
|
+ if got := ctx.isRequestStepAligned(tt.args.start, tt.args.end, tt.args.step); got != tt.want {
|
|
|
+ t.Errorf("isRequestStepAligned() = %v, want %v", got, tt.want)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestContext_alignWindow(t *testing.T) {
|
|
|
+ type fields struct {
|
|
|
+ Client api.Client
|
|
|
+ name string
|
|
|
+ errorCollector *QueryErrorCollector
|
|
|
+ }
|
|
|
+ type args struct {
|
|
|
+ start time.Time
|
|
|
+ end time.Time
|
|
|
+ step time.Duration
|
|
|
+ }
|
|
|
+ tests := []struct {
|
|
|
+ name string
|
|
|
+ fields fields
|
|
|
+ args args
|
|
|
+ wantStart time.Time
|
|
|
+ wantEnd time.Time
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ name: "Do not update the start and end when step-aligned",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ wantStart: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ wantEnd: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Update start to be step-aligned and leave end the same",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 59, 0, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ wantStart: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ wantEnd: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Update end to be step-aligned and leave start the same",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 59, 0, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ wantStart: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ wantEnd: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Update start and end to be step-aligned",
|
|
|
+ fields: fields{},
|
|
|
+ args: args{
|
|
|
+ start: time.Date(2022, 11, 7, 4, 59, 0, 0, time.UTC),
|
|
|
+ end: time.Date(2022, 11, 8, 4, 59, 0, 0, time.UTC),
|
|
|
+ step: time.Hour,
|
|
|
+ },
|
|
|
+ wantStart: time.Date(2022, 11, 7, 4, 0, 0, 0, time.UTC),
|
|
|
+ wantEnd: time.Date(2022, 11, 8, 4, 0, 0, 0, time.UTC),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, tt := range tests {
|
|
|
+ t.Run(tt.name, func(t *testing.T) {
|
|
|
+ ctx := &Context{
|
|
|
+ Client: tt.fields.Client,
|
|
|
+ name: tt.fields.name,
|
|
|
+ errorCollector: tt.fields.errorCollector,
|
|
|
+ }
|
|
|
+ got, got1 := ctx.alignWindow(tt.args.start, tt.args.end, tt.args.step)
|
|
|
+ if !reflect.DeepEqual(got, tt.wantStart) {
|
|
|
+ t.Errorf("alignWindow() got = %v, want %v", got, tt.wantStart)
|
|
|
+ }
|
|
|
+ if !reflect.DeepEqual(got1, tt.wantEnd) {
|
|
|
+ t.Errorf("alignWindow() got1 = %v, want %v", got1, tt.wantEnd)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|