//go:build !integration // +build !integration package functions import ( "testing" "knative.dev/pkg/ptr" ) func Test_validateOptions(t *testing.T) { tests := []struct { name string options Options errs int }{ { "correct 'scale.metric' - concurrency", Options{ Scale: &ScaleOptions{ Metric: ptr.String("concurrency"), }, }, 0, }, { "correct 'scale.metric' - rps", Options{ Scale: &ScaleOptions{ Metric: ptr.String("rps"), }, }, 0, }, { "incorrect 'scale.metric'", Options{ Scale: &ScaleOptions{ Metric: ptr.String("foo"), }, }, 1, }, { "correct 'scale.min'", Options{ Scale: &ScaleOptions{ Min: ptr.Int64(1), }, }, 0, }, { "correct 'scale.max'", Options{ Scale: &ScaleOptions{ Max: ptr.Int64(10), }, }, 0, }, { "correct 'scale.min' & 'scale.max'", Options{ Scale: &ScaleOptions{ Min: ptr.Int64(0), Max: ptr.Int64(10), }, }, 0, }, { "incorrect 'scale.min' & 'scale.max'", Options{ Scale: &ScaleOptions{ Min: ptr.Int64(100), Max: ptr.Int64(10), }, }, 1, }, { "incorrect 'scale.min' - negative value", Options{ Scale: &ScaleOptions{ Min: ptr.Int64(-10), }, }, 1, }, { "incorrect 'scale.max' - negative value", Options{ Scale: &ScaleOptions{ Max: ptr.Int64(-10), }, }, 1, }, { "correct 'scale.target'", Options{ Scale: &ScaleOptions{ Target: ptr.Float64(50), }, }, 0, }, { "incorrect 'scale.target'", Options{ Scale: &ScaleOptions{ Target: ptr.Float64(0), }, }, 1, }, { "correct 'scale.utilization'", Options{ Scale: &ScaleOptions{ Utilization: ptr.Float64(50), }, }, 0, }, { "incorrect 'scale.utilization' - < 1", Options{ Scale: &ScaleOptions{ Utilization: ptr.Float64(0), }, }, 1, }, { "incorrect 'scale.utilization' - > 100", Options{ Scale: &ScaleOptions{ Utilization: ptr.Float64(110), }, }, 1, }, { "correct 'resources.requests.cpu'", Options{ Resources: &ResourcesOptions{ Requests: &ResourcesRequestsOptions{ CPU: ptr.String("1000m"), }, }, }, 0, }, { "incorrect 'resources.requests.cpu'", Options{ Resources: &ResourcesOptions{ Requests: &ResourcesRequestsOptions{ CPU: ptr.String("foo"), }, }, }, 1, }, { "correct 'resources.requests.memory'", Options{ Resources: &ResourcesOptions{ Requests: &ResourcesRequestsOptions{ Memory: ptr.String("100Mi"), }, }, }, 0, }, { "incorrect 'resources.requests.memory'", Options{ Resources: &ResourcesOptions{ Requests: &ResourcesRequestsOptions{ Memory: ptr.String("foo"), }, }, }, 1, }, { "correct 'resources.limits.cpu'", Options{ Resources: &ResourcesOptions{ Limits: &ResourcesLimitsOptions{ CPU: ptr.String("1000m"), }, }, }, 0, }, { "incorrect 'resources.limits.cpu'", Options{ Resources: &ResourcesOptions{ Limits: &ResourcesLimitsOptions{ CPU: ptr.String("foo"), }, }, }, 1, }, { "correct 'resources.limits.memory'", Options{ Resources: &ResourcesOptions{ Limits: &ResourcesLimitsOptions{ Memory: ptr.String("100Mi"), }, }, }, 0, }, { "incorrect 'resources.limits.memory'", Options{ Resources: &ResourcesOptions{ Limits: &ResourcesLimitsOptions{ Memory: ptr.String("foo"), }, }, }, 1, }, { "correct 'resources.limits.concurrency'", Options{ Resources: &ResourcesOptions{ Limits: &ResourcesLimitsOptions{ Concurrency: ptr.Int64(50), }, }, }, 0, }, { "correct 'resources.limits.concurrency' - 0", Options{ Resources: &ResourcesOptions{ Limits: &ResourcesLimitsOptions{ Concurrency: ptr.Int64(0), }, }, }, 0, }, { "incorrect 'resources.limits.concurrency' - negative value", Options{ Resources: &ResourcesOptions{ Limits: &ResourcesLimitsOptions{ Concurrency: ptr.Int64(-10), }, }, }, 1, }, { "correct all options", Options{ Resources: &ResourcesOptions{ Requests: &ResourcesRequestsOptions{ CPU: ptr.String("1000m"), Memory: ptr.String("100Mi"), }, Limits: &ResourcesLimitsOptions{ CPU: ptr.String("1000m"), Memory: ptr.String("100Mi"), Concurrency: ptr.Int64(10), }, }, Scale: &ScaleOptions{ Min: ptr.Int64(0), Max: ptr.Int64(10), Metric: ptr.String("concurrency"), Target: ptr.Float64(40.5), Utilization: ptr.Float64(35.5), }, }, 0, }, { "incorrect all options", Options{ Resources: &ResourcesOptions{ Requests: &ResourcesRequestsOptions{ CPU: ptr.String("foo"), Memory: ptr.String("foo"), }, Limits: &ResourcesLimitsOptions{ CPU: ptr.String("foo"), Memory: ptr.String("foo"), Concurrency: ptr.Int64(-1), }, }, Scale: &ScaleOptions{ Min: ptr.Int64(-1), Max: ptr.Int64(-1), Metric: ptr.String("foo"), Target: ptr.Float64(-1), Utilization: ptr.Float64(110), }, }, 10, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := validateOptions(tt.options); len(got) != tt.errs { t.Errorf("validateOptions() = %v\n got %d errors but want %d", got, len(got), tt.errs) } }) } }