gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package context
  4. import (
  5. "fmt"
  6. "net/http"
  7. "net/url"
  8. "testing"
  9. "time"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. type testAccessLoggerMock struct {
  15. logs []string
  16. }
  17. func (t *testAccessLoggerMock) Log(skip int, event *log.Event, format string, v ...any) {
  18. t.logs = append(t.logs, fmt.Sprintf(format, v...))
  19. }
  20. func (t *testAccessLoggerMock) GetLevel() log.Level {
  21. return log.INFO
  22. }
  23. type testAccessLoggerResponseWriterMock struct{}
  24. func (t testAccessLoggerResponseWriterMock) Header() http.Header {
  25. return nil
  26. }
  27. func (t testAccessLoggerResponseWriterMock) Before(f func(ResponseWriter)) {}
  28. func (t testAccessLoggerResponseWriterMock) WriteHeader(statusCode int) {}
  29. func (t testAccessLoggerResponseWriterMock) Write(bytes []byte) (int, error) {
  30. return 0, nil
  31. }
  32. func (t testAccessLoggerResponseWriterMock) Flush() {}
  33. func (t testAccessLoggerResponseWriterMock) WrittenStatus() int {
  34. return http.StatusOK
  35. }
  36. func (t testAccessLoggerResponseWriterMock) WrittenSize() int {
  37. return 123123
  38. }
  39. func TestAccessLogger(t *testing.T) {
  40. setting.Log.AccessLogTemplate = `{{.Ctx.RemoteHost}} - {{.Identity}} {{.Start.Format "[02/Jan/2006:15:04:05 -0700]" }} "{{.Ctx.Req.Method}} {{.Ctx.Req.URL.RequestURI}} {{.Ctx.Req.Proto}}" {{.ResponseWriter.Status}} {{.ResponseWriter.Size}} "{{.Ctx.Req.Referer}}" "{{.Ctx.Req.UserAgent}}"`
  41. recorder := newAccessLogRecorder()
  42. mockLogger := &testAccessLoggerMock{}
  43. recorder.logger = mockLogger
  44. req := &http.Request{
  45. RemoteAddr: "remote-addr",
  46. Method: http.MethodGet,
  47. Proto: "https",
  48. URL: &url.URL{Path: "/path"},
  49. }
  50. req.Header = http.Header{}
  51. req.Header.Add("Referer", "referer")
  52. req.Header.Add("User-Agent", "user-agent")
  53. recorder.record(time.Date(2000, 1, 2, 3, 4, 5, 0, time.UTC), &testAccessLoggerResponseWriterMock{}, req)
  54. assert.Equal(t, []string{`remote-addr - - [02/Jan/2000:03:04:05 +0000] "GET /path https" 200 123123 "referer" "user-agent"`}, mockLogger.logs)
  55. }