123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- // Copyright (C) 2014 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- package versioner
- import (
- "os"
- "path/filepath"
- "sort"
- "strconv"
- "testing"
- "time"
- "github.com/d4l3k/messagediff"
- "github.com/syncthing/syncthing/lib/config"
- "github.com/syncthing/syncthing/lib/fs"
- )
- func TestStaggeredVersioningVersionCount(t *testing.T) {
- /* Default settings:
- {30, 3600}, // first hour -> 30 sec between versions
- {3600, 86400}, // next day -> 1 h between versions
- {86400, 592000}, // next 30 days -> 1 day between versions
- {604800, maxAge}, // next year -> 1 week between versions
- */
- now := parseTime("20160415-140000")
- versionsWithMtime := []string{
- // 14:00:00 is "now"
- "test~20160415-140000", // 0 seconds ago
- "test~20160415-135959", // 1 second ago
- "test~20160415-135931", // 29 seconds ago
- "test~20160415-135930", // 30 seconds ago
- "test~20160415-130059", // 59 minutes 01 seconds ago
- "test~20160415-130030", // 59 minutes 30 seconds ago
- "test~20160415-130000", // 1 hour ago
- "test~20160415-120001", // 1 hour 59:59 ago
- "test~20160414-155959", // 22 hours 1 second ago
- "test~20160414-150001", // 22 hours 59 seconds ago
- "test~20160414-150000", // 23 hours ago
- "test~20160414-140000", // 1 day ago
- "test~20160414-130001", // 1 days 59:59 second ago
- "test~20160409-135959", // 6 days 1 second ago
- "test~20160408-140001", // 6 days 23:59:59 second ago
- "test~20160408-140000", // 7 days ago
- "test~20160408-135959", // 7 days 1 second ago
- "test~20160407-140001", // 7 days 23:59:59 ago
- "test~20160407-140000", // 8 days ago
- "test~20160317-140000", // 29 days ago
- "test~20160317-135959", // 29 days 1 second ago
- "test~20160316-140000", // 30 days ago
- "test~20160308-135959", // 37 days 1 second ago
- "test~20160301-140000", // 44 days ago
- "test~20160223-140000", // 51 days ago
- "test~20150423-140000", // 358 days ago (!!! 2016 was a leap year !!!)
- "test~20150417-140000", // 364 days ago
- "test~20150416-140000", // 365 days ago
- // exceeds maxAge
- "test~20150416-135959", // 365 days 1 second ago
- "test~20150416-135958", // 365 days 2 seconds ago
- "test~20150414-140000", // 367 days ago
- }
- delete := []string{
- "test~20160415-135959", // 1 second ago
- "test~20160415-135931", // 29 seconds ago
- "test~20160415-130059", // 59 minutes 01 seconds ago
- "test~20160415-130000", // 1 hour ago
- "test~20160414-155959", // 22 hours 1 second ago
- "test~20160414-150001", // 22 hours 59 seconds ago
- "test~20160414-140000", // 1 day ago
- "test~20160409-135959", // 6 days 1 second ago
- "test~20160408-140001", // 6 days 23:59:59 second ago
- "test~20160408-135959", // 7 days 1 second ago
- "test~20160407-140001", // 7 days 23:59:59 ago
- "test~20160317-135959", // 29 days 1 second ago
- "test~20160308-135959", // 37 days 1 second ago
- "test~20150417-140000", // 364 days ago
- "test~20150416-135959", // 365 days 1 second ago
- "test~20150416-135958", // 365 days 2 seconds ago
- "test~20150414-140000", // 367 days ago
- }
- sort.Strings(delete)
- cfg := config.FolderConfiguration{
- FilesystemType: fs.FilesystemTypeBasic,
- Path: "testdata",
- Versioning: config.VersioningConfiguration{
- Params: map[string]string{
- "maxAge": strconv.Itoa(365 * 86400),
- },
- },
- }
- v := newStaggered(cfg).(*staggered)
- rem := v.toRemove(versionsWithMtime, now)
- sort.Strings(rem)
- if diff, equal := messagediff.PrettyDiff(delete, rem); !equal {
- t.Errorf("Incorrect deleted files; got %v, expected %v\n%v", rem, delete, diff)
- }
- }
- func parseTime(in string) time.Time {
- t, err := time.ParseInLocation(TimeFormat, in, time.Local)
- if err != nil {
- panic(err.Error())
- }
- return t
- }
- func TestCreateVersionPath(t *testing.T) {
- const (
- versionsDir = "some/nested/dir"
- archiveFile = "testfile"
- )
- // Create a test dir and file
- tmpDir := t.TempDir()
- if err := os.WriteFile(filepath.Join(tmpDir, archiveFile), []byte("sup"), 0644); err != nil {
- t.Fatal(err)
- }
- folderCfg := config.FolderConfiguration{
- ID: "default",
- Path: tmpDir,
- Versioning: config.VersioningConfiguration{
- Type: "staggered",
- FSPath: versionsDir,
- },
- }
- // Archive the file
- versioner := newStaggered(folderCfg)
- if err := versioner.Archive(archiveFile); err != nil {
- t.Fatal(err)
- }
- // Look for files named like the test file, in the archive dir.
- files, err := filepath.Glob(filepath.Join(tmpDir, versionsDir, archiveFile) + "*")
- if err != nil {
- t.Fatal(err)
- }
- if len(files) == 0 {
- t.Error("expected file to have been archived")
- }
- }
|