From 4785e489d55e4786a45533d749800060dd28f90b Mon Sep 17 00:00:00 2001 From: Alexandre Tuleu Date: Thu, 13 Aug 2015 10:43:01 +0200 Subject: [PATCH] Adds recovery test --- recovery_test.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 recovery_test.go diff --git a/recovery_test.go b/recovery_test.go new file mode 100644 index 0000000..0429ae6 --- /dev/null +++ b/recovery_test.go @@ -0,0 +1,73 @@ +package narco + +import ( + "bytes" + "log" + "net/http" + "net/http/httptest" + "strings" + + . "gopkg.in/check.v1" +) + +type RecovererSuite struct { + *NarcoSuite + + recov *Recoverer + buffer bytes.Buffer + rec *httptest.ResponseRecorder + req *http.Request + URL string +} + +var _ = Suite(&RecovererSuite{NarcoSuite: NewNarcoSuite()}) + +func (s *RecovererSuite) SetUpSuite(c *C) { + + s.recov = NewRecoverer() + s.recov.Logger = log.New(&s.buffer, "[narco] ", log.LstdFlags) + s.chain = s.chain.Append(s.recov.Wrap()) + + c.Assert(s.chain, NotNil) +} + +func (s *RecovererSuite) SetUpTest(c *C) { + s.buffer.Reset() + s.rec = httptest.NewRecorder() + var err error + s.URL = "http://" + httptest.DefaultRemoteAddr + "/" + s.req, err = http.NewRequest("GET", s.URL, nil) + c.Assert(err, IsNil, Commentf("Unexpected error :%s", err)) +} + +func (s *RecovererSuite) TestRecoversFromPanic(c *C) { + // this should not panic + defer func() { + err := recover() + c.Assert(err, IsNil, Commentf("It should not have panic: %s", err)) + }() + + s.ServeHTTP(s.rec, s.req, func(rw http.ResponseWriter, req *http.Request) { + panic("foo") + }) + + lines := strings.Split(s.buffer.String(), "\n") + + c.Assert(lines[0], Matches, `\[narco\] .* `+"PANIC: foo") + for i, l := range lines { + if i == 0 { + continue + } + matchString := "foo" + if i == 1 { + matchString = `goroutine [0-9]+ (\[running\])?:` + } else if i%2 == 0 { + //either function call, empty or created by line + matchString = `(.*\(.*\)|created by .*|)` + } else { + //function location, or + matchString = `\t(.*\.go|\):[0-9]+ .*` + } + c.Assert(l, Matches, matchString, Commentf("On line %d", i)) + } +}