gcs_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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/fetcher/transport/generichttp"
  11. "github.com/imgproxy/imgproxy/v3/httpheaders"
  12. )
  13. func getFreePort() (int, error) {
  14. addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
  15. if err != nil {
  16. return 0, err
  17. }
  18. l, err := net.ListenTCP("tcp", addr)
  19. if err != nil {
  20. return 0, err
  21. }
  22. defer l.Close()
  23. return l.Addr().(*net.TCPAddr).Port, nil
  24. }
  25. type GCSTestSuite struct {
  26. suite.Suite
  27. server *fakestorage.Server
  28. transport http.RoundTripper
  29. etag string
  30. lastModified time.Time
  31. }
  32. func (s *GCSTestSuite) SetupSuite() {
  33. noAuth = true
  34. // s.etag = "testetag"
  35. s.lastModified, _ = time.Parse(http.TimeFormat, "Wed, 21 Oct 2015 07:28:00 GMT")
  36. port, err := getFreePort()
  37. s.Require().NoError(err)
  38. s.server, err = fakestorage.NewServerWithOptions(fakestorage.Options{
  39. Scheme: "http",
  40. Port: uint16(port),
  41. PublicHost: fmt.Sprintf("localhost:%d", port),
  42. InitialObjects: []fakestorage.Object{
  43. {
  44. ObjectAttrs: fakestorage.ObjectAttrs{
  45. BucketName: "test",
  46. Name: "foo/test.png",
  47. // Etag: s.etag,
  48. Updated: s.lastModified,
  49. },
  50. Content: make([]byte, 32),
  51. },
  52. },
  53. })
  54. s.Require().NoError(err)
  55. obj, err := s.server.GetObject("test", "foo/test.png")
  56. s.Require().NoError(err)
  57. s.etag = obj.Etag
  58. config := NewDefaultConfig()
  59. config.Endpoint = s.server.PublicURL() + "/storage/v1/"
  60. tc := generichttp.NewDefaultConfig()
  61. tc.IgnoreSslVerification = true
  62. trans, gerr := generichttp.New(false, &tc)
  63. s.Require().NoError(gerr)
  64. s.transport, err = New(&config, trans)
  65. s.Require().NoError(err)
  66. }
  67. func (s *GCSTestSuite) TearDownSuite() {
  68. s.server.Stop()
  69. }
  70. func (s *GCSTestSuite) TestRoundTripWithETagEnabled() {
  71. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  72. response, err := s.transport.RoundTrip(request)
  73. s.Require().NoError(err)
  74. s.Require().Equal(200, response.StatusCode)
  75. s.Require().Equal(s.etag, response.Header.Get(httpheaders.Etag))
  76. }
  77. func (s *GCSTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  78. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  79. request.Header.Set(httpheaders.IfNoneMatch, s.etag)
  80. response, err := s.transport.RoundTrip(request)
  81. s.Require().NoError(err)
  82. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  83. }
  84. func (s *GCSTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  85. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  86. request.Header.Set(httpheaders.IfNoneMatch, s.etag+"_wrong")
  87. response, err := s.transport.RoundTrip(request)
  88. s.Require().NoError(err)
  89. s.Require().Equal(http.StatusOK, response.StatusCode)
  90. }
  91. func (s *GCSTestSuite) TestRoundTripWithLastModifiedEnabled() {
  92. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  93. response, err := s.transport.RoundTrip(request)
  94. s.Require().NoError(err)
  95. s.Require().Equal(200, response.StatusCode)
  96. s.Require().Equal(s.lastModified.Format(http.TimeFormat), response.Header.Get(httpheaders.LastModified))
  97. }
  98. func (s *GCSTestSuite) TestRoundTripWithIfModifiedSinceReturns304() {
  99. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  100. request.Header.Set(httpheaders.IfModifiedSince, s.lastModified.Format(http.TimeFormat))
  101. response, err := s.transport.RoundTrip(request)
  102. s.Require().NoError(err)
  103. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  104. }
  105. func (s *GCSTestSuite) TestRoundTripWithUpdatedLastModifiedReturns200() {
  106. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  107. request.Header.Set(httpheaders.IfModifiedSince, s.lastModified.Add(-24*time.Hour).Format(http.TimeFormat))
  108. response, err := s.transport.RoundTrip(request)
  109. s.Require().NoError(err)
  110. s.Require().Equal(http.StatusOK, response.StatusCode)
  111. }
  112. func TestGCSTransport(t *testing.T) {
  113. suite.Run(t, new(GCSTestSuite))
  114. }