gcs_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package gcs
  2. import (
  3. "fmt"
  4. "net"
  5. "net/http"
  6. "testing"
  7. "github.com/fsouza/fake-gcs-server/fakestorage"
  8. "github.com/stretchr/testify/require"
  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. }
  30. func (s *GCSTestSuite) SetupSuite() {
  31. noAuth = true
  32. // s.etag = "testetag"
  33. port, err := getFreePort()
  34. require.Nil(s.T(), err)
  35. s.server, err = fakestorage.NewServerWithOptions(fakestorage.Options{
  36. Scheme: "http",
  37. Port: uint16(port),
  38. PublicHost: fmt.Sprintf("localhost:%d", port),
  39. InitialObjects: []fakestorage.Object{
  40. {
  41. ObjectAttrs: fakestorage.ObjectAttrs{
  42. BucketName: "test",
  43. Name: "foo/test.png",
  44. // Etag: s.etag,
  45. },
  46. Content: make([]byte, 32),
  47. },
  48. },
  49. })
  50. require.Nil(s.T(), err)
  51. obj, err := s.server.GetObject("test", "foo/test.png")
  52. require.Nil(s.T(), err)
  53. s.etag = obj.Etag
  54. config.GCSEnabled = true
  55. config.GCSEndpoint = s.server.PublicURL() + "/storage/v1/"
  56. s.transport, err = New()
  57. require.Nil(s.T(), err)
  58. }
  59. func (s *GCSTestSuite) TearDownSuite() {
  60. s.server.Stop()
  61. }
  62. func (s *GCSTestSuite) TestRoundTripWithETagDisabledReturns200() {
  63. config.ETagEnabled = false
  64. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  65. response, err := s.transport.RoundTrip(request)
  66. require.Nil(s.T(), err)
  67. require.Equal(s.T(), 200, response.StatusCode)
  68. }
  69. func (s *GCSTestSuite) TestRoundTripWithETagEnabled() {
  70. config.ETagEnabled = true
  71. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  72. response, err := s.transport.RoundTrip(request)
  73. require.Nil(s.T(), err)
  74. require.Equal(s.T(), 200, response.StatusCode)
  75. require.Equal(s.T(), s.etag, response.Header.Get("ETag"))
  76. }
  77. func (s *GCSTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  78. config.ETagEnabled = true
  79. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  80. request.Header.Set("If-None-Match", s.etag)
  81. response, err := s.transport.RoundTrip(request)
  82. require.Nil(s.T(), err)
  83. require.Equal(s.T(), http.StatusNotModified, response.StatusCode)
  84. }
  85. func (s *GCSTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  86. config.ETagEnabled = true
  87. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  88. request.Header.Set("If-None-Match", s.etag+"_wrong")
  89. response, err := s.transport.RoundTrip(request)
  90. require.Nil(s.T(), err)
  91. require.Equal(s.T(), http.StatusOK, response.StatusCode)
  92. }
  93. func TestGCSTransport(t *testing.T) {
  94. suite.Run(t, new(GCSTestSuite))
  95. }