From: Dmitry Vyukov Date: Fri, 26 Feb 2016 12:02:42 +0000 (+0100) Subject: runtime/race: improve TestNoRaceIOHttp test X-Git-Tag: go1.7beta1~462 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6dfba5c7ce867583cbcea9da09dceacd2633bacc;p=gostls13.git runtime/race: improve TestNoRaceIOHttp test TestNoRaceIOHttp does all kinds of bad things: 1. Binds to a fixed port, so concurrent tests fail. 2. Registers HTTP handler multiple times, so repeated tests fail. 3. Relies on sleep to wait for listen. Fix all of that. Change-Id: I1210b7797ef5e92465b37dc407246d92a2a24fe8 Reviewed-on: https://go-review.googlesource.com/19953 Run-TryBot: Dmitry Vyukov TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/runtime/race/testdata/io_test.go b/src/runtime/race/testdata/io_test.go index 1b3ee3822b..30a121bee4 100644 --- a/src/runtime/race/testdata/io_test.go +++ b/src/runtime/race/testdata/io_test.go @@ -7,9 +7,11 @@ package race_test import ( "fmt" "io/ioutil" + "net" "net/http" "os" "path/filepath" + "sync" "testing" "time" ) @@ -41,29 +43,34 @@ func TestNoRaceIOFile(t *testing.T) { _ = x } +var ( + regHandler sync.Once + handlerData int +) + func TestNoRaceIOHttp(t *testing.T) { - x := 0 - go func() { + regHandler.Do(func() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - x = 41 + handlerData++ fmt.Fprintf(w, "test") - x = 42 + handlerData++ }) - err := http.ListenAndServe("127.0.0.1:23651", nil) - if err != nil { - t.Fatalf("http.ListenAndServe: %v", err) - } - }() - time.Sleep(1e7) - x = 1 - _, err := http.Get("http://127.0.0.1:23651") + }) + ln, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen: %v", err) + } + defer ln.Close() + go http.Serve(ln, nil) + handlerData++ + _, err = http.Get("http://" + ln.Addr().String()) if err != nil { t.Fatalf("http.Get: %v", err) } - x = 2 - _, err = http.Get("http://127.0.0.1:23651") + handlerData++ + _, err = http.Get("http://" + ln.Addr().String()) if err != nil { t.Fatalf("http.Get: %v", err) } - x = 3 + handlerData++ }