From 133a62dd116c0c08e7b222cbc027167e8d89e0df Mon Sep 17 00:00:00 2001 From: Justin Israel Date: Wed, 28 Feb 2018 15:07:50 +1300 Subject: [PATCH] Add test for recovery of broken pipe (#1089) --- recovery_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/recovery_test.go b/recovery_test.go index de3b62a5..df69a483 100644 --- a/recovery_test.go +++ b/recovery_test.go @@ -6,6 +6,9 @@ package gin import ( "bytes" + "net" + "os" + "syscall" "testing" "github.com/stretchr/testify/assert" @@ -41,3 +44,38 @@ func TestPanicWithAbort(t *testing.T) { // TEST assert.Equal(t, 400, w.Code) } + +// TestPanicWithBrokenPipe asserts that recovery specifically handles +// writting responses to broken pipes +func TestPanicWithBrokenPipe(t *testing.T) { + const expectCode = 204 + + expectMsgs := map[syscall.Errno]string{ + syscall.EPIPE: "broken pipe", + syscall.ECONNRESET: "connection reset", + } + + for errno, expectMsg := range expectMsgs { + t.Run(expectMsg, func(t *testing.T) { + + var buf bytes.Buffer + + router := New() + router.Use(RecoveryWithWriter(&buf)) + router.GET("/recovery", func(c *Context) { + // Start writting response + c.Header("X-Test", "Value") + c.Status(expectCode) + + // Oops. Client connection closed + e := &net.OpError{Err: &os.SyscallError{Err: errno}} + panic(e) + }) + // RUN + w := performRequest(router, "GET", "/recovery") + // TEST + assert.Equal(t, expectCode, w.Code) + assert.Contains(t, buf.String(), expectMsg) + }) + } +}