1
0

staggered_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright (C) 2014 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package versioner
  7. import (
  8. "os"
  9. "path/filepath"
  10. "slices"
  11. "strconv"
  12. "testing"
  13. "time"
  14. "github.com/d4l3k/messagediff"
  15. "github.com/syncthing/syncthing/lib/config"
  16. )
  17. func TestStaggeredVersioningVersionCount(t *testing.T) {
  18. /* Default settings:
  19. {30, 3600}, // first hour -> 30 sec between versions
  20. {3600, 86400}, // next day -> 1 h between versions
  21. {86400, 592000}, // next 30 days -> 1 day between versions
  22. {604800, maxAge}, // next year -> 1 week between versions
  23. */
  24. now := parseTime("20160415-140000")
  25. versionsWithMtime := []string{
  26. // 14:00:00 is "now"
  27. "test~20160415-140000", // 0 seconds ago
  28. "test~20160415-135959", // 1 second ago
  29. "test~20160415-135931", // 29 seconds ago
  30. "test~20160415-135930", // 30 seconds ago
  31. "test~20160415-130059", // 59 minutes 01 seconds ago
  32. "test~20160415-130030", // 59 minutes 30 seconds ago
  33. "test~20160415-130000", // 1 hour ago
  34. "test~20160415-120001", // 1 hour 59:59 ago
  35. "test~20160414-155959", // 22 hours 1 second ago
  36. "test~20160414-150001", // 22 hours 59 seconds ago
  37. "test~20160414-150000", // 23 hours ago
  38. "test~20160414-140000", // 1 day ago
  39. "test~20160414-130001", // 1 days 59:59 second ago
  40. "test~20160409-135959", // 6 days 1 second ago
  41. "test~20160408-140001", // 6 days 23:59:59 second ago
  42. "test~20160408-140000", // 7 days ago
  43. "test~20160408-135959", // 7 days 1 second ago
  44. "test~20160407-140001", // 7 days 23:59:59 ago
  45. "test~20160407-140000", // 8 days ago
  46. "test~20160317-140000", // 29 days ago
  47. "test~20160317-135959", // 29 days 1 second ago
  48. "test~20160316-140000", // 30 days ago
  49. "test~20160308-135959", // 37 days 1 second ago
  50. "test~20160301-140000", // 44 days ago
  51. "test~20160223-140000", // 51 days ago
  52. "test~20150423-140000", // 358 days ago (!!! 2016 was a leap year !!!)
  53. "test~20150417-140000", // 364 days ago
  54. "test~20150416-140000", // 365 days ago
  55. // exceeds maxAge
  56. "test~20150416-135959", // 365 days 1 second ago
  57. "test~20150416-135958", // 365 days 2 seconds ago
  58. "test~20150414-140000", // 367 days ago
  59. }
  60. delete := []string{
  61. "test~20160415-135959", // 1 second ago
  62. "test~20160415-135931", // 29 seconds ago
  63. "test~20160415-130059", // 59 minutes 01 seconds ago
  64. "test~20160415-130000", // 1 hour ago
  65. "test~20160414-155959", // 22 hours 1 second ago
  66. "test~20160414-150001", // 22 hours 59 seconds ago
  67. "test~20160414-140000", // 1 day ago
  68. "test~20160409-135959", // 6 days 1 second ago
  69. "test~20160408-140001", // 6 days 23:59:59 second ago
  70. "test~20160408-135959", // 7 days 1 second ago
  71. "test~20160407-140001", // 7 days 23:59:59 ago
  72. "test~20160317-135959", // 29 days 1 second ago
  73. "test~20160308-135959", // 37 days 1 second ago
  74. "test~20150417-140000", // 364 days ago
  75. "test~20150416-135959", // 365 days 1 second ago
  76. "test~20150416-135958", // 365 days 2 seconds ago
  77. "test~20150414-140000", // 367 days ago
  78. }
  79. slices.Sort(delete)
  80. cfg := config.FolderConfiguration{
  81. FilesystemType: config.FilesystemTypeBasic,
  82. Path: "testdata",
  83. Versioning: config.VersioningConfiguration{
  84. Params: map[string]string{
  85. "maxAge": strconv.Itoa(365 * 86400),
  86. },
  87. },
  88. }
  89. v := newStaggered(cfg).(*staggered)
  90. rem := v.toRemove(versionsWithMtime, now)
  91. slices.Sort(rem)
  92. if diff, equal := messagediff.PrettyDiff(delete, rem); !equal {
  93. t.Errorf("Incorrect deleted files; got %v, expected %v\n%v", rem, delete, diff)
  94. }
  95. }
  96. func parseTime(in string) time.Time {
  97. t, err := time.ParseInLocation(TimeFormat, in, time.Local)
  98. if err != nil {
  99. panic(err.Error())
  100. }
  101. return t
  102. }
  103. func TestCreateVersionPath(t *testing.T) {
  104. const (
  105. versionsDir = "some/nested/dir"
  106. archiveFile = "testfile"
  107. )
  108. // Create a test dir and file
  109. tmpDir := t.TempDir()
  110. if err := os.WriteFile(filepath.Join(tmpDir, archiveFile), []byte("sup"), 0o644); err != nil {
  111. t.Fatal(err)
  112. }
  113. folderCfg := config.FolderConfiguration{
  114. ID: "default",
  115. FilesystemType: config.FilesystemTypeBasic,
  116. Path: tmpDir,
  117. Versioning: config.VersioningConfiguration{
  118. Type: "staggered",
  119. FSType: config.FilesystemTypeBasic,
  120. FSPath: versionsDir,
  121. },
  122. }
  123. // Archive the file
  124. versioner := newStaggered(folderCfg)
  125. if err := versioner.Archive(archiveFile); err != nil {
  126. t.Fatal(err)
  127. }
  128. // Look for files named like the test file, in the archive dir.
  129. files, err := filepath.Glob(filepath.Join(tmpDir, versionsDir, archiveFile) + "*")
  130. if err != nil {
  131. t.Fatal(err)
  132. }
  133. if len(files) == 0 {
  134. t.Error("expected file to have been archived")
  135. }
  136. }