mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 04:06:03 +00:00
e2e framework: clean up instance after all other code ran
In contrast to ginkgo.AfterEach, ginkgo.DeferCleanup runs the callback in first-in-last-out order. Using it makes the following test code work as expected: f := framework.NewDefaultFramework("some test") ginkgo.AfterEach(func() { // do something with f.ClientSet }) Previously, f.ClientSet was already set to nil by the framework's cleanup code.
This commit is contained in:
parent
9188d55689
commit
cbf94307ef
@ -108,9 +108,6 @@ type Framework struct {
|
|||||||
// the various afterEaches
|
// the various afterEaches
|
||||||
afterEaches map[string]AfterEachActionFunc
|
afterEaches map[string]AfterEachActionFunc
|
||||||
|
|
||||||
// beforeEachStarted indicates that BeforeEach has started
|
|
||||||
beforeEachStarted bool
|
|
||||||
|
|
||||||
// configuration for framework's client
|
// configuration for framework's client
|
||||||
Options Options
|
Options Options
|
||||||
|
|
||||||
@ -149,8 +146,10 @@ func NewFrameworkWithCustomTimeouts(baseName string, timeouts *TimeoutContext) *
|
|||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDefaultFramework makes a new framework and sets up a BeforeEach/AfterEach for
|
// NewDefaultFramework makes a new framework and sets up a BeforeEach which
|
||||||
// you (you can write additional before/after each functions).
|
// initializes the framework instance. It cleans up with a DeferCleanup,
|
||||||
|
// which runs last, so a AfterEach in the test still has a valid framework
|
||||||
|
// instance.
|
||||||
func NewDefaultFramework(baseName string) *Framework {
|
func NewDefaultFramework(baseName string) *Framework {
|
||||||
options := Options{
|
options := Options{
|
||||||
ClientQPS: 20,
|
ClientQPS: 20,
|
||||||
@ -184,14 +183,18 @@ func NewFramework(baseName string, options Options, client clientset.Interface)
|
|||||||
})
|
})
|
||||||
|
|
||||||
ginkgo.BeforeEach(f.BeforeEach)
|
ginkgo.BeforeEach(f.BeforeEach)
|
||||||
ginkgo.AfterEach(f.AfterEach)
|
|
||||||
|
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
// BeforeEach gets a client and makes a namespace.
|
// BeforeEach gets a client and makes a namespace.
|
||||||
func (f *Framework) BeforeEach() {
|
func (f *Framework) BeforeEach() {
|
||||||
f.beforeEachStarted = true
|
// DeferCleanup, in constrast to AfterEach, triggers execution in
|
||||||
|
// first-in-last-out order. This ensures that the framework instance
|
||||||
|
// remains valid as long as possible.
|
||||||
|
//
|
||||||
|
// In addition, AfterEach will not be called if a test never gets here.
|
||||||
|
ginkgo.DeferCleanup(f.AfterEach)
|
||||||
|
|
||||||
// The fact that we need this feels like a bug in ginkgo.
|
// The fact that we need this feels like a bug in ginkgo.
|
||||||
// https://github.com/onsi/ginkgo/v2/issues/222
|
// https://github.com/onsi/ginkgo/v2/issues/222
|
||||||
@ -369,12 +372,6 @@ func (f *Framework) AddAfterEach(name string, fn AfterEachActionFunc) {
|
|||||||
|
|
||||||
// AfterEach deletes the namespace, after reading its events.
|
// AfterEach deletes the namespace, after reading its events.
|
||||||
func (f *Framework) AfterEach() {
|
func (f *Framework) AfterEach() {
|
||||||
// If BeforeEach never started AfterEach should be skipped.
|
|
||||||
// Currently some tests under e2e/storage have this condition.
|
|
||||||
if !f.beforeEachStarted {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
RemoveCleanupAction(f.cleanupHandle)
|
RemoveCleanupAction(f.cleanupHandle)
|
||||||
|
|
||||||
// This should not happen. Given ClientSet is a public field a test must have updated it!
|
// This should not happen. Given ClientSet is a public field a test must have updated it!
|
||||||
|
Loading…
Reference in New Issue
Block a user