diff --git a/src/cmds/restic/integration_fuse_test.go b/src/cmds/restic/integration_fuse_test.go index 2f7a5fa9f..8a4aa4860 100644 --- a/src/cmds/restic/integration_fuse_test.go +++ b/src/cmds/restic/integration_fuse_test.go @@ -84,65 +84,66 @@ func listSnapshots(t testing.TB, dir string) []string { return names } +func checkSnapshots(t testing.TB, global GlobalOptions, repo *repository.Repository, mountpoint, repodir string, snapshotIDs restic.IDs) { + t.Logf("checking for %d snapshots: %v", len(snapshotIDs), snapshotIDs) + go mount(t, global, mountpoint) + waitForMount(t, mountpoint) + defer umount(t, global, mountpoint) + + if !snapshotsDirExists(t, mountpoint) { + t.Fatal(`virtual directory "snapshots" doesn't exist`) + } + + ids := listSnapshots(t, repodir) + t.Logf("found %v snapshots in repo: %v", len(ids), ids) + + namesInSnapshots := listSnapshots(t, mountpoint) + t.Logf("found %v snapshots in fuse mount: %v", len(namesInSnapshots), namesInSnapshots) + Assert(t, + len(namesInSnapshots) == len(snapshotIDs), + "Invalid number of snapshots: expected %d, got %d", len(snapshotIDs), len(namesInSnapshots)) + + namesMap := make(map[string]bool) + for _, name := range namesInSnapshots { + namesMap[name] = false + } + + for _, id := range snapshotIDs { + snapshot, err := restic.LoadSnapshot(repo, id) + OK(t, err) + + ts := snapshot.Time.Format(time.RFC3339) + present, ok := namesMap[ts] + if !ok { + t.Errorf("Snapshot %v (%q) isn't present in fuse dir", id.Str(), ts) + } + + for i := 1; present; i++ { + ts = fmt.Sprintf("%s-%d", snapshot.Time.Format(time.RFC3339), i) + present, ok = namesMap[ts] + if !ok { + t.Errorf("Snapshot %v (%q) isn't present in fuse dir", id.Str(), ts) + } + + if !present { + break + } + } + + namesMap[ts] = true + } + + for name, present := range namesMap { + Assert(t, present, "Directory %s is present in fuse dir but is not a snapshot", name) + } +} + func TestMount(t *testing.T) { if !RunFuseTest { t.Skip("Skipping fuse tests") } withTestEnvironment(t, func(env *testEnvironment, global GlobalOptions) { - checkSnapshots := func(repo *repository.Repository, mountpoint string, snapshotIDs restic.IDs) { - t.Logf("checking for %d snapshots: %v", len(snapshotIDs), snapshotIDs) - go mount(t, global, mountpoint) - waitForMount(t, mountpoint) - defer umount(t, global, mountpoint) - - if !snapshotsDirExists(t, mountpoint) { - t.Fatal(`virtual directory "snapshots" doesn't exist`) - } - - ids := listSnapshots(t, env.repo) - t.Logf("found %v snapshots in repo: %v", len(ids), ids) - - namesInSnapshots := listSnapshots(t, mountpoint) - t.Logf("found %v snapshots in fuse mount: %v", len(namesInSnapshots), namesInSnapshots) - Assert(t, - len(namesInSnapshots) == len(snapshotIDs), - "Invalid number of snapshots: expected %d, got %d", len(snapshotIDs), len(namesInSnapshots)) - - namesMap := make(map[string]bool) - for _, name := range namesInSnapshots { - namesMap[name] = false - } - - for _, id := range snapshotIDs { - snapshot, err := restic.LoadSnapshot(repo, id) - OK(t, err) - - ts := snapshot.Time.Format(time.RFC3339) - present, ok := namesMap[ts] - if !ok { - t.Errorf("Snapshot %v (%q) isn't present in fuse dir", id.Str(), ts) - } - - for i := 1; present; i++ { - ts = fmt.Sprintf("%s-%d", snapshot.Time.Format(time.RFC3339), i) - present, ok = namesMap[ts] - if !ok { - t.Errorf("Snapshot %v (%q) isn't present in fuse dir", id.Str(), ts) - } - - if !present { - break - } - } - - namesMap[ts] = true - } - - for name, present := range namesMap { - Assert(t, present, "Directory %s is present in fuse dir but is not a snapshot", name) - } - } cmdInit(t, global) repo, err := global.OpenRepository() @@ -154,7 +155,7 @@ func TestMount(t *testing.T) { // We remove the mountpoint now to check that cmdMount creates it RemoveAll(t, mountpoint) - checkSnapshots(repo, mountpoint, []restic.ID{}) + checkSnapshots(t, global, repo, mountpoint, env.repo, []restic.ID{}) SetupTarTestFixture(t, env.testdata, filepath.Join("testdata", "backup-data.tar.gz")) @@ -164,7 +165,7 @@ func TestMount(t *testing.T) { Assert(t, len(snapshotIDs) == 1, "expected one snapshot, got %v", snapshotIDs) - checkSnapshots(repo, mountpoint, snapshotIDs) + checkSnapshots(t, global, repo, mountpoint, env.repo, snapshotIDs) // second backup, implicit incremental cmdBackup(t, global, []string{env.testdata}, nil) @@ -172,7 +173,7 @@ func TestMount(t *testing.T) { Assert(t, len(snapshotIDs) == 2, "expected two snapshots, got %v", snapshotIDs) - checkSnapshots(repo, mountpoint, snapshotIDs) + checkSnapshots(t, global, repo, mountpoint, env.repo, snapshotIDs) // third backup, explicit incremental cmdBackup(t, global, []string{env.testdata}, &snapshotIDs[0]) @@ -180,6 +181,30 @@ func TestMount(t *testing.T) { Assert(t, len(snapshotIDs) == 3, "expected three snapshots, got %v", snapshotIDs) - checkSnapshots(repo, mountpoint, snapshotIDs) + checkSnapshots(t, global, repo, mountpoint, env.repo, snapshotIDs) + }) +} + +func TestMountSameTimestamps(t *testing.T) { + if !RunFuseTest { + t.Skip("Skipping fuse tests") + } + + withTestEnvironment(t, func(env *testEnvironment, global GlobalOptions) { + SetupTarTestFixture(t, env.base, filepath.Join("testdata", "repo-same-timestamps.tar.gz")) + + repo, err := global.OpenRepository() + OK(t, err) + + mountpoint, err := ioutil.TempDir(TestTempDir, "restic-test-mount-") + OK(t, err) + + ids := []restic.ID{ + restic.TestParseID("280303689e5027328889a06d718b729e96a1ce6ae9ef8290bff550459ae611ee"), + restic.TestParseID("75ad6cdc0868e082f2596d5ab8705e9f7d87316f5bf5690385eeff8dbe49d9f5"), + restic.TestParseID("5fd0d8b2ef0fa5d23e58f1e460188abb0f525c0f0c4af8365a1280c807a80a1b"), + } + + checkSnapshots(t, global, repo, mountpoint, env.repo, ids) }) } diff --git a/src/cmds/restic/testdata/repo-same-timestamps.tar.gz b/src/cmds/restic/testdata/repo-same-timestamps.tar.gz new file mode 100644 index 000000000..42cf2b2bb Binary files /dev/null and b/src/cmds/restic/testdata/repo-same-timestamps.tar.gz differ