mirror of
https://github.com/kubernetes/kubernetes.git
synced 2026-02-11 14:54:47 -05:00
The recent change to support importing ktesting into an E2E suite without progress reporting was flawed: - If a Go unit test had a deadline (the default when invoked by `go test`!), the early return skipped initializing progress reporting. - When it didn't, for example when invoking a test binary directly under stress, a test created goroutines which were kept running, which broke leak checking in e.g. an integration tests TestMain. The revised approach uses reference counting: as long as some unit test is running, the progress reporting with the required goroutines are active. When the last one ends, they get cleaned up, which keeps the goleak checker happy.
61 lines
1.8 KiB
Go
61 lines
1.8 KiB
Go
//go:build example
|
|
|
|
/*
|
|
Copyright 2023 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package withktesting
|
|
|
|
// The tests below will fail and therefore are excluded from
|
|
// normal "make test" via the "example" build tag. To run
|
|
// the tests and check the output, use "go test -tags example ."
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"k8s.io/kubernetes/test/utils/ktesting"
|
|
)
|
|
|
|
func TestTimeout(t *testing.T) {
|
|
tCtx := ktesting.Init(t)
|
|
tmp := t.TempDir()
|
|
tCtx.Logf("Using %q as temporary directory.", tmp)
|
|
tCtx.Cleanup(func() {
|
|
t.Log("Cleaning up...")
|
|
})
|
|
if deadline, ok := t.Deadline(); ok {
|
|
t.Logf("Will fail shortly before the test suite deadline at %s.", deadline)
|
|
}
|
|
|
|
// This is how Ginkgo and ktesting communicate to Gomega how to
|
|
// provide a progress report when stuck in e.g. gomega.Eventually.
|
|
// Here we use this to provide some additional output when
|
|
// this example is sent a SIGUSR1.
|
|
remove := tCtx.Value("GINKGO_SPEC_CONTEXT").(interface {
|
|
AttachProgressReporter(func() string) func()
|
|
}).AttachProgressReporter(func() string { return "waiting for timeout or interrupt" })
|
|
defer remove()
|
|
|
|
select {
|
|
case <-time.After(1000 * time.Hour):
|
|
// This should not be reached.
|
|
tCtx.Log("Huh?! I shouldn't be that old.")
|
|
case <-tCtx.Done():
|
|
// But this will before the test suite timeout.
|
|
tCtx.Errorf("need to stop: %v", context.Cause(tCtx))
|
|
}
|
|
}
|