staggered_test.go 4.6 KB

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