Skip to content

Commit cf3e427

Browse files
committed
Add WASM test
1 parent 599534b commit cf3e427

12 files changed

+188
-89
lines changed

cmp_test.go renamed to assert_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package websocket_test
22

33
import (
4+
"context"
5+
"fmt"
46
"reflect"
57

68
"github.com/google/go-cmp/cmp"
9+
10+
"nhooyr.io/websocket"
11+
"nhooyr.io/websocket/wsjson"
712
)
813

914
// https://github.com/google/go-cmp/issues/40#issuecomment-328615283
@@ -51,3 +56,44 @@ func structTypes(v reflect.Value, m map[reflect.Type]struct{}) {
5156
}
5257
}
5358
}
59+
60+
func assertEqualf(exp, act interface{}, f string, v ...interface{}) error {
61+
if diff := cmpDiff(exp, act); diff != "" {
62+
return fmt.Errorf(f+": %v", append(v, diff)...)
63+
}
64+
return nil
65+
}
66+
67+
func assertJSONEcho(ctx context.Context, c *websocket.Conn, n int) error {
68+
exp := randString(n)
69+
err := wsjson.Write(ctx, c, exp)
70+
if err != nil {
71+
return err
72+
}
73+
74+
var act interface{}
75+
err = wsjson.Read(ctx, c, &act)
76+
if err != nil {
77+
return err
78+
}
79+
80+
return assertEqualf(exp, act, "unexpected JSON")
81+
}
82+
83+
func assertJSONRead(ctx context.Context, c *websocket.Conn, exp interface{}) error {
84+
var act interface{}
85+
err := wsjson.Read(ctx, c, &act)
86+
if err != nil {
87+
return err
88+
}
89+
90+
return assertEqualf(exp, act, "unexpected JSON")
91+
}
92+
93+
func randBytes(n int) []byte {
94+
return make([]byte, n)
95+
}
96+
97+
func randString(n int) string {
98+
return string(randBytes(n))
99+
}

ci/run.sh

+7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@ set -euo pipefail
66
cd "$(dirname "${0}")"
77
cd "$(git rev-parse --show-toplevel)"
88

9+
echo "--- fmt"
910
./ci/fmt.sh
11+
12+
echo "--- lint"
1013
./ci/lint.sh
14+
15+
echo "--- test"
1116
./ci/test.sh
17+
18+
echo "--- wasm"
1219
./ci/wasm.sh

ci/test.sh

+7-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@ if [[ ${CI-} ]]; then
1616
)
1717
fi
1818

