github.com/mckael/restic@v0.8.3/internal/backend/local/local_test.go (about) 1 package local_test 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/restic/restic/internal/backend/local" 10 "github.com/restic/restic/internal/backend/test" 11 "github.com/restic/restic/internal/restic" 12 rtest "github.com/restic/restic/internal/test" 13 ) 14 15 func newTestSuite(t testing.TB) *test.Suite { 16 return &test.Suite{ 17 // NewConfig returns a config for a new temporary backend that will be used in tests. 18 NewConfig: func() (interface{}, error) { 19 dir, err := ioutil.TempDir(rtest.TestTempDir, "restic-test-local-") 20 if err != nil { 21 t.Fatal(err) 22 } 23 24 t.Logf("create new backend at %v", dir) 25 26 cfg := local.Config{ 27 Path: dir, 28 } 29 return cfg, nil 30 }, 31 32 // CreateFn is a function that creates a temporary repository for the tests. 33 Create: func(config interface{}) (restic.Backend, error) { 34 cfg := config.(local.Config) 35 return local.Create(cfg) 36 }, 37 38 // OpenFn is a function that opens a previously created temporary repository. 39 Open: func(config interface{}) (restic.Backend, error) { 40 cfg := config.(local.Config) 41 return local.Open(cfg) 42 }, 43 44 // CleanupFn removes data created during the tests. 45 Cleanup: func(config interface{}) error { 46 cfg := config.(local.Config) 47 if !rtest.TestCleanupTempDirs { 48 t.Logf("leaving test backend dir at %v", cfg.Path) 49 } 50 51 rtest.RemoveAll(t, cfg.Path) 52 return nil 53 }, 54 } 55 } 56 57 func TestBackend(t *testing.T) { 58 newTestSuite(t).RunTests(t) 59 } 60 61 func BenchmarkBackend(t *testing.B) { 62 newTestSuite(t).RunBenchmarks(t) 63 } 64 65 func readdirnames(t testing.TB, dir string) []string { 66 f, err := os.Open(dir) 67 if err != nil { 68 t.Fatal(err) 69 } 70 71 entries, err := f.Readdirnames(-1) 72 if err != nil { 73 t.Fatal(err) 74 } 75 76 err = f.Close() 77 if err != nil { 78 t.Fatal(err) 79 } 80 81 return entries 82 } 83 84 func empty(t testing.TB, dir string) { 85 entries := readdirnames(t, dir) 86 if len(entries) != 0 { 87 t.Fatalf("directory %v is not empty, contains: %v", dir, entries) 88 } 89 } 90 91 func openclose(t testing.TB, dir string) { 92 cfg := local.Config{Path: dir} 93 94 be, err := local.Open(cfg) 95 if err != nil { 96 t.Logf("Open returned error %v", err) 97 } 98 99 if be != nil { 100 err = be.Close() 101 if err != nil { 102 t.Logf("Close returned error %v", err) 103 } 104 } 105 } 106 107 func mkdir(t testing.TB, dir string) { 108 err := os.Mkdir(dir, 0700) 109 if err != nil { 110 t.Fatal(err) 111 } 112 } 113 114 func removeAll(t testing.TB, dir string) { 115 err := os.RemoveAll(dir) 116 if err != nil { 117 t.Fatal(err) 118 } 119 } 120 121 func TestOpenNotExistingDirectory(t *testing.T) { 122 dir, cleanup := rtest.TempDir(t) 123 defer cleanup() 124 125 // local.Open must not create any files dirs in the repo 126 openclose(t, filepath.Join(dir, "repo")) 127 empty(t, dir) 128 129 openclose(t, dir) 130 empty(t, dir) 131 132 mkdir(t, filepath.Join(dir, "data")) 133 openclose(t, dir) 134 removeAll(t, filepath.Join(dir, "data")) 135 empty(t, dir) 136 }