mirror of
https://github.com/octoleo/restic.git
synced 2024-11-26 06:46:34 +00:00
FindUsedBlobs: Test that seen blobs are skipped
This also copies the TreeLoader interface from internal/walker to allow stubbing the repository in the call to `FindUsedBlobs`.
This commit is contained in:
parent
9ea1a78bd4
commit
af66a62c04
@ -2,9 +2,14 @@ package restic
|
|||||||
|
|
||||||
import "context"
|
import "context"
|
||||||
|
|
||||||
|
// TreeLoader loads a tree from a repository.
|
||||||
|
type TreeLoader interface {
|
||||||
|
LoadTree(context.Context, ID) (*Tree, error)
|
||||||
|
}
|
||||||
|
|
||||||
// FindUsedBlobs traverses the tree ID and adds all seen blobs (trees and data
|
// FindUsedBlobs traverses the tree ID and adds all seen blobs (trees and data
|
||||||
// blobs) to the set blobs. Already seen tree blobs will not be visited again.
|
// blobs) to the set blobs. Already seen tree blobs will not be visited again.
|
||||||
func FindUsedBlobs(ctx context.Context, repo Repository, treeID ID, blobs BlobSet) error {
|
func FindUsedBlobs(ctx context.Context, repo TreeLoader, treeID ID, blobs BlobSet) error {
|
||||||
h := BlobHandle{ID: treeID, Type: TreeBlob}
|
h := BlobHandle{ID: treeID, Type: TreeBlob}
|
||||||
if blobs.Has(h) {
|
if blobs.Has(h) {
|
||||||
return nil
|
return nil
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/restic/restic/internal/errors"
|
||||||
"github.com/restic/restic/internal/repository"
|
"github.com/restic/restic/internal/repository"
|
||||||
"github.com/restic/restic/internal/restic"
|
"github.com/restic/restic/internal/restic"
|
||||||
)
|
)
|
||||||
@ -118,6 +119,31 @@ func TestFindUsedBlobs(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ForbiddenRepo struct{}
|
||||||
|
|
||||||
|
func (r ForbiddenRepo) LoadTree(ctx context.Context, id restic.ID) (*restic.Tree, error) {
|
||||||
|
return nil, errors.New("should not be called")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFindUsedBlobsSkipsSeenBlobs(t *testing.T) {
|
||||||
|
repo, cleanup := repository.TestRepository(t)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
snapshot := restic.TestCreateSnapshot(t, repo, findTestTime, findTestDepth, 0)
|
||||||
|
t.Logf("snapshot %v saved, tree %v", snapshot.ID().Str(), snapshot.Tree.Str())
|
||||||
|
|
||||||
|
usedBlobs := restic.NewBlobSet()
|
||||||
|
err := restic.FindUsedBlobs(context.TODO(), repo, *snapshot.Tree, usedBlobs)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("FindUsedBlobs returned error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = restic.FindUsedBlobs(context.TODO(), ForbiddenRepo{}, *snapshot.Tree, usedBlobs)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("FindUsedBlobs returned error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkFindUsedBlobs(b *testing.B) {
|
func BenchmarkFindUsedBlobs(b *testing.B) {
|
||||||
repo, cleanup := repository.TestRepository(b)
|
repo, cleanup := repository.TestRepository(b)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
Loading…
Reference in New Issue
Block a user