gcs_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package gcs
  2. import (
  3. "fmt"
  4. "net"
  5. "net/http"
  6. "testing"
  7. "time"
  8. "github.com/fsouza/fake-gcs-server/fakestorage"
  9. "github.com/stretchr/testify/suite"
  10. "github.com/imgproxy/imgproxy/v3/config"
  11. )
  12. func getFreePort() (int, error) {
  13. addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
  14. if err != nil {
  15. return 0, err
  16. }
  17. l, err := net.ListenTCP("tcp", addr)
  18. if err != nil {
  19. return 0, err
  20. }
  21. defer l.Close()
  22. return l.Addr().(*net.TCPAddr).Port, nil
  23. }
  24. type GCSTestSuite struct {
  25. suite.Suite
  26. server *fakestorage.Server
  27. transport http.RoundTripper
  28. etag string
  29. lastModified time.Time
  30. }
  31. func (s *GCSTestSuite) SetupSuite() {
  32. noAuth = true
  33. // s.etag = "testetag"
  34. s.lastModified, _ = time.Parse(http.TimeFormat, "Wed, 21 Oct 2015 07:28:00 GMT")
  35. port, err := getFreePort()
  36. s.Require().NoError(err)
  37. s.server, err = fakestorage.NewServerWithOptions(fakestorage.Options{
  38. Scheme: "http",
  39. Port: uint16(port),
  40. PublicHost: fmt.Sprintf("localhost:%d", port),
  41. InitialObjects: []fakestorage.Object{
  42. {
  43. ObjectAttrs: fakestorage.ObjectAttrs{
  44. BucketName: "test",
  45. Name: "foo/test.png",
  46. // Etag: s.etag,
  47. Updated: s.lastModified,
  48. },
  49. Content: make([]byte, 32),
  50. },
  51. },
  52. })
  53. s.Require().NoError(err)
  54. obj, err := s.server.GetObject("test", "foo/test.png")
  55. s.Require().NoError(err)
  56. s.etag = obj.Etag
  57. config.GCSEnabled = true
  58. config.GCSEndpoint = s.server.PublicURL() + "/storage/v1/"
  59. s.transport, err = New()
  60. s.Require().NoError(err)
  61. }
  62. func (s *GCSTestSuite) TearDownSuite() {
  63. s.server.Stop()
  64. }
  65. func (s *GCSTestSuite) TestRoundTripWithETagDisabledReturns200() {
  66. config.ETagEnabled = false
  67. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  68. response, err := s.transport.RoundTrip(request)
  69. s.Require().NoError(err)
  70. s.Require().Equal(200, response.StatusCode)
  71. }
  72. func (s *GCSTestSuite) TestRoundTripWithETagEnabled() {
  73. config.ETagEnabled = true
  74. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  75. response, err := s.transport.RoundTrip(request)
  76. s.Require().NoError(err)
  77. s.Require().Equal(200, response.StatusCode)
  78. s.Require().Equal(s.etag, response.Header.Get("ETag"))
  79. }
  80. func (s *GCSTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  81. config.ETagEnabled = true
  82. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  83. request.Header.Set("If-None-Match", s.etag)
  84. response, err := s.transport.RoundTrip(request)
  85. s.Require().NoError(err)
  86. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  87. }
  88. func (s *GCSTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  89. config.ETagEnabled = true
  90. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  91. request.Header.Set("If-None-Match", s.etag+"_wrong")
  92. response, err := s.transport.RoundTrip(request)
  93. s.Require().NoError(err)
  94. s.Require().Equal(http.StatusOK, response.StatusCode)
  95. }
  96. func (s *GCSTestSuite) TestRoundTripWithLastModifiedDisabledReturns200() {
  97. config.LastModifiedEnabled = false
  98. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  99. response, err := s.transport.RoundTrip(request)
  100. s.Require().NoError(err)
  101. s.Require().Equal(200, response.StatusCode)
  102. }
  103. func (s *GCSTestSuite) TestRoundTripWithLastModifiedEnabled() {
  104. config.LastModifiedEnabled = true
  105. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  106. response, err := s.transport.RoundTrip(request)
  107. s.Require().NoError(err)
  108. s.Require().Equal(200, response.StatusCode)
  109. s.Require().Equal(s.lastModified.Format(http.TimeFormat), response.Header.Get("Last-Modified"))
  110. }
  111. func (s *GCSTestSuite) TestRoundTripWithIfModifiedSinceReturns304() {
  112. config.LastModifiedEnabled = true
  113. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  114. request.Header.Set("If-Modified-Since", s.lastModified.Format(http.TimeFormat))
  115. response, err := s.transport.RoundTrip(request)
  116. s.Require().NoError(err)
  117. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  118. }
  119. func (s *GCSTestSuite) TestRoundTripWithUpdatedLastModifiedReturns200() {
  120. config.LastModifiedEnabled = true
  121. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  122. request.Header.Set("If-Modified-Sicne", s.lastModified.Add(-24*time.Hour).Format(http.TimeFormat))
  123. response, err := s.transport.RoundTrip(request)
  124. s.Require().NoError(err)
  125. s.Require().Equal(http.StatusOK, response.StatusCode)
  126. }
  127. func TestGCSTransport(t *testing.T) {
  128. suite.Run(t, new(GCSTestSuite))
  129. }