blob: b54e85612065c71c8af023ce640151fb07c6ef22 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package sse
import (
"bytes"
"net/http"
"net/http/httptest"
"testing"
"time"
)
func ExampleStart() {
http.HandleFunc("/example/startsse", func(w http.ResponseWriter, r *http.Request) {
err := Start(w, r)
if err != nil {
w.WriteHeader(http.StatusNotFound)
return
}
ticker := time.NewTicker(time.Second)
for {
select {
case <-ticker.C:
helloWorld := &Event{Data: []byte("hello world")}
helloWorld.WriteTo(w)
case <-r.Context().Done():
ticker.Stop()
return
}
}
})
}
func TestStart_ErrNotAcceptable(t *testing.T) {
w := httptest.NewRecorder()
r, _ := http.NewRequest("GET", "/", nil)
err := Start(w, r)
if err != ErrNotAcceptable {
t.Fatalf("expected ErrNotAcceptable, got %#v", err)
}
w = httptest.NewRecorder()
r.Header.Set("Accept", "text/event-stream")
err = Start(w, r)
if err != nil {
t.Fatalf("unexpected error: %#v", err)
}
}
func TestStart_SetsHeaders(t *testing.T) {
w := httptest.NewRecorder()
r, _ := http.NewRequest("GET", "/", nil)
r.Header.Set("Accept", "text/event-stream")
err := Start(w, r)
if err != nil {
t.Fatalf("unexpected error: %#v", err)
}
var headers = map[string]string{
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"X-Accel-Buffering": "no",
}
for k, v := range headers {
g := w.Header().Get(k)
if g != v {
t.Errorf("expected %s to be %q, got %q", k, v, g)
}
}
}
func TestStart_Writes200(t *testing.T) {
w := httptest.NewRecorder()
r, _ := http.NewRequest("GET", "/", nil)
r.Header.Set("Accept", "text/event-stream")
err := Start(w, r)
if err != nil {
t.Fatalf("unexpected error: %#v", err)
}
if w.Code != 200 {
t.Fatalf("expected 200, got %d", w.Code)
}
}
func TestStart_Flushed(t *testing.T) {
w := httptest.NewRecorder()
r, _ := http.NewRequest("GET", "/", nil)
r.Header.Set("Accept", "text/event-stream")
err := Start(w, r)
if err != nil {
t.Fatalf("unexpected error: %#v", err)
}
if !w.Flushed {
t.Fatal("expected connection to be flushed")
}
}
func TestWrite(t *testing.T) {
w := httptest.NewRecorder()
r, _ := http.NewRequest("GET", "/", nil)
r.Header.Set("Accept", "text/event-stream")
err := Start(w, r)
if err != nil {
t.Fatalf("unexpected error: %#v", err)
}
if !w.Flushed {
t.Fatal("expected connection to be flushed")
}
w.Flushed = false
Write(w, &Event{Data: []byte("test")})
if !w.Flushed {
t.Fatal("Write failed to flush")
}
if w.Body.String() != "data: test\n\n" {
t.Fatalf("expected %q, got %q", "data: test\n\n", w.Body.String())
}
}
func TestClientServer(t *testing.T) {
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
err := Start(w, r)
if err != nil {
w.WriteHeader(http.StatusNotFound)
return
}
Write(w, &Event{Data: []byte("hello world")})
}))
defer s.Close()
defer s.CloseClientConnections()
req, err := http.NewRequest("GET", s.URL, nil)
if err != nil {
t.Fatal(err)
}
req.Header.Set("Accept", "text/event-stream")
res, err := s.Client().Do(req)
if err != nil {
t.Fatal(err)
}
cli, err := New(res)
if err != nil {
t.Fatal(err)
}
e, err := cli.ReadEvent()
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(e.Data, []byte("hello world")) {
t.Fatal("unexpected event data")
}
}