1
0
mirror of https://github.com/golang/go synced 2024-11-13 17:00:22 -07:00

http: cancel test timers; don't t.Fatalf in other goroutines

R=rsc
CC=golang-dev
https://golang.org/cl/5228041
This commit is contained in:
Brad Fitzpatrick 2011-10-09 17:57:31 -07:00
parent cab53c899c
commit e63fcd613f

View File

@ -356,18 +356,17 @@ func TestIdentityResponse(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("error writing: %v", err) t.Fatalf("error writing: %v", err)
} }
// The next ReadAll will hang for a failing test, so use a Timer instead
// to fail more traditionally // The ReadAll will hang for a failing test, so use a Timer to
timer := time.AfterFunc(2e9, func() { // fail explicitly.
t.Fatalf("Timeout expired in ReadAll.") goTimeout(t, 2e9, func() {
got, _ := ioutil.ReadAll(conn)
expectedSuffix := "\r\n\r\ntoo short"
if !strings.HasSuffix(string(got), expectedSuffix) {
t.Errorf("Expected output to end with %q; got response body %q",
expectedSuffix, string(got))
}
}) })
defer timer.Stop()
got, _ := ioutil.ReadAll(conn)
expectedSuffix := "\r\n\r\ntoo short"
if !strings.HasSuffix(string(got), expectedSuffix) {
t.Fatalf("Expected output to end with %q; got response body %q",
expectedSuffix, string(got))
}
} }
func testTcpConnectionCloses(t *testing.T, req string, h Handler) { func testTcpConnectionCloses(t *testing.T, req string, h Handler) {
@ -549,14 +548,13 @@ func TestTLSHandshakeTimeout(t *testing.T) {
t.Fatalf("Dial: %v", err) t.Fatalf("Dial: %v", err)
} }
defer conn.Close() defer conn.Close()
timer := time.AfterFunc(10e9, func() { t.Fatalf("Timeout") }) goTimeout(t, 10e9, func() {
defer timer.Stop() var buf [1]byte
n, err := conn.Read(buf[:])
var buf [1]byte if err == nil || n != 0 {
n, err := conn.Read(buf[:]) t.Errorf("Read = %d, %v; want an error and no bytes", n, err)
if err == nil || n != 0 { }
t.Errorf("Read = %d, %v; want an error and no bytes", n, err) })
}
} }
func TestTLSServer(t *testing.T) { func TestTLSServer(t *testing.T) {
@ -580,25 +578,29 @@ func TestTLSServer(t *testing.T) {
t.Fatalf("Dial: %v", err) t.Fatalf("Dial: %v", err)
} }
defer idleConn.Close() defer idleConn.Close()
time.AfterFunc(10e9, func() { t.Fatalf("Timeout") }) goTimeout(t, 10e9, func() {
if !strings.HasPrefix(ts.URL, "https://") {
if !strings.HasPrefix(ts.URL, "https://") { t.Errorf("expected test TLS server to start with https://, got %q", ts.URL)
t.Fatalf("expected test TLS server to start with https://, got %q", ts.URL) return
} }
res, err := Get(ts.URL) res, err := Get(ts.URL)
if err != nil { if err != nil {
t.Fatal(err) t.Error(err)
} return
if res == nil { }
t.Fatalf("got nil Response") if res == nil {
} t.Errorf("got nil Response")
defer res.Body.Close() return
if res.Header.Get("X-TLS-Set") != "true" { }
t.Errorf("expected X-TLS-Set response header") defer res.Body.Close()
} if res.Header.Get("X-TLS-Set") != "true" {
if res.Header.Get("X-TLS-HandshakeComplete") != "true" { t.Errorf("expected X-TLS-Set response header")
t.Errorf("expected X-TLS-HandshakeComplete header") return
} }
if res.Header.Get("X-TLS-HandshakeComplete") != "true" {
t.Errorf("expected X-TLS-HandshakeComplete header")
}
})
} }
type serverExpectTest struct { type serverExpectTest struct {
@ -1019,6 +1021,21 @@ func TestClientWriteShutdown(t *testing.T) {
} }
} }
// goTimeout runs f, failing t if f takes more than ns to complete.
func goTimeout(t *testing.T, ns int64, f func()) {
ch := make(chan bool, 2)
timer := time.AfterFunc(ns, func() {
t.Errorf("Timeout expired after %d ns", ns)
ch <- true
})
defer timer.Stop()
go func() {
defer func() { ch <- true }()
f()
}()
<-ch
}
type errorListener struct { type errorListener struct {
errs []os.Error errs []os.Error
} }