| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package websocket |
| |
| import ( |
| "bytes"; |
| "http"; |
| "io"; |
| "log"; |
| "net"; |
| "once"; |
| "strings"; |
| "testing"; |
| ) |
| |
| var serverAddr string |
| |
| func echoServer(ws *Conn) { io.Copy(ws, ws) } |
| |
| func startServer() { |
| l, e := net.Listen("tcp", ":0"); // any available address |
| if e != nil { |
| log.Exitf("net.Listen tcp :0 %v", e) |
| } |
| serverAddr = l.Addr().String(); |
| log.Stderr("Test WebSocket server listening on ", serverAddr); |
| http.Handle("/echo", Handler(echoServer)); |
| go http.Serve(l, nil); |
| } |
| |
| func TestEcho(t *testing.T) { |
| once.Do(startServer); |
| |
| client, err := net.Dial("tcp", "", serverAddr); |
| if err != nil { |
| t.Fatal("dialing", err) |
| } |
| |
| ws, err := newClient("/echo", "localhost", "http://localhost", |
| "ws://localhost/echo", "", client); |
| if err != nil { |
| t.Errorf("WebSocket handshake error", err); |
| return; |
| } |
| msg := strings.Bytes("hello, world\n"); |
| if _, err := ws.Write(msg); err != nil { |
| t.Errorf("Write: error %v", err) |
| } |
| var actual_msg = make([]byte, 512); |
| n, err := ws.Read(actual_msg); |
| if err != nil { |
| t.Errorf("Read: error %v", err) |
| } |
| actual_msg = actual_msg[0:n]; |
| if !bytes.Equal(msg, actual_msg) { |
| t.Errorf("Echo: expected %q got %q", msg, actual_msg) |
| } |
| ws.Close(); |
| } |