From cddd2427214a9c54b1f85964efdb8334d80831cf Mon Sep 17 00:00:00 2001 From: Matous Jobanek Date: Tue, 25 Feb 2025 12:54:36 +0100 Subject: [PATCH 1/5] add assertions for histograms and helper for provision time --- go.mod | 4 +++- go.sum | 4 ++-- pkg/test/metrics/metric.go | 25 +++++++++++++++++++++++++ pkg/test/usersignup/usersignup.go | 6 ++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0283681b..f81e298b 100644 --- a/go.mod +++ b/go.mod @@ -31,12 +31,15 @@ require ( github.com/google/uuid v1.6.0 github.com/migueleliasweb/go-github-mock v0.0.18 github.com/prometheus/client_golang v1.18.0 + github.com/prometheus/client_model v0.5.0 golang.org/x/oauth2 v0.12.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/kubectl v0.29.2 k8s.io/utils v0.0.0-20230726121419-3b25d923346b ) +replace github.com/codeready-toolchain/api => github.com/matousjobanek/api v0.0.0-20250225114159-7e2aa7cf0ada + require ( github.com/BurntSushi/toml v1.3.2 // indirect github.com/Masterminds/goutils v1.1.1 // indirect @@ -86,7 +89,6 @@ require ( github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/shopspring/decimal v1.2.0 // indirect diff --git a/go.sum b/go.sum index 67425f18..90a0be8d 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/codeready-toolchain/api v0.0.0-20250131222557-beba5463f429 h1:I7xzHRmstvzucH9NqF54xvsM/yYuWOp/G5+BUr5j4tY= -github.com/codeready-toolchain/api v0.0.0-20250131222557-beba5463f429/go.mod h1:gPwicZPTmRm1PF75ysEYXaYKdXoFgwgCggTJd1oYmOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -155,6 +153,8 @@ github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaW github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matousjobanek/api v0.0.0-20250225114159-7e2aa7cf0ada h1:pcIVW9vAUd7agBG5Vow1ajB/91HOUxudOienzeFRuYM= +github.com/matousjobanek/api v0.0.0-20250225114159-7e2aa7cf0ada/go.mod h1:gPwicZPTmRm1PF75ysEYXaYKdXoFgwgCggTJd1oYmOs= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/migueleliasweb/go-github-mock v0.0.18 h1:0lWt9MYmZQGnQE2rFtjlft/YtD6hzxuN6JJRFpujzEI= diff --git a/pkg/test/metrics/metric.go b/pkg/test/metrics/metric.go index f76e002a..2ad2a109 100644 --- a/pkg/test/metrics/metric.go +++ b/pkg/test/metrics/metric.go @@ -1,11 +1,14 @@ package metrics import ( + "fmt" "testing" "github.com/prometheus/client_golang/prometheus" promtestutil "github.com/prometheus/client_golang/prometheus/testutil" + promclientgo "github.com/prometheus/client_model/go" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func AssertMetricsCounterEquals(t *testing.T, expected int, c prometheus.Counter) { @@ -27,3 +30,25 @@ func AssertCounterGreaterOrEqualsInt(t *testing.T, threshold int, c prometheus.C func AssertMetricsGaugeEquals(t *testing.T, expected int, g prometheus.Gauge, msgAndArgs ...interface{}) { assert.InDelta(t, float64(expected), promtestutil.ToFloat64(g), 0.01, msgAndArgs...) } + +func AssertHistogramBucketEquals(t *testing.T, expected, bucket int, h prometheus.Histogram, msgAndArgs ...interface{}) { + metric := promclientgo.Metric{} + err := h.Write(&metric) + require.NoError(t, err) + for _, buck := range metric.GetHistogram().GetBucket() { + if buck.GetUpperBound() == float64(bucket) { + assert.Equal(t, uint64(expected), buck.GetCumulativeCount(), msgAndArgs...) + return + } + } + assert.Fail(t, fmt.Sprintf("the bucket with the upper limit '%d' wasn't found, actual: %v", bucket, metric.GetHistogram().GetBucket()), msgAndArgs...) +} + +func AssertAllHistogramBucketsAreEmpty(t *testing.T, h prometheus.Histogram, msgAndArgs ...interface{}) { + metric := promclientgo.Metric{} + err := h.Write(&metric) + require.NoError(t, err) + for _, buck := range metric.GetHistogram().GetBucket() { + assert.Empty(t, buck.GetCumulativeCount(), msgAndArgs...) + } +} diff --git a/pkg/test/usersignup/usersignup.go b/pkg/test/usersignup/usersignup.go index 86c0af46..6305fc95 100644 --- a/pkg/test/usersignup/usersignup.go +++ b/pkg/test/usersignup/usersignup.go @@ -228,6 +228,12 @@ func WithAnnotation(key, value string) Modifier { } } +func WithRequestReceivedTimeAnnotation(t time.Time) Modifier { + return func(userSignup *toolchainv1alpha1.UserSignup) { + userSignup.Annotations[toolchainv1alpha1.UserSignupRequestReceivedTimeAnnotationKey] = t.Format(time.RFC3339) + } +} + func WithoutAnnotation(key string) Modifier { return func(userSignup *toolchainv1alpha1.UserSignup) { delete(userSignup.Annotations, key) From a887f966e3c385020e7071066bf385e23571cce4 Mon Sep 17 00:00:00 2001 From: Matous Jobanek Date: Tue, 25 Feb 2025 16:44:27 +0100 Subject: [PATCH 2/5] linter --- pkg/test/metrics/metric.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/test/metrics/metric.go b/pkg/test/metrics/metric.go index 2ad2a109..1080f6b3 100644 --- a/pkg/test/metrics/metric.go +++ b/pkg/test/metrics/metric.go @@ -37,7 +37,7 @@ func AssertHistogramBucketEquals(t *testing.T, expected, bucket int, h prometheu require.NoError(t, err) for _, buck := range metric.GetHistogram().GetBucket() { if buck.GetUpperBound() == float64(bucket) { - assert.Equal(t, uint64(expected), buck.GetCumulativeCount(), msgAndArgs...) + assert.Equal(t, uint64(expected), buck.GetCumulativeCount(), msgAndArgs...) // nolint:gosec (expected value should be always non-negative) return } } From c7a74a683dc764018cfbf4a7844aaae9ba5ad643 Mon Sep 17 00:00:00 2001 From: Matous Jobanek Date: Tue, 25 Feb 2025 16:48:13 +0100 Subject: [PATCH 3/5] linter 2.0 --- pkg/test/metrics/metric.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/test/metrics/metric.go b/pkg/test/metrics/metric.go index 1080f6b3..09ab2127 100644 --- a/pkg/test/metrics/metric.go +++ b/pkg/test/metrics/metric.go @@ -37,7 +37,7 @@ func AssertHistogramBucketEquals(t *testing.T, expected, bucket int, h prometheu require.NoError(t, err) for _, buck := range metric.GetHistogram().GetBucket() { if buck.GetUpperBound() == float64(bucket) { - assert.Equal(t, uint64(expected), buck.GetCumulativeCount(), msgAndArgs...) // nolint:gosec (expected value should be always non-negative) + assert.Equal(t, uint64(expected), buck.GetCumulativeCount(), msgAndArgs...) // nolint:gosec // (expected value should be always non-negative) return } } From 67625f8d4ee7f2e61a24cf94754f9ce1c733cc3f Mon Sep 17 00:00:00 2001 From: Matous Jobanek Date: Wed, 26 Feb 2025 15:40:39 +0100 Subject: [PATCH 4/5] improve --- pkg/test/metrics/metric.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/test/metrics/metric.go b/pkg/test/metrics/metric.go index 09ab2127..1001f663 100644 --- a/pkg/test/metrics/metric.go +++ b/pkg/test/metrics/metric.go @@ -31,17 +31,24 @@ func AssertMetricsGaugeEquals(t *testing.T, expected int, g prometheus.Gauge, ms assert.InDelta(t, float64(expected), promtestutil.ToFloat64(g), 0.01, msgAndArgs...) } -func AssertHistogramBucketEquals(t *testing.T, expected, bucket int, h prometheus.Histogram, msgAndArgs ...interface{}) { +func AssertHistogramBucketEquals(t *testing.T, expected, bucket float64, h prometheus.Histogram, msgAndArgs ...interface{}) { metric := promclientgo.Metric{} err := h.Write(&metric) require.NoError(t, err) for _, buck := range metric.GetHistogram().GetBucket() { - if buck.GetUpperBound() == float64(bucket) { - assert.Equal(t, uint64(expected), buck.GetCumulativeCount(), msgAndArgs...) // nolint:gosec // (expected value should be always non-negative) + if buck.GetUpperBound() == bucket { + assert.Equal(t, uint64(expected), buck.GetCumulativeCount(), msgAndArgs...) // nolint:gosec return } } - assert.Fail(t, fmt.Sprintf("the bucket with the upper limit '%d' wasn't found, actual: %v", bucket, metric.GetHistogram().GetBucket()), msgAndArgs...) + assert.Fail(t, fmt.Sprintf("the bucket with the upper limit '%v' wasn't found, actual: %v", bucket, metric.GetHistogram().GetBucket()), msgAndArgs...) +} + +func AssertHistogramSampleCountEquals(t *testing.T, expected uint64, h prometheus.Histogram, msgAndArgs ...interface{}) { + metric := promclientgo.Metric{} + err := h.Write(&metric) + require.NoError(t, err) + assert.Equal(t, expected, metric.GetHistogram().GetSampleCount(), msgAndArgs...) } func AssertAllHistogramBucketsAreEmpty(t *testing.T, h prometheus.Histogram, msgAndArgs ...interface{}) { @@ -51,4 +58,5 @@ func AssertAllHistogramBucketsAreEmpty(t *testing.T, h prometheus.Histogram, msg for _, buck := range metric.GetHistogram().GetBucket() { assert.Empty(t, buck.GetCumulativeCount(), msgAndArgs...) } + assert.Empty(t, metric.GetHistogram().GetSampleCount(), msgAndArgs...) } From c5080a234b29aed31e3a90a90672d19c4861a1ca Mon Sep 17 00:00:00 2001 From: Matous Jobanek Date: Thu, 27 Feb 2025 08:39:37 +0100 Subject: [PATCH 5/5] api dependency --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index f81e298b..c46d14f2 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( ) require ( - github.com/codeready-toolchain/api v0.0.0-20250131222557-beba5463f429 + github.com/codeready-toolchain/api v0.0.0-20250227073728-5999971adb48 github.com/ghodss/yaml v1.0.0 github.com/google/go-cmp v0.6.0 github.com/google/go-github/v52 v52.0.0 @@ -38,8 +38,6 @@ require ( k8s.io/utils v0.0.0-20230726121419-3b25d923346b ) -replace github.com/codeready-toolchain/api => github.com/matousjobanek/api v0.0.0-20250225114159-7e2aa7cf0ada - require ( github.com/BurntSushi/toml v1.3.2 // indirect github.com/Masterminds/goutils v1.1.1 // indirect diff --git a/go.sum b/go.sum index 90a0be8d..dc06779f 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/codeready-toolchain/api v0.0.0-20250227073728-5999971adb48 h1:jqGcYw4KdQzqe5WEp+06HXBRyosAktgO5Y6ADs+NF5A= +github.com/codeready-toolchain/api v0.0.0-20250227073728-5999971adb48/go.mod h1:gPwicZPTmRm1PF75ysEYXaYKdXoFgwgCggTJd1oYmOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -153,8 +155,6 @@ github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaW github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matousjobanek/api v0.0.0-20250225114159-7e2aa7cf0ada h1:pcIVW9vAUd7agBG5Vow1ajB/91HOUxudOienzeFRuYM= -github.com/matousjobanek/api v0.0.0-20250225114159-7e2aa7cf0ada/go.mod h1:gPwicZPTmRm1PF75ysEYXaYKdXoFgwgCggTJd1oYmOs= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/migueleliasweb/go-github-mock v0.0.18 h1:0lWt9MYmZQGnQE2rFtjlft/YtD6hzxuN6JJRFpujzEI=