forked from TrueCloudLab/restic
index: additional tests for new index save methods
This commit is contained in:
parent
5f7b48e65f
commit
2ca1c37721
1 changed files with 76 additions and 1 deletions
|
@ -355,8 +355,60 @@ func TestIndexSave(t *testing.T) {
|
|||
}
|
||||
|
||||
func testIndexSave(t *testing.T, version uint) {
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
saver func(idx *index.MasterIndex, repo restic.Repository) error
|
||||
}{
|
||||
{"rewrite no-op", func(idx *index.MasterIndex, repo restic.Repository) error {
|
||||
return idx.Rewrite(context.TODO(), repo, nil, nil, nil, index.MasterIndexRewriteOpts{})
|
||||
}},
|
||||
{"rewrite skip-all", func(idx *index.MasterIndex, repo restic.Repository) error {
|
||||
return idx.Rewrite(context.TODO(), repo, nil, restic.NewIDSet(), nil, index.MasterIndexRewriteOpts{})
|
||||
}},
|
||||
{"SaveFallback", func(idx *index.MasterIndex, repo restic.Repository) error {
|
||||
err := restic.ParallelRemove(context.TODO(), repo, idx.IDs(), restic.IndexFile, nil, nil)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return idx.SaveFallback(context.TODO(), repo, restic.NewIDSet(), nil)
|
||||
}},
|
||||
} {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
repo := createFilledRepo(t, 3, version)
|
||||
|
||||
idx := index.NewMasterIndex()
|
||||
rtest.OK(t, idx.Load(context.TODO(), repo, nil, nil))
|
||||
blobs := make(map[restic.PackedBlob]struct{})
|
||||
rtest.OK(t, idx.Each(context.TODO(), func(pb restic.PackedBlob) {
|
||||
blobs[pb] = struct{}{}
|
||||
}))
|
||||
|
||||
rtest.OK(t, test.saver(idx, repo))
|
||||
idx = index.NewMasterIndex()
|
||||
rtest.OK(t, idx.Load(context.TODO(), repo, nil, nil))
|
||||
|
||||
rtest.OK(t, idx.Each(context.TODO(), func(pb restic.PackedBlob) {
|
||||
if _, ok := blobs[pb]; ok {
|
||||
delete(blobs, pb)
|
||||
} else {
|
||||
t.Fatalf("unexpected blobs %v", pb)
|
||||
}
|
||||
}))
|
||||
rtest.Equals(t, 0, len(blobs), "saved index is missing blobs")
|
||||
|
||||
checker.TestCheckRepo(t, repo, false)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestIndexSavePartial(t *testing.T) {
|
||||
repository.TestAllVersions(t, testIndexSavePartial)
|
||||
}
|
||||
|
||||
func testIndexSavePartial(t *testing.T, version uint) {
|
||||
repo := createFilledRepo(t, 3, version)
|
||||
|
||||
// capture blob list before adding fourth snapshot
|
||||
idx := index.NewMasterIndex()
|
||||
rtest.OK(t, idx.Load(context.TODO(), repo, nil, nil))
|
||||
blobs := make(map[restic.PackedBlob]struct{})
|
||||
|
@ -364,10 +416,21 @@ func testIndexSave(t *testing.T, version uint) {
|
|||
blobs[pb] = struct{}{}
|
||||
}))
|
||||
|
||||
rtest.OK(t, idx.Rewrite(context.TODO(), repo, nil, nil, nil, index.MasterIndexRewriteOpts{}))
|
||||
// add+remove new snapshot and track its pack files
|
||||
packsBefore := listPacks(t, repo)
|
||||
sn := restic.TestCreateSnapshot(t, repo, snapshotTime.Add(time.Duration(4)*time.Second), depth)
|
||||
rtest.OK(t, repo.RemoveUnpacked(context.TODO(), restic.SnapshotFile, *sn.ID()))
|
||||
packsAfter := listPacks(t, repo)
|
||||
newPacks := packsAfter.Sub(packsBefore)
|
||||
|
||||
// rewrite index and remove pack files of new snapshot
|
||||
idx = index.NewMasterIndex()
|
||||
rtest.OK(t, idx.Load(context.TODO(), repo, nil, nil))
|
||||
rtest.OK(t, idx.Rewrite(context.TODO(), repo, newPacks, nil, nil, index.MasterIndexRewriteOpts{}))
|
||||
|
||||
// check blobs
|
||||
idx = index.NewMasterIndex()
|
||||
rtest.OK(t, idx.Load(context.TODO(), repo, nil, nil))
|
||||
rtest.OK(t, idx.Each(context.TODO(), func(pb restic.PackedBlob) {
|
||||
if _, ok := blobs[pb]; ok {
|
||||
delete(blobs, pb)
|
||||
|
@ -377,5 +440,17 @@ func testIndexSave(t *testing.T, version uint) {
|
|||
}))
|
||||
rtest.Equals(t, 0, len(blobs), "saved index is missing blobs")
|
||||
|
||||
// remove pack files to make check happy
|
||||
rtest.OK(t, restic.ParallelRemove(context.TODO(), repo, newPacks, restic.PackFile, nil, nil))
|
||||
|
||||
checker.TestCheckRepo(t, repo, false)
|
||||
}
|
||||
|
||||
func listPacks(t testing.TB, repo restic.Lister) restic.IDSet {
|
||||
s := restic.NewIDSet()
|
||||
rtest.OK(t, repo.List(context.TODO(), restic.PackFile, func(id restic.ID, _ int64) error {
|
||||
s.Insert(id)
|
||||
return nil
|
||||
}))
|
||||
return s
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue