github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/igm/sockjs-go.v2/sockjs/xhr_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  
    11  func TestHandler_XhrSendNilBody(t *testing.T) {
    12  	h := newTestHandler()
    13  	rec := httptest.NewRecorder()
    14  	req, _ := http.NewRequest("POST", "/server/non_existing_session/xhr_send", nil)
    15  	h.xhrSend(rec, req)
    16  	if rec.Code != http.StatusInternalServerError {
    17  		t.Errorf("Unexpected response status, got '%d' expected '%d'", rec.Code, http.StatusInternalServerError)
    18  	}
    19  	if rec.Body.String() != "Payload expected." {
    20  		t.Errorf("Unexcpected body received: '%s'", rec.Body.String())
    21  	}
    22  }
    23  
    24  func TestHandler_XhrSendEmptyBody(t *testing.T) {
    25  	h := newTestHandler()
    26  	rec := httptest.NewRecorder()
    27  	req, _ := http.NewRequest("POST", "/server/non_existing_session/xhr_send", strings.NewReader(""))
    28  	h.xhrSend(rec, req)
    29  	if rec.Code != http.StatusInternalServerError {
    30  		t.Errorf("Unexpected response status, got '%d' expected '%d'", rec.Code, http.StatusInternalServerError)
    31  	}
    32  	if rec.Body.String() != "Payload expected." {
    33  		t.Errorf("Unexcpected body received: '%s'", rec.Body.String())
    34  	}
    35  }
    36  
    37  func TestHandler_XhrSendWrongUrlPath(t *testing.T) {
    38  	h := newTestHandler()
    39  	rec := httptest.NewRecorder()
    40  	req, _ := http.NewRequest("POST", "incorrect", strings.NewReader("[\"a\"]"))
    41  	h.xhrSend(rec, req)
    42  	if rec.Code != http.StatusInternalServerError {
    43  		t.Errorf("Unexcpected response status, got '%d', expected '%d'", rec.Code, http.StatusInternalServerError)
    44  	}
    45  }
    46  
    47  func TestHandler_XhrSendToExistingSession(t *testing.T) {
    48  	h := newTestHandler()
    49  	sess := newSession("session", time.Second, time.Second)
    50  	h.sessions["session"] = sess
    51  
    52  	rec := httptest.NewRecorder()
    53  	req, _ := http.NewRequest("POST", "/server/session/xhr_send", strings.NewReader("[\"some message\"]"))
    54  	var done = make(chan bool)
    55  	go func() {
    56  		h.xhrSend(rec, req)
    57  		done <- true
    58  	}()
    59  	msg, _ := sess.Recv()
    60  	if msg != "some message" {
    61  		t.Errorf("Incorrect message in the channel, should be '%s', was '%s'", "some message", msg)
    62  	}
    63  	<-done
    64  	if rec.Code != http.StatusNoContent {
    65  		t.Errorf("Wrong response status received %d, should be %d", rec.Code, http.StatusNoContent)
    66  	}
    67  	if rec.Header().Get("content-type") != "text/plain; charset=UTF-8" {
    68  		t.Errorf("Wrong content type received '%s'", rec.Header().Get("content-type"))
    69  	}
    70  }
    71  
    72  func TestHandler_XhrSendInvalidInput(t *testing.T) {
    73  	h := newTestHandler()
    74  	req, _ := http.NewRequest("POST", "/server/session/xhr_send", strings.NewReader("some invalid message frame"))
    75  	rec := httptest.NewRecorder()
    76  	h.xhrSend(rec, req)
    77  	if rec.Code != http.StatusInternalServerError || rec.Body.String() != "Broken JSON encoding." {
    78  		t.Errorf("Unexpected response, got '%d,%s' expected '%d,Broken JSON encoding.'", rec.Code, rec.Body.String(), http.StatusInternalServerError)
    79  	}
    80  
    81  	// unexpected EOF
    82  	req, _ = http.NewRequest("POST", "/server/session/xhr_send", strings.NewReader("[\"x"))
    83  	rec = httptest.NewRecorder()
    84  	h.xhrSend(rec, req)
    85  	if rec.Code != http.StatusInternalServerError || rec.Body.String() != "Broken JSON encoding." {
    86  		t.Errorf("Unexpected response, got '%d,%s' expected '%d,Broken JSON encoding.'", rec.Code, rec.Body.String(), http.StatusInternalServerError)
    87  	}
    88  }
    89  
    90  func TestHandler_XhrSendSessionNotFound(t *testing.T) {
    91  	h := handler{}
    92  	req, _ := http.NewRequest("POST", "/server/session/xhr_send", strings.NewReader("[\"some message\"]"))
    93  	rec := httptest.NewRecorder()
    94  	h.xhrSend(rec, req)
    95  	if rec.Code != http.StatusNotFound {
    96  		t.Errorf("Unexpected response status, got '%d' expected '%d'", rec.Code, http.StatusNotFound)
    97  	}
    98  }
    99  
   100  func TestHandler_XhrPoll(t *testing.T) {
   101  	h := newTestHandler()
   102  	rw := httptest.NewRecorder()
   103  	req, _ := http.NewRequest("POST", "/server/session/xhr", nil)
   104  	h.xhrPoll(rw, req)
   105  	if rw.Header().Get("content-type") != "application/javascript; charset=UTF-8" {
   106  		t.Errorf("Wrong content type received, got '%s'", rw.Header().Get("content-type"))
   107  	}
   108  }
   109  
   110  func TestHandler_XhrPollConnectionInterrupted(t *testing.T) {
   111  	h := newTestHandler()
   112  	sess := newTestSession()
   113  	sess.state = sessionActive
   114  	h.sessions["session"] = sess
   115  	req, _ := http.NewRequest("POST", "/server/session/xhr", nil)
   116  	rw := newClosableRecorder()
   117  	close(rw.closeNotifCh)
   118  	h.xhrPoll(rw, req)
   119  	time.Sleep(1 * time.Millisecond)
   120  	sess.Lock()
   121  	if sess.state != sessionClosed {
   122  		t.Errorf("Session should be closed")
   123  	}
   124  }
   125  
   126  func TestHandler_XhrPollAnotherConnectionExists(t *testing.T) {
   127  	h := newTestHandler()
   128  	// turn of timeoutes and heartbeats
   129  	sess := newSession("session", time.Hour, time.Hour)
   130  	h.sessions["session"] = sess
   131  	sess.attachReceiver(newTestReceiver())
   132  	req, _ := http.NewRequest("POST", "/server/session/xhr", nil)
   133  	rw2 := httptest.NewRecorder()
   134  	h.xhrPoll(rw2, req)
   135  	if rw2.Body.String() != "c[2010,\"Another connection still open\"]\n" {
   136  		t.Errorf("Unexpected body, got '%s'", rw2.Body)
   137  	}
   138  }
   139  
   140  func TestHandler_XhrStreaming(t *testing.T) {
   141  	h := newTestHandler()
   142  	rw := newClosableRecorder()
   143  	req, _ := http.NewRequest("POST", "/server/session/xhr_streaming", nil)
   144  	h.xhrStreaming(rw, req)
   145  	expectedBody := strings.Repeat("h", 2048) + "\no\n"
   146  	if rw.Body.String() != expectedBody {
   147  		t.Errorf("Unexpected body, got '%s' expected '%s'", rw.Body, expectedBody)
   148  	}
   149  }
   150  
   151  func TestHandler_XhrStreamingAnotherReceiver(t *testing.T) {
   152  	h := newTestHandler()
   153  	h.options.ResponseLimit = 4096
   154  	rw1 := newClosableRecorder()
   155  	req, _ := http.NewRequest("POST", "/server/session/xhr_streaming", nil)
   156  	go func() {
   157  		rec := httptest.NewRecorder()
   158  		h.xhrStreaming(rec, req)
   159  		expectedBody := strings.Repeat("h", 2048) + "\n" + "c[2010,\"Another connection still open\"]\n"
   160  		if rec.Body.String() != expectedBody {
   161  			t.Errorf("Unexpected body got '%s', expected '%s', ", rec.Body, expectedBody)
   162  		}
   163  		close(rw1.closeNotifCh)
   164  	}()
   165  	h.xhrStreaming(rw1, req)
   166  }
   167  
   168  // various test only structs
   169  func newTestHandler() *handler {
   170  	h := &handler{sessions: make(map[string]*session)}
   171  	h.options.HeartbeatDelay = time.Hour
   172  	h.options.DisconnectDelay = time.Hour
   173  	return h
   174  }
   175  
   176  type ClosableRecorder struct {
   177  	*httptest.ResponseRecorder
   178  	closeNotifCh chan bool
   179  }
   180  
   181  func newClosableRecorder() *ClosableRecorder {
   182  	return &ClosableRecorder{httptest.NewRecorder(), make(chan bool)}
   183  }
   184  
   185  func (cr *ClosableRecorder) CloseNotify() <-chan bool { return cr.closeNotifCh }