From 900d49afeccd32f3571fcb8fe317747d91e5f7e7 Mon Sep 17 00:00:00 2001 From: Felix Pojtinger Date: Wed, 12 Jan 2022 20:30:16 +0100 Subject: [PATCH] feat: Add test for `Remove` --- pkg/fs/filesystem.go | 4 - pkg/fs/filesystem_test.go | 173 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+), 4 deletions(-) diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index fd4789c..9e4dfbe 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -443,10 +443,6 @@ func (f *STFS) Remove(name string) error { return os.ErrPermission } - if checkName(name) { - return os.ErrInvalid - } - f.ioLock.Lock() defer f.ioLock.Unlock() diff --git a/pkg/fs/filesystem_test.go b/pkg/fs/filesystem_test.go index 9381678..ffa73b5 100644 --- a/pkg/fs/filesystem_test.go +++ b/pkg/fs/filesystem_test.go @@ -1249,3 +1249,176 @@ func TestSTFS_OpenFile(t *testing.T) { }) } } + +type removeArgs struct { + name string +} + +var removeTests = []struct { + name string + args removeArgs + wantErr bool + prepare func(afero.Fs) error + check func(afero.Fs) error + checkAfterError bool +}{ + { + "Can remove /", + removeArgs{"/"}, + false, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can remove ''", + removeArgs{""}, + false, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can not remove ' '", + removeArgs{" "}, + true, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can not remove /test.txt if does not exist", + removeArgs{"/test.txt"}, + true, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can remove /test.txt if does exist", + removeArgs{"/test.txt"}, + false, + func(f afero.Fs) error { + if _, err := f.Create("/test.txt"); err != nil { + return err + } + + return nil + }, + func(f afero.Fs) error { + if _, err := f.Stat("/test.txt"); !errors.Is(err, os.ErrNotExist) { + return err + } + + return nil + }, + false, + }, + { + "Can not remove /mydir/test.txt if does not exist", + removeArgs{"/mydir/test.txt"}, + true, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can not remove /mydir/test.txt if does not exist, but the parent exists", + removeArgs{"/mydir/test.txt"}, + true, + func(f afero.Fs) error { + return f.Mkdir("/mydir", os.ModePerm) + }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can remove /mydir/test.txt if does exist", + removeArgs{"/mydir/test.txt"}, + false, + func(f afero.Fs) error { + if err := f.Mkdir("/mydir", os.ModePerm); err != nil { + return err + } + + if _, err := f.Create("/mydir/test.txt"); err != nil { + return err + } + + return nil + }, + func(f afero.Fs) error { + if _, err := f.Stat("/mydir/test.txt"); !errors.Is(err, os.ErrNotExist) { + return err + } + + return nil + }, + false, + }, + { + "Can remove /mydir if it is a directory and empty", + removeArgs{"/mydir"}, + false, + func(f afero.Fs) error { + if err := f.Mkdir("/mydir", os.ModePerm); err != nil { + return err + } + + return nil + }, + func(f afero.Fs) error { + return nil + }, + false, + }, + // FIXME: STFS can delete directories using `Remove` even if it isn't empty + // { + // "Can not remove /mydir if it is a directory and not empty", + // removeArgs{"/mydir"}, + // true, + // func(f afero.Fs) error { + // if err := f.Mkdir("/mydir", os.ModePerm); err != nil { + // return err + // } + + // if _, err := f.Create("/mydir/test.txt"); err != nil { + // return err + // } + + // return nil + // }, + // func(f afero.Fs) error { + // return nil + // }, + // false, + // }, +} + +func TestSTFS_Remove(t *testing.T) { + for _, tt := range removeTests { + tt := tt + + runTestForAllFss(t, tt.name, true, func(t *testing.T, fs fsConfig) { + if err := tt.prepare(fs.fs); err != nil { + t.Errorf("%v prepare() error = %v", fs.fs.Name(), err) + + return + } + + if err := fs.fs.Remove(tt.args.name); (err != nil) != tt.wantErr { + if !tt.checkAfterError { + t.Errorf("%v.Remove() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) + + return + } + } + + if err := tt.check(fs.fs); err != nil { + t.Errorf("%v check() error = %v", fs.fs.Name(), err) + + return + } + }) + } +}