Files
gopass-mirror/pkg/fsutil/fsutil_test.go
Eng Zer Jun d2f64457fb test: use T.TempDir to create temporary test directory (#2377)
This commit replaces `os.MkdirTemp` with `t.TempDir` in tests. The
directory created by `t.TempDir` is automatically removed when the test
and all its subtests complete.

Prior to this commit, temporary directory created using `os.MkdirTemp`
needs to be removed manually by calling `os.RemoveAll`, which is omitted
in some tests. The error handling boilerplate e.g.
	defer func() {
		if err := os.RemoveAll(dir); err != nil {
			t.Fatal(err)
		}
	}
is also tedious, but `t.TempDir` handles this for us nicely.

Reference: https://pkg.go.dev/testing#T.TempDir
Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2022-10-04 21:14:46 +02:00

156 lines
3.4 KiB
Go

package fsutil
import (
"crypto/rand"
"io/ioutil"
"os"
"os/user"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCleanFilename(t *testing.T) {
t.Parallel()
m := map[string]string{
`"§$%&aÜÄ*&b%§"'Ä"c%$"'"`: "a____b______c",
}
for k, v := range m {
out := CleanFilename(k)
t.Logf("%s -> %s / %s", k, v, out)
assert.Equal(t, v, out)
}
}
func TestCleanPath(t *testing.T) { //nolint:paralleltest
tempdir := t.TempDir()
m := map[string]string{
".": "",
"/home/user/../bob/.password-store": "/home/bob/.password-store",
"/home/user//.password-store": "/home/user/.password-store",
tempdir + "/foo.gpg": tempdir + "/foo.gpg",
}
usr, err := user.Current()
if err == nil {
hd := usr.HomeDir
if gph := os.Getenv("GOPASS_HOMEDIR"); gph != "" {
hd = gph
}
m["~/.password-store"] = hd + "/.password-store"
}
for in, out := range m {
got := CleanPath(in)
// filepath.Abs turns /home/bob into C:\home\bob on Windows
absOut, err := filepath.Abs(out)
assert.NoError(t, err)
assert.Equal(t, absOut, got)
}
}
func TestIsDir(t *testing.T) {
t.Parallel()
tempdir := t.TempDir()
fn := filepath.Join(tempdir, "foo")
assert.NoError(t, os.WriteFile(fn, []byte("bar"), 0o644))
assert.Equal(t, true, IsDir(tempdir))
assert.Equal(t, false, IsDir(fn))
assert.Equal(t, false, IsDir(filepath.Join(tempdir, "non-existing")))
}
func TestIsFile(t *testing.T) {
t.Parallel()
tempdir := t.TempDir()
fn := filepath.Join(tempdir, "foo")
assert.NoError(t, os.WriteFile(fn, []byte("bar"), 0o644))
assert.Equal(t, false, IsFile(tempdir))
assert.Equal(t, true, IsFile(fn))
}
func TestShred(t *testing.T) {
t.Parallel()
tempdir := t.TempDir()
fn := filepath.Join(tempdir, "file")
// test successful shread
fh, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0o644)
assert.NoError(t, err)
buf := make([]byte, 1024)
for i := 0; i < 10*1024; i++ {
_, _ = rand.Read(buf)
_, _ = fh.Write(buf)
}
require.NoError(t, fh.Close())
assert.NoError(t, Shred(fn, 8))
assert.Equal(t, false, IsFile(fn))
// test failed
fh, err = os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0o400)
assert.NoError(t, err)
buf = make([]byte, 1024)
for i := 0; i < 10*1024; i++ {
_, _ = rand.Read(buf)
_, _ = fh.Write(buf)
}
require.NoError(t, fh.Close())
assert.Error(t, Shred(fn, 8))
assert.Equal(t, true, IsFile(fn))
}
func TestIsEmptyDir(t *testing.T) {
t.Parallel()
tempdir := t.TempDir()
fn := filepath.Join(tempdir, "foo", "bar", "baz", "zab")
require.NoError(t, os.MkdirAll(fn, 0o755))
isEmpty, err := IsEmptyDir(tempdir)
assert.NoError(t, err)
assert.Equal(t, true, isEmpty)
fn = filepath.Join(fn, ".config.yml")
require.NoError(t, os.WriteFile(fn, []byte("foo"), 0o644))
isEmpty, err = IsEmptyDir(tempdir)
require.NoError(t, err)
assert.Equal(t, false, isEmpty)
}
func TestCopyFile(t *testing.T) {
t.Parallel()
tempdir := t.TempDir()
sfn := filepath.Join(tempdir, "foo")
require.NoError(t, os.MkdirAll(filepath.Dir(sfn), 0o755))
require.NoError(t, os.WriteFile(sfn, []byte("foo"), 0o644))
dfn := filepath.Join(tempdir, "bar")
assert.NoError(t, CopyFile(sfn, dfn))
// try to overwrite existing file w/o write bit
dfn = filepath.Join(tempdir, "bar2")
require.NoError(t, ioutil.WriteFile(dfn, []byte("foo"), 0o400))
assert.Error(t, CopyFile(sfn, dfn))
assert.NoError(t, CopyFileForce(sfn, dfn))
}