etag_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package etag
  2. import (
  3. "io"
  4. "net/http"
  5. "os"
  6. "strings"
  7. "testing"
  8. "github.com/sirupsen/logrus"
  9. "github.com/stretchr/testify/suite"
  10. "github.com/imgproxy/imgproxy/v3/config"
  11. "github.com/imgproxy/imgproxy/v3/imagedata"
  12. "github.com/imgproxy/imgproxy/v3/options"
  13. )
  14. const (
  15. etagReq = `"yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y/RImxvcmVtaXBzdW1kb2xvciI"`
  16. etagData = `"yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y/D3t8wWhX4piqDCV4ZMEZsKvOaIO6onhKjbf9f-ZfYUV0"`
  17. )
  18. type EtagTestSuite struct {
  19. suite.Suite
  20. po *options.ProcessingOptions
  21. imgWithETag *imagedata.ImageData
  22. imgWithoutETag *imagedata.ImageData
  23. h Handler
  24. }
  25. func (s *EtagTestSuite) SetupSuite() {
  26. logrus.SetOutput(io.Discard)
  27. s.po = options.NewProcessingOptions()
  28. d, err := os.ReadFile("../testdata/test1.jpg")
  29. s.Require().NoError(err)
  30. imgWithETag, err := imagedata.NewFromBytes(d, http.Header{"ETag": []string{`"loremipsumdolor"`}})
  31. s.Require().NoError(err)
  32. imgWithoutETag, err := imagedata.NewFromBytes(d, make(http.Header))
  33. s.Require().NoError(err)
  34. s.imgWithETag = imgWithETag
  35. s.imgWithoutETag = imgWithoutETag
  36. }
  37. func (s *EtagTestSuite) TeardownSuite() {
  38. logrus.SetOutput(os.Stdout)
  39. }
  40. func (s *EtagTestSuite) SetupTest() {
  41. s.h = Handler{}
  42. config.Reset()
  43. }
  44. func (s *EtagTestSuite) TestGenerateActualReq() {
  45. s.h.SetActualProcessingOptions(s.po)
  46. s.h.SetActualImageData(s.imgWithETag)
  47. s.Require().Equal(etagReq, s.h.GenerateActualETag())
  48. }
  49. func (s *EtagTestSuite) TestGenerateActualData() {
  50. s.h.SetActualProcessingOptions(s.po)
  51. s.h.SetActualImageData(s.imgWithoutETag)
  52. s.Require().Equal(etagData, s.h.GenerateActualETag())
  53. }
  54. func (s *EtagTestSuite) TestGenerateExpectedReq() {
  55. s.h.ParseExpectedETag(etagReq)
  56. s.Require().Equal(etagReq, s.h.GenerateExpectedETag())
  57. }
  58. func (s *EtagTestSuite) TestGenerateExpectedData() {
  59. s.h.ParseExpectedETag(etagData)
  60. s.Require().Equal(etagData, s.h.GenerateExpectedETag())
  61. }
  62. func (s *EtagTestSuite) TestProcessingOptionsCheckSuccess() {
  63. s.h.ParseExpectedETag(etagReq)
  64. s.Require().True(s.h.SetActualProcessingOptions(s.po))
  65. s.Require().True(s.h.ProcessingOptionsMatch())
  66. }
  67. func (s *EtagTestSuite) TestProcessingOptionsCheckFailure() {
  68. i := strings.Index(etagReq, "/")
  69. wrongEtag := `"wrongpohash` + etagReq[i:]
  70. s.h.ParseExpectedETag(wrongEtag)
  71. s.Require().False(s.h.SetActualProcessingOptions(s.po))
  72. s.Require().False(s.h.ProcessingOptionsMatch())
  73. }
  74. func (s *EtagTestSuite) TestImageETagExpectedPresent() {
  75. s.h.ParseExpectedETag(etagReq)
  76. //nolint:testifylint // False-positive expected-actual
  77. s.Require().Equal(s.imgWithETag.Headers["ETag"], s.h.ImageEtagExpected())
  78. }
  79. func (s *EtagTestSuite) TestImageETagExpectedBlank() {
  80. s.h.ParseExpectedETag(etagData)
  81. s.Require().Empty(s.h.ImageEtagExpected())
  82. }
  83. func (s *EtagTestSuite) TestImageDataCheckDataToDataSuccess() {
  84. s.h.ParseExpectedETag(etagData)
  85. s.Require().True(s.h.SetActualImageData(s.imgWithoutETag))
  86. }
  87. func (s *EtagTestSuite) TestImageDataCheckDataToDataFailure() {
  88. i := strings.Index(etagData, "/")
  89. wrongEtag := etagData[:i] + `/Dwrongimghash"`
  90. s.h.ParseExpectedETag(wrongEtag)
  91. s.Require().False(s.h.SetActualImageData(s.imgWithoutETag))
  92. }
  93. func (s *EtagTestSuite) TestImageDataCheckDataToReqSuccess() {
  94. s.h.ParseExpectedETag(etagData)
  95. s.Require().True(s.h.SetActualImageData(s.imgWithETag))
  96. }
  97. func (s *EtagTestSuite) TestImageDataCheckDataToReqFailure() {
  98. i := strings.Index(etagData, "/")
  99. wrongEtag := etagData[:i] + `/Dwrongimghash"`
  100. s.h.ParseExpectedETag(wrongEtag)
  101. s.Require().False(s.h.SetActualImageData(s.imgWithETag))
  102. }
  103. func (s *EtagTestSuite) TestImageDataCheckReqToDataFailure() {
  104. s.h.ParseExpectedETag(etagReq)
  105. s.Require().False(s.h.SetActualImageData(s.imgWithoutETag))
  106. }
  107. func (s *EtagTestSuite) TestETagBusterFailure() {
  108. config.ETagBuster = "busted"
  109. s.h.ParseExpectedETag(etagReq)
  110. s.Require().False(s.h.SetActualImageData(s.imgWithoutETag))
  111. }
  112. func TestEtag(t *testing.T) {
  113. suite.Run(t, new(EtagTestSuite))
  114. }