diff --git a/internal/archiver/file_saver_test.go b/internal/archiver/file_saver_test.go index 59a996d76..4dbf78548 100644 --- a/internal/archiver/file_saver_test.go +++ b/internal/archiver/file_saver_test.go @@ -30,7 +30,7 @@ func createTestFiles(t testing.TB, num int) (files []string) { 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) workers := uint(runtime.NumCPU()) @@ -39,26 +39,26 @@ func startFileSaver(ctx context.Context, t testing.TB, _ fs.FS) (*fileSaver, con 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) { return meta.ToNode(ignoreXattrListError, t.Logf) } - return s, ctx, wg + return s, saver, ctx, wg } func TestFileSaver(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - files := createTestFiles(t, 15) - startFn := func() {} completeReadingFn := func() {} completeFn := func(*data.Node, ItemStats) {} + files := createTestFiles(t, 15) testFs := fs.Local{} - s, ctx, wg := startFileSaver(ctx, t, testFs) + s, saver, ctx, wg := startFileSaver(ctx, t, testFs) 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() err := wg.Wait() diff --git a/internal/archiver/tree_saver_test.go b/internal/archiver/tree_saver_test.go index 4724f5d5c..ed3a148af 100644 --- a/internal/archiver/tree_saver_test.go +++ b/internal/archiver/tree_saver_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "runtime" + "sync" "testing" "github.com/restic/restic/internal/data" @@ -13,10 +14,20 @@ import ( "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)) { - cb(restic.Hash(buf), false, len(buf), nil) +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)) { + // 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) { @@ -27,7 +38,7 @@ func setupTreeSaver() (context.Context, context.CancelFunc, *treeSaver, func() e 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 { b.TriggerShutdown()