X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/cc8174aca759773fa661bd9172f877b2d639576b..7db3ceda16742b65d73ebbc05d02351a5e0496bd:/sdk/go/httpserver/logger_test.go?ds=sidebyside diff --git a/sdk/go/httpserver/logger_test.go b/sdk/go/httpserver/logger_test.go index 3b2bc77580..eb71fcd814 100644 --- a/sdk/go/httpserver/logger_test.go +++ b/sdk/go/httpserver/logger_test.go @@ -8,6 +8,7 @@ import ( "bytes" "context" "encoding/json" + "fmt" "net/http" "net/http/httptest" "testing" @@ -24,17 +25,23 @@ func Test(t *testing.T) { var _ = check.Suite(&Suite{}) -type Suite struct{} +type Suite struct { + ctx context.Context + log *logrus.Logger + logdata *bytes.Buffer +} -func (s *Suite) TestLogRequests(c *check.C) { - captured := &bytes.Buffer{} - log := logrus.New() - log.Out = captured - log.Formatter = &logrus.JSONFormatter{ +func (s *Suite) SetUpTest(c *check.C) { + s.logdata = bytes.NewBuffer(nil) + s.log = logrus.New() + s.log.Out = s.logdata + s.log.Formatter = &logrus.JSONFormatter{ TimestampFormat: time.RFC3339Nano, } - ctx := ctxlog.Context(context.Background(), log) + s.ctx = ctxlog.Context(context.Background(), s.log) +} +func (s *Suite) TestLogRequests(c *check.C) { h := AddRequestIDs(LogRequests( http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { w.Write([]byte("hello world")) @@ -45,9 +52,9 @@ func (s *Suite) TestLogRequests(c *check.C) { c.Assert(err, check.IsNil) resp := httptest.NewRecorder() - HandlerWithContext(ctx, h).ServeHTTP(resp, req) + HandlerWithContext(s.ctx, h).ServeHTTP(resp, req) - dec := json.NewDecoder(captured) + dec := json.NewDecoder(s.logdata) gotReq := make(map[string]interface{}) err = dec.Decode(&gotReq) @@ -72,3 +79,46 @@ func (s *Suite) TestLogRequests(c *check.C) { c.Check(gotResp[key].(float64), check.Not(check.Equals), float64(0)) } } + +func (s *Suite) TestLogErrorBody(c *check.C) { + dec := json.NewDecoder(s.logdata) + + for _, trial := range []struct { + label string + statusCode int + sentBody string + expectLog bool + expectBody string + }{ + {"ok", 200, "hello world", false, ""}, + {"redir", 302, "redir", false, ""}, + {"4xx short body", 400, "oops", true, "oops"}, + {"4xx long body", 400, fmt.Sprintf("%0*d", sniffBytes*2, 1), true, fmt.Sprintf("%0*d", sniffBytes, 0)}, + {"5xx empty body", 500, "", true, ""}, + } { + comment := check.Commentf("in trial: %q", trial.label) + + req, err := http.NewRequest("GET", "https://foo.example/bar", nil) + c.Assert(err, check.IsNil) + resp := httptest.NewRecorder() + + HandlerWithContext(s.ctx, LogRequests( + http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.WriteHeader(trial.statusCode) + w.Write([]byte(trial.sentBody)) + }), + )).ServeHTTP(resp, req) + + gotReq := make(map[string]interface{}) + err = dec.Decode(&gotReq) + c.Logf("%#v", gotReq) + gotResp := make(map[string]interface{}) + err = dec.Decode(&gotResp) + c.Logf("%#v", gotResp) + if trial.expectLog { + c.Check(gotResp["respBody"], check.Equals, trial.expectBody, comment) + } else { + c.Check(gotResp["respBody"], check.IsNil, comment) + } + } +}