restic/internal/backend/local/local_test.go
Michael Eischer ff7ef5007e Replace most usages of ioutil with the underlying function
The ioutil functions are deprecated since Go 1.17 and only wrap another
library function. Thus directly call the underlying function.

This commit only mechanically replaces the function calls.
2022-12-02 19:36:43 +01:00

137 lines
2.8 KiB
Go

package local_test
import (
"context"
"os"
"path/filepath"
"testing"
"github.com/restic/restic/internal/backend/local"
"github.com/restic/restic/internal/backend/test"
"github.com/restic/restic/internal/restic"
rtest "github.com/restic/restic/internal/test"
)
func newTestSuite(t testing.TB) *test.Suite {
return &test.Suite{
// NewConfig returns a config for a new temporary backend that will be used in tests.
NewConfig: func() (interface{}, error) {
dir, err := os.MkdirTemp(rtest.TestTempDir, "restic-test-local-")
if err != nil {
t.Fatal(err)
}
t.Logf("create new backend at %v", dir)
cfg := local.Config{
Path: dir,
Connections: 2,
}
return cfg, nil
},
// CreateFn is a function that creates a temporary repository for the tests.
Create: func(config interface{}) (restic.Backend, error) {
cfg := config.(local.Config)
return local.Create(context.TODO(), cfg)
},
// OpenFn is a function that opens a previously created temporary repository.
Open: func(config interface{}) (restic.Backend, error) {
cfg := config.(local.Config)
return local.Open(context.TODO(), cfg)
},
// CleanupFn removes data created during the tests.
Cleanup: func(config interface{}) error {
cfg := config.(local.Config)
if !rtest.TestCleanupTempDirs {
t.Logf("leaving test backend dir at %v", cfg.Path)
}
rtest.RemoveAll(t, cfg.Path)
return nil
},
}
}
func TestBackend(t *testing.T) {
newTestSuite(t).RunTests(t)
}
func BenchmarkBackend(t *testing.B) {
newTestSuite(t).RunBenchmarks(t)
}
func readdirnames(t testing.TB, dir string) []string {
f, err := os.Open(dir)
if err != nil {
t.Fatal(err)
}
entries, err := f.Readdirnames(-1)
if err != nil {
t.Fatal(err)
}
err = f.Close()
if err != nil {
t.Fatal(err)
}
return entries
}
func empty(t testing.TB, dir string) {
entries := readdirnames(t, dir)
if len(entries) != 0 {
t.Fatalf("directory %v is not empty, contains: %v", dir, entries)
}
}
func openclose(t testing.TB, dir string) {
cfg := local.Config{Path: dir}
be, err := local.Open(context.TODO(), cfg)
if err != nil {
t.Logf("Open returned error %v", err)
}
if be != nil {
err = be.Close()
if err != nil {
t.Logf("Close returned error %v", err)
}
}
}
func mkdir(t testing.TB, dir string) {
err := os.Mkdir(dir, 0700)
if err != nil {
t.Fatal(err)
}
}
func removeAll(t testing.TB, dir string) {
err := os.RemoveAll(dir)
if err != nil {
t.Fatal(err)
}
}
func TestOpenNotExistingDirectory(t *testing.T) {
dir, cleanup := rtest.TempDir(t)
defer cleanup()
// local.Open must not create any files dirs in the repo
openclose(t, filepath.Join(dir, "repo"))
empty(t, dir)
openclose(t, dir)
empty(t, dir)
mkdir(t, filepath.Join(dir, "data"))
openclose(t, dir)
removeAll(t, filepath.Join(dir, "data"))
empty(t, dir)
}