all: don't call t.Fatal from a goroutine

Fixes #17900.

Change-Id: I42cda6ac9cf48ed739d3a015a90b3cb15edf8ddf
Reviewed-on: https://go-review.googlesource.com/33243
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Ian Lance Taylor 2016-11-14 21:34:58 -08:00
parent 9be14c4058
commit a145890059
14 changed files with 68 additions and 40 deletions

View File

@ -206,7 +206,8 @@ func TestRenegotiationExtension(t *testing.T) {
buf = make([]byte, 1024) buf = make([]byte, 1024)
n, err := c.Read(buf) n, err := c.Read(buf)
if err != nil { if err != nil {
t.Fatalf("Server read returned error: %s", err) t.Errorf("Server read returned error: %s", err)
return
} }
buf = buf[:n] buf = buf[:n]
c.Close() c.Close()

View File

@ -295,12 +295,14 @@ func TestTLSUniqueMatches(t *testing.T) {
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
sconn, err := ln.Accept() sconn, err := ln.Accept()
if err != nil { if err != nil {
t.Fatal(err) t.Error(err)
return
} }
serverConfig := testConfig.Clone() serverConfig := testConfig.Clone()
srv := Server(sconn, serverConfig) srv := Server(sconn, serverConfig)
if err := srv.Handshake(); err != nil { if err := srv.Handshake(); err != nil {
t.Fatal(err) t.Error(err)
return
} }
serverTLSUniques <- srv.ConnectionState().TLSUnique serverTLSUniques <- srv.ConnectionState().TLSUnique
} }

View File

