@@ -4,7 +4,9 @@ package websocket_test
44
55import (
66 "context"
7+ "crypto/rand"
78 "io"
9+ "math/big"
810 "net/http"
911 "net/http/httptest"
1012 "strings"
@@ -18,77 +20,32 @@ import (
1820 "nhooyr.io/websocket"
1921)
2022
21- func TestFuzz (t * testing.T ) {
22- t .Parallel ()
23-
24- s , closeFn := testServer (t , func (w http.ResponseWriter , r * http.Request ) {
25- c , err := websocket .Accept (w , r , & websocket.AcceptOptions {
26- CompressionOptions : websocket.CompressionOptions {
27- Mode : websocket .CompressionContextTakeover ,
28- },
29- })
30- assert .Success (t , "accept" , err )
31- defer c .Close (websocket .StatusInternalError , "" )
32-
33- err = echoLoop (r .Context (), c )
34- assertCloseStatus (t , websocket .StatusNormalClosure , err )
35- }, false )
36- defer closeFn ()
37-
38- ctx , cancel := context .WithTimeout (context .Background (), time .Minute )
39- defer cancel ()
40-
41- opts := & websocket.DialOptions {
42- CompressionOptions : websocket.CompressionOptions {
43- Mode : websocket .CompressionContextTakeover ,
44- },
45- }
46- opts .HTTPClient = s .Client ()
47-
48- c , _ , err := websocket .Dial (ctx , wsURL (s ), opts )
49- assert .Success (t , "dial" , err )
50- assertJSONEcho (t , ctx , c , 8393 )
51- }
52-
5323func TestConn (t * testing.T ) {
5424 t .Parallel ()
5525
5626 t .Run ("json" , func (t * testing.T ) {
57- s , closeFn := testServer (t , func (w http.ResponseWriter , r * http.Request ) {
58- c , err := websocket .Accept (w , r , & websocket.AcceptOptions {
59- Subprotocols : []string {"echo" },
60- CompressionOptions : websocket.CompressionOptions {
61- Mode : websocket .CompressionContextTakeover ,
62- },
63- })
64- assert .Success (t , "accept" , err )
65- defer c .Close (websocket .StatusInternalError , "" )
66-
67- err = echoLoop (r .Context (), c )
68- assertCloseStatus (t , websocket .StatusNormalClosure , err )
69- }, false )
27+ t .Parallel ()
28+
29+ s , closeFn := testEchoLoop (t )
7030 defer closeFn ()
7131
72- ctx , cancel := context . WithTimeout ( context . Background (), time . Minute )
73- defer cancel ( )
32+ c , _ := dialWebSocket ( t , s , nil )
33+ defer c . Close ( websocket . StatusInternalError , "" )
7434
75- opts := & websocket. DialOptions {
76- Subprotocols : [] string { "echo" },
77- CompressionOptions : websocket. CompressionOptions {
78- Mode : websocket . CompressionContextTakeover ,
79- },
35+ c . SetReadLimit ( 1 << 30 )
36+
37+ for i := 0 ; i < 10 ; i ++ {
38+ n := randInt ( t , 1_048_576 )
39+ echoJSON ( t , c , n )
8040 }
81- opts .HTTPClient = s .Client ()
8241
83- c , _ , err := websocket .Dial (ctx , wsURL (s ), opts )
84- assert .Success (t , "dial" , err )
85- assertJSONEcho (t , ctx , c , 8393 )
42+ c .Close (websocket .StatusNormalClosure , "" )
8643 })
8744}
8845
89- func testServer (tb testing.TB , fn func (w http.ResponseWriter , r * http.Request ), tls bool ) (s * httptest.Server , closeFn func ()) {
46+ func testServer (tb testing.TB , fn func (w http.ResponseWriter , r * http.Request )) (s * httptest.Server , closeFn func ()) {
9047 h := http .HandlerFunc (fn )
91- if tls {
48+ if randInt ( tb , 2 ) == 1 {
9249 s = httptest .NewTLSServer (h )
9350 } else {
9451 s = httptest .NewServer (h )
@@ -179,3 +136,19 @@ func echoLoop(ctx context.Context, c *websocket.Conn) error {
179136func wsURL (s * httptest.Server ) string {
180137 return strings .Replace (s .URL , "http" , "ws" , 1 )
181138}
139+
140+ func testEchoLoop (t testing.TB ) (* httptest.Server , func ()) {
141+ return testServer (t , func (w http.ResponseWriter , r * http.Request ) {
142+ c := acceptWebSocket (t , r , w , nil )
143+ defer c .Close (websocket .StatusInternalError , "" )
144+
145+ err := echoLoop (r .Context (), c )
146+ assertCloseStatus (t , websocket .StatusNormalClosure , err )
147+ })
148+ }
149+
150+ func randInt (t testing.TB , max int ) int {
151+ x , err := rand .Int (rand .Reader , big .NewInt (int64 (max )))
152+ assert .Success (t , "rand.Int" , err )
153+ return int (x .Int64 ())
154+ }
0 commit comments