diff --git a/db.go b/db.go index d12e846..03a9c74 100644 --- a/db.go +++ b/db.go @@ -419,7 +419,11 @@ func (db *DB) FileSize() (int64, error) { return 0, err } for _, file := range files { - size += file.Size() + info, err := file.Info() + if err != nil { + return 0, err + } + size += info.Size() } return size, nil } diff --git a/db_test.go b/db_test.go index 8a71bce..bd29b84 100644 --- a/db_test.go +++ b/db_test.go @@ -6,7 +6,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "log" "os" "path/filepath" @@ -30,7 +29,7 @@ var ( func TestMain(m *testing.M) { flag.Parse() if !testing.Verbose() { - SetLogger(log.New(ioutil.Discard, "", 0)) + SetLogger(log.New(io.Discard, "", 0)) } // Run tests against all file systems. for _, fsys := range []fs.FileSystem{fs.Mem, fs.OSMMap, fs.OS} { @@ -43,6 +42,7 @@ func TestMain(m *testing.M) { os.Exit(exitCode) } } + _ = cleanDir(testDBName) os.Exit(0) } @@ -87,6 +87,17 @@ func TestHeaderSize(t *testing.T) { } } +func cleanDir(path string) error { + files, err := testFS.ReadDir(path) + if err != nil { + return err + } + for _, file := range files { + _ = testFS.Remove(filepath.Join(testDBName, file.Name())) + } + return nil +} + func createTestDB(opts *Options) (*DB, error) { if opts == nil { opts = &Options{FileSystem: testFS} @@ -95,15 +106,10 @@ func createTestDB(opts *Options) (*DB, error) { opts.FileSystem = testFS } } - path := testDBName - files, err := testFS.ReadDir(path) - if err != nil && !os.IsNotExist(err) { + if err := cleanDir(testDBName); err != nil { return nil, err } - for _, file := range files { - _ = testFS.Remove(filepath.Join(path, file.Name())) - } - return Open(path, opts) + return Open(testDBName, opts) } func TestEmpty(t *testing.T) { diff --git a/file_test.go b/file_test.go index 88857b9..41ce6e1 100644 --- a/file_test.go +++ b/file_test.go @@ -30,7 +30,7 @@ func (fs *errfs) Rename(oldpath, newpath string) error { return errfileError } -func (fs *errfs) ReadDir(name string) ([]os.FileInfo, error) { +func (fs *errfs) ReadDir(name string) ([]os.DirEntry, error) { return nil, errfileError } diff --git a/fs/fs.go b/fs/fs.go index ebde0e9..5c5153f 100644 --- a/fs/fs.go +++ b/fs/fs.go @@ -56,7 +56,7 @@ type FileSystem interface { Rename(oldpath, newpath string) error // ReadDir reads the directory and returns a list of directory entries. - ReadDir(name string) ([]os.FileInfo, error) + ReadDir(name string) ([]os.DirEntry, error) // CreateLockFile creates a lock file. CreateLockFile(name string, perm os.FileMode) (LockFile, bool, error) diff --git a/fs/mem.go b/fs/mem.go index d1c3fd8..9ce08f0 100644 --- a/fs/mem.go +++ b/fs/mem.go @@ -70,15 +70,15 @@ func (fs *memFS) Rename(oldpath, newpath string) error { return os.ErrNotExist } -func (fs *memFS) ReadDir(dir string) ([]os.FileInfo, error) { +func (fs *memFS) ReadDir(dir string) ([]os.DirEntry, error) { dir = filepath.Clean(dir) - var fis []os.FileInfo + var entries []os.DirEntry for name, f := range fs.files { if filepath.Dir(name) == dir { - fis = append(fis, f) + entries = append(entries, f) } } - return fis, nil + return entries, nil } type memFile struct { @@ -223,6 +223,14 @@ func (f *memFile) Sys() interface{} { return nil } +func (f *memFile) Type() os.FileMode { + return f.perm +} + +func (f *memFile) Info() (os.FileInfo, error) { + return f.Stat() +} + func (f *memFile) Slice(start int64, end int64) ([]byte, error) { if f.closed { return nil, os.ErrClosed diff --git a/fs/os.go b/fs/os.go index 605ac4e..e778abc 100644 --- a/fs/os.go +++ b/fs/os.go @@ -1,7 +1,6 @@ package fs import ( - "io/ioutil" "os" ) @@ -34,8 +33,8 @@ func (fs *osFS) Rename(oldpath, newpath string) error { return os.Rename(oldpath, newpath) } -func (fs *osFS) ReadDir(name string) ([]os.FileInfo, error) { - return ioutil.ReadDir(name) +func (fs *osFS) ReadDir(name string) ([]os.DirEntry, error) { + return os.ReadDir(name) } type osFile struct { diff --git a/fs/os_mmap_unix.go b/fs/os_mmap_unix.go index 2a5d4c2..bb2e295 100644 --- a/fs/os_mmap_unix.go +++ b/fs/os_mmap_unix.go @@ -1,4 +1,4 @@ -// +build !windows +//go:build !windows package fs diff --git a/fs/os_mmap_windows.go b/fs/os_mmap_windows.go index 1f2d8f0..af8434b 100644 --- a/fs/os_mmap_windows.go +++ b/fs/os_mmap_windows.go @@ -1,4 +1,4 @@ -// +build windows +//go:build windows package fs diff --git a/fs/os_unix.go b/fs/os_unix.go index 0b11c15..bcc6230 100644 --- a/fs/os_unix.go +++ b/fs/os_unix.go @@ -1,4 +1,4 @@ -// +build !windows +//go:build !windows package fs diff --git a/fs/os_windows.go b/fs/os_windows.go index cdd61c8..097a23f 100644 --- a/fs/os_windows.go +++ b/fs/os_windows.go @@ -1,4 +1,4 @@ -// +build windows +//go:build windows package fs diff --git a/fs/sub.go b/fs/sub.go index 9a69d1e..678653c 100644 --- a/fs/sub.go +++ b/fs/sub.go @@ -39,7 +39,7 @@ func (fs *subFS) Rename(oldpath, newpath string) error { return fs.fsys.Rename(subOldpath, subNewpath) } -func (fs *subFS) ReadDir(name string) ([]os.FileInfo, error) { +func (fs *subFS) ReadDir(name string) ([]os.DirEntry, error) { subName := filepath.Join(fs.root, name) return fs.fsys.ReadDir(subName) } diff --git a/internal/errors/errors_go113_test.go b/internal/errors/errors_go113_test.go deleted file mode 100644 index 4438fe9..0000000 --- a/internal/errors/errors_go113_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build go1.13 - -package errors - -import ( - "errors" - "testing" - - "github.com/akrylysov/pogreb/internal/assert" -) - -func TestIs(t *testing.T) { - err1 := New("err1") - w11 := Wrap(err1, "wrapped 11") - w12 := Wrap(w11, "wrapped 12") - - err2 := New("err2") - w21 := Wrap(err2, "wrapped 21") - - assert.Equal(t, true, errors.Is(err1, err1)) - assert.Equal(t, true, errors.Is(w11, err1)) - assert.Equal(t, true, errors.Is(w12, err1)) - assert.Equal(t, true, errors.Is(w12, w11)) - - assert.Equal(t, false, errors.Is(err1, err2)) - assert.Equal(t, false, errors.Is(w11, err2)) - assert.Equal(t, false, errors.Is(w12, err2)) - assert.Equal(t, false, errors.Is(w21, err1)) - assert.Equal(t, false, errors.Is(w21, w11)) -} diff --git a/internal/errors/errors_test.go b/internal/errors/errors_test.go index 68be927..360f9f6 100644 --- a/internal/errors/errors_test.go +++ b/internal/errors/errors_test.go @@ -1,6 +1,7 @@ package errors import ( + "errors" "testing" "github.com/akrylysov/pogreb/internal/assert" @@ -17,3 +18,23 @@ func TestWrap(t *testing.T) { assert.Equal(t, "wrapped 11: err1", w11.Error()) assert.Equal(t, "wrapped 12: wrapped 11: err1", w12.Error()) } + +func TestIs(t *testing.T) { + err1 := New("err1") + w11 := Wrap(err1, "wrapped 11") + w12 := Wrap(w11, "wrapped 12") + + err2 := New("err2") + w21 := Wrap(err2, "wrapped 21") + + assert.Equal(t, true, errors.Is(err1, err1)) + assert.Equal(t, true, errors.Is(w11, err1)) + assert.Equal(t, true, errors.Is(w12, err1)) + assert.Equal(t, true, errors.Is(w12, w11)) + + assert.Equal(t, false, errors.Is(err1, err2)) + assert.Equal(t, false, errors.Is(w11, err2)) + assert.Equal(t, false, errors.Is(w12, err2)) + assert.Equal(t, false, errors.Is(w21, err1)) + assert.Equal(t, false, errors.Is(w21, w11)) +}