@ -2514,7 +2514,8 @@ func TestConnectionLeak(t *testing.T) {
go func() { go func() {
r, err := db.Query("SELECT|people|name|") r, err := db.Query("SELECT|people|name|")
if err != nil { if err != nil {
t.Fatal(err) t.Error(err)
return
} }
r.Close() r.Close()
wg.Done() wg.Done()

View File

@ -369,7 +369,8 @@ func TestConcurrentReconnect(t *testing.T) {
defer wg.Done() defer wg.Done()
w, err := Dial(net, addr, LOG_USER|LOG_ERR, "tag") w, err := Dial(net, addr, LOG_USER|LOG_ERR, "tag")
if err != nil { if err != nil {
t.Fatalf("syslog.Dial() failed: %v", err) t.Errorf("syslog.Dial() failed: %v", err)
return
} }
defer w.Close() defer w.Close()
for i := 0; i < M; i++ { for i := 0; i < M; i++ {

View File

@ -668,12 +668,14 @@ func TestIgnoreDNSForgeries(t *testing.T) {
b := make([]byte, 512) b := make([]byte, 512)
n, err := s.Read(b) n, err := s.Read(b)
if err != nil { if err != nil {
t.Fatal(err) t.Error(err)
return
} }
msg := &dnsMsg{} msg := &dnsMsg{}
if !msg.Unpack(b[:n]) { if !msg.Unpack(b[:n]) {
t.Fatal("invalid DNS query") t.Error("invalid DNS query")
return
} }
s.Write([]byte("garbage DNS response packet")) s.Write([]byte("garbage DNS response packet"))
@ -682,7 +684,8 @@ func TestIgnoreDNSForgeries(t *testing.T) {
msg.id++ // make invalid ID msg.id++ // make invalid ID
b, ok := msg.Pack() b, ok := msg.Pack()
if !ok { if !ok {
t.Fatal("failed to pack DNS response") t.Error("failed to pack DNS response")
return
} }
s.Write(b) s.Write(b)
@ -701,7 +704,8 @@ func TestIgnoreDNSForgeries(t *testing.T) {
b, ok = msg.Pack() b, ok = msg.Pack()
if !ok { if !ok {
t.Fatal("failed to pack DNS response") t.Error("failed to pack DNS response")
return
} }
s.Write(b) s.Write(b)
}() }()

View File

@ -2468,7 +2468,7 @@ func TestClientWriteShutdown(t *testing.T) {
defer close(donec) defer close(donec)
bs, err := ioutil.ReadAll(conn) bs, err := ioutil.ReadAll(conn)
if err != nil { if err != nil {
t.Fatalf("ReadAll: %v", err) t.Errorf("ReadAll: %v", err)
} }
got := string(bs) got := string(bs)
if got != "" { if got != "" {
@ -2620,7 +2620,8 @@ func TestCloseNotifier(t *testing.T) {
go func() { go func() {
_, err = fmt.Fprintf(conn, "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n") _, err = fmt.Fprintf(conn, "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n")
if err != nil { if err != nil {
t.Fatal(err) t.Error(err)
return
} }
<-diec <-diec
conn.Close() conn.Close()
@ -2662,7 +2663,8 @@ func TestCloseNotifierPipelined(t *testing.T) {
const req = "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n" const req = "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n"
_, err = io.WriteString(conn, req+req) // two requests _, err = io.WriteString(conn, req+req) // two requests
if err != nil { if err != nil {
t.Fatal(err) t.Error(err)
return
} }
<-diec <-diec
conn.Close() conn.Close()

View File

@ -693,7 +693,8 @@ func benchmarkEndToEndAsync(dial func() (*Client, error), b *testing.B) {
B := call.Args.(*Args).B B := call.Args.(*Args).B
C := call.Reply.(*Reply).C C := call.Reply.(*Reply).C
if A+B != C { if A+B != C {
b.Fatalf("incorrect reply: Add: expected %d got %d", A+B, C) b.Errorf("incorrect reply: Add: expected %d got %d", A+B, C)
return
} }
<-gate <-gate
if atomic.AddInt32(&recv, -1) == 0 { if atomic.AddInt32(&recv, -1) == 0 {

View File

@ -432,7 +432,7 @@ func TestExtraFilesFDShuffle(t *testing.T) {
buf := make([]byte, 512) buf := make([]byte, 512)
n, err := stderr.Read(buf) n, err := stderr.Read(buf)
if err != nil { if err != nil {
t.Fatalf("Read: %s", err) t.Errorf("Read: %s", err)
ch <- err.Error() ch <- err.Error()
} else { } else {
ch <- string(buf[:n]) ch <- string(buf[:n])

View File

@ -210,11 +210,14 @@ func TestNonblockRecvRace(t *testing.T) {
select { select {
case <-c: case <-c:
default: default:
t.Fatal("chan is not ready") t.Error("chan is not ready")
} }
}() }()
close(c) close(c)
<-c <-c
if t.Failed() {
return
}
} }
} }
@ -311,14 +314,16 @@ func TestSelfSelect(t *testing.T) {
case c <- p: case c <- p:
case v := <-c: case v := <-c:
if chanCap == 0 && v == p { if chanCap == 0 && v == p {
t.Fatalf("self receive") t.Errorf("self receive")
return
} }
} }
} else { } else {
select { select {
case v := <-c: case v := <-c:
if chanCap == 0 && v == p { if chanCap == 0 && v == p {
t.Fatalf("self receive") t.Errorf("self receive")
return
} }
case c <- p: case c <- p:
} }

View File

@ -85,7 +85,8 @@ func TestTraceSymbolize(t *testing.T) {
go func() { go func() {
c, err := ln.Accept() c, err := ln.Accept()
if err != nil { if err != nil {
t.Fatalf("failed to accept: %v", err) t.Errorf("failed to accept: %v", err)
return
} }
c.Close() c.Close()
}() }()
@ -139,14 +140,14 @@ func TestTraceSymbolize(t *testing.T) {
want := []eventDesc{ want := []eventDesc{
{trace.EvGCStart, []frame{ {trace.EvGCStart, []frame{
{"runtime.GC", 0}, {"runtime.GC", 0},
{"runtime/trace_test.TestTraceSymbolize", 106}, {"runtime/trace_test.TestTraceSymbolize", 107},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoStart, []frame{ {trace.EvGoStart, []frame{
{"runtime/trace_test.TestTraceSymbolize.func1", 37}, {"runtime/trace_test.TestTraceSymbolize.func1", 37},
}}, }},
{trace.EvGoSched, []frame{ {trace.EvGoSched, []frame{
{"runtime/trace_test.TestTraceSymbolize", 107}, {"runtime/trace_test.TestTraceSymbolize", 108},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoCreate, []frame{ {trace.EvGoCreate, []frame{
@ -171,7 +172,7 @@ func TestTraceSymbolize(t *testing.T) {
}}, }},
{trace.EvGoUnblock, []frame{ {trace.EvGoUnblock, []frame{
{"runtime.chansend1", 0}, {"runtime.chansend1", 0},
{"runtime/trace_test.TestTraceSymbolize", 109}, {"runtime/trace_test.TestTraceSymbolize", 110},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoBlockSend, []frame{ {trace.EvGoBlockSend, []frame{
@ -180,7 +181,7 @@ func TestTraceSymbolize(t *testing.T) {
}}, }},
{trace.EvGoUnblock, []frame{ {trace.EvGoUnblock, []frame{
{"runtime.chanrecv1", 0}, {"runtime.chanrecv1", 0},
{"runtime/trace_test.TestTraceSymbolize", 110}, {"runtime/trace_test.TestTraceSymbolize", 111},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoBlockSelect, []frame{ {trace.EvGoBlockSelect, []frame{
@ -189,7 +190,7 @@ func TestTraceSymbolize(t *testing.T) {
}}, }},
{trace.EvGoUnblock, []frame{ {trace.EvGoUnblock, []frame{
{"runtime.selectgo", 0}, {"runtime.selectgo", 0},
{"runtime/trace_test.TestTraceSymbolize", 111}, {"runtime/trace_test.TestTraceSymbolize", 112},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoBlockSync, []frame{ {trace.EvGoBlockSync, []frame{
@ -198,7 +199,7 @@ func TestTraceSymbolize(t *testing.T) {
}}, }},
{trace.EvGoUnblock, []frame{ {trace.EvGoUnblock, []frame{
{"sync.(*Mutex).Unlock", 0}, {"sync.(*Mutex).Unlock", 0},
{"runtime/trace_test.TestTraceSymbolize", 115}, {"runtime/trace_test.TestTraceSymbolize", 116},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoBlockSync, []frame{ {trace.EvGoBlockSync, []frame{
@ -208,7 +209,7 @@ func TestTraceSymbolize(t *testing.T) {
{trace.EvGoUnblock, []frame{ {trace.EvGoUnblock, []frame{
{"sync.(*WaitGroup).Add", 0}, {"sync.(*WaitGroup).Add", 0},
{"sync.(*WaitGroup).Done", 0}, {"sync.(*WaitGroup).Done", 0},
{"runtime/trace_test.TestTraceSymbolize", 116}, {"runtime/trace_test.TestTraceSymbolize", 117},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoBlockCond, []frame{ {trace.EvGoBlockCond, []frame{
@ -217,12 +218,12 @@ func TestTraceSymbolize(t *testing.T) {
}}, }},
{trace.EvGoUnblock, []frame{ {trace.EvGoUnblock, []frame{
{"sync.(*Cond).Signal", 0}, {"sync.(*Cond).Signal", 0},
{"runtime/trace_test.TestTraceSymbolize", 117}, {"runtime/trace_test.TestTraceSymbolize", 118},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
{trace.EvGoSleep, []frame{ {trace.EvGoSleep, []frame{
{"time.Sleep", 0}, {"time.Sleep", 0},
{"runtime/trace_test.TestTraceSymbolize", 108}, {"runtime/trace_test.TestTraceSymbolize", 109},
{"testing.tRunner", 0}, {"testing.tRunner", 0},
}}, }},
} }
@ -240,7 +241,7 @@ func TestTraceSymbolize(t *testing.T) {
{"syscall.Read", 0}, {"syscall.Read", 0},
{"os.(*File).read", 0}, {"os.(*File).read", 0},
{"os.(*File).Read", 0}, {"os.(*File).Read", 0},
{"runtime/trace_test.TestTraceSymbolize.func11", 101}, {"runtime/trace_test.TestTraceSymbolize.func11", 102},
}}, }},
}...) }...)
} }

View File

@ -269,7 +269,8 @@ func TestTraceStressStartStop(t *testing.T) {
rp, wp, err := os.Pipe() rp, wp, err := os.Pipe()
if err != nil { if err != nil {
t.Fatalf("failed to create pipe: %v", err) t.Errorf("failed to create pipe: %v", err)
return
} }
defer func() { defer func() {
rp.Close() rp.Close()
@ -345,7 +346,8 @@ func TestTraceStressStartStop(t *testing.T) {
// A bit of network. // A bit of network.
ln, err := net.Listen("tcp", "127.0.0.1:0") ln, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil { if err != nil {
t.Fatalf("listen failed: %v", err) t.Errorf("listen failed: %v", err)
return
} }
defer ln.Close() defer ln.Close()
go func() { go func() {
@ -360,7 +362,8 @@ func TestTraceStressStartStop(t *testing.T) {
}() }()
c, err := net.Dial("tcp", ln.Addr().String()) c, err := net.Dial("tcp", ln.Addr().String())
if err != nil { if err != nil {
t.Fatalf("dial failed: %v", err) t.Errorf("dial failed: %v", err)
return
} }
var tmp [1]byte var tmp [1]byte
c.Read(tmp[:]) c.Read(tmp[:])

View File

@ -1226,10 +1226,12 @@ func TestStoreLoadSeqCst32(t *testing.T) {
} }
his := LoadInt32(&ack[he][i%3]) his := LoadInt32(&ack[he][i%3])
if (my != i && my != i-1) || (his != i && his != i-1) { if (my != i && my != i-1) || (his != i && his != i-1) {
t.Fatalf("invalid values: %d/%d (%d)", my, his, i) t.Errorf("invalid values: %d/%d (%d)", my, his, i)
break
} }
if my != i && his != i { if my != i && his != i {
t.Fatalf("store/load are not sequentially consistent: %d/%d (%d)", my, his, i) t.Errorf("store/load are not sequentially consistent: %d/%d (%d)", my, his, i)
break
} }
StoreInt32(&ack[me][(i-1)%3], -1) StoreInt32(&ack[me][(i-1)%3], -1)
} }
@ -1269,10 +1271,12 @@ func TestStoreLoadSeqCst64(t *testing.T) {
} }
his := LoadInt64(&ack[he][i%3]) his := LoadInt64(&ack[he][i%3])
if (my != i && my != i-1) || (his != i && his != i-1) { if (my != i && my != i-1) || (his != i && his != i-1) {
t.Fatalf("invalid values: %d/%d (%d)", my, his, i) t.Errorf("invalid values: %d/%d (%d)", my, his, i)
break
} }
if my != i && his != i { if my != i && his != i {
t.Fatalf("store/load are not sequentially consistent: %d/%d (%d)", my, his, i) t.Errorf("store/load are not sequentially consistent: %d/%d (%d)", my, his, i)
break
} }
StoreInt64(&ack[me][(i-1)%3], -1) StoreInt64(&ack[me][(i-1)%3], -1)
} }
@ -1317,7 +1321,8 @@ func TestStoreLoadRelAcq32(t *testing.T) {
d1 := X.data1 d1 := X.data1
d2 := X.data2 d2 := X.data2
if d1 != i || d2 != float32(i) { if d1 != i || d2 != float32(i) {
t.Fatalf("incorrect data: %d/%g (%d)", d1, d2, i) t.Errorf("incorrect data: %d/%g (%d)", d1, d2, i)
break
} }
} }
} }
@ -1365,7 +1370,8 @@ func TestStoreLoadRelAcq64(t *testing.T) {
d1 := X.data1 d1 := X.data1
d2 := X.data2 d2 := X.data2
if d1 != i || d2 != float64(i) { if d1 != i || d2 != float64(i) {
t.Fatalf("incorrect data: %d/%g (%d)", d1, d2, i) t.Errorf("incorrect data: %d/%g (%d)", d1, d2, i)
break
} }
} }
} }

View File

@ -137,7 +137,7 @@ func TestRace(t *testing.T) {
x = 1 x = 1
c.Wait() c.Wait()
if x != 2 { if x != 2 {
t.Fatal("want 2") t.Error("want 2")
} }
x = 3 x = 3
c.Signal() c.Signal()
@ -165,7 +165,7 @@ func TestRace(t *testing.T) {
if x == 2 { if x == 2 {
c.Wait() c.Wait()
if x != 3 { if x != 3 {
t.Fatal("want 3") t.Error("want 3")
} }
break break
} }

View File

@ -127,7 +127,8 @@ func TestPoolStress(t *testing.T) {
p.Put(v) p.Put(v)
v = p.Get() v = p.Get()
if v != nil && v.(int) != 0 { if v != nil && v.(int) != 0 {
t.Fatalf("expect 0, got %v", v) t.Errorf("expect 0, got %v", v)
break
} }
} }
done <- true done <- true