restic: Test progress reporting of StreamTrees
This commit is contained in:
parent
313ad0e32f
commit
ddb7697d29
2 changed files with 46 additions and 4 deletions
|
@ -15,6 +15,8 @@ import (
|
||||||
"github.com/restic/restic/internal/errors"
|
"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"
|
||||||
|
"github.com/restic/restic/internal/test"
|
||||||
|
"github.com/restic/restic/internal/ui/progress"
|
||||||
)
|
)
|
||||||
|
|
||||||
func loadIDSet(t testing.TB, filename string) restic.BlobSet {
|
func loadIDSet(t testing.TB, filename string) restic.BlobSet {
|
||||||
|
@ -92,9 +94,12 @@ func TestFindUsedBlobs(t *testing.T) {
|
||||||
snapshots = append(snapshots, sn)
|
snapshots = append(snapshots, sn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p := progress.New(time.Second, findTestSnapshots, func(value uint64, total uint64, runtime time.Duration, final bool) {})
|
||||||
|
defer p.Done()
|
||||||
|
|
||||||
for i, sn := range snapshots {
|
for i, sn := range snapshots {
|
||||||
usedBlobs := restic.NewBlobSet()
|
usedBlobs := restic.NewBlobSet()
|
||||||
err := restic.FindUsedBlobs(context.TODO(), repo, restic.IDs{*sn.Tree}, usedBlobs, nil)
|
err := restic.FindUsedBlobs(context.TODO(), repo, restic.IDs{*sn.Tree}, usedBlobs, p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("FindUsedBlobs returned error: %v", err)
|
t.Errorf("FindUsedBlobs returned error: %v", err)
|
||||||
continue
|
continue
|
||||||
|
@ -105,6 +110,8 @@ func TestFindUsedBlobs(t *testing.T) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test.Equals(t, p.Get(), uint64(i+1))
|
||||||
|
|
||||||
goldenFilename := filepath.Join("testdata", fmt.Sprintf("used_blobs_snapshot%d", i))
|
goldenFilename := filepath.Join("testdata", fmt.Sprintf("used_blobs_snapshot%d", i))
|
||||||
want := loadIDSet(t, goldenFilename)
|
want := loadIDSet(t, goldenFilename)
|
||||||
|
|
||||||
|
@ -119,6 +126,40 @@ func TestFindUsedBlobs(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMultiFindUsedBlobs(t *testing.T) {
|
||||||
|
repo, cleanup := repository.TestRepository(t)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
var snapshotTrees restic.IDs
|
||||||
|
for i := 0; i < findTestSnapshots; i++ {
|
||||||
|
sn := restic.TestCreateSnapshot(t, repo, findTestTime.Add(time.Duration(i)*time.Second), findTestDepth, 0)
|
||||||
|
t.Logf("snapshot %v saved, tree %v", sn.ID().Str(), sn.Tree.Str())
|
||||||
|
snapshotTrees = append(snapshotTrees, *sn.Tree)
|
||||||
|
}
|
||||||
|
|
||||||
|
want := restic.NewBlobSet()
|
||||||
|
for i := range snapshotTrees {
|
||||||
|
goldenFilename := filepath.Join("testdata", fmt.Sprintf("used_blobs_snapshot%d", i))
|
||||||
|
want.Merge(loadIDSet(t, goldenFilename))
|
||||||
|
}
|
||||||
|
|
||||||
|
p := progress.New(time.Second, findTestSnapshots, func(value uint64, total uint64, runtime time.Duration, final bool) {})
|
||||||
|
defer p.Done()
|
||||||
|
|
||||||
|
// run twice to check progress bar handling of duplicate tree roots
|
||||||
|
usedBlobs := restic.NewBlobSet()
|
||||||
|
for i := 1; i < 3; i++ {
|
||||||
|
err := restic.FindUsedBlobs(context.TODO(), repo, snapshotTrees, usedBlobs, p)
|
||||||
|
test.OK(t, err)
|
||||||
|
test.Equals(t, p.Get(), uint64(i*len(snapshotTrees)))
|
||||||
|
|
||||||
|
if !want.Equals(usedBlobs) {
|
||||||
|
t.Errorf("wrong list of blobs returned:\n missing blobs: %v\n extra blobs: %v",
|
||||||
|
want.Sub(usedBlobs), usedBlobs.Sub(want))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type ForbiddenRepo struct{}
|
type ForbiddenRepo struct{}
|
||||||
|
|
||||||
func (r ForbiddenRepo) LoadTree(ctx context.Context, id restic.ID) (*restic.Tree, error) {
|
func (r ForbiddenRepo) LoadTree(ctx context.Context, id restic.ID) (*restic.Tree, error) {
|
||||||
|
|
|
@ -82,7 +82,8 @@ func (c *Counter) Done() {
|
||||||
*c = Counter{} // Prevent reuse.
|
*c = Counter{} // Prevent reuse.
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Counter) get() uint64 {
|
// Get the current Counter value. This method is concurrency-safe.
|
||||||
|
func (c *Counter) Get() uint64 {
|
||||||
c.valueMutex.Lock()
|
c.valueMutex.Lock()
|
||||||
v := c.value
|
v := c.value
|
||||||
c.valueMutex.Unlock()
|
c.valueMutex.Unlock()
|
||||||
|
@ -102,7 +103,7 @@ func (c *Counter) run() {
|
||||||
defer close(c.stopped)
|
defer close(c.stopped)
|
||||||
defer func() {
|
defer func() {
|
||||||
// Must be a func so that time.Since isn't called at defer time.
|
// Must be a func so that time.Since isn't called at defer time.
|
||||||
c.report(c.get(), c.getMax(), time.Since(c.start), true)
|
c.report(c.Get(), c.getMax(), time.Since(c.start), true)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var tick <-chan time.Time
|
var tick <-chan time.Time
|
||||||
|
@ -122,6 +123,6 @@ func (c *Counter) run() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.report(c.get(), c.getMax(), now.Sub(c.start), false)
|
c.report(c.Get(), c.getMax(), now.Sub(c.start), false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue