| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package middleware |
| |
| import ( |
| "fmt" |
| "net/http" |
| "net/http/httptest" |
| "testing" |
| |
| "golang.org/x/pkgsite/internal/config" |
| ) |
| |
| func TestErrorReporting(t *testing.T) { |
| tests := []struct { |
| code int |
| bypassHeader string |
| wantReports int |
| }{ |
| {500, "", 1}, |
| {404, "", 0}, |
| {200, "", 0}, |
| {503, "", 0}, |
| {550, "", 0}, |
| {500, "true", 0}, // set bypass header |
| {500, "false", 1}, |
| } |
| |
| for _, test := range tests { |
| t.Run(fmt.Sprintf("%d,%s", test.code, test.bypassHeader), func(t *testing.T) { |
| handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| if test.bypassHeader != "" { |
| w.Header().Set(config.BypassErrorReportingHeader, test.bypassHeader) |
| } |
| w.WriteHeader(test.code) |
| }) |
| fr := &fakeReporter{} |
| mw := ErrorReporting(fr) |
| ts := httptest.NewServer(mw(handler)) |
| resp, err := http.Get(ts.URL) |
| if err != nil { |
| t.Fatal(err) |
| } |
| resp.Body.Close() |
| if got := fr.reports; got != test.wantReports { |
| t.Errorf("Got %d reports, want %d", got, test.wantReports) |
| } |
| }) |
| } |
| } |
| |
| type fakeReporter struct { |
| reports int |
| } |
| |
| func (f *fakeReporter) Report(error, *http.Request, []byte) { |
| f.reports++ |
| } |