From 3f21c2381d9b0f0977f388cc89104f557a7d2c88 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 13 Nov 2019 17:33:03 -0800 Subject: [PATCH] os/signal: don't ignore SIGINT in TestAtomicStop child process Fixes #35085 Change-Id: Ice611e1223392f687061a43fd4c2298ea22774fb Reviewed-on: https://go-review.googlesource.com/c/go/+/207081 Run-TryBot: Ian Lance Taylor Reviewed-by: Bryan C. Mills --- src/os/signal/signal_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/os/signal/signal_test.go b/src/os/signal/signal_test.go index d9305a4b86..a4489ffd3e 100644 --- a/src/os/signal/signal_test.go +++ b/src/os/signal/signal_test.go @@ -422,6 +422,19 @@ func TestAtomicStop(t *testing.T) { testenv.MustHaveExec(t) + // Call Notify for SIGINT before starting the child process. + // That ensures that SIGINT is not ignored for the child. + // This is necessary because if SIGINT is ignored when a + // Go program starts, then it remains ignored, and closing + // the last notification channel for SIGINT will switch it + // back to being ignored. In that case the assumption of + // atomicStopTestProgram, that it will either die from SIGINT + // or have it be reported, breaks down, as there is a third + // option: SIGINT might be ignored. + cs := make(chan os.Signal, 1) + Notify(cs, syscall.SIGINT) + defer Stop(cs) + const execs = 10 for i := 0; i < execs; i++ { timeout := "0" @@ -466,6 +479,12 @@ func TestAtomicStop(t *testing.T) { // It tries to trigger a signal delivery race. This function should // either catch a signal or die from it. func atomicStopTestProgram() { + // This test won't work if SIGINT is ignored here. + if Ignored(syscall.SIGINT) { + fmt.Println("SIGINT is ignored") + os.Exit(1) + } + const tries = 10 timeout := 2 * time.Second -- 2.48.1