etag_test.go 4.3 KB

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