diff --git a/Vagrantfile b/Vagrantfile index ae66663bb..b12f1a737 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -85,6 +85,7 @@ end Vagrant.configure(2) do |config| # use rsync to copy content to the folder config.vm.synced_folder ".", "/vagrant/go/src/github.com/restic/restic", :type => "rsync" + config.vm.synced_folder ".", "/vagrant", disabled: true # fix permissions on synced folder config.vm.provision "fix perms", :type => :shell, :inline => fix_perms diff --git a/cmd/restic/integration_fuse_test.go b/cmd/restic/integration_fuse_test.go index 5a6d26ac9..807b335fc 100644 --- a/cmd/restic/integration_fuse_test.go +++ b/cmd/restic/integration_fuse_test.go @@ -57,7 +57,7 @@ func cmdMount(t testing.TB, global GlobalOptions, dir string, ready, done chan s cmd := &CmdMount{global: &global, ready: ready, done: done} OK(t, cmd.Execute([]string{dir})) if TestCleanup { - OK(t, os.RemoveAll(dir)) + RemoveAll(t, dir) } } @@ -102,7 +102,7 @@ func TestMount(t *testing.T) { OK(t, err) // We remove the mountpoint now to check that cmdMount creates it - OK(t, os.RemoveAll(mountpoint)) + RemoveAll(t, mountpoint) ready := make(chan struct{}, 1) done := make(chan struct{}) diff --git a/cmd/restic/integration_helpers_test.go b/cmd/restic/integration_helpers_test.go index a31198a53..857096c58 100644 --- a/cmd/restic/integration_helpers_test.go +++ b/cmd/restic/integration_helpers_test.go @@ -183,7 +183,7 @@ func cleanupTempdir(t testing.TB, tempdir string) { return } - OK(t, os.RemoveAll(tempdir)) + RemoveAll(t, tempdir) } // withTestEnvironment creates a test environment and calls f with it. After f has @@ -214,5 +214,5 @@ func withTestEnvironment(t testing.TB, f func(*testEnvironment, GlobalOptions)) return } - OK(t, os.RemoveAll(tempdir)) + RemoveAll(t, tempdir) } diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go index f255181ba..50895c65c 100644 --- a/crypto/crypto_test.go +++ b/crypto/crypto_test.go @@ -2,9 +2,9 @@ package crypto_test import ( "bytes" + "crypto/rand" "io" "io/ioutil" - "os" "testing" "github.com/restic/chunker" @@ -50,10 +50,7 @@ func TestSmallBuffer(t *testing.T) { size := 600 data := make([]byte, size) - f, err := os.Open("/dev/urandom") - OK(t, err) - - _, err = io.ReadFull(f, data) + _, err := io.ReadFull(rand.Reader, data) OK(t, err) ciphertext := make([]byte, size/2) @@ -75,10 +72,7 @@ func TestSameBuffer(t *testing.T) { size := 600 data := make([]byte, size) - f, err := os.Open("/dev/urandom") - OK(t, err) - - _, err = io.ReadFull(f, data) + _, err := io.ReadFull(rand.Reader, data) OK(t, err) ciphertext := make([]byte, 0, size+crypto.Extension) @@ -124,10 +118,7 @@ func TestLargeEncrypt(t *testing.T) { for _, size := range []int{chunker.MaxSize, chunker.MaxSize + 1, chunker.MaxSize + 1<<20} { data := make([]byte, size) - f, err := os.Open("/dev/urandom") - OK(t, err) - - _, err = io.ReadFull(f, data) + _, err := io.ReadFull(rand.Reader, data) OK(t, err) ciphertext, err := crypto.Encrypt(k, make([]byte, size+crypto.Extension), data) diff --git a/fuse/dir.go b/fuse/dir.go index 7588b31e6..19f5d569f 100644 --- a/fuse/dir.go +++ b/fuse/dir.go @@ -1,3 +1,6 @@ +// +build !openbsd +// +build !windows + package fuse import ( diff --git a/fuse/file.go b/fuse/file.go index 20e6fdd16..998ea822c 100644 --- a/fuse/file.go +++ b/fuse/file.go @@ -1,3 +1,6 @@ +// +build !openbsd +// +build !windows + package fuse import ( diff --git a/fuse/file_test.go b/fuse/file_test.go index db48f1e9d..10668ea82 100644 --- a/fuse/file_test.go +++ b/fuse/file_test.go @@ -1,3 +1,6 @@ +// +build !openbsd +// +build !windows + package fuse import ( diff --git a/fuse/fuse.go b/fuse/fuse.go index 487d23f10..da64f3938 100644 --- a/fuse/fuse.go +++ b/fuse/fuse.go @@ -1,3 +1,6 @@ +// +build !openbsd +// +build !windows + package fuse import ( diff --git a/fuse/link.go b/fuse/link.go index 61e05b3fd..f963b5832 100644 --- a/fuse/link.go +++ b/fuse/link.go @@ -1,3 +1,6 @@ +// +build !openbsd +// +build !windows + package fuse import ( diff --git a/fuse/snapshot.go b/fuse/snapshot.go index 99f84e806..80476cc78 100644 --- a/fuse/snapshot.go +++ b/fuse/snapshot.go @@ -1,3 +1,6 @@ +// +build !openbsd +// +build !windows + package fuse import ( diff --git a/node_test.go b/node_test.go index 5bdf284bb..f02f0e948 100644 --- a/node_test.go +++ b/node_test.go @@ -109,7 +109,7 @@ func TestNodeRestoreAt(t *testing.T) { defer func() { if TestCleanup { - OK(t, os.RemoveAll(tempdir)) + RemoveAll(t, tempdir) } else { t.Logf("leaving tempdir at %v", tempdir) } diff --git a/test/helpers.go b/test/helpers.go index 504b582ca..1b09b7a0e 100644 --- a/test/helpers.go +++ b/test/helpers.go @@ -59,6 +59,7 @@ func Equals(tb testing.TB, exp, act interface{}) { } } +// ParseID parses s as a backend.ID and panics if that fails. func ParseID(s string) backend.ID { id, err := backend.ParseID(s) if err != nil { @@ -88,19 +89,18 @@ func RandomReader(seed, size int) *bytes.Reader { // SetupTarTestFixture extracts the tarFile to outputDir. func SetupTarTestFixture(t testing.TB, outputDir, tarFile string) { - err := System("sh", "-c", `(cd "$1" && tar xzf - ) < "$2"`, - "sh", outputDir, tarFile) + f, err := os.Open(tarFile) + defer f.Close() OK(t, err) -} -// System runs the command and returns the exit code. Output is passed on to -// stdout/stderr. -func System(command string, args ...string) error { - cmd := exec.Command(command, args...) + cmd := exec.Command("tar", "xzf", "-") + cmd.Dir = outputDir + + cmd.Stdin = f cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr - return cmd.Run() + OK(t, cmd.Run()) } // WithTestEnvironment creates a test environment, extracts the repository @@ -124,7 +124,7 @@ func WithTestEnvironment(t testing.TB, repoFixture string, f func(repodir string return } - OK(t, os.RemoveAll(tempdir)) + RemoveAll(t, tempdir) } // OpenLocalRepo opens the local repository located at dir. @@ -138,3 +138,31 @@ func OpenLocalRepo(t testing.TB, dir string) *repository.Repository { return repo } + +func isFile(fi os.FileInfo) bool { + return fi.Mode()&(os.ModeType|os.ModeCharDevice) == 0 +} + +// ResetReadOnly recursively resets the read-only flag recursively for dir. +// This is mainly used for tests on Windows, which is unable to delete a file +// set read-only. +func ResetReadOnly(t testing.TB, dir string) { + OK(t, filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error { + if fi.IsDir() { + return os.Chmod(path, 0777) + } + + if isFile(fi) { + return os.Chmod(path, 0666) + } + + return nil + })) +} + +// RemoveAll recursively resets the read-only flag of all files and dirs and +// afterwards uses os.RemoveAll() to remove the path. +func RemoveAll(t testing.TB, path string) { + ResetReadOnly(t, path) + OK(t, os.RemoveAll(path)) +} diff --git a/tree_test.go b/tree_test.go index 2d9cb7b7e..725e80b14 100644 --- a/tree_test.go +++ b/tree_test.go @@ -50,7 +50,7 @@ func TestTree(t *testing.T) { dir := createTempDir(t) defer func() { if TestCleanup { - OK(t, os.RemoveAll(dir)) + RemoveAll(t, dir) } }() }