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,6 +355,25 @@ func TestIndexSave(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testIndexSave(t *testing.T, version uint) {
|
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)
|
repo := createFilledRepo(t, 3, version)
|
||||||
|
|
||||||
idx := index.NewMasterIndex()
|
idx := index.NewMasterIndex()
|
||||||
|
@ -364,7 +383,7 @@ func testIndexSave(t *testing.T, version uint) {
|
||||||
blobs[pb] = struct{}{}
|
blobs[pb] = struct{}{}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
rtest.OK(t, idx.Rewrite(context.TODO(), repo, nil, nil, nil, index.MasterIndexRewriteOpts{}))
|
rtest.OK(t, test.saver(idx, repo))
|
||||||
idx = index.NewMasterIndex()
|
idx = index.NewMasterIndex()
|
||||||
rtest.OK(t, idx.Load(context.TODO(), repo, nil, nil))
|
rtest.OK(t, idx.Load(context.TODO(), repo, nil, nil))
|
||||||
|
|
||||||
|
@ -378,4 +397,60 @@ func testIndexSave(t *testing.T, version uint) {
|
||||||
rtest.Equals(t, 0, len(blobs), "saved index is missing blobs")
|
rtest.Equals(t, 0, len(blobs), "saved index is missing blobs")
|
||||||
|
|
||||||
checker.TestCheckRepo(t, repo, false)
|
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{})
|
||||||
|
rtest.OK(t, idx.Each(context.TODO(), func(pb restic.PackedBlob) {
|
||||||
|
blobs[pb] = struct{}{}
|
||||||
|
}))
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
} else {
|
||||||
|
t.Fatalf("unexpected blobs %v", pb)
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
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