kubernetes/test/utils/ktesting/examples/with_ktesting/example_test.go
Patrick Ohly 65693b2d2a ktesting: fix setting up progress reporting
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.
2026-01-27 10:13:43 +01:00

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))
}
}