/
handler_test.go
127 lines (117 loc) · 3.73 KB
/
handler_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package sockjs
import (
"encoding/json"
"io/ioutil"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"time"
)
var testOptions = DefaultOptions
func init() {
testOptions.RawWebsocket = true
}
func TestHandler_Create(t *testing.T) {
handler := newHandler("/echo", testOptions, nil)
if handler.Prefix() != "/echo" {
t.Errorf("Prefix not properly set, got '%s' expected '%s'", handler.Prefix(), "/echo")
}
if handler.sessions == nil {
t.Errorf("Handler session map not made")
}
server := httptest.NewServer(handler)
defer server.Close()
resp, err := http.Get(server.URL + "/echo")
if err != nil {
t.Errorf("There should not be any error, got '%s'", err)
t.FailNow()
}
if resp == nil {
t.Errorf("Response should not be nil")
t.FailNow()
}
if resp.StatusCode != http.StatusOK {
t.Errorf("Unexpected status code receiver, got '%d' expected '%d'", resp.StatusCode, http.StatusOK)
}
}
func TestHandler_RootPrefixInfoHandler(t *testing.T) {
handler := newHandler("", testOptions, nil)
if handler.Prefix() != "" {
t.Errorf("Prefix not properly set, got '%s' expected '%s'", handler.Prefix(), "")
}
server := httptest.NewServer(handler)
defer server.Close()
resp, err := http.Get(server.URL + "/info")
if err != nil {
t.Errorf("There should not be any error, got '%s'", err)
t.FailNow()
}
if resp == nil {
t.Errorf("Response should not be nil")
t.FailNow()
}
if resp.StatusCode != http.StatusOK {
t.Errorf("Unexpected status code receiver, got '%d' expected '%d'", resp.StatusCode, http.StatusOK)
}
infoData, err := ioutil.ReadAll(resp.Body)
if err != nil {
t.Errorf("Error reading body: '%v'", err)
}
var i info
err = json.Unmarshal(infoData, &i)
if err != nil {
t.Fatalf("Error unmarshaling info: '%v', data was: '%s'", err, string(infoData))
}
if i.Websocket != true {
t.Fatalf("Expected websocket to be true")
}
}
func TestHandler_ParseSessionId(t *testing.T) {
h := handler{prefix: "/prefix"}
url, _ := url.Parse("http://server:80/prefix/server/session/whatever")
if session, err := h.parseSessionID(url); session != "session" || err != nil {
t.Errorf("Wrong session parsed, got '%s' expected '%s' with error = '%v'", session, "session", err)
}
url, _ = url.Parse("http://server:80/asdasd/server/session/whatever")
if _, err := h.parseSessionID(url); err == nil {
t.Errorf("Should return error")
}
}
func TestHandler_SessionByRequest(t *testing.T) {
h := newHandler("", testOptions, nil)
h.options.DisconnectDelay = 10 * time.Millisecond
var handlerFuncCalled = make(chan Session)
h.handlerFunc = func(conn Session) { handlerFuncCalled <- conn }
req, _ := http.NewRequest("POST", "/server/sessionid/whatever/follows", nil)
sess, err := h.sessionByRequest(req)
if sess == nil || err != nil {
t.Errorf("Session should be returned")
// test handlerFunc was called
select {
case conn := <-handlerFuncCalled: // ok
if conn != sess {
t.Errorf("Handler was not passed correct session")
}
case <-time.After(100 * time.Millisecond):
t.Errorf("HandlerFunc was not called")
}
}
// test session is reused for multiple requests with same sessionID
req2, _ := http.NewRequest("POST", "/server/sessionid/whatever", nil)
if sess2, err := h.sessionByRequest(req2); sess2 != sess || err != nil {
t.Errorf("Expected error, got session: '%v'", sess)
}
// test session expires after timeout
time.Sleep(15 * time.Millisecond)
h.sessionsMux.Lock()
if _, exists := h.sessions["sessionid"]; exists {
t.Errorf("Session should not exist in handler after timeout")
}
h.sessionsMux.Unlock()
// test proper behaviour in case URL is not correct
req, _ = http.NewRequest("POST", "", nil)
if _, err := h.sessionByRequest(req); err == nil {
t.Errorf("Expected parser sessionID from URL error, got 'nil'")
}
}