gcs_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. config.GCSEnabled = true
  52. config.GCSEndpoint = s.server.PublicURL() + "/storage/v1/"
  53. s.transport, err = New()
  54. require.Nil(s.T(), err)
  55. }
  56. func (s *GCSTestSuite) TearDownSuite() {
  57. s.server.Stop()
  58. }
  59. func (s *GCSTestSuite) TestRoundTripWithETagDisabledReturns200() {
  60. config.ETagEnabled = false
  61. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  62. response, err := s.transport.RoundTrip(request)
  63. require.Nil(s.T(), err)
  64. require.Equal(s.T(), 200, response.StatusCode)
  65. }
  66. func (s *GCSTestSuite) TestRoundTripWithETagEnabled() {
  67. config.ETagEnabled = true
  68. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  69. response, err := s.transport.RoundTrip(request)
  70. require.Nil(s.T(), err)
  71. require.Equal(s.T(), 200, response.StatusCode)
  72. require.Equal(s.T(), s.etag, response.Header.Get("ETag"))
  73. }
  74. func (s *GCSTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  75. config.ETagEnabled = true
  76. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  77. request.Header.Set("If-None-Match", s.etag)
  78. response, err := s.transport.RoundTrip(request)
  79. require.Nil(s.T(), err)
  80. require.Equal(s.T(), http.StatusNotModified, response.StatusCode)
  81. }
  82. func (s *GCSTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  83. config.ETagEnabled = true
  84. request, _ := http.NewRequest("GET", "gcs://test/foo/test.png", nil)
  85. request.Header.Set("If-None-Match", s.etag+"_wrong")
  86. response, err := s.transport.RoundTrip(request)
  87. require.Nil(s.T(), err)
  88. require.Equal(s.T(), http.StatusOK, response.StatusCode)
  89. }
  90. func TestGCSTransport(t *testing.T) {
  91. suite.Run(t, new(GCSTestSuite))
  92. }