Skip to content

Commit c7ed5b3

Browse files
committed
test: make the tests reliable
* fix races * fix timeouts * disable some tests when the race detector is enabled (too slow, too many goroutines)
1 parent 9f55272 commit c7ed5b3

File tree

2 files changed

+255
-166
lines changed

2 files changed

+255
-166
lines changed

session_norace_test.go

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
//+build !race
2+
3+
package yamux
4+
5+
import (
6+
"bytes"
7+
"io"
8+
"io/ioutil"
9+
"sync"
10+
"testing"
11+
"time"
12+
)
13+
14+
func TestSession_PingOfDeath(t *testing.T) {
15+
client, server := testClientServerConfig(testConfNoKeepAlive())
16+
defer client.Close()
17+
defer server.Close()
18+
19+
count := 10000
20+
21+
var wg sync.WaitGroup
22+
begin := make(chan struct{})
23+
for i := 0; i < count; i++ {
24+
wg.Add(2)
25+
go func() {
26+
defer wg.Done()
27+
<-begin
28+
if _, err := server.Ping(); err != nil {
29+
t.Error(err)
30+
}
31+
}()
32+
go func() {
33+
defer wg.Done()
34+
<-begin
35+
if _, err := client.Ping(); err != nil {
36+
t.Error(err)
37+
}
38+
}()
39+
}
40+
close(begin)
41+
wg.Wait()
42+
}
43+
44+
func TestSendData_VeryLarge(t *testing.T) {
45+
client, server := testClientServer()
46+
defer client.Close()
47+
defer server.Close()
48+
49+
var n int64 = 1 * 1024 * 1024 * 1024
50+
var workers int = 16
51+
52+
wg := &sync.WaitGroup{}
53+
wg.Add(workers * 2)
54+
55+
for i := 0; i < workers; i++ {
56+
go func() {
57+
defer wg.Done()
58+
stream, err := server.AcceptStream()
59+
if err != nil {
60+
t.Errorf("err: %v", err)
61+
return
62+
}
63+
defer stream.Close()
64+
65+
buf := make([]byte, 4)
66+
_, err = io.ReadFull(stream, buf)
67+
if err != nil {
68+
t.Errorf("err: %v", err)
69+
return
70+
}
71+
if !bytes.Equal(buf, []byte{0, 1, 2, 3}) {
72+
t.Errorf("bad header")
73+
return
74+
}
75+
76+
recv, err := io.Copy(ioutil.Discard, stream)
77+
if err != nil {
78+
t.Errorf("err: %v", err)
79+
return
80+
}
81+
if recv != n {
82+
t.Errorf("bad: %v", recv)
83+
return
84+
}
85+
}()
86+
}
87+
for i := 0; i < workers; i++ {
88+
go func() {
89+
defer wg.Done()
90+
stream, err := client.Open()
91+
if err != nil {
92+
t.Errorf("err: %v", err)
93+
return
94+
}
95+
defer stream.Close()
96+
97+
_, err = stream.Write([]byte{0, 1, 2, 3})
98+
if err != nil {
99+
t.Errorf("err: %v", err)
100+
return
101+
}
102+
103+
unlimited := &UnlimitedReader{}
104+
sent, err := io.Copy(stream, io.LimitReader(unlimited, n))
105+
if err != nil {
106+
t.Errorf("err: %v", err)
107+
return
108+
}
109+
if sent != n {
110+
t.Errorf("bad: %v", sent)
111+
return
112+
}
113+
}()
114+
}
115+
116+
doneCh := make(chan struct{})
117+
go func() {
118+
wg.Wait()
119+
close(doneCh)
120+
}()
121+
select {
122+
case <-doneCh:
123+
case <-time.After(20 * time.Second):
124+
server.Close()
125+
client.Close()
126+
wg.Wait()
127+
t.Fatal("timeout")
128+
}
129+
}

0 commit comments

Comments
 (0)