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 }