file_cache_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package server
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/stretchr/testify/require"
  6. "heckel.io/ntfy/util"
  7. "os"
  8. "strings"
  9. "testing"
  10. "time"
  11. )
  12. var (
  13. oneKilobyteArray = make([]byte, 1024)
  14. )
  15. func TestFileCache_Write_Success(t *testing.T) {
  16. dir, c := newTestFileCache(t)
  17. size, err := c.Write("abcdefghijkl", strings.NewReader("normal file"), util.NewFixedLimiter(999))
  18. require.Nil(t, err)
  19. require.Equal(t, int64(11), size)
  20. require.Equal(t, "normal file", readFile(t, dir+"/abcdefghijkl"))
  21. require.Equal(t, int64(11), c.Size())
  22. require.Equal(t, int64(10229), c.Remaining())
  23. }
  24. func TestFileCache_Write_Remove_Success(t *testing.T) {
  25. dir, c := newTestFileCache(t) // max = 10k (10240), each = 1k (1024)
  26. for i := 0; i < 10; i++ { // 10x999 = 9990
  27. size, err := c.Write(fmt.Sprintf("abcdefghijk%d", i), bytes.NewReader(make([]byte, 999)))
  28. require.Nil(t, err)
  29. require.Equal(t, int64(999), size)
  30. }
  31. require.Equal(t, int64(9990), c.Size())
  32. require.Equal(t, int64(250), c.Remaining())
  33. require.FileExists(t, dir+"/abcdefghijk1")
  34. require.FileExists(t, dir+"/abcdefghijk5")
  35. require.Nil(t, c.Remove("abcdefghijk1", "abcdefghijk5"))
  36. require.NoFileExists(t, dir+"/abcdefghijk1")
  37. require.NoFileExists(t, dir+"/abcdefghijk5")
  38. require.Equal(t, int64(7992), c.Size())
  39. require.Equal(t, int64(2248), c.Remaining())
  40. }
  41. func TestFileCache_Write_FailedTotalSizeLimit(t *testing.T) {
  42. dir, c := newTestFileCache(t)
  43. for i := 0; i < 10; i++ {
  44. size, err := c.Write(fmt.Sprintf("abcdefghijk%d", i), bytes.NewReader(oneKilobyteArray))
  45. require.Nil(t, err)
  46. require.Equal(t, int64(1024), size)
  47. }
  48. _, err := c.Write("abcdefghijkX", bytes.NewReader(oneKilobyteArray))
  49. require.Equal(t, util.ErrLimitReached, err)
  50. require.NoFileExists(t, dir+"/abcdefghijkX")
  51. }
  52. func TestFileCache_Write_FailedFileSizeLimit(t *testing.T) {
  53. dir, c := newTestFileCache(t)
  54. _, err := c.Write("abcdefghijkl", bytes.NewReader(make([]byte, 1025)))
  55. require.Equal(t, util.ErrLimitReached, err)
  56. require.NoFileExists(t, dir+"/abcdefghijkl")
  57. }
  58. func TestFileCache_Write_FailedAdditionalLimiter(t *testing.T) {
  59. dir, c := newTestFileCache(t)
  60. _, err := c.Write("abcdefghijkl", bytes.NewReader(make([]byte, 1001)), util.NewFixedLimiter(1000))
  61. require.Equal(t, util.ErrLimitReached, err)
  62. require.NoFileExists(t, dir+"/abcdefghijkl")
  63. }
  64. func TestFileCache_RemoveExpired(t *testing.T) {
  65. dir, c := newTestFileCache(t)
  66. _, err := c.Write("abcdefghijkl", bytes.NewReader(make([]byte, 1001)))
  67. require.Nil(t, err)
  68. _, err = c.Write("notdeleted12", bytes.NewReader(make([]byte, 1001)))
  69. require.Nil(t, err)
  70. modTime := time.Now().Add(-1 * 4 * time.Hour)
  71. require.Nil(t, os.Chtimes(dir+"/abcdefghijkl", modTime, modTime))
  72. olderThan := time.Now().Add(-1 * 3 * time.Hour)
  73. ids, err := c.Expired(olderThan)
  74. require.Nil(t, err)
  75. require.Equal(t, []string{"abcdefghijkl"}, ids)
  76. require.Nil(t, c.Remove(ids...))
  77. require.NoFileExists(t, dir+"/abcdefghijkl")
  78. require.FileExists(t, dir+"/notdeleted12")
  79. ids, err = c.Expired(olderThan)
  80. require.Nil(t, err)
  81. require.Empty(t, ids)
  82. }
  83. func newTestFileCache(t *testing.T) (dir string, cache *fileCache) {
  84. dir = t.TempDir()
  85. cache, err := newFileCache(dir, 10*1024, 1*1024)
  86. require.Nil(t, err)
  87. return dir, cache
  88. }
  89. func readFile(t *testing.T, f string) string {
  90. b, err := os.ReadFile(f)
  91. require.Nil(t, err)
  92. return string(b)
  93. }