sse_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
  2. // Use of this source code is governed by a MIT style
  3. // license that can be found in the LICENSE file.
  4. package sse
  5. import (
  6. "bytes"
  7. "net/http/httptest"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestEncodeOnlyData(t *testing.T) {
  12. w := new(bytes.Buffer)
  13. event := Event{
  14. Data: "junk\n\njk\nid:fake",
  15. }
  16. err := Encode(w, event)
  17. assert.NoError(t, err)
  18. assert.Equal(t, w.String(),
  19. `data:junk
  20. data:
  21. data:jk
  22. data:id:fake
  23. `)
  24. decoded, _ := Decode(w)
  25. assert.Equal(t, decoded, []Event{event})
  26. }
  27. func TestEncodeWithEvent(t *testing.T) {
  28. w := new(bytes.Buffer)
  29. event := Event{
  30. Event: "t\n:<>\r\test",
  31. Data: "junk\n\njk\nid:fake",
  32. }
  33. err := Encode(w, event)
  34. assert.NoError(t, err)
  35. assert.Equal(t, w.String(),
  36. `event:t\n:<>\r est
  37. data:junk
  38. data:
  39. data:jk
  40. data:id:fake
  41. `)
  42. decoded, _ := Decode(w)
  43. assert.Equal(t, decoded, []Event{event})
  44. }
  45. func TestEncodeWithId(t *testing.T) {
  46. w := new(bytes.Buffer)
  47. err := Encode(w, Event{
  48. Id: "t\n:<>\r\test",
  49. Data: "junk\n\njk\nid:fa\rke",
  50. })
  51. assert.NoError(t, err)
  52. assert.Equal(t, w.String(),
  53. `id:t\n:<>\r est
  54. data:junk
  55. data:
  56. data:jk
  57. data:id:fa\rke
  58. `)
  59. }
  60. func TestEncodeWithRetry(t *testing.T) {
  61. w := new(bytes.Buffer)
  62. err := Encode(w, Event{
  63. Retry: 11,
  64. Data: "junk\n\njk\nid:fake\n",
  65. })
  66. assert.NoError(t, err)
  67. assert.Equal(t, w.String(),
  68. `retry:11
  69. data:junk
  70. data:
  71. data:jk
  72. data:id:fake
  73. data:
  74. `)
  75. }
  76. func TestEncodeWithEverything(t *testing.T) {
  77. w := new(bytes.Buffer)
  78. err := Encode(w, Event{
  79. Event: "abc",
  80. Id: "12345",
  81. Retry: 10,
  82. Data: "some data",
  83. })
  84. assert.NoError(t, err)
  85. assert.Equal(t, w.String(), "id:12345\nevent:abc\nretry:10\ndata:some data\n\n")
  86. }
  87. func TestEncodeMap(t *testing.T) {
  88. w := new(bytes.Buffer)
  89. err := Encode(w, Event{
  90. Event: "a map",
  91. Data: map[string]interface{}{
  92. "foo": "b\n\rar",
  93. "bar": "id: 2",
  94. },
  95. })
  96. assert.NoError(t, err)
  97. assert.Equal(t, w.String(), "event:a map\ndata:{\"bar\":\"id: 2\",\"foo\":\"b\\n\\rar\"}\n\n")
  98. }
  99. func TestEncodeSlice(t *testing.T) {
  100. w := new(bytes.Buffer)
  101. err := Encode(w, Event{
  102. Event: "a slice",
  103. Data: []interface{}{1, "text", map[string]interface{}{"foo": "bar"}},
  104. })
  105. assert.NoError(t, err)
  106. assert.Equal(t, w.String(), "event:a slice\ndata:[1,\"text\",{\"foo\":\"bar\"}]\n\n")
  107. }
  108. func TestEncodeStruct(t *testing.T) {
  109. myStruct := struct {
  110. A int
  111. B string `json:"value"`
  112. }{1, "number"}
  113. w := new(bytes.Buffer)
  114. err := Encode(w, Event{
  115. Event: "a struct",
  116. Data: myStruct,
  117. })
  118. assert.NoError(t, err)
  119. assert.Equal(t, w.String(), "event:a struct\ndata:{\"A\":1,\"value\":\"number\"}\n\n")
  120. w.Reset()
  121. err = Encode(w, Event{
  122. Event: "a struct",
  123. Data: &myStruct,
  124. })
  125. assert.NoError(t, err)
  126. assert.Equal(t, w.String(), "event:a struct\ndata:{\"A\":1,\"value\":\"number\"}\n\n")
  127. }
  128. func TestEncodeInteger(t *testing.T) {
  129. w := new(bytes.Buffer)
  130. err := Encode(w, Event{
  131. Event: "an integer",
  132. Data: 1,
  133. })
  134. assert.NoError(t, err)
  135. assert.Equal(t, w.String(), "event:an integer\ndata:1\n\n")
  136. }
  137. func TestEncodeFloat(t *testing.T) {
  138. w := new(bytes.Buffer)
  139. err := Encode(w, Event{
  140. Event: "Float",
  141. Data: 1.5,
  142. })
  143. assert.NoError(t, err)
  144. assert.Equal(t, w.String(), "event:Float\ndata:1.5\n\n")
  145. }
  146. func TestEncodeStream(t *testing.T) {
  147. w := new(bytes.Buffer)
  148. Encode(w, Event{
  149. Event: "float",
  150. Data: 1.5,
  151. })
  152. Encode(w, Event{
  153. Id: "123",
  154. Data: map[string]interface{}{"foo": "bar", "bar": "foo"},
  155. })
  156. Encode(w, Event{
  157. Id: "124",
  158. Event: "chat",
  159. Data: "hi! dude",
  160. })
  161. assert.Equal(t, w.String(), "event:float\ndata:1.5\n\nid:123\ndata:{\"bar\":\"foo\",\"foo\":\"bar\"}\n\nid:124\nevent:chat\ndata:hi! dude\n\n")
  162. }
  163. func TestRenderSSE(t *testing.T) {
  164. w := httptest.NewRecorder()
  165. err := (Event{
  166. Event: "msg",
  167. Data: "hi! how are you?",
  168. }).Render(w)
  169. assert.NoError(t, err)
  170. assert.Equal(t, w.Body.String(), "event:msg\ndata:hi! how are you?\n\n")
  171. assert.Equal(t, w.Header().Get("Content-Type"), "text/event-stream")
  172. assert.Equal(t, w.Header().Get("Cache-Control"), "no-cache")
  173. }
  174. func BenchmarkResponseWriter(b *testing.B) {
  175. w := httptest.NewRecorder()
  176. b.ResetTimer()
  177. b.ReportAllocs()
  178. for i := 0; i < b.N; i++ {
  179. (Event{
  180. Event: "new_message",
  181. Data: "hi! how are you? I am fine. this is a long stupid message!!!",
  182. }).Render(w)
  183. }
  184. }
  185. func BenchmarkFullSSE(b *testing.B) {
  186. buf := new(bytes.Buffer)
  187. b.ResetTimer()
  188. b.ReportAllocs()
  189. for i := 0; i < b.N; i++ {
  190. Encode(buf, Event{
  191. Event: "new_message",
  192. Id: "13435",
  193. Retry: 10,
  194. Data: "hi! how are you? I am fine. this is a long stupid message!!!",
  195. })
  196. buf.Reset()
  197. }
  198. }
  199. func BenchmarkNoRetrySSE(b *testing.B) {
  200. buf := new(bytes.Buffer)
  201. b.ResetTimer()
  202. b.ReportAllocs()
  203. for i := 0; i < b.N; i++ {
  204. Encode(buf, Event{
  205. Event: "new_message",
  206. Id: "13435",
  207. Data: "hi! how are you? I am fine. this is a long stupid message!!!",
  208. })
  209. buf.Reset()
  210. }
  211. }
  212. func BenchmarkSimpleSSE(b *testing.B) {
  213. buf := new(bytes.Buffer)
  214. b.ResetTimer()
  215. b.ReportAllocs()
  216. for i := 0; i < b.N; i++ {
  217. Encode(buf, Event{
  218. Event: "new_message",
  219. Data: "hi! how are you? I am fine. this is a long stupid message!!!",
  220. })
  221. buf.Reset()
  222. }
  223. }