]> Cypherpunks repositories - gostls13.git/commitdiff
testing: only call flag.Parse if it has not been called before
authorAlberto Bertogli <albertito@blitiri.com.ar>
Fri, 6 Nov 2015 01:40:56 +0000 (01:40 +0000)
committerRuss Cox <rsc@golang.org>
Thu, 12 Nov 2015 19:48:06 +0000 (19:48 +0000)
Calling flag.Parse twice can be problematic if other goroutines called
flag.Parsed in between: the race detector complains due to the
write after read from a different goroutine.

This can happen if TestMain calls flag.Parse and launches goroutines
that call flag.Parsed, for example if it initializes a server which
checks flags.

This patch makes testing.M.Run only parse the flags if they have not
been parsed already.

Change-Id: Id9f8c31c5f90614e3f34c63d1a32cf7e9055d68e
Reviewed-on: https://go-review.googlesource.com/16739
Reviewed-by: Russ Cox <rsc@golang.org>
src/testing/testing.go

index 1dcc35ebc06d9890cbb6b06c178dd63934141024..6237da9abd3a1685b4fd728128fa4760c12ec28c 100644 (file)
@@ -485,7 +485,11 @@ func MainStart(matchString func(pat, str string) (bool, error), tests []Internal
 
 // Run runs the tests. It returns an exit code to pass to os.Exit.
 func (m *M) Run() int {
-       flag.Parse()
+       // TestMain may have already called flag.Parse.
+       if !flag.Parsed() {
+               flag.Parse()
+       }
+
        parseCpuList()
 
        before()