diff --git a/internal/dump/common_test.go b/internal/dump/common_test.go new file mode 100644 index 000000000..e15659701 --- /dev/null +++ b/internal/dump/common_test.go @@ -0,0 +1,103 @@ +package dump + +import ( + "bytes" + "context" + "testing" + + "github.com/restic/restic/internal/archiver" + "github.com/restic/restic/internal/fs" + "github.com/restic/restic/internal/repository" + "github.com/restic/restic/internal/restic" + rtest "github.com/restic/restic/internal/test" +) + +func prepareTempdirRepoSrc(t testing.TB, src archiver.TestDir) (tempdir string, repo restic.Repository, cleanup func()) { + tempdir, removeTempdir := rtest.TempDir(t) + repo, removeRepository := repository.TestRepository(t) + + archiver.TestCreateFiles(t, tempdir, src) + + cleanup = func() { + removeRepository() + removeTempdir() + } + + return tempdir, repo, cleanup +} + +type CheckDump func(t *testing.T, testDir string, testDump *bytes.Buffer) error + +func WriteTest(t *testing.T, wd WriteDump, cd CheckDump) { + tests := []struct { + name string + args archiver.TestDir + target string + }{ + { + name: "single file in root", + args: archiver.TestDir{ + "file": archiver.TestFile{Content: "string"}, + }, + target: "/", + }, + { + name: "multiple files in root", + args: archiver.TestDir{ + "file1": archiver.TestFile{Content: "string"}, + "file2": archiver.TestFile{Content: "string"}, + }, + target: "/", + }, + { + name: "multiple files and folders in root", + args: archiver.TestDir{ + "file1": archiver.TestFile{Content: "string"}, + "file2": archiver.TestFile{Content: "string"}, + "firstDir": archiver.TestDir{ + "another": archiver.TestFile{Content: "string"}, + }, + "secondDir": archiver.TestDir{ + "another2": archiver.TestFile{Content: "string"}, + }, + }, + target: "/", + }, + { + name: "file and symlink in root", + args: archiver.TestDir{ + "file1": archiver.TestFile{Content: "string"}, + "file2": archiver.TestSymlink{Target: "file1"}, + }, + target: "/", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + tmpdir, repo, cleanup := prepareTempdirRepoSrc(t, tt.args) + defer cleanup() + + arch := archiver.New(repo, fs.Track{FS: fs.Local{}}, archiver.Options{}) + + back := rtest.Chdir(t, tmpdir) + defer back() + + sn, _, err := arch.Snapshot(ctx, []string{"."}, archiver.SnapshotOptions{}) + rtest.OK(t, err) + + tree, err := repo.LoadTree(ctx, *sn.Tree) + rtest.OK(t, err) + + dst := &bytes.Buffer{} + if err := wd(ctx, repo, tree, tt.target, dst); err != nil { + t.Fatalf("WriteDump() error = %v", err) + } + if err := cd(t, tmpdir, dst); err != nil { + t.Errorf("WriteDump() = does not match: %v", err) + } + }) + } +} diff --git a/internal/dump/tar_test.go b/internal/dump/tar_test.go index 2ef98ffe0..ecf9869ae 100644 --- a/internal/dump/tar_test.go +++ b/internal/dump/tar_test.go @@ -3,7 +3,6 @@ package dump import ( "archive/tar" "bytes" - "context" "fmt" "io" "io/ioutil" @@ -13,99 +12,11 @@ import ( "testing" "time" - "github.com/restic/restic/internal/archiver" "github.com/restic/restic/internal/fs" - "github.com/restic/restic/internal/repository" - "github.com/restic/restic/internal/restic" - rtest "github.com/restic/restic/internal/test" ) -func prepareTempdirRepoSrc(t testing.TB, src archiver.TestDir) (tempdir string, repo restic.Repository, cleanup func()) { - tempdir, removeTempdir := rtest.TempDir(t) - repo, removeRepository := repository.TestRepository(t) - - archiver.TestCreateFiles(t, tempdir, src) - - cleanup = func() { - removeRepository() - removeTempdir() - } - - return tempdir, repo, cleanup -} - func TestWriteTar(t *testing.T) { - tests := []struct { - name string - args archiver.TestDir - target string - }{ - { - name: "single file in root", - args: archiver.TestDir{ - "file": archiver.TestFile{Content: "string"}, - }, - target: "/", - }, - { - name: "multiple files in root", - args: archiver.TestDir{ - "file1": archiver.TestFile{Content: "string"}, - "file2": archiver.TestFile{Content: "string"}, - }, - target: "/", - }, - { - name: "multiple files and folders in root", - args: archiver.TestDir{ - "file1": archiver.TestFile{Content: "string"}, - "file2": archiver.TestFile{Content: "string"}, - "firstDir": archiver.TestDir{ - "another": archiver.TestFile{Content: "string"}, - }, - "secondDir": archiver.TestDir{ - "another2": archiver.TestFile{Content: "string"}, - }, - }, - target: "/", - }, - { - name: "file and symlink in root", - args: archiver.TestDir{ - "file1": archiver.TestFile{Content: "string"}, - "file2": archiver.TestSymlink{Target: "file1"}, - }, - target: "/", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - tmpdir, repo, cleanup := prepareTempdirRepoSrc(t, tt.args) - defer cleanup() - - arch := archiver.New(repo, fs.Track{FS: fs.Local{}}, archiver.Options{}) - - back := rtest.Chdir(t, tmpdir) - defer back() - - sn, _, err := arch.Snapshot(ctx, []string{"."}, archiver.SnapshotOptions{}) - rtest.OK(t, err) - - tree, err := repo.LoadTree(ctx, *sn.Tree) - rtest.OK(t, err) - - dst := &bytes.Buffer{} - if err := WriteTar(ctx, repo, tree, tt.target, dst); err != nil { - t.Fatalf("WriteTar() error = %v", err) - } - if err := checkTar(t, tmpdir, dst); err != nil { - t.Errorf("WriteTar() = tar does not match: %v", err) - } - }) - } + WriteTest(t, WriteTar, checkTar) } func checkTar(t *testing.T, testDir string, srcTar *bytes.Buffer) error { diff --git a/internal/dump/zip_test.go b/internal/dump/zip_test.go index 70ad00275..84e0d0487 100644 --- a/internal/dump/zip_test.go +++ b/internal/dump/zip_test.go @@ -3,7 +3,6 @@ package dump import ( "archive/zip" "bytes" - "context" "fmt" "io/ioutil" "os" @@ -12,83 +11,11 @@ import ( "testing" "time" - "github.com/restic/restic/internal/archiver" "github.com/restic/restic/internal/fs" - rtest "github.com/restic/restic/internal/test" ) func TestWriteZip(t *testing.T) { - tests := []struct { - name string - args archiver.TestDir - target string - }{ - { - name: "single file in root", - args: archiver.TestDir{ - "file": archiver.TestFile{Content: "string"}, - }, - target: "/", - }, - { - name: "multiple files in root", - args: archiver.TestDir{ - "file1": archiver.TestFile{Content: "string"}, - "file2": archiver.TestFile{Content: "string"}, - }, - target: "/", - }, - { - name: "multiple files and folders in root", - args: archiver.TestDir{ - "file1": archiver.TestFile{Content: "string"}, - "file2": archiver.TestFile{Content: "string"}, - "firstDir": archiver.TestDir{ - "another": archiver.TestFile{Content: "string"}, - }, - "secondDir": archiver.TestDir{ - "another2": archiver.TestFile{Content: "string"}, - }, - }, - target: "/", - }, - { - name: "file and symlink in root", - args: archiver.TestDir{ - "file1": archiver.TestFile{Content: "string"}, - "file2": archiver.TestSymlink{Target: "file1"}, - }, - target: "/", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - tmpdir, repo, cleanup := prepareTempdirRepoSrc(t, tt.args) - defer cleanup() - - arch := archiver.New(repo, fs.Track{FS: fs.Local{}}, archiver.Options{}) - - back := rtest.Chdir(t, tmpdir) - defer back() - - sn, _, err := arch.Snapshot(ctx, []string{"."}, archiver.SnapshotOptions{}) - rtest.OK(t, err) - - tree, err := repo.LoadTree(ctx, *sn.Tree) - rtest.OK(t, err) - - dst := &bytes.Buffer{} - if err := WriteZip(ctx, repo, tree, tt.target, dst); err != nil { - t.Fatalf("WriteZip() error = %v", err) - } - if err := checkZip(t, tmpdir, dst); err != nil { - t.Errorf("WriteZip() = zip does not match: %v", err) - } - }) - } + WriteTest(t, WriteZip, checkZip) } func readZipFile(f *zip.File) ([]byte, error) { @@ -123,6 +50,7 @@ func checkZip(t *testing.T, testDir string, srcZip *bytes.Buffer) error { if info.Name() != filepath.Base(testDir) { fileNumber++ } + return nil }) if err != nil {