github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/igm/sockjs-go.v2/sockjs/websocket_test.gon-place (about)

     1  package sockjs
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  
    10  	"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  }