|
1 | 1 | package main |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "context" |
| 4 | + "fmt" |
5 | 5 | "os" |
6 | 6 | "strings" |
7 | | - "time" |
8 | 7 |
|
9 | | - "github.com/onsi/ginkgo/v2" |
10 | | - "github.com/onsi/gomega" |
11 | 8 | "github.com/openshift-eng/openshift-tests-extension/pkg/cmd" |
12 | | - "github.com/openshift-eng/openshift-tests-extension/pkg/dbtime" |
13 | | - "github.com/openshift-eng/openshift-tests-extension/pkg/extension" |
14 | | - "github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests" |
| 9 | + e "github.com/openshift-eng/openshift-tests-extension/pkg/extension" |
| 10 | + et "github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests" |
| 11 | + g "github.com/openshift-eng/openshift-tests-extension/pkg/ginkgo" |
15 | 12 |
|
16 | 13 | "github.com/spf13/cobra" |
17 | 14 |
|
| 15 | + // The import below is necessary to ensure that the kube controller manager operator tests are registered with the extension. |
18 | 16 | _ "github.com/openshift/cluster-kube-controller-manager-operator/test/extended" |
19 | 17 | ) |
20 | 18 |
|
21 | | -var ( |
22 | | - CommitFromGit string |
23 | | - BuildDate string |
24 | | - GitTreeState string |
25 | | -) |
26 | | - |
27 | | -// GinkgoTestingT implements the minimal TestingT interface needed by Ginkgo |
28 | | -type GinkgoTestingT struct{} |
29 | | - |
30 | | -func (GinkgoTestingT) Errorf(format string, args ...interface{}) {} |
31 | | -func (GinkgoTestingT) Fail() {} |
32 | | -func (GinkgoTestingT) FailNow() { os.Exit(1) } |
33 | | - |
34 | | -// NewGinkgoTestingT creates a new testing.T compatible instance for Ginkgo |
35 | | -func NewGinkgoTestingT() *GinkgoTestingT { |
36 | | - return &GinkgoTestingT{} |
37 | | -} |
38 | | - |
39 | | -// escapeRegexChars escapes special regex characters in test names for Ginkgo focus |
40 | | -func escapeRegexChars(s string) string { |
41 | | - // Only escape the problematic characters that cause regex parsing issues |
42 | | - // We need to escape [ and ] which are treated as character classes |
43 | | - s = strings.ReplaceAll(s, "[", "\\[") |
44 | | - s = strings.ReplaceAll(s, "]", "\\]") |
45 | | - return s |
46 | | -} |
47 | | - |
48 | | -// createTestSpec creates a test spec with proper execution functions |
49 | | -func createTestSpec(name, source string, codeLocations []string) *extensiontests.ExtensionTestSpec { |
50 | | - return &extensiontests.ExtensionTestSpec{ |
51 | | - Name: name, |
52 | | - Source: source, |
53 | | - CodeLocations: codeLocations, |
54 | | - Lifecycle: extensiontests.LifecycleBlocking, |
55 | | - Resources: extensiontests.Resources{ |
56 | | - Isolation: extensiontests.Isolation{}, |
57 | | - }, |
58 | | - EnvironmentSelector: extensiontests.EnvironmentSelector{}, |
59 | | - Run: func(ctx context.Context) *extensiontests.ExtensionTestResult { |
60 | | - return runGinkgoTest(ctx, name) |
61 | | - }, |
62 | | - RunParallel: func(ctx context.Context) *extensiontests.ExtensionTestResult { |
63 | | - return runGinkgoTest(ctx, name) |
| 19 | +func main() { |
| 20 | + registry := e.NewRegistry() |
| 21 | + ext := e.NewExtension("openshift", "payload", "cluster-kube-controller-manager-operator") |
| 22 | + |
| 23 | + // Suite: conformance/parallel (fast, parallel-safe) |
| 24 | + ext.AddSuite(e.Suite{ |
| 25 | + Name: "openshift/cluster-kube-controller-manager-operator/conformance/parallel", |
| 26 | + Parents: []string{"openshift/conformance/parallel"}, |
| 27 | + Qualifiers: []string{ |
| 28 | + `!(name.contains("[Serial]") || name.contains("[Slow]"))`, |
64 | 29 | }, |
65 | | - } |
66 | | -} |
67 | | - |
68 | | -// runGinkgoTest runs a Ginkgo test in-process |
69 | | -func runGinkgoTest(ctx context.Context, testName string) *extensiontests.ExtensionTestResult { |
70 | | - startTime := time.Now() |
71 | | - |
72 | | - // Configure Ginkgo to run specific test |
73 | | - gomega.RegisterFailHandler(ginkgo.Fail) |
74 | | - |
75 | | - // Run the test suite with focus on specific test |
76 | | - suiteConfig, reporterConfig := ginkgo.GinkgoConfiguration() |
77 | | - suiteConfig.FocusStrings = []string{escapeRegexChars(testName)} |
78 | | - |
79 | | - // Configure JUnit reporter for CI integration |
80 | | - reporterConfig.JUnitReport = "junit.xml" |
81 | | - reporterConfig.JSONReport = "report.json" |
82 | | - |
83 | | - passed := ginkgo.RunSpecs(NewGinkgoTestingT(), "OpenShift Kube Controller Manager Operator Test Suite", suiteConfig, reporterConfig) |
84 | | - |
85 | | - endTime := time.Now() |
86 | | - duration := endTime.Sub(startTime) |
87 | | - |
88 | | - result := extensiontests.ResultPassed |
89 | | - if !passed { |
90 | | - result = extensiontests.ResultFailed |
91 | | - } |
| 30 | + }) |
92 | 31 |
|
93 | | - return &extensiontests.ExtensionTestResult{ |
94 | | - Name: testName, |
95 | | - Result: result, |
96 | | - StartTime: dbtime.Ptr(startTime), |
97 | | - EndTime: dbtime.Ptr(endTime), |
98 | | - Duration: int64(duration.Seconds()), |
99 | | - Output: "", |
100 | | - } |
101 | | -} |
| 32 | + // Suite: conformance/serial (explicitly serial tests) |
| 33 | + ext.AddSuite(e.Suite{ |
| 34 | + Name: "openshift/cluster-kube-controller-manager-operator/conformance/serial", |
| 35 | + Parents: []string{"openshift/conformance/serial"}, |
| 36 | + Qualifiers: []string{ |
| 37 | + `name.contains("[Serial]")`, |
| 38 | + }, |
| 39 | + }) |
102 | 40 |
|
103 | | -func main() { |
104 | | - // Create a new registry |
105 | | - registry := extension.NewRegistry() |
| 41 | + // Suite: optional/slow (long-running tests) |
| 42 | + ext.AddSuite(e.Suite{ |
| 43 | + Name: "openshift/cluster-kube-controller-manager-operator/optional/slow", |
| 44 | + Parents: []string{"openshift/optional/slow"}, |
| 45 | + Qualifiers: []string{ |
| 46 | + `name.contains("[Slow]")`, |
| 47 | + }, |
| 48 | + }) |
106 | 49 |
|
107 | | - // Create extension for this component |
108 | | - ext := extension.NewExtension("openshift", "payload", "cluster-kube-controller-manager-operator") |
| 50 | + // Suite: all (includes everything) |
| 51 | + ext.AddSuite(e.Suite{ |
| 52 | + Name: "openshift/cluster-kube-controller-manager-operator/all", |
| 53 | + }) |
109 | 54 |
|
110 | | - // Set source information |
111 | | - ext.Source = extension.Source{ |
112 | | - Commit: CommitFromGit, |
113 | | - BuildDate: BuildDate, |
114 | | - GitTreeState: GitTreeState, |
| 55 | + specs, err := g.BuildExtensionTestSpecsFromOpenShiftGinkgoSuite() |
| 56 | + if err != nil { |
| 57 | + panic(fmt.Sprintf("couldn't build extension test specs from ginkgo: %+v", err.Error())) |
115 | 58 | } |
116 | 59 |
|
117 | | - // Add test suites |
118 | | - ext.AddGlobalSuite(extension.Suite{ |
119 | | - Name: "openshift/cluster-kube-controller-manager-operator/conformance/parallel", |
120 | | - Description: "", |
121 | | - Parents: []string{"openshift/conformance/parallel"}, |
122 | | - Qualifiers: []string{"(source == \"openshift:payload:cluster-kube-controller-manager-operator\") && (!(name.contains(\"[Serial]\") || name.contains(\"[Slow]\")))"}, |
| 60 | + // Ensure [Disruptive] tests are also [Serial] (for any future tests that might need this) |
| 61 | + specs = specs.Walk(func(spec *et.ExtensionTestSpec) { |
| 62 | + if strings.Contains(spec.Name, "[Disruptive]") && !strings.Contains(spec.Name, "[Serial]") { |
| 63 | + spec.Name = strings.ReplaceAll( |
| 64 | + spec.Name, |
| 65 | + "[Disruptive]", |
| 66 | + "[Serial][Disruptive]", |
| 67 | + ) |
| 68 | + } |
123 | 69 | }) |
124 | 70 |
|
125 | | - ext.AddGlobalSuite(extension.Suite{ |
126 | | - Name: "openshift/cluster-kube-controller-manager-operator/conformance/serial", |
127 | | - Description: "", |
128 | | - Parents: []string{"openshift/conformance/serial"}, |
129 | | - Qualifiers: []string{"(source == \"openshift:payload:cluster-kube-controller-manager-operator\") && (name.contains(\"[Serial]\"))"}, |
| 71 | + // Preserve original-name labels for renamed tests |
| 72 | + specs = specs.Walk(func(spec *et.ExtensionTestSpec) { |
| 73 | + for label := range spec.Labels { |
| 74 | + if strings.HasPrefix(label, "original-name:") { |
| 75 | + parts := strings.SplitN(label, "original-name:", 2) |
| 76 | + if len(parts) > 1 { |
| 77 | + spec.OriginalName = parts[1] |
| 78 | + } |
| 79 | + } |
| 80 | + } |
130 | 81 | }) |
131 | 82 |
|
132 | | - ext.AddGlobalSuite(extension.Suite{ |
133 | | - Name: "openshift/cluster-kube-controller-manager-operator/optional/slow", |
134 | | - Description: "", |
135 | | - Parents: []string{"openshift/optional/slow"}, |
136 | | - Qualifiers: []string{"(source == \"openshift:payload:cluster-kube-controller-manager-operator\") && (name.contains(\"[Slow]\"))"}, |
137 | | - }) |
| 83 | + // Ignore obsolete tests |
| 84 | + ext.IgnoreObsoleteTests( |
| 85 | + // "[sig-kube-controller-manager] <test name here>", |
| 86 | + ) |
138 | 87 |
|
139 | | - ext.AddGlobalSuite(extension.Suite{ |
140 | | - Name: "openshift/cluster-kube-controller-manager-operator/all", |
141 | | - Description: "", |
142 | | - Qualifiers: []string{"source == \"openshift:payload:cluster-kube-controller-manager-operator\""}, |
| 88 | + // Initialize environment before running any tests |
| 89 | + specs.AddBeforeAll(func() { |
| 90 | + // do stuff |
143 | 91 | }) |
144 | 92 |
|
145 | | - // Add test specs with proper execution functions |
146 | | - testSpecs := extensiontests.ExtensionTestSpecs{ |
147 | | - createTestSpec( |
148 | | - "[Jira:kube-controller-manager][sig-api-machinery] sanity test should always pass [Suite:openshift/cluster-kube-controller-manager-operator/conformance/parallel]", |
149 | | - "openshift:payload:cluster-kube-controller-manager-operator", |
150 | | - []string{ |
151 | | - "/test/extended/main.go:8", |
152 | | - "/test/extended/main.go:9", |
153 | | - }, |
154 | | - ), |
155 | | - } |
156 | | - ext.AddSpecs(testSpecs) |
157 | | - |
158 | | - // Register the extension |
| 93 | + ext.AddSpecs(specs) |
159 | 94 | registry.Register(ext) |
160 | 95 |
|
161 | | - // Create root command with default extension commands |
162 | | - rootCmd := &cobra.Command{ |
163 | | - Use: "cluster-kube-controller-manager-operator-tests-ext", |
164 | | - Short: "OpenShift kube-controller-manager operator tests extension", |
| 96 | + root := &cobra.Command{ |
| 97 | + Long: "Cluster Kube Controller Manager Operator Tests Extension", |
165 | 98 | } |
166 | 99 |
|
167 | | - // Add all the default extension commands (info, list, run-test, run-suite, update) |
168 | | - rootCmd.AddCommand(cmd.DefaultExtensionCommands(registry)...) |
| 100 | + root.AddCommand(cmd.DefaultExtensionCommands(registry)...) |
169 | 101 |
|
170 | | - // Execute the command |
171 | | - if err := rootCmd.Execute(); err != nil { |
| 102 | + if err := root.Execute(); err != nil { |
172 | 103 | os.Exit(1) |
173 | 104 | } |
174 | 105 | } |
0 commit comments