Skip to content

Commit 320e99a

Browse files
committed
test: make the tests reliable
* fix races * fix timeouts * extend timeouts when race detector is enabled
1 parent 9f55272 commit 320e99a

File tree

3 files changed

+122
-67
lines changed

3 files changed

+122
-67
lines changed

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ module github.com/libp2p/go-yamux
22

33
go 1.12
44

5-
require github.com/libp2p/go-buffer-pool v0.0.2
5+
require (
6+
github.com/ipfs/go-detect-race v0.0.1
7+
github.com/libp2p/go-buffer-pool v0.0.2
8+
)

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
2+
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
13
github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs=
24
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=

session_test.go

+116-66
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"io"
77
"io/ioutil"
8-
"log"
98
"net"
109
"reflect"
1110
"runtime"
@@ -14,24 +13,26 @@ import (
1413
"sync/atomic"
1514
"testing"
1615
"time"
16+
17+
"github.com/ipfs/go-detect-race"
1718
)
1819

1920
type logCapture struct{ bytes.Buffer }
2021

2122
func (l *logCapture) logs() []string {
22-
return strings.Split(strings.TrimSpace(l.String()), "\n")
23+
lines := strings.Split(strings.TrimSpace(l.String()), "\n")
24+
for i, line := range lines {
25+
// trim leading date.
26+
split := strings.SplitN(line, " ", 3)
27+
lines[i] = split[2]
28+
}
29+
return lines
2330
}
2431

2532
func (l *logCapture) match(expect []string) bool {
2633
return reflect.DeepEqual(l.logs(), expect)
2734
}
2835

29-
func captureLogs(s *Session) *logCapture {
30-
buf := new(logCapture)
31-
s.logger = log.New(buf, "", 0)
32-
return buf
33-
}
34-
3536
type pipeConn struct {
3637
net.Conn
3738
writeDeadline pipeDeadline
@@ -470,6 +471,11 @@ func TestSendData_Large(t *testing.T) {
470471
defer client.Close()
471472
defer server.Close()
472473

474+
timeout := 5 * time.Second
475+
if detectrace.WithRace() {
476+
timeout *= 10
477+
}
478+
473479
const (
474480
sendSize = 250 * 1024 * 1024
475481
recvSize = 4 * 1024
@@ -487,28 +493,34 @@ func TestSendData_Large(t *testing.T) {
487493
defer wg.Done()
488494
stream, err := server.AcceptStream()
489495
if err != nil {
490-
t.Fatalf("err: %v", err)
496+
t.Errorf("err: %v", err)
497+
return
491498
}
499+
492500
var sz int
493501
buf := make([]byte, recvSize)
494502
for i := 0; i < sendSize/recvSize; i++ {
495503
n, err := io.ReadFull(stream, buf)
496504
if err != nil {
497-
t.Fatalf("err: %v", err)
505+
t.Errorf("err: %v", err)
506+
return
498507
}
499508
if n != recvSize {
500-
t.Fatalf("short read: %d", n)
509+
t.Errorf("short read: %d", n)
510+
return
501511
}
502512
sz += n
503513
for idx := range buf {
504514
if buf[idx] != byte(idx%256) {
505-
t.Fatalf("bad: %v %v %v", i, idx, buf[idx])
515+
t.Errorf("bad: %v %v %v", i, idx, buf[idx])
516+
return
506517
}
507518
}
508519
}
509520

510521
if err := stream.Close(); err != nil {
511-
t.Fatalf("err: %v", err)
522+
t.Errorf("err: %v", err)
523+
return
512524
}
513525

514526
t.Logf("cap=%d, n=%d\n", stream.recvBuf.Cap(), sz)
@@ -518,19 +530,23 @@ func TestSendData_Large(t *testing.T) {
518530
defer wg.Done()
519531
stream, err := client.Open()
520532
if err != nil {
521-
t.Fatalf("err: %v", err)
533+
t.Errorf("err: %v", err)
534+
return
522535
}
523536

524537
n, err := stream.Write(data)
525538
if err != nil {
526-
t.Fatalf("err: %v", err)
539+
t.Errorf("err: %v", err)
540+
return
527541
}
528542
if n != len(data) {
529-
t.Fatalf("short write %d", n)
543+
t.Errorf("short write %d", n)
544+
return
530545
}
531546

532547
if err := stream.Close(); err != nil {
533-
t.Fatalf("err: %v", err)
548+
t.Errorf("err: %v", err)
549+
return
534550
}
535551
}()
536552

@@ -541,13 +557,20 @@ func TestSendData_Large(t *testing.T) {
541557
}()
542558
select {
543559
case <-doneCh:
544-
case <-time.After(5 * time.Second):
545-
panic("timeout")
560+
case <-time.After(timeout):
561+
client.Close()
562+
server.Close()
563+
wg.Wait()
564+
t.Fatal("timeout")
546565
}
547566
}
548567

549568
func TestGoAway(t *testing.T) {
550-
client, server := testClientServer()
569+
// This test is noisy.
570+
conf := testConf()
571+
conf.LogOutput = ioutil.Discard
572+
573+
client, server := testClientServerConfig(conf)
551574
defer client.Close()
552575
defer server.Close()
553576

@@ -905,11 +928,12 @@ func TestKeepAlive_Timeout(t *testing.T) {
905928
client, _ := Client(conn1, clientConf)
906929
defer client.Close()
907930

908-
server, _ := Server(conn2, testConf())
909-
defer server.Close()
931+
serverLogs := new(logCapture)
932+
serverConf := testConf()
933+
serverConf.LogOutput = serverLogs
910934

911-
_ = captureLogs(client) // Client logs aren't part of the test
912-
serverLogs := captureLogs(server)
935+
server, _ := Server(conn2, serverConf)
936+
defer server.Close()
913937

914938
errCh := make(chan error, 1)
915939
go func() {
@@ -982,6 +1006,11 @@ func TestSendData_VeryLarge(t *testing.T) {
9821006
defer client.Close()
9831007
defer server.Close()
9841008

1009+
if detectrace.WithRace() {
1010+
t.Skip("disabling slow test due to race detector")
1011+
return
1012+
}
1013+
9851014
var n int64 = 1 * 1024 * 1024 * 1024
9861015
var workers int = 16
9871016

@@ -993,25 +1022,30 @@ func TestSendData_VeryLarge(t *testing.T) {
9931022
defer wg.Done()
9941023
stream, err := server.AcceptStream()
9951024
if err != nil {
996-
t.Fatalf("err: %v", err)
1025+
t.Errorf("err: %v", err)
1026+
return
9971027
}
9981028
defer stream.Close()
9991029

10001030
buf := make([]byte, 4)
10011031
_, err = io.ReadFull(stream, buf)
10021032
if err != nil {
1003-
t.Fatalf("err: %v", err)
1033+
t.Errorf("err: %v", err)
1034+
return
10041035
}
10051036
if !bytes.Equal(buf, []byte{0, 1, 2, 3}) {
1006-
t.Fatalf("bad header")
1037+
t.Errorf("bad header")
1038+
return
10071039
}
10081040

10091041
recv, err := io.Copy(ioutil.Discard, stream)
10101042
if err != nil {
1011-
t.Fatalf("err: %v", err)
1043+
t.Errorf("err: %v", err)
1044+
return
10121045
}
10131046
if recv != n {
1014-
t.Fatalf("bad: %v", recv)
1047+
t.Errorf("bad: %v", recv)
1048+
return
10151049
}
10161050
}()
10171051
}
@@ -1020,22 +1054,26 @@ func TestSendData_VeryLarge(t *testing.T) {
10201054
defer wg.Done()
10211055
stream, err := client.Open()
10221056
if err != nil {
1023-
t.Fatalf("err: %v", err)
1057+
t.Errorf("err: %v", err)
1058+
return
10241059
}
10251060
defer stream.Close()
10261061

10271062
_, err = stream.Write([]byte{0, 1, 2, 3})
10281063
if err != nil {
1029-
t.Fatalf("err: %v", err)
1064+
t.Errorf("err: %v", err)
1065+
return
10301066
}
10311067

10321068
unlimited := &UnlimitedReader{}
10331069
sent, err := io.Copy(stream, io.LimitReader(unlimited, n))
10341070
if err != nil {
1035-
t.Fatalf("err: %v", err)
1071+
t.Errorf("err: %v", err)
1072+
return
10361073
}
10371074
if sent != n {
1038-
t.Fatalf("bad: %v", sent)
1075+
t.Errorf("bad: %v", sent)
1076+
return
10391077
}
10401078
}()
10411079
}
@@ -1048,21 +1086,27 @@ func TestSendData_VeryLarge(t *testing.T) {
10481086
select {
10491087
case <-doneCh:
10501088
case <-time.After(20 * time.Second):
1051-
panic("timeout")
1089+
server.Close()
1090+
client.Close()
1091+
wg.Wait()
1092+
t.Fatal("timeout")
10521093
}
10531094
}
10541095

10551096
func TestBacklogExceeded_Accept(t *testing.T) {
10561097
client, server := testClientServer()
10571098
defer client.Close()
1058-
defer server.Close()
10591099

10601100
max := 5 * client.config.AcceptBacklog
1101+
done := make(chan struct{})
10611102
go func() {
1103+
defer close(done)
1104+
defer server.Close()
10621105
for i := 0; i < max; i++ {
10631106
stream, err := server.Accept()
10641107
if err != nil {
1065-
t.Fatalf("err: %v", err)
1108+
t.Errorf("err: %v", err)
1109+
return
10661110
}
10671111
defer stream.Close()
10681112
}
@@ -1072,14 +1116,15 @@ func TestBacklogExceeded_Accept(t *testing.T) {
10721116
for i := 0; i < max; i++ {
10731117
stream, err := client.Open()
10741118
if err != nil {
1075-
t.Fatalf("err: %v", err)
1119+
t.Errorf("err: %v", err)
10761120
}
10771121
defer stream.Close()
10781122

10791123
if _, err := stream.Write([]byte("foo")); err != nil {
1080-
t.Fatalf("err: %v", err)
1124+
t.Errorf("err: %v", err)
10811125
}
10821126
}
1127+
<-done
10831128
}
10841129

10851130
func TestSession_WindowUpdateWriteDuringRead(t *testing.T) {
@@ -1228,34 +1273,6 @@ func TestSession_sendMsg_Timeout(t *testing.T) {
12281273
}
12291274
}
12301275

1231-
func TestSession_PingOfDeath(t *testing.T) {
1232-
client, server := testClientServerConfig(testConfNoKeepAlive())
1233-
defer client.Close()
1234-
defer server.Close()
1235-
1236-
var wg sync.WaitGroup
1237-
begin := make(chan struct{})
1238-
for i := 0; i < 10000; i++ {
1239-
wg.Add(2)
1240-
go func() {
1241-
defer wg.Done()
1242-
<-begin
1243-
if _, err := server.Ping(); err != nil {
1244-
t.Error(err)
1245-
}
1246-
}()
1247-
go func() {
1248-
defer wg.Done()
1249-
<-begin
1250-
if _, err := client.Ping(); err != nil {
1251-
t.Error(err)
1252-
}
1253-
}()
1254-
}
1255-
close(begin)
1256-
wg.Wait()
1257-
}
1258-
12591276
func TestSession_ConnectionWriteTimeout(t *testing.T) {
12601277
client, server := testClientServerConfig(testConfNoKeepAlive())
12611278
defer client.Close()
@@ -1558,3 +1575,36 @@ func TestReadDeadlineInterrupt(t *testing.T) {
15581575
}
15591576
}
15601577
}
1578+
1579+
func TestSession_PingOfDeath(t *testing.T) {
1580+
client, server := testClientServerConfig(testConfNoKeepAlive())
1581+
defer client.Close()
1582+
defer server.Close()
1583+
1584+
count := 10000
1585+
if detectrace.WithRace() {
1586+
count = 1000
1587+
}
1588+
1589+
var wg sync.WaitGroup
1590+
begin := make(chan struct{})
1591+
for i := 0; i < count; i++ {
1592+
wg.Add(2)
1593+
go func() {
1594+
defer wg.Done()
1595+
<-begin
1596+
if _, err := server.Ping(); err != nil {
1597+
t.Error(err)
1598+
}
1599+
}()
1600+
go func() {
1601+
defer wg.Done()
1602+
<-begin
1603+
if _, err := client.Ping(); err != nil {
1604+
t.Error(err)
1605+
}
1606+
}()
1607+
}
1608+
close(begin)
1609+
wg.Wait()
1610+
}

0 commit comments

Comments
 (0)