blob: 961a93eaab5bedc914aede0b8d27c0de0fba8744 [file] [log] [blame]
Jungho Ahn8c11c032015-02-02 11:21:36 -08001package benchmark
2
3import (
4 "io"
5 "net"
6 "testing"
7
Matt Rosencrantz86ba1a12015-03-09 13:19:02 -07008 "v.io/x/ref/profiles/internal/lib/websocket"
Jungho Ahn8c11c032015-02-02 11:21:36 -08009)
10
11// benchmarkWS sets up nConns WS connections and measures throughput.
12func benchmarkWS(b *testing.B, nConns int) {
13 rchan := make(chan net.Conn, nConns)
14 wchan := make(chan net.Conn, nConns)
15 ln, err := websocket.Listener("ws", "127.0.0.1:0")
16 if err != nil {
17 b.Fatalf("websocket.Listener failed: %v", err)
18 return
19 }
20 defer ln.Close()
21 // One goroutine to dial nConns connections.
22 go func() {
23 for i := 0; i < nConns; i++ {
24 conn, err := websocket.Dial("ws", ln.Addr().String(), 0)
25 if err != nil {
26 b.Fatalf("websocket.Dial(%q, %q) failed: %v", "ws", ln.Addr(), err)
27 wchan <- nil
28 return
29 }
30 wchan <- conn
31 }
32 close(wchan)
33 }()
34 // One goroutine to accept nConns connections.
35 go func() {
36 for i := 0; i < nConns; i++ {
37 conn, err := ln.Accept()
38 if err != nil {
39 b.Fatalf("Accept failed: %v", err)
40 rchan <- nil
41 return
42 }
43 rchan <- conn
44 }
45 close(rchan)
46 }()
47
48 var readers []io.ReadCloser
49 var writers []io.WriteCloser
50 for r := range rchan {
51 readers = append(readers, r)
52 }
53 for w := range wchan {
54 writers = append(writers, w)
55 }
56 if b.Failed() {
57 return
58 }
59 (&throughputTester{b: b, readers: readers, writers: writers}).Run()
60}