func TestLoggerAndPanic(t *testing.T) { kami.Reset() // test logger with panic status := 0 kami.LogHandler = func(ctx context.Context, w mutil.WriterProxy, r *http.Request) { status = w.Status() } kami.PanicHandler = kami.HandlerFunc(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { err := kami.Exception(ctx) if err != "test panic" { t.Error("unexpected exception:", err) } w.WriteHeader(http.StatusServiceUnavailable) }) kami.Post("/test", func(ctx context.Context, w http.ResponseWriter, r *http.Request) { panic("test panic") }) kami.Put("/ok", func(ctx context.Context, w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) expectResponseCode(t, "POST", "/test", http.StatusServiceUnavailable) if status != http.StatusServiceUnavailable { t.Error("log handler received wrong status code", status, "≠", http.StatusServiceUnavailable) } // test loggers without panics expectResponseCode(t, "PUT", "/ok", http.StatusOK) if status != http.StatusOK { t.Error("log handler received wrong status code", status, "≠", http.StatusOK) } }
func TestPanickingLogger(t *testing.T) { kami.Reset() kami.LogHandler = func(ctx context.Context, w mutil.WriterProxy, r *http.Request) { t.Log("log handler") panic("test panic") } kami.PanicHandler = kami.HandlerFunc(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { t.Log("panic handler") err := kami.Exception(ctx) if err != "test panic" { t.Error("unexpected exception:", err) } w.WriteHeader(500) w.Write([]byte("error 500")) }) kami.Post("/test", noop) resp := httptest.NewRecorder() req, err := http.NewRequest("POST", "/test", nil) if err != nil { t.Fatal(err) } kami.Handler().ServeHTTP(resp, req) if resp.Code != 500 { t.Error("should return HTTP 500", resp.Code, "≠", 500) } }
func TestLoggerAndPanic(t *testing.T) { kami.Reset() // test logger with panic status := 0 kami.LogHandler = func(ctx context.Context, w mutil.WriterProxy, r *http.Request) { status = w.Status() } kami.PanicHandler = kami.HandlerFunc(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { err := kami.Exception(ctx) if err != "test panic" { t.Error("unexpected exception:", err) } w.WriteHeader(500) w.Write([]byte("error 500")) }) kami.Post("/test", func(ctx context.Context, w http.ResponseWriter, r *http.Request) { panic("test panic") }) kami.Put("/ok", func(ctx context.Context, w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }) resp := httptest.NewRecorder() req, err := http.NewRequest("POST", "/test", nil) if err != nil { t.Fatal(err) } kami.Handler().ServeHTTP(resp, req) if resp.Code != 500 { t.Error("should return HTTP 500", resp.Code, "≠", 500) } if status != 500 { t.Error("should return HTTP 500", status, "≠", 500) } // test loggers without panics resp = httptest.NewRecorder() req, err = http.NewRequest("PUT", "/ok", nil) if err != nil { t.Fatal(err) } kami.Handler().ServeHTTP(resp, req) if resp.Code != 200 { t.Error("should return HTTP 200", resp.Code, "≠", 200) } if status != 200 { t.Error("should return HTTP 200", status, "≠", 200) } }
func panicSendAirbrake(ctx context.Context, req *http.Request) { exception := kami.Exception(ctx) log.Println("ERROR:", exception) log.Println("ERROR:", string(debug.Stack())) defer func() { if err := recover(); err != nil { log.Println("ERROR:", err) } }() rollbar.RequestError(rollbar.ERR, req, fmt.Errorf("%s", exception)) }
func panicSendAirbrake(ctx context.Context, req *http.Request) { exception := kami.Exception(ctx) log.Println("ERROR:", exception) log.Println("ERROR:", string(debug.Stack())) defer func() { if err := recover(); err != nil { log.Println("ERROR:", err) } }() err := airbrake.Notify(exception, req) if err != nil { log.Println("ERROR:", "airbrake send error: %s (request error: %s)", err, exception) } }
func TestPanickingLogger(t *testing.T) { kami.Reset() kami.LogHandler = func(ctx context.Context, w mutil.WriterProxy, r *http.Request) { t.Log("log handler") panic("test panic") } kami.PanicHandler = kami.HandlerFunc(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { t.Log("panic handler") err := kami.Exception(ctx) if err != "test panic" { t.Error("unexpected exception:", err) } w.WriteHeader(http.StatusServiceUnavailable) w.Write([]byte("error 503")) }) kami.Post("/test", noop) expectResponseCode(t, "POST", "/test", http.StatusServiceUnavailable) }