From 061a381d38101c68a0994cf767498867c08838d7 Mon Sep 17 00:00:00 2001 From: Oliver Ryde Date: Mon, 15 Sep 2025 11:19:05 +0200 Subject: [PATCH 1/3] Refactor go tests to use DescribeTable --- .../controller/humiocluster_version_test.go | 326 +++++++++--------- 1 file changed, 164 insertions(+), 162 deletions(-) diff --git a/internal/controller/humiocluster_version_test.go b/internal/controller/humiocluster_version_test.go index 4cfec5de0..3c4b8bd21 100644 --- a/internal/controller/humiocluster_version_test.go +++ b/internal/controller/humiocluster_version_test.go @@ -1,177 +1,179 @@ package controller import ( + "fmt" "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" ) -func Test_HumioVersionFromString(t *testing.T) { - type fields struct { - userDefinedImageVersion string - expectedImageVersion string - expectedAssumeLatest bool - } - tests := []struct { - name string - fields fields - }{ - { - "image with container image SHA", - fields{ - userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f@sha256:4d545bbd0dc3a22d40188947f569566737657c42e4bd14327598299db2b5a38a", - expectedImageVersion: "1.70.0", - expectedAssumeLatest: false, - }, +func TestVersions(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Version suite") +} + +// Helper functions for consistent error message formatting + +// formatVersionParsingMessage formats error messages for version parsing tests +func formatVersionParsingMessage(input, field string, got, expected interface{}) string { + return fmt.Sprintf("HumioVersionFromString(%s) = got %s %v, expected %s %v", input, field, got, field, expected) +} + +// formatVersionComparisonMessage formats error messages for version comparison setup +func formatVersionComparisonMessage(input, got, expected string) string { + return fmt.Sprintf("HumioVersion.AtLeast(%s) = got %s, expected %s", input, got, expected) +} + +// formatAtLeastErrorMessage formats error messages for AtLeast error checks +func formatAtLeastErrorMessage(inputVersion, compareVersion string, gotErr error, expectedErr bool) string { + return fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", inputVersion, compareVersion, gotErr, expectedErr) +} + +// formatAtLeastBoolMessage formats error messages for AtLeast boolean result checks +func formatAtLeastBoolMessage(inputVersion, compareVersion string, got, expected bool) string { + return fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got %t, expected %t", inputVersion, compareVersion, got, expected) +} + +// versionParsingTestCase defines test cases for HumioVersionFromString function +type versionParsingTestCase struct { + userDefinedImageVersion string // Input Docker image string to parse + expectedImageVersion string // Expected semantic version output + expectedAssumeLatest bool // Expected IsLatest() result +} + +var _ = DescribeTable("HumioVersionFromString", Label("unit"), + func(testCase versionParsingTestCase) { + gotVersion := HumioVersionFromString(testCase.userDefinedImageVersion) + + Expect(testCase.expectedAssumeLatest).To(Equal(gotVersion.IsLatest()), + formatVersionParsingMessage(testCase.userDefinedImageVersion, "IsLatest", gotVersion.IsLatest(), testCase.expectedAssumeLatest)) + + if !testCase.expectedAssumeLatest { + Expect(testCase.expectedImageVersion).To(Equal(gotVersion.String()), + formatVersionParsingMessage(testCase.userDefinedImageVersion, "image", gotVersion.String(), testCase.expectedImageVersion)) + } + }, + Entry("image with container image SHA", + versionParsingTestCase{ + userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f@sha256:4d545bbd0dc3a22d40188947f569566737657c42e4bd14327598299db2b5a38a", + expectedImageVersion: "1.70.0", + expectedAssumeLatest: false, }, - { - "image without container image SHA", - fields{ - userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f", - expectedImageVersion: "1.70.0", - expectedAssumeLatest: false, - }, + ), + Entry("image without container image SHA", + versionParsingTestCase{ + userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f", + expectedImageVersion: "1.70.0", + expectedAssumeLatest: false, }, - { - "image from github issue https://github.com/humio/humio-operator/issues/615", - fields{ - userDefinedImageVersion: "humio/humio-core:1.34.0@sha256:38c78710107dc76f4f809b457328ff1c6764ae4244952a5fa7d76f6e67ea2390", - expectedImageVersion: "1.34.0", - expectedAssumeLatest: false, - }, + ), + Entry("image from github issue https://github.com/humio/humio-operator/issues/615", + versionParsingTestCase{ + userDefinedImageVersion: "humio/humio-core:1.34.0@sha256:38c78710107dc76f4f809b457328ff1c6764ae4244952a5fa7d76f6e67ea2390", + expectedImageVersion: "1.34.0", + expectedAssumeLatest: false, }, - { - "short image version", - fields{ - userDefinedImageVersion: "humio/humio-core:1.34.0", - expectedImageVersion: "1.34.0", - expectedAssumeLatest: false, - }, + ), + Entry("short image version", + versionParsingTestCase{ + userDefinedImageVersion: "humio/humio-core:1.34.0", + expectedImageVersion: "1.34.0", + expectedAssumeLatest: false, }, - { - "master image tag", - fields{ - userDefinedImageVersion: "humio/humio-core:master", - expectedImageVersion: "", - expectedAssumeLatest: true, - }, + ), + Entry("master image tag", + versionParsingTestCase{ + userDefinedImageVersion: "humio/humio-core:master", + expectedImageVersion: "", + expectedAssumeLatest: true, }, - { - "preview image tag", - fields{ - userDefinedImageVersion: "humio/humio-core:preview", - expectedImageVersion: "", - expectedAssumeLatest: true, - }, + ), + Entry("preview image tag", + versionParsingTestCase{ + userDefinedImageVersion: "humio/humio-core:preview", + expectedImageVersion: "", + expectedAssumeLatest: true, }, - { - "latest image tag", - fields{ - userDefinedImageVersion: "humio/humio-core:latest", - expectedImageVersion: "", - expectedAssumeLatest: true, - }, + ), + Entry("latest image tag", + versionParsingTestCase{ + userDefinedImageVersion: "humio/humio-core:latest", + expectedImageVersion: "", + expectedAssumeLatest: true, }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - gotVersion := HumioVersionFromString(tt.fields.userDefinedImageVersion) - - if gotVersion.IsLatest() != tt.fields.expectedAssumeLatest { - t.Errorf("HumioVersionFromString(%s) = got IsLatest %t, expected IsLatest %t", tt.fields.userDefinedImageVersion, gotVersion.IsLatest(), tt.fields.expectedAssumeLatest) - } - - if !tt.fields.expectedAssumeLatest && gotVersion.String() != tt.fields.expectedImageVersion { - t.Errorf("HumioVersionFromString(%s) = got image %s, expected image %s", tt.fields.userDefinedImageVersion, gotVersion.String(), tt.fields.expectedImageVersion) - } - }) - } -} + )) -func Test_humioVersion_AtLeast(t *testing.T) { - type fields struct { - userDefinedImageVersion string - imageVersionOlder string - imageVersionExact string - imageVersionNewer string - expectedErr bool - } - tests := []struct { - name string - fields fields - }{ - { - "image with container image SHA", - fields{ - userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f@sha256:4d545bbd0dc3a22d40188947f569566737657c42e4bd14327598299db2b5a38a", - imageVersionOlder: "1.69.0", - imageVersionExact: "1.70.0", - imageVersionNewer: "1.70.1", - expectedErr: false, - }, - }, - { - "image without container image SHA", - fields{ - userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f", - imageVersionOlder: "1.50.5", - imageVersionExact: "1.70.0", - imageVersionNewer: "1.71.0", - expectedErr: false, - }, - }, - { - "image from github issue https://github.com/humio/humio-operator/issues/615", - fields{ - userDefinedImageVersion: "humio/humio-core:1.34.0@sha256:38c78710107dc76f4f809b457328ff1c6764ae4244952a5fa7d76f6e67ea2390", - imageVersionOlder: "1.33.0", - imageVersionExact: "1.34.0", - imageVersionNewer: "1.35.0", - expectedErr: false, - }, - }, - { - "short image version", - fields{ - userDefinedImageVersion: "humio/humio-core:1.34.0", - imageVersionOlder: "1.1.5", - imageVersionExact: "1.34.0", - imageVersionNewer: "1.100.0", - expectedErr: false, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - humioVersion := HumioVersionFromString(tt.fields.userDefinedImageVersion) - if humioVersion.String() != tt.fields.imageVersionExact { - t.Errorf("HumioVersion.AtLeast(%s) = got %s, expected %s", tt.fields.userDefinedImageVersion, humioVersion.String(), tt.fields.userDefinedImageVersion) - } - - // Verify current version is newer than older image - atLeast, err := humioVersion.AtLeast(tt.fields.imageVersionOlder) - if (err != nil) != tt.fields.expectedErr { - t.Errorf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", tt.fields.userDefinedImageVersion, tt.fields.imageVersionOlder, err, tt.fields.expectedErr) - } - if !atLeast { - t.Errorf("HumioVersion(%s).AtLeast(%s) = got %t, expected true", tt.fields.userDefinedImageVersion, tt.fields.imageVersionOlder, atLeast) - } - - // Verify version exactly the same as the specified image is reported as at least the exact - atLeast, err = humioVersion.AtLeast(tt.fields.imageVersionExact) - if (err != nil) != tt.fields.expectedErr { - t.Errorf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", tt.fields.userDefinedImageVersion, tt.fields.imageVersionExact, err, tt.fields.expectedErr) - } - if !atLeast { - t.Errorf("HumioVersion(%s).AtLeast(%s) = got %t, expected true", tt.fields.userDefinedImageVersion, tt.fields.imageVersionExact, atLeast) - } - - // Verify current version reports false to be AtLeast for images newer - atLeast, err = humioVersion.AtLeast(tt.fields.imageVersionNewer) - if (err != nil) != tt.fields.expectedErr { - t.Errorf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", tt.fields.userDefinedImageVersion, tt.fields.imageVersionNewer, err, tt.fields.expectedErr) - } - if atLeast { - t.Errorf("HumioVersion(%s).AtLeast(%s) = got %t, expected false", tt.fields.userDefinedImageVersion, tt.fields.imageVersionNewer, atLeast) - } - }) - } +// versionComparisonTestCase defines test cases for HumioVersion.AtLeast function +type versionComparisonTestCase struct { + userDefinedImageVersion string // Input Docker image string to parse + imageVersionOlder string // Version that should be older than parsed version + imageVersionExact string // Version that should be exactly equal to parsed version + imageVersionNewer string // Version that should be newer than parsed version + expectedErr bool // Expected error result } + +var _ = DescribeTable("HumioVersionAtLeast", + func(testCase versionComparisonTestCase) { + humioVersion := HumioVersionFromString(testCase.userDefinedImageVersion) + + Expect(testCase.imageVersionExact).To(Equal(humioVersion.String()), + formatVersionComparisonMessage(testCase.userDefinedImageVersion, humioVersion.String(), testCase.userDefinedImageVersion)) + + // Verify current version is newer than older image + atLeast, err := humioVersion.AtLeast(testCase.imageVersionOlder) + Expect(testCase.expectedErr).To(Equal(err != nil), + formatAtLeastErrorMessage(testCase.userDefinedImageVersion, testCase.imageVersionOlder, err, testCase.expectedErr)) + + Expect(atLeast).To(BeTrue(), + formatAtLeastBoolMessage(testCase.userDefinedImageVersion, testCase.imageVersionOlder, atLeast, true)) + + // Verify version exactly the same as the specified image is reported as at least the exact + atLeast, err = humioVersion.AtLeast(testCase.imageVersionExact) + Expect(testCase.expectedErr).To(Equal(err != nil), + formatAtLeastErrorMessage(testCase.userDefinedImageVersion, testCase.imageVersionExact, err, testCase.expectedErr)) + + Expect(atLeast).To(BeTrue(), + formatAtLeastBoolMessage(testCase.userDefinedImageVersion, testCase.imageVersionExact, atLeast, true)) + + // Verify current version reports false to be AtLeast for images newer + atLeast, err = humioVersion.AtLeast(testCase.imageVersionNewer) + Expect(testCase.expectedErr).To(Equal(err != nil), + formatAtLeastErrorMessage(testCase.userDefinedImageVersion, testCase.imageVersionNewer, err, testCase.expectedErr)) + + Expect(atLeast).To(BeFalse(), + formatAtLeastBoolMessage(testCase.userDefinedImageVersion, testCase.imageVersionNewer, atLeast, false)) + }, + Entry("image with container image SHA", + versionComparisonTestCase{ + userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f@sha256:4d545bbd0dc3a22d40188947f569566737657c42e4bd14327598299db2b5a38a", + imageVersionOlder: "1.69.0", + imageVersionExact: "1.70.0", + imageVersionNewer: "1.70.1", + expectedErr: false, + }), + Entry("image without container image SHA", + versionComparisonTestCase{ + userDefinedImageVersion: "humio/humio-core-dev:1.70.0--build-1023123--uaihdasiuhdiuahd23792f", + imageVersionOlder: "1.50.5", + imageVersionExact: "1.70.0", + imageVersionNewer: "1.71.0", + expectedErr: false, + }), + Entry("image from github issue https://github.com/humio/humio-operator/issues/615", + versionComparisonTestCase{ + userDefinedImageVersion: "humio/humio-core:1.34.0@sha256:38c78710107dc76f4f809b457328ff1c6764ae4244952a5fa7d76f6e67ea2390", + imageVersionOlder: "1.33.0", + imageVersionExact: "1.34.0", + imageVersionNewer: "1.35.0", + expectedErr: false, + }), + Entry("short image version", + versionComparisonTestCase{ + userDefinedImageVersion: "humio/humio-core:1.34.0", + imageVersionOlder: "1.1.5", + imageVersionExact: "1.34.0", + imageVersionNewer: "1.100.0", + expectedErr: false, + }), +) From 0683fc6753eac07d625d0ef395753d7dafebe42c Mon Sep 17 00:00:00 2001 From: Oliver Ryde Date: Mon, 15 Sep 2025 12:28:10 +0200 Subject: [PATCH 2/3] Revert to using sprintf directly --- .../controller/humiocluster_version_test.go | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/internal/controller/humiocluster_version_test.go b/internal/controller/humiocluster_version_test.go index 3c4b8bd21..c2c52d734 100644 --- a/internal/controller/humiocluster_version_test.go +++ b/internal/controller/humiocluster_version_test.go @@ -13,28 +13,6 @@ func TestVersions(t *testing.T) { RunSpecs(t, "Version suite") } -// Helper functions for consistent error message formatting - -// formatVersionParsingMessage formats error messages for version parsing tests -func formatVersionParsingMessage(input, field string, got, expected interface{}) string { - return fmt.Sprintf("HumioVersionFromString(%s) = got %s %v, expected %s %v", input, field, got, field, expected) -} - -// formatVersionComparisonMessage formats error messages for version comparison setup -func formatVersionComparisonMessage(input, got, expected string) string { - return fmt.Sprintf("HumioVersion.AtLeast(%s) = got %s, expected %s", input, got, expected) -} - -// formatAtLeastErrorMessage formats error messages for AtLeast error checks -func formatAtLeastErrorMessage(inputVersion, compareVersion string, gotErr error, expectedErr bool) string { - return fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", inputVersion, compareVersion, gotErr, expectedErr) -} - -// formatAtLeastBoolMessage formats error messages for AtLeast boolean result checks -func formatAtLeastBoolMessage(inputVersion, compareVersion string, got, expected bool) string { - return fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got %t, expected %t", inputVersion, compareVersion, got, expected) -} - // versionParsingTestCase defines test cases for HumioVersionFromString function type versionParsingTestCase struct { userDefinedImageVersion string // Input Docker image string to parse @@ -47,11 +25,11 @@ var _ = DescribeTable("HumioVersionFromString", Label("unit"), gotVersion := HumioVersionFromString(testCase.userDefinedImageVersion) Expect(testCase.expectedAssumeLatest).To(Equal(gotVersion.IsLatest()), - formatVersionParsingMessage(testCase.userDefinedImageVersion, "IsLatest", gotVersion.IsLatest(), testCase.expectedAssumeLatest)) + fmt.Sprintf("HumioVersionFromString(%s) = got %s %v, expected %s %v", testCase.userDefinedImageVersion, "IsLatest", gotVersion.IsLatest(), "IsLatest", testCase.expectedAssumeLatest)) if !testCase.expectedAssumeLatest { Expect(testCase.expectedImageVersion).To(Equal(gotVersion.String()), - formatVersionParsingMessage(testCase.userDefinedImageVersion, "image", gotVersion.String(), testCase.expectedImageVersion)) + fmt.Sprintf("HumioVersionFromString(%s) = got %s %v, expected %s %v", testCase.userDefinedImageVersion, "image", gotVersion.String(), "image", testCase.expectedImageVersion)) } }, Entry("image with container image SHA", @@ -118,31 +96,31 @@ var _ = DescribeTable("HumioVersionAtLeast", humioVersion := HumioVersionFromString(testCase.userDefinedImageVersion) Expect(testCase.imageVersionExact).To(Equal(humioVersion.String()), - formatVersionComparisonMessage(testCase.userDefinedImageVersion, humioVersion.String(), testCase.userDefinedImageVersion)) + fmt.Sprintf("HumioVersion.AtLeast(%s) = got %s, expected %s", testCase.userDefinedImageVersion, humioVersion.String(), testCase.userDefinedImageVersion)) // Verify current version is newer than older image atLeast, err := humioVersion.AtLeast(testCase.imageVersionOlder) Expect(testCase.expectedErr).To(Equal(err != nil), - formatAtLeastErrorMessage(testCase.userDefinedImageVersion, testCase.imageVersionOlder, err, testCase.expectedErr)) + fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", testCase.userDefinedImageVersion, testCase.imageVersionOlder, err, testCase.expectedErr)) Expect(atLeast).To(BeTrue(), - formatAtLeastBoolMessage(testCase.userDefinedImageVersion, testCase.imageVersionOlder, atLeast, true)) + fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got %t, expected %t", testCase.userDefinedImageVersion, testCase.imageVersionOlder, atLeast, true)) // Verify version exactly the same as the specified image is reported as at least the exact atLeast, err = humioVersion.AtLeast(testCase.imageVersionExact) Expect(testCase.expectedErr).To(Equal(err != nil), - formatAtLeastErrorMessage(testCase.userDefinedImageVersion, testCase.imageVersionExact, err, testCase.expectedErr)) + fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", testCase.userDefinedImageVersion, testCase.imageVersionExact, err, testCase.expectedErr)) Expect(atLeast).To(BeTrue(), - formatAtLeastBoolMessage(testCase.userDefinedImageVersion, testCase.imageVersionExact, atLeast, true)) + fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got %t, expected %t", testCase.userDefinedImageVersion, testCase.imageVersionExact, atLeast, true)) // Verify current version reports false to be AtLeast for images newer atLeast, err = humioVersion.AtLeast(testCase.imageVersionNewer) Expect(testCase.expectedErr).To(Equal(err != nil), - formatAtLeastErrorMessage(testCase.userDefinedImageVersion, testCase.imageVersionNewer, err, testCase.expectedErr)) + fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got err %v, expected err %v", testCase.userDefinedImageVersion, testCase.imageVersionNewer, err, testCase.expectedErr)) Expect(atLeast).To(BeFalse(), - formatAtLeastBoolMessage(testCase.userDefinedImageVersion, testCase.imageVersionNewer, atLeast, false)) + fmt.Sprintf("HumioVersion(%s).AtLeast(%s) = got %t, expected %t", testCase.userDefinedImageVersion, testCase.imageVersionNewer, atLeast, false)) }, Entry("image with container image SHA", versionComparisonTestCase{ From 92aac6dbcfa90e278f8e1696d5dfad7aefa6176f Mon Sep 17 00:00:00 2001 From: Oliver Ryde Date: Tue, 23 Sep 2025 11:27:24 +0200 Subject: [PATCH 3/3] Do not label unit test --- internal/controller/humiocluster_version_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/controller/humiocluster_version_test.go b/internal/controller/humiocluster_version_test.go index c2c52d734..495db9dbc 100644 --- a/internal/controller/humiocluster_version_test.go +++ b/internal/controller/humiocluster_version_test.go @@ -20,7 +20,7 @@ type versionParsingTestCase struct { expectedAssumeLatest bool // Expected IsLatest() result } -var _ = DescribeTable("HumioVersionFromString", Label("unit"), +var _ = DescribeTable("HumioVersionFromString", func(testCase versionParsingTestCase) { gotVersion := HumioVersionFromString(testCase.userDefinedImageVersion)