This repository has been archived by the owner on May 26, 2022. It is now read-only.
/
browser_integration_native_test.go
108 lines (97 loc) · 2.58 KB
/
browser_integration_native_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// +build !js,!windows
package websocket
import (
"bufio"
"context"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
"github.com/libp2p/go-libp2p-core/sec/insecure"
mplex "github.com/libp2p/go-libp2p-mplex"
tptu "github.com/libp2p/go-libp2p-transport-upgrader"
ma "github.com/multiformats/go-multiaddr"
)
var (
wasmBrowserTestBin = "wasmbrowsertest"
wasmBrowserTestDir = filepath.Join("tools", "bin")
wasmBrowserTestPackage = "github.com/agnivade/wasmbrowsertest"
)
// TestInBrowser is a harness that allows us to use `go test` in order to run
// WebAssembly tests in a headless browser.
func TestInBrowser(t *testing.T) {
// ensure we have the right tools.
err := os.MkdirAll(wasmBrowserTestDir, 0755)
t.Logf("building %s", wasmBrowserTestPackage)
if err != nil && !os.IsExist(err) {
t.Fatal(err)
}
cmd := exec.Command(
"go", "build",
"-o", wasmBrowserTestBin,
"github.com/agnivade/wasmbrowsertest",
)
cmd.Dir = wasmBrowserTestDir
err = cmd.Run()
if err != nil {
t.Fatal(err)
}
t.Log("starting server")
// Start a transport which the browser peer will dial.
serverDoneSignal := make(chan struct{})
go func() {
defer func() {
close(serverDoneSignal)
}()
tpt := New(&tptu.Upgrader{
Secure: insecure.New("serverPeer"),
Muxer: new(mplex.Transport),
})
addr, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5555/ws")
if err != nil {
t.Error("SERVER:", err)
}
listener, err := tpt.Listen(addr)
if err != nil {
t.Error("SERVER:", err)
}
conn, err := listener.Accept()
if err != nil {
t.Error("SERVER:", err)
}
defer conn.Close()
stream, err := conn.OpenStream(context.Background())
if err != nil {
t.Error("SERVER: could not open stream:", err)
}
defer stream.Close()
buf := bufio.NewReader(stream)
if _, err := stream.Write([]byte("ping\n")); err != nil {
t.Error("SERVER:", err)
}
msg, err := buf.ReadString('\n')
if err != nil {
t.Error("SERVER: could not read pong message:" + err.Error())
}
expected := "pong\n"
if msg != expected {
t.Errorf("SERVER: Received wrong message. Expected %q but got %q", expected, msg)
}
}()
t.Log("starting browser")
cmd = exec.Command(
"go", "test", "-v",
"-exec", filepath.Join(wasmBrowserTestDir, wasmBrowserTestBin),
"-run", "TestInBrowser",
".",
)
cmd.Env = append(os.Environ(), []string{"GOOS=js", "GOARCH=wasm"}...)
output, err := cmd.CombinedOutput()
if err != nil {
formattedOutput := "\t" + strings.Join(strings.Split(string(output), "\n"), "\n\t")
t.Log("BROWSER OUTPUT:\n", formattedOutput)
t.Fatal("BROWSER:", err)
}
<-serverDoneSignal
}