19-
argv+=(
20-
"$@"
21-
)
19+
if [[ $# -gt 0 ]]; then
20+
argv+=(
21+
"$@"
22+
)
23+
else
24+
argv+=(./...)
25+
fi
2226

2327
mkdir -p ci/out/websocket
2428
"${argv[@]}"

ci/wasm.sh

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ set -euo pipefail
44
cd "$(dirname "${0}")"
55
cd "$(git rev-parse --show-toplevel)"
66

7+
stdout="$(mktemp -d)/stdout"
8+
mkfifo "$stdout"
9+
go run ./internal/wsecho/cmd > "$stdout" &
10+
11+
WS_ECHO_SERVER_URL="$(head -n 1 "$stdout")"
12+
713
GOOS=js GOARCH=wasm go vet ./...
814
go install golang.org/x/lint/golint
915
GOOS=js GOARCH=wasm golint -set_exit_status ./...
10-
GOOS=js GOARCH=wasm go test ./...
16+
GOOS=js GOARCH=wasm go test ./... -args "$WS_ECHO_SERVER_URL"

internal/echoserver/echoserver.go

-11
This file was deleted.

internal/wsecho/cmd/main.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// +build !js
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
"net/http"
8+
"net/http/httptest"
9+
"runtime"
10+
"strings"
11+
12+
"nhooyr.io/websocket/internal/wsecho"
13+
)
14+
15+
func main() {
16+
s := httptest.NewServer(http.HandlerFunc(wsecho.Serve))
17+
wsURL := strings.Replace(s.URL, "http", "ws", 1)
18+
fmt.Printf("%v\n", wsURL)
19+
20+
runtime.Goexit()
21+
}

internal/wsecho/wsecho.go

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// +build !js
2+
3+
package wsecho
4+
5+
import (
6+
"context"
7+
"io"
8+
"log"
9+
"net/http"
10+
"time"
11+
12+
"nhooyr.io/websocket"
13+
)
14+
15+
// Serve provides a streaming WebSocket echo server
16+
// for use in tests.
17+
func Serve(w http.ResponseWriter, r *http.Request) {
18+
c, err := websocket.Accept(w, r, &websocket.AcceptOptions{
19+
Subprotocols: []string{"echo"},
20+
InsecureSkipVerify: true,
21+
})
22+
if err != nil {
23+
log.Printf("echo server: failed to accept: %+v", err)
24+
return
25+
}
26+
defer c.Close(websocket.StatusInternalError, "")
27+
28+
Loop(r.Context(), c)
29+
}
30+
31+
// Loop echos every msg received from c until an error
32+
// occurs or the context expires.
33+
// The read limit is set to 1 << 40.
34+
func Loop(ctx context.Context, c *websocket.Conn) {
35+
defer c.Close(websocket.StatusInternalError, "")
36+
37+
c.SetReadLimit(1 << 40)
38+
39+
ctx, cancel := context.WithTimeout(ctx, time.Minute)
40+
defer cancel()
41+
42+
b := make([]byte, 32768)
43+
echo := func() error {
44+
typ, r, err := c.Reader(ctx)
45+
if err != nil {
46+
return err
47+
}
48+
49+
w, err := c.Writer(ctx, typ)
50+
if err != nil {
51+
return err
52+
}
53+
54+
_, err = io.CopyBuffer(w, r, b)
55+
if err != nil {
56+
return err
57+
}
58+
59+
err = w.Close()
60+
if err != nil {
61+
return err
62+
}
63+
64+
return nil
65+
}
66+
67+
for {
68+
err := echo()
69+
if err != nil {
70+
return
71+
}
72+
}
73+
}

websocket_autobahn_python_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
"strings"
2121
"testing"
2222
"time"
23+
24+
"nhooyr.io/websocket/internal/wsecho"
2325
)
2426

2527
// https://github.com/crossbario/autobahn-python/tree/master/wstest
@@ -34,7 +36,7 @@ func TestPythonAutobahnServer(t *testing.T) {
3436
t.Logf("server handshake failed: %+v", err)
3537
return
3638
}
37-
echoLoop(r.Context(), c)
39+
wsecho.Loop(r.Context(), c)
3840
}))
3941
defer s.Close()
4042

@@ -186,7 +188,7 @@ func TestPythonAutobahnClientOld(t *testing.T) {
186188
if err != nil {
187189
t.Fatal(err)
188190
}
189-
echoLoop(ctx, c)
191+
wsecho.Loop(ctx, c)
190192
}()
191193
}
192194

websocket_bench_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"time"
1414

1515
"nhooyr.io/websocket"
16+
"nhooyr.io/websocket/internal/wsecho"
1617
)
1718

1819
func BenchmarkConn(b *testing.B) {
@@ -54,7 +55,7 @@ func benchConn(b *testing.B, echo, stream bool, size int) {
5455
return err
5556
}
5657
if echo {
57-
echoLoop(r.Context(), c)
58+
wsecho.Loop(r.Context(), c)
5859
} else {
5960
discardLoop(r.Context(), c)
6061
}

websocket_js_test.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,34 @@ package websocket_test
22

33
import (
44
"context"
5+
"net/http"
6+
"os"
57
"testing"
68
"time"
79

810
"nhooyr.io/websocket"
911
)
1012

13+
var wsEchoServerURL = os.Args[1]
14+
1115
func TestWebSocket(t *testing.T) {
1216
t.Parallel()
1317

14-
_, _, err := websocket.Dial(context.Background(), "ws://localhost:8081", nil)
18+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
19+
defer cancel()
20+
21+
c, resp, err := websocket.Dial(ctx, wsEchoServerURL, nil)
1522
if err != nil {
1623
t.Fatal(err)
1724
}
1825

19-
time.Sleep(time.Second)
26+
err = assertEqualf(&http.Response{}, resp, "unexpected http response")
27+
if err != nil {
28+
t.Fatal(err)
29+
}
30+
31+
err = assertJSONEcho(ctx, c, 4096)
32+
if err != nil {
33+
t.Fatal(err)
34+
}
2035
}

0 commit comments

Comments
 (0)