5
5
"fmt"
6
6
"io"
7
7
"io/ioutil"
8
- "log"
9
8
"net"
10
9
"reflect"
11
10
"runtime"
@@ -14,24 +13,26 @@ import (
14
13
"sync/atomic"
15
14
"testing"
16
15
"time"
16
+
17
+ "github.com/ipfs/go-detect-race"
17
18
)
18
19
19
20
type logCapture struct { bytes.Buffer }
20
21
21
22
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
23
30
}
24
31
25
32
func (l * logCapture ) match (expect []string ) bool {
26
33
return reflect .DeepEqual (l .logs (), expect )
27
34
}
28
35
29
- func captureLogs (s * Session ) * logCapture {
30
- buf := new (logCapture )
31
- s .logger = log .New (buf , "" , 0 )
32
- return buf
33
- }
34
-
35
36
type pipeConn struct {
36
37
net.Conn
37
38
writeDeadline pipeDeadline
@@ -470,6 +471,11 @@ func TestSendData_Large(t *testing.T) {
470
471
defer client .Close ()
471
472
defer server .Close ()
472
473
474
+ timeout := 5 * time .Second
475
+ if detectrace .WithRace () {
476
+ timeout *= 10
477
+ }
478
+
473
479
const (
474
480
sendSize = 250 * 1024 * 1024
475
481
recvSize = 4 * 1024
@@ -487,28 +493,34 @@ func TestSendData_Large(t *testing.T) {
487
493
defer wg .Done ()
488
494
stream , err := server .AcceptStream ()
489
495
if err != nil {
490
- t .Fatalf ("err: %v" , err )
496
+ t .Errorf ("err: %v" , err )
497
+ return
491
498
}
499
+
492
500
var sz int
493
501
buf := make ([]byte , recvSize )
494
502
for i := 0 ; i < sendSize / recvSize ; i ++ {
495
503
n , err := io .ReadFull (stream , buf )
496
504
if err != nil {
497
- t .Fatalf ("err: %v" , err )
505
+ t .Errorf ("err: %v" , err )
506
+ return
498
507
}
499
508
if n != recvSize {
500
- t .Fatalf ("short read: %d" , n )
509
+ t .Errorf ("short read: %d" , n )
510
+ return
501
511
}
502
512
sz += n
503
513
for idx := range buf {
504
514
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
506
517
}
507
518
}
508
519
}
509
520
510
521
if err := stream .Close (); err != nil {
511
- t .Fatalf ("err: %v" , err )
522
+ t .Errorf ("err: %v" , err )
523
+ return
512
524
}
513
525
514
526
t .Logf ("cap=%d, n=%d\n " , stream .recvBuf .Cap (), sz )
@@ -518,19 +530,23 @@ func TestSendData_Large(t *testing.T) {
518
530
defer wg .Done ()
519
531
stream , err := client .Open ()
520
532
if err != nil {
521
- t .Fatalf ("err: %v" , err )
533
+ t .Errorf ("err: %v" , err )
534
+ return
522
535
}
523
536
524
537
n , err := stream .Write (data )
525
538
if err != nil {
526
- t .Fatalf ("err: %v" , err )
539
+ t .Errorf ("err: %v" , err )
540
+ return
527
541
}
528
542
if n != len (data ) {
529
- t .Fatalf ("short write %d" , n )
543
+ t .Errorf ("short write %d" , n )
544
+ return
530
545
}
531
546
532
547
if err := stream .Close (); err != nil {
533
- t .Fatalf ("err: %v" , err )
548
+ t .Errorf ("err: %v" , err )
549
+ return
534
550
}
535
551
}()
536
552
@@ -541,13 +557,20 @@ func TestSendData_Large(t *testing.T) {
541
557
}()
542
558
select {
543
559
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" )
546
565
}
547
566
}
548
567
549
568
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 )
551
574
defer client .Close ()
552
575
defer server .Close ()
553
576
@@ -905,11 +928,12 @@ func TestKeepAlive_Timeout(t *testing.T) {
905
928
client , _ := Client (conn1 , clientConf )
906
929
defer client .Close ()
907
930
908
- server , _ := Server (conn2 , testConf ())
909
- defer server .Close ()
931
+ serverLogs := new (logCapture )
932
+ serverConf := testConf ()
933
+ serverConf .LogOutput = serverLogs
910
934
911
- _ = captureLogs ( client ) // Client logs aren't part of the test
912
- serverLogs := captureLogs ( server )
935
+ server , _ := Server ( conn2 , serverConf )
936
+ defer server . Close ( )
913
937
914
938
errCh := make (chan error , 1 )
915
939
go func () {
@@ -982,6 +1006,11 @@ func TestSendData_VeryLarge(t *testing.T) {
982
1006
defer client .Close ()
983
1007
defer server .Close ()
984
1008
1009
+ if detectrace .WithRace () {
1010
+ t .Skip ("disabling slow test due to race detector" )
1011
+ return
1012
+ }
1013
+
985
1014
var n int64 = 1 * 1024 * 1024 * 1024
986
1015
var workers int = 16
987
1016
@@ -993,25 +1022,30 @@ func TestSendData_VeryLarge(t *testing.T) {
993
1022
defer wg .Done ()
994
1023
stream , err := server .AcceptStream ()
995
1024
if err != nil {
996
- t .Fatalf ("err: %v" , err )
1025
+ t .Errorf ("err: %v" , err )
1026
+ return
997
1027
}
998
1028
defer stream .Close ()
999
1029
1000
1030
buf := make ([]byte , 4 )
1001
1031
_ , err = io .ReadFull (stream , buf )
1002
1032
if err != nil {
1003
- t .Fatalf ("err: %v" , err )
1033
+ t .Errorf ("err: %v" , err )
1034
+ return
1004
1035
}
1005
1036
if ! bytes .Equal (buf , []byte {0 , 1 , 2 , 3 }) {
1006
- t .Fatalf ("bad header" )
1037
+ t .Errorf ("bad header" )
1038
+ return
1007
1039
}
1008
1040
1009
1041
recv , err := io .Copy (ioutil .Discard , stream )
1010
1042
if err != nil {
1011
- t .Fatalf ("err: %v" , err )
1043
+ t .Errorf ("err: %v" , err )
1044
+ return
1012
1045
}
1013
1046
if recv != n {
1014
- t .Fatalf ("bad: %v" , recv )
1047
+ t .Errorf ("bad: %v" , recv )
1048
+ return
1015
1049
}
1016
1050
}()
1017
1051
}
@@ -1020,22 +1054,26 @@ func TestSendData_VeryLarge(t *testing.T) {
1020
1054
defer wg .Done ()
1021
1055
stream , err := client .Open ()
1022
1056
if err != nil {
1023
- t .Fatalf ("err: %v" , err )
1057
+ t .Errorf ("err: %v" , err )
1058
+ return
1024
1059
}
1025
1060
defer stream .Close ()
1026
1061
1027
1062
_ , err = stream .Write ([]byte {0 , 1 , 2 , 3 })
1028
1063
if err != nil {
1029
- t .Fatalf ("err: %v" , err )
1064
+ t .Errorf ("err: %v" , err )
1065
+ return
1030
1066
}
1031
1067
1032
1068
unlimited := & UnlimitedReader {}
1033
1069
sent , err := io .Copy (stream , io .LimitReader (unlimited , n ))
1034
1070
if err != nil {
1035
- t .Fatalf ("err: %v" , err )
1071
+ t .Errorf ("err: %v" , err )
1072
+ return
1036
1073
}
1037
1074
if sent != n {
1038
- t .Fatalf ("bad: %v" , sent )
1075
+ t .Errorf ("bad: %v" , sent )
1076
+ return
1039
1077
}
1040
1078
}()
1041
1079
}
@@ -1048,21 +1086,27 @@ func TestSendData_VeryLarge(t *testing.T) {
1048
1086
select {
1049
1087
case <- doneCh :
1050
1088
case <- time .After (20 * time .Second ):
1051
- panic ("timeout" )
1089
+ server .Close ()
1090
+ client .Close ()
1091
+ wg .Wait ()
1092
+ t .Fatal ("timeout" )
1052
1093
}
1053
1094
}
1054
1095
1055
1096
func TestBacklogExceeded_Accept (t * testing.T ) {
1056
1097
client , server := testClientServer ()
1057
1098
defer client .Close ()
1058
- defer server .Close ()
1059
1099
1060
1100
max := 5 * client .config .AcceptBacklog
1101
+ done := make (chan struct {})
1061
1102
go func () {
1103
+ defer close (done )
1104
+ defer server .Close ()
1062
1105
for i := 0 ; i < max ; i ++ {
1063
1106
stream , err := server .Accept ()
1064
1107
if err != nil {
1065
- t .Fatalf ("err: %v" , err )
1108
+ t .Errorf ("err: %v" , err )
1109
+ return
1066
1110
}
1067
1111
defer stream .Close ()
1068
1112
}
@@ -1072,14 +1116,15 @@ func TestBacklogExceeded_Accept(t *testing.T) {
1072
1116
for i := 0 ; i < max ; i ++ {
1073
1117
stream , err := client .Open ()
1074
1118
if err != nil {
1075
- t .Fatalf ("err: %v" , err )
1119
+ t .Errorf ("err: %v" , err )
1076
1120
}
1077
1121
defer stream .Close ()
1078
1122
1079
1123
if _ , err := stream .Write ([]byte ("foo" )); err != nil {
1080
- t .Fatalf ("err: %v" , err )
1124
+ t .Errorf ("err: %v" , err )
1081
1125
}
1082
1126
}
1127
+ <- done
1083
1128
}
1084
1129
1085
1130
func TestSession_WindowUpdateWriteDuringRead (t * testing.T ) {
@@ -1228,34 +1273,6 @@ func TestSession_sendMsg_Timeout(t *testing.T) {
1228
1273
}
1229
1274
}
1230
1275
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
-
1259
1276
func TestSession_ConnectionWriteTimeout (t * testing.T ) {
1260
1277
client , server := testClientServerConfig (testConfNoKeepAlive ())
1261
1278
defer client .Close ()
@@ -1558,3 +1575,36 @@ func TestReadDeadlineInterrupt(t *testing.T) {
1558
1575
}
1559
1576
}
1560
1577
}
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