github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/igm/sockjs-go.v2/sockjs/websocket_test.go (about) 1 package sockjs 2 3 import ( 4 "net/http" 5 "net/http/httptest" 6 "strings" 7 "testing" 8 "time" 9 10 "github.com/insionng/yougam/libraries/gorilla/websocket" 11 ) 12 13 func TestHandler_WebSocketHandshakeError(t *testing.T) { 14 h := newTestHandler() 15 server := httptest.NewServer(http.HandlerFunc(h.sockjsWebsocket)) 16 defer server.Close() 17 req, _ := http.NewRequest("GET", server.URL, nil) 18 req.Header.Set("origin", "https"+server.URL[4:]) 19 resp, _ := http.DefaultClient.Do(req) 20 if resp.StatusCode != http.StatusBadRequest { 21 t.Errorf("Unexpected response code, got '%d', expected '%d'", resp.StatusCode, http.StatusBadRequest) 22 } 23 } 24 25 func TestHandler_WebSocket(t *testing.T) { 26 h := newTestHandler() 27 server := httptest.NewServer(http.HandlerFunc(h.sockjsWebsocket)) 28 defer server.CloseClientConnections() 29 url := "ws" + server.URL[4:] 30 var connCh = make(chan Session) 31 h.handlerFunc = func(conn Session) { connCh <- conn } 32 conn, resp, err := websocket.DefaultDialer.Dial(url, nil) 33 if conn == nil { 34 t.Errorf("Connection should not be nil") 35 } 36 if err != nil { 37 t.Errorf("Unexpected error '%v'", err) 38 } 39 if resp.StatusCode != http.StatusSwitchingProtocols { 40 t.Errorf("Wrong response code returned, got '%d', expected '%d'", resp.StatusCode, http.StatusSwitchingProtocols) 41 } 42 select { 43 case <-connCh: //ok 44 case <-time.After(10 * time.Millisecond): 45 t.Errorf("Sockjs Handler not invoked") 46 } 47 } 48 49 func TestHandler_WebSocketTerminationByServer(t *testing.T) { 50 h := newTestHandler() 51 server := httptest.NewServer(http.HandlerFunc(h.sockjsWebsocket)) 52 defer server.Close() 53 url := "ws" + server.URL[4:] 54 h.handlerFunc = func(conn Session) { 55 conn.Close(1024, "some close message") 56 conn.Close(0, "this should be ignored") 57 } 58 conn, _, err := websocket.DefaultDialer.Dial(url, map[string][]string{"Origin": []string{server.URL}}) 59 _, msg, err := conn.ReadMessage() 60 if string(msg) != "o" || err != nil { 61 t.Errorf("Open frame expected, got '%s' and error '%v', expected '%s' without error", msg, err, "o") 62 } 63 _, msg, err = conn.ReadMessage() 64 if string(msg) != `c[1024,"some close message"]` || err != nil { 65 t.Errorf("Open frame expected, got '%s' and error '%v', expected '%s' without error", msg, err, `c[1024,"some close message"]`) 66 } 67 _, msg, err = conn.ReadMessage() 68 // gorilla websocket keeps `errUnexpectedEOF` private so we need to introspect the error message 69 if err != nil { 70 if !strings.Contains(err.Error(), "unexpected EOF") { 71 t.Errorf("Expected 'unexpected EOF' error or similar, got '%v'", err) 72 } 73 } 74 } 75 76 func TestHandler_WebSocketTerminationByClient(t *testing.T) { 77 h := newTestHandler() 78 server := httptest.NewServer(http.HandlerFunc(h.sockjsWebsocket)) 79 defer server.Close() 80 url := "ws" + server.URL[4:] 81 var done = make(chan struct{}) 82 h.handlerFunc = func(conn Session) { 83 if _, err := conn.Recv(); err != ErrSessionNotOpen { 84 t.Errorf("Recv should fail") 85 } 86 close(done) 87 } 88 conn, _, _ := websocket.DefaultDialer.Dial(url, map[string][]string{"Origin": []string{server.URL}}) 89 conn.Close() 90 <-done 91 } 92 93 func TestHandler_WebSocketCommunication(t *testing.T) { 94 h := newTestHandler() 95 server := httptest.NewServer(http.HandlerFunc(h.sockjsWebsocket)) 96 // defer server.CloseClientConnections() 97 url := "ws" + server.URL[4:] 98 var done = make(chan struct{}) 99 h.handlerFunc = func(conn Session) { 100 conn.Send("message 1") 101 conn.Send("message 2") 102 msg, err := conn.Recv() 103 if msg != "message 3" || err != nil { 104 t.Errorf("Got '%s', expecte '%s'", msg, "message 3") 105 } 106 conn.Close(123, "close") 107 close(done) 108 } 109 conn, _, _ := websocket.DefaultDialer.Dial(url, map[string][]string{"Origin": []string{server.URL}}) 110 conn.WriteJSON([]string{"message 3"}) 111 var expected = []string{"o", `a["message 1"]`, `a["message 2"]`, `c[123,"close"]`} 112 for _, exp := range expected { 113 _, msg, err := conn.ReadMessage() 114 if string(msg) != exp || err != nil { 115 t.Errorf("Wrong frame, got '%s' and error '%v', expected '%s' without error", msg, err, exp) 116 } 117 } 118 <-done 119 }