Skip to content

Commit 9cb21b5

Browse files
committed
feat: add custom upgrade testing framework
1 parent 185d22c commit 9cb21b5

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

test/test_utils.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"os"
8+
"testing"
89

910
"github.com/crossplane-contrib/xp-testing/pkg/envvar"
1011
"github.com/crossplane-contrib/xp-testing/pkg/logging"
@@ -242,3 +243,51 @@ func resClient(cfg *envconf.Config) *res.Resources {
242243
r, _ := resources.GetResourcesWithRESTConfig(cfg)
243244
return r
244245
}
246+
247+
// CustomAssessmentFunc is a function that performs custom validation
248+
// before or after a provider upgrade
249+
type CustomAssessmentFunc func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context
250+
251+
// CustomUpgradeTest encapsulates configuration for custom upgrade tests
252+
type CustomUpgradeTest struct {
253+
name string
254+
fromVersion string
255+
toVersion string
256+
resourceDirectories []string
257+
preUpgradeAssessment map[string]CustomAssessmentFunc
258+
postUpgradeAssessment map[string]CustomAssessmentFunc
259+
}
260+
261+
// NewCustomUpgradeTest creates a new CustomUpgradeTest builder
262+
func NewCustomUpgradeTest(name, fromVersion, toVersion string) *CustomUpgradeTest {
263+
return &CustomUpgradeTest{
264+
name: name,
265+
preUpgradeAssessment: make(map[string]CustomAssessmentFunc),
266+
postUpgradeAssessment: make(map[string]CustomAssessmentFunc),
267+
}
268+
}
269+
270+
func (c *CustomUpgradeTest) WithResourceDirectories(dirs []string) *CustomUpgradeTest {
271+
c.resourceDirectories = dirs
272+
return c
273+
}
274+
275+
func (c *CustomUpgradeTest) ToVersion(version string) *CustomUpgradeTest {
276+
c.toVersion = version
277+
return c
278+
}
279+
280+
func (c *CustomUpgradeTest) FromVersion(version string) *CustomUpgradeTest {
281+
c.fromVersion = version
282+
return c
283+
}
284+
285+
func (c *CustomUpgradeTest) PreUpgradeAssessment(name string, fn CustomAssessmentFunc) *CustomUpgradeTest {
286+
c.preUpgradeAssessment[name] = fn
287+
return c
288+
}
289+
290+
func (c *CustomUpgradeTest) PostUpgradeAssessment(name string, fn CustomAssessmentFunc) *CustomUpgradeTest {
291+
c.postUpgradeAssessment[name] = fn
292+
return c
293+
}

test/upgrade/base_upgrade_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
//go:build upgrade
2+
3+
package upgrade
4+
5+
import (
6+
"context"
7+
"testing"
8+
9+
"k8s.io/client-go/features"
10+
)
11+
12+
func (c *CustomUpgradeTest) Build(t *testing.T) features.Feature {
13+
feature := features.New(c.name)
14+
feature = feature.Setup(func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
15+
t.Logf("Setting up resources from version %s", c.fromVersion)
16+
//TODO: install provider at fromVersion
17+
//TODO: Apply manifest at resource directories
18+
return ctx
19+
})
20+
// Pre-upgrade assessments
21+
for name, assestmentFunc := range c.preUpgradeAssessment {
22+
assestment := assestmentFunc //Capture for closure
23+
assestmentName := name
24+
feature = feature.Assess(assestmentName, func(ctx context.Context, t *testing.T, cfg *envconf.Config) config.Context {
25+
t.Logf("Running pre-upgrade Assestment %s": assestmentName)
26+
return assestment(ctx, t, cfg)
27+
})
28+
29+
}
30+
31+
//Upgrade Tests
32+
feature = feature.Assess("Upgrade Provider", func(ctx context.Context, t *testing.T, cfg *envconf.Config) config.Context {
33+
t.Logf("Upgrading provider from %s to %s", c.fromVersion, c.toVersion)
34+
//TODO: Put in code for upgrade provider
35+
return ctx
36+
})
37+
38+
// Post-upgrade assessments
39+
for name, assestmentFunc := range c.postUpgradeAssessment {
40+
assestment := assestmentFunc //Capture for closure
41+
assestmentName := name
42+
feature = feature.Assess(assestmentName, func(ctx context.Context, t *testing.T, cfg *envconf.Config) config.Context {
43+
t.Logf("Running post-upgrade Assestment %s": assestmentName)
44+
return assestment(ctx, t, cfg)
45+
})
46+
47+
}
48+
//Teardown Phase
49+
feature = feature.Teardown(func(ctx context.Context, t *Testing.T, cfg *envconf.Config) context.Context {
50+
t.Logf("Cleaning up test resources")
51+
//TODO: put in code to delete test resources
52+
return ctx
53+
})
54+
return feature
55+
56+
}
57+
58+
func (c *CustomUpgradeTest) Run(t *Testing.T, cfg *envconf.Config) {
59+
feature := c.Build(t)
60+
testenv.Test(t, feature.Feature())
61+
}
62+
63+

0 commit comments

Comments
 (0)