diff options
| author | Meir Fischer <meirfischer@gmail.com> | 2017-07-13 22:51:08 -0400 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2017-08-25 22:45:35 +0000 |
| commit | 7e455b628c2d9f2286270238fbd2b1ab38643a2a (patch) | |
| tree | ad2995dab92ff3df5355c1d5f842b758c0a8e62f /src/testing/testing.go | |
| parent | 85deaf60776b686b550ed413c37fda9cc9615c05 (diff) | |
| download | go-7e455b628c2d9f2286270238fbd2b1ab38643a2a.tar.xz | |
testing: ensure profiles are written upon -timeout panic
This addresses the case of a -timeout panic, but not the more
general case of a signal arriving. See CL 48370 and CL 44352
for recent difficulties in that area.
"-timeout" here means flag usage to distinguish from the
default timeout termination which uses signals.
Fixes #19394
Change-Id: I5452d5422c0c080e940cbcc8c6606049975268c6
Reviewed-on: https://go-review.googlesource.com/48491
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/testing/testing.go')
| -rw-r--r-- | src/testing/testing.go | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/testing/testing.go b/src/testing/testing.go index 9e519f5cb9..53283796f8 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -876,6 +876,9 @@ type M struct { tests []InternalTest benchmarks []InternalBenchmark examples []InternalExample + + timer *time.Timer + afterOnce sync.Once } // testDeps is an internal interface of functionality that is @@ -918,22 +921,21 @@ func (m *M) Run() int { parseCpuList() m.before() - startAlarm() + defer m.after() + m.startAlarm() haveExamples = len(m.examples) > 0 testRan, testOk := runTests(m.deps.MatchString, m.tests) exampleRan, exampleOk := runExamples(m.deps.MatchString, m.examples) - stopAlarm() + m.stopAlarm() if !testRan && !exampleRan && *matchBenchmarks == "" { fmt.Fprintln(os.Stderr, "testing: warning: no tests to run") } if !testOk || !exampleOk || !runBenchmarks(m.deps.ImportPath(), m.deps.MatchString, m.benchmarks) || race.Errors() > 0 { fmt.Println("FAIL") - m.after() return 1 } fmt.Println("PASS") - m.after() return 0 } @@ -1063,6 +1065,12 @@ func (m *M) before() { // after runs after all testing. func (m *M) after() { + m.afterOnce.Do(func() { + m.writeProfiles() + }) +} + +func (m *M) writeProfiles() { if *cpuProfile != "" { m.deps.StopCPUProfile() // flushes profile to disk } @@ -1139,12 +1147,11 @@ func toOutputDir(path string) string { return fmt.Sprintf("%s%c%s", *outputDir, os.PathSeparator, path) } -var timer *time.Timer - // startAlarm starts an alarm if requested. -func startAlarm() { +func (m *M) startAlarm() { if *timeout > 0 { - timer = time.AfterFunc(*timeout, func() { + m.timer = time.AfterFunc(*timeout, func() { + m.after() debug.SetTraceback("all") panic(fmt.Sprintf("test timed out after %v", *timeout)) }) @@ -1152,9 +1159,9 @@ func startAlarm() { } // stopAlarm turns off the alarm. -func stopAlarm() { +func (m *M) stopAlarm() { if *timeout > 0 { - timer.Stop() + m.timer.Stop() } } |
