archiver: assert number of uploaded chunks in fileSaver test

This commit is contained in:
Michael Eischer 2025-10-13 23:00:06 +02:00
parent 7f6fdcc52c
commit 3f92987974
2 changed files with 23 additions and 10 deletions

View file

@ -30,7 +30,7 @@ func createTestFiles(t testing.TB, num int) (files []string) {
return files return files
} }
func startFileSaver(ctx context.Context, t testing.TB, _ fs.FS) (*fileSaver, context.Context, *errgroup.Group) { func startFileSaver(ctx context.Context, t testing.TB, _ fs.FS) (*fileSaver, *mockSaver, context.Context, *errgroup.Group) {
wg, ctx := errgroup.WithContext(ctx) wg, ctx := errgroup.WithContext(ctx)
workers := uint(runtime.NumCPU()) workers := uint(runtime.NumCPU())
@ -39,26 +39,26 @@ func startFileSaver(ctx context.Context, t testing.TB, _ fs.FS) (*fileSaver, con
t.Fatal(err) t.Fatal(err)
} }
s := newFileSaver(ctx, wg, &noopSaver{}, pol, workers) saver := &mockSaver{saved: make(map[string]int)}
s := newFileSaver(ctx, wg, saver, pol, workers)
s.NodeFromFileInfo = func(snPath, filename string, meta ToNoder, ignoreXattrListError bool) (*data.Node, error) { s.NodeFromFileInfo = func(snPath, filename string, meta ToNoder, ignoreXattrListError bool) (*data.Node, error) {
return meta.ToNode(ignoreXattrListError, t.Logf) return meta.ToNode(ignoreXattrListError, t.Logf)
} }
return s, ctx, wg return s, saver, ctx, wg
} }
func TestFileSaver(t *testing.T) { func TestFileSaver(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
files := createTestFiles(t, 15)
startFn := func() {} startFn := func() {}
completeReadingFn := func() {} completeReadingFn := func() {}
completeFn := func(*data.Node, ItemStats) {} completeFn := func(*data.Node, ItemStats) {}
files := createTestFiles(t, 15)
testFs := fs.Local{} testFs := fs.Local{}
s, ctx, wg := startFileSaver(ctx, t, testFs) s, saver, ctx, wg := startFileSaver(ctx, t, testFs)
var results []futureNode var results []futureNode
@ -79,6 +79,8 @@ func TestFileSaver(t *testing.T) {
} }
} }
test.Assert(t, len(saver.saved) == len(files), "expected %d saved files, got %d", len(files), len(saver.saved))
s.TriggerShutdown() s.TriggerShutdown()
err := wg.Wait() err := wg.Wait()

View file

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"runtime" "runtime"
"sync"
"testing" "testing"
"github.com/restic/restic/internal/data" "github.com/restic/restic/internal/data"
@ -13,10 +14,20 @@ import (
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
) )
type noopSaver struct{} type mockSaver struct {
saved map[string]int
mutex sync.Mutex
}
func (n *noopSaver) SaveBlobAsync(_ context.Context, _ restic.BlobType, buf []byte, id restic.ID, storeDuplicate bool, cb func(newID restic.ID, known bool, sizeInRepo int, err error)) { func (m *mockSaver) SaveBlobAsync(_ context.Context, _ restic.BlobType, buf []byte, id restic.ID, storeDuplicate bool, cb func(newID restic.ID, known bool, sizeInRepo int, err error)) {
cb(restic.Hash(buf), false, len(buf), nil) // Fake async operation
go func() {
m.mutex.Lock()
m.saved[string(buf)]++
m.mutex.Unlock()
cb(restic.Hash(buf), false, len(buf), nil)
}()
} }
func setupTreeSaver() (context.Context, context.CancelFunc, *treeSaver, func() error) { func setupTreeSaver() (context.Context, context.CancelFunc, *treeSaver, func() error) {
@ -27,7 +38,7 @@ func setupTreeSaver() (context.Context, context.CancelFunc, *treeSaver, func() e
return err return err
} }
b := newTreeSaver(ctx, wg, uint(runtime.NumCPU()), &noopSaver{}, errFn) b := newTreeSaver(ctx, wg, uint(runtime.NumCPU()), &mockSaver{saved: make(map[string]int)}, errFn)
shutdown := func() error { shutdown := func() error {
b.TriggerShutdown() b.TriggerShutdown()