// +build !go1.3 package graceful import ( "net/http" "sync/atomic" "testing" ) type fakeWriter http.Header func (f fakeWriter) Header() http.Header { return http.Header(f) } func (f fakeWriter) Write(buf []byte) (int, error) { return len(buf), nil } func (f fakeWriter) WriteHeader(status int) {} func testClose(t *testing.T, h http.Handler, expectClose bool) { m := middleware(h) r, _ := http.NewRequest("GET", "/", nil) w := make(fakeWriter) m.ServeHTTP(w, r) c, ok := w["Connection"] if expectClose { if !ok || len(c) != 1 || c[0] != "close" { t.Fatal("Expected 'Connection: close'") } } else { if ok { t.Fatal("Did not expect Connection header") } } } func TestNormal(t *testing.T) { atomic.StoreInt32(&closing, 0) h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte{}) }) testClose(t, h, false) } func TestClose(t *testing.T) { atomic.StoreInt32(&closing, 0) h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { atomic.StoreInt32(&closing, 1) }) testClose(t, h, true) } func TestCloseWriteHeader(t *testing.T) { atomic.StoreInt32(&closing, 0) h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { atomic.StoreInt32(&closing, 1) w.WriteHeader(200) }) testClose(t, h, true) } func TestCloseWrite(t *testing.T) { atomic.StoreInt32(&closing, 0) h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { atomic.StoreInt32(&closing, 1) w.Write([]byte{}) }) testClose(t, h, true) }