diff --git a/pkg/manager/signals/signal.go b/pkg/manager/signals/signal.go index 1a89f634ed..1c1e4901d0 100644 --- a/pkg/manager/signals/signal.go +++ b/pkg/manager/signals/signal.go @@ -23,7 +23,11 @@ import ( "time" ) -var onlyOneSignalHandler = make(chan struct{}) +var ( + onlyOneSignalHandler = make(chan struct{}) + // Define global signal channel for testing + signalCh = make(chan os.Signal, 2) +) // SetupSignalHandlerWithDelay registers for SIGTERM and SIGINT. A context is // returned which is canceled on one of these signals after waiting for the @@ -37,17 +41,16 @@ func SetupSignalHandlerWithDelay(delay time.Duration) context.Context { ctx, cancel := context.WithCancel(context.Background()) - c := make(chan os.Signal, 2) - signal.Notify(c, shutdownSignals...) + signal.Notify(signalCh, shutdownSignals...) go func() { - <-c + <-signalCh // Cancel the context after delaying for the specified duration but // avoid blocking if a second signal is caught go func() { <-time.After(delay) cancel() }() - <-c + <-signalCh os.Exit(1) // second signal. Exit directly. }() diff --git a/pkg/manager/signals/signal_test.go b/pkg/manager/signals/signal_test.go index 134937e012..23378b5bcc 100644 --- a/pkg/manager/signals/signal_test.go +++ b/pkg/manager/signals/signal_test.go @@ -17,10 +17,7 @@ limitations under the License. package signals import ( - "fmt" "os" - "os/signal" - "sync" "time" . "github.com/onsi/ginkgo/v2" @@ -31,53 +28,23 @@ var _ = Describe("runtime signal", func() { Context("SignalHandler Test", func() { - It("test signal handler", func() { - ctx := SetupSignalHandler() - task := &Task{ - ticker: time.NewTicker(time.Second * 2), - } - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt) - task.wg.Add(1) - go func(c chan os.Signal) { - defer task.wg.Done() - task.Run(c) - }(c) + It("test signal handler with delay", func() { + delay := time.Second + ctx := SetupSignalHandlerWithDelay(delay) - select { - case sig := <-c: - fmt.Printf("Got %s signal. Aborting...\n", sig) - case _, ok := <-ctx.Done(): - Expect(ok).To(BeFalse()) - } + // Save time before sending signal + beforeSendingSignal := time.Now() + + // Send signal + signalCh <- os.Interrupt + + _, ok := <-ctx.Done() + // Verify that the channel was closed + Expect(ok).To(BeFalse()) + // Verify that our delay was respected + Expect(time.Since(beforeSendingSignal)).To(BeNumerically(">=", delay)) }) }) }) - -type Task struct { - wg sync.WaitGroup - ticker *time.Ticker -} - -func (t *Task) Run(c chan os.Signal) { - for { - go sendSignal(c) - handle() - } -} - -func handle() { - for i := 0; i < 5; i++ { - fmt.Print("#") - time.Sleep(time.Millisecond * 100) - } - fmt.Println() -} - -func sendSignal(stopChan chan os.Signal) { - fmt.Printf("...") - time.Sleep(1 * time.Second) - stopChan <- os.Interrupt -}