swift_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package swift
  2. import (
  3. "context"
  4. "io/ioutil"
  5. "net/http"
  6. "os"
  7. "path/filepath"
  8. "testing"
  9. "github.com/ncw/swift/v2"
  10. "github.com/ncw/swift/v2/swifttest"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/suite"
  13. "github.com/imgproxy/imgproxy/v3/config"
  14. )
  15. const (
  16. testContainer = "test"
  17. testObject = "foo/test.png"
  18. )
  19. type SwiftTestSuite struct {
  20. suite.Suite
  21. server *swifttest.SwiftServer
  22. transport http.RoundTripper
  23. etag string
  24. }
  25. func (s *SwiftTestSuite) SetupSuite() {
  26. s.server, _ = swifttest.NewSwiftServer("localhost")
  27. config.Reset()
  28. config.SwiftAuthURL = s.server.AuthURL
  29. config.SwiftUsername = swifttest.TEST_ACCOUNT
  30. config.SwiftAPIKey = swifttest.TEST_ACCOUNT
  31. config.SwiftAuthVersion = 1
  32. s.setupTestFile()
  33. var err error
  34. s.transport, err = New()
  35. assert.Nil(s.T(), err, "failed to initialize swift transport")
  36. }
  37. func (s *SwiftTestSuite) setupTestFile() {
  38. t := s.T()
  39. c := &swift.Connection{
  40. UserName: config.SwiftUsername,
  41. ApiKey: config.SwiftAPIKey,
  42. AuthUrl: config.SwiftAuthURL,
  43. AuthVersion: config.SwiftAuthVersion,
  44. }
  45. ctx := context.Background()
  46. err := c.Authenticate(ctx)
  47. assert.Nil(t, err, "failed to authenticate with test server")
  48. err = c.ContainerCreate(ctx, testContainer, nil)
  49. assert.Nil(t, err, "failed to create container")
  50. f, err := c.ObjectCreate(ctx, testContainer, testObject, true, "", "image/png", nil)
  51. assert.Nil(t, err, "failed to create object")
  52. defer f.Close()
  53. wd, err := os.Getwd()
  54. assert.Nil(t, err)
  55. data, err := ioutil.ReadFile(filepath.Join(wd, "..", "..", "testdata", "test1.png"))
  56. assert.Nil(t, err, "failed to read testdata/test1.png")
  57. n, err := f.Write(data)
  58. assert.Equal(t, n, len(data))
  59. assert.Nil(t, err)
  60. f.Close()
  61. h, err := f.Headers()
  62. assert.Nil(t, err)
  63. s.etag = h["Etag"]
  64. }
  65. func (s *SwiftTestSuite) TearDownSuite() {
  66. s.server.Close()
  67. }
  68. func (s *SwiftTestSuite) TestRoundTripWithETagDisabledReturns200() {
  69. config.ETagEnabled = false
  70. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  71. response, err := s.transport.RoundTrip(request)
  72. assert.Nil(s.T(), err)
  73. assert.Equal(s.T(), 200, response.StatusCode)
  74. }
  75. func (s *SwiftTestSuite) TestRoundTripWithETagEnabled() {
  76. config.ETagEnabled = true
  77. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  78. response, err := s.transport.RoundTrip(request)
  79. assert.Nil(s.T(), err)
  80. assert.Equal(s.T(), 200, response.StatusCode)
  81. assert.Equal(s.T(), s.etag, response.Header.Get("ETag"))
  82. }
  83. func (s *SwiftTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  84. config.ETagEnabled = true
  85. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  86. request.Header.Set("If-None-Match", s.etag)
  87. response, err := s.transport.RoundTrip(request)
  88. assert.Nil(s.T(), err)
  89. assert.Equal(s.T(), http.StatusNotModified, response.StatusCode)
  90. }
  91. func (s *SwiftTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  92. config.ETagEnabled = true
  93. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  94. request.Header.Set("If-None-Match", s.etag+"_wrong")
  95. response, err := s.transport.RoundTrip(request)
  96. assert.Nil(s.T(), err)
  97. assert.Equal(s.T(), http.StatusOK, response.StatusCode)
  98. }
  99. func TestSwiftTransport(t *testing.T) {
  100. suite.Run(t, new(SwiftTestSuite))
  101. }