1
0
Fork 0
mirror of https://github.com/restic/restic.git synced 2025-03-03 18:26:51 +00:00

tests: add unit test to check the progress counter for forget/prune

This commit is contained in:
Srigovind Nayak 2025-02-02 20:18:56 +05:30
parent 58f58a995d
commit 8d970e36cf
No known key found for this signature in database
GPG key ID: 09006810B7263D69

View file

@ -0,0 +1,106 @@
package restic
import (
"context"
"sync"
"testing"
"time"
"github.com/restic/restic/internal/errors"
"github.com/restic/restic/internal/ui/progress"
)
type mockRemoverUnpacked struct {
removeUnpacked func(ctx context.Context, t FileType, id ID) error
}
func (m *mockRemoverUnpacked) Connections() uint {
return 2
}
func (m *mockRemoverUnpacked) RemoveUnpacked(ctx context.Context, t FileType, id ID) error {
return m.removeUnpacked(ctx, t, id)
}
func NewTestID(i byte) ID {
return Hash([]byte{i})
}
func TestParallelRemove(t *testing.T) {
ctx := context.Background()
fileType := SnapshotFile // this can be any FileType
tests := []struct {
name string
removeUnpacked func(ctx context.Context, t FileType, id ID) error
fileList IDSet
wantRemoved IDSet
wantReportIDSet IDSet
wantBarCount int
}{
{
name: "remove files",
removeUnpacked: func(ctx context.Context, t FileType, id ID) error {
return nil
},
fileList: NewIDSet(NewTestID(1), NewTestID(2), NewTestID(3)),
wantRemoved: NewIDSet(NewTestID(1), NewTestID(2), NewTestID(3)),
wantReportIDSet: NewIDSet(NewTestID(1), NewTestID(2), NewTestID(3)),
wantBarCount: 3,
},
{
name: "remove files with error",
removeUnpacked: func(ctx context.Context, t FileType, id ID) error {
return errors.New("error")
},
fileList: NewIDSet(NewTestID(1), NewTestID(2), NewTestID(3)),
wantRemoved: NewIDSet(),
wantReportIDSet: NewIDSet(),
wantBarCount: 0,
},
{
name: "fail 2 files",
removeUnpacked: func(ctx context.Context, t FileType, id ID) error {
if id == NewTestID(2) {
return errors.New("error")
}
if id == NewTestID(3) {
return errors.New("error")
}
return nil
},
fileList: NewIDSet(NewTestID(1), NewTestID(2), NewTestID(3), NewTestID(4)),
wantRemoved: NewIDSet(NewTestID(1), NewTestID(4)),
wantReportIDSet: NewIDSet(NewTestID(1), NewTestID(4)),
wantBarCount: 2,
},
}
mu := sync.Mutex{}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
repo := &mockRemoverUnpacked{removeUnpacked: test.removeUnpacked}
reportIDSet := NewIDSet()
bar := progress.NewCounter(time.Millisecond, 0, func(value uint64, total uint64, runtime time.Duration, final bool) {})
report := func(id ID, err error) error {
if err == nil {
mu.Lock()
reportIDSet.Insert(id)
mu.Unlock()
return nil
}
return nil
}
_ = ParallelRemove(ctx, repo, test.fileList, fileType, report, bar)
barCount, _ := bar.Get()
if barCount != uint64(test.wantBarCount) {
t.Errorf("ParallelRemove() barCount = %d, want %d", barCount, test.wantBarCount)
}
if !reportIDSet.Equals(test.wantReportIDSet) {
t.Errorf("ParallelRemove() reportIDSet = %v, want %v", reportIDSet, test.wantReportIDSet)
}
})
}
}