]> Cypherpunks repositories - gostls13.git/commitdiff
testing: restore os.Exit(0) after every call to (*M).Run
authorBryan C. Mills <bcmills@google.com>
Fri, 28 Aug 2020 01:30:24 +0000 (21:30 -0400)
committerBryan C. Mills <bcmills@google.com>
Fri, 28 Aug 2020 02:46:19 +0000 (02:46 +0000)
cmd/go.TestScript/test_main_twice demonstrates a program that invokes
(*M).Run twice in a row. If we only restore os.Exit(0) in m.afterOnce,
we will fail to restore it after the second run and fail the test
process despite both runs passing.

Updates #29062
Updates #23129

Change-Id: Id22ec68f1708e4583c8dda14a8ba0efae7178b85
Reviewed-on: https://go-review.googlesource.com/c/go/+/251262
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/testing/testing.go

index d0334243f467e4537ea4f4640c7ddd97c3a6fb70..01743969ee3dc81d9730ba479618e7df6a664d7c 100644 (file)
@@ -1533,11 +1533,15 @@ func (m *M) before() {
 // after runs after all testing.
 func (m *M) after() {
        m.afterOnce.Do(func() {
-               if *panicOnExit0 {
-                       m.deps.SetPanicOnExit0(false)
-               }
                m.writeProfiles()
        })
+
+       // Restore PanicOnExit0 after every run, because we set it to true before
+       // every run. Otherwise, if m.Run is called multiple times the behavior of
+       // os.Exit(0) will not be restored after the second run.
+       if *panicOnExit0 {
+               m.deps.SetPanicOnExit0(false)
+       }
 }
 
 func (m *M) writeProfiles() {