From 1c7cb5ef73e82c1a02af198d974053d4fed16f93 Mon Sep 17 00:00:00 2001 From: Fumitoshi Ukai Date: Tue, 23 Mar 2010 18:09:24 -0700 Subject: websocket: implement new protocol http://www.whatwg.org/specs/web-socket-protocol/ (draft of draft-hixie-thewebsocketprotocol-76) draft-hixie-thewebsocketprotocol-76 will introduce new handshake incompatible draft 75 or prior. http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol R=rsc CC=golang-dev http://codereview.appspot.com/583041 Committer: Russ Cox --- src/pkg/websocket/websocket_test.go | 65 +++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 6 deletions(-) (limited to 'src/pkg/websocket/websocket_test.go') diff --git a/src/pkg/websocket/websocket_test.go b/src/pkg/websocket/websocket_test.go index 92582b1ef..58065580e 100644 --- a/src/pkg/websocket/websocket_test.go +++ b/src/pkg/websocket/websocket_test.go @@ -27,23 +27,56 @@ func startServer() { serverAddr = l.Addr().String() log.Stderr("Test WebSocket server listening on ", serverAddr) http.Handle("/echo", Handler(echoServer)) + http.Handle("/echoDraft75", Draft75Handler(echoServer)) go http.Serve(l, nil) } func TestEcho(t *testing.T) { once.Do(startServer) + // websocket.Dial() client, err := net.Dial("tcp", "", serverAddr) if err != nil { t.Fatal("dialing", err) } - ws, err := newClient("/echo", "localhost", "http://localhost", - "ws://localhost/echo", "", client) + "ws://localhost/echo", "", client, handshake) + if err != nil { + t.Errorf("WebSocket handshake error", err) + return + } + + msg := []byte("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() +} + +func TestEchoDraft75(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", "", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + ws, err := newClient("/echoDraft75", "localhost", "http://localhost", + "ws://localhost/echoDraft75", "", client, draft75handshake) if err != nil { t.Errorf("WebSocket handshake error", err) return } + msg := []byte("hello, world\n") if _, err := ws.Write(msg); err != nil { t.Errorf("Write: error %v", err) @@ -69,7 +102,7 @@ func TestWithQuery(t *testing.T) { } ws, err := newClient("/echo?q=v", "localhost", "http://localhost", - "ws://localhost/echo?q=v", "", client) + "ws://localhost/echo?q=v", "", client, handshake) if err != nil { t.Errorf("WebSocket handshake error", err) return @@ -80,13 +113,33 @@ func TestWithQuery(t *testing.T) { func TestHTTP(t *testing.T) { once.Do(startServer) - r, _, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) + // If the client did not send a handshake that matches the protocol + // specification, the server should abort the WebSocket connection. + _, _, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) + if err == nil { + t.Errorf("Get: unexpected success") + return + } + urlerr, ok := err.(*http.URLError) + if !ok { + t.Errorf("Get: not URLError %#v", err) + return + } + if urlerr.Error != io.ErrUnexpectedEOF { + t.Errorf("Get: error %#v", err) + return + } +} + +func TestHTTPDraft75(t *testing.T) { + once.Do(startServer) + + r, _, err := http.Get(fmt.Sprintf("http://%s/echoDraft75", serverAddr)) if err != nil { - t.Errorf("Get: error %v", err) + t.Errorf("Get: error %#v", err) return } if r.StatusCode != http.StatusBadRequest { t.Errorf("Get: got status %d", r.StatusCode) - return } } -- cgit v1.2.3