diff --git a/memfs/fs_test.go b/memfs/fs_test.go index 9e6a1e8..5514cfe 100644 --- a/memfs/fs_test.go +++ b/memfs/fs_test.go @@ -23,79 +23,5 @@ func fixtureFile(name string) string { func TestMemFS(t *testing.T) { fsys := New() t.Run("Pass writefstest.TestFS", writefstest.TestFS(fsys)) - /* - t.Run("MapWriteFS", func(t *testing.T) { - / * data := []byte{0xca, 0xfe, 0xba, 0xbe} - fsw := MapWriteFS{fstest.MapFS{ - "adir/afile": &fstest.MapFile{Data: data}, - "adir2/afile2": &fstest.MapFile{Data: data}, - }} - * / - t.Run("WriteFile", func(t *testing.T) { - fsw := MapWriteFS{fstest.MapFS{}} - - buf := []byte("pippero") - n, err := writefs.WriteFile(fsw, "file.pip", buf) - assert.NoError(t, err) - assert.Equal(t, len(buf), n) - - actual, err := fs.ReadFile(fsw, "file.pip") - assert.NoError(t, err) - assert.Equal(t, buf, actual) - - }) - /* - t.Run("creates directories with OpenFile", func(t *testing.T) { - - fsys := MapWriteFS{fstest.MapFS{}} - f, err := fsys.OpenFile("tmp/adir", os.O_CREATE, fs.FileMode(0755)|fs.ModeDir) - assert.NoError(t, err) - assert.Nil(t, f) - info, err := fs.Stat(fsys, "tmp/adir") - assert.NoError(t, err) - assert.True(t, info.IsDir()) - - }) - - t.Run("remove directories with OpenFile", func(t *testing.T) { - - fsys := MapWriteFS{fstest.MapFS{ - "adir/afile": &fstest.MapFile{Mode: fs.ModeDir}, - }} - - info, err := fs.Stat(fsys, "adir/afile") - assert.NoError(t, err) - assert.True(t, info.IsDir()) - - f, err := fsys.OpenFile("adir/afile", os.O_TRUNC, 0) - assert.NoError(t, err) - assert.Nil(t, f) - - info, err = fs.Stat(fsys, "adir/afile") - assert.Error(t, err) - assert.True(t, os.IsNotExist(err)) - assert.Nil(t, info) - - }) - - t.Run("writes files", func(t *testing.T) { - f, err := writefs.OpenFile(fsw, "adir/afile", os.O_WRONLY|os.O_TRUNC, fs.FileMode(0664)) - assert.NoError(t, err) - - defer f.Close() - - buf := []byte("ciao") - n, err := f.Write(buf) - - assert.NoError(t, err) - assert.Equal(t, n, len(buf)) - - actual, err := fs.ReadFile(fsw, "adir/afile") - assert.NoError(t, err) - assert.Equal(t, buf, actual) - }) - * / - }) - */ } diff --git a/mountedfs/fs.go b/mountedfs/fs.go index 4f86ac3..3b23eaa 100644 --- a/mountedfs/fs.go +++ b/mountedfs/fs.go @@ -103,7 +103,23 @@ func (f MountedFS) Sub(dir string) (fs.FS, error) { // OpenFile implements writefs.WriteFS func (f MountedFS) OpenFile(name string, flag int, perm fs.FileMode) (writefs.FileWriter, error) { - return nil, nil + if !fs.ValidPath(name) { + return nil, &fs.PathError{} + } + + if name == "." { + return nil, syscall.EISDIR + } + + rpath := f.pickRemotePath(name) + if rpath.Error != nil { + return nil, rpath.Error + } + if rpath.Path == "." { + return nil, fs.ErrExist + } + + return writefs.OpenFile(rpath.Fs, rpath.Path, flag, perm) } // Mount add a child file system, using `name` @@ -231,7 +247,7 @@ func (f MountedFS) pickRemotePath(name string) remotePath { var ok bool res.Fs, ok = f[res.FsName] if !ok { - res.Error = fmt.Errorf("fs not found: %s", res.FsName) + res.Error = fmt.Errorf("%w: fs not found: %s", fs.ErrNotExist, res.FsName) } return res diff --git a/mountedfs/fs_test.go b/mountedfs/fs_test.go index fa27671..b7d77c1 100644 --- a/mountedfs/fs_test.go +++ b/mountedfs/fs_test.go @@ -5,12 +5,14 @@ import ( "testing" "testing/fstest" + "github.com/parro-it/vs/memfs" + "github.com/parro-it/vs/writefstest" "github.com/stretchr/testify/assert" ) func TestMountedFS(t *testing.T) { data := []byte{0xca, 0xfe, 0xba, 0xbe} - memfs := fstest.MapFS{ + memfs1 := fstest.MapFS{ "adir/afile": &fstest.MapFile{Data: data}, } @@ -18,11 +20,18 @@ func TestMountedFS(t *testing.T) { "adir2/afile2": &fstest.MapFile{Data: data}, } + dir1 := memfs.New() + dirempty := memfs.New() + mfs := MountedFS{ - "c": memfs, - "d": memfs2, + "c": memfs1, + "d": memfs2, + "dir1": dir1, + "dirempty": dirempty, } + t.Run("pass writefstest.TestFS", writefstest.TestFS(mfs)) + t.Run("read files from multiple fs", func(t *testing.T) { buf, err := fs.ReadFile(mfs, "c/adir/afile") buf2, err2 := fs.ReadFile(mfs, "d/adir2/afile2") @@ -50,11 +59,8 @@ func TestMountedFS(t *testing.T) { buf, err := fs.ReadFile(mfs, "f/adir/afile") assert.Error(t, err) - assert.Equal(t, "fs not found: f", err.Error()) + assert.Equal(t, "file does not exist: fs not found: f", err.Error()) assert.Nil(t, buf) }) - t.Run("TestFS", func(t *testing.T) { - assert.NoError(t, fstest.TestFS(mfs, "c/adir/afile", "d/adir2/afile2")) - }) } diff --git a/osfs/fs_test.go b/osfs/fs_test.go index 7bf93bb..6c46a43 100644 --- a/osfs/fs_test.go +++ b/osfs/fs_test.go @@ -35,76 +35,5 @@ func fixtureFile(name string) string { func TestOsFS(t *testing.T) { fsys := DirWriteFS("/var/fixtures") t.Run("Pass writefstest.TestFS", writefstest.TestFS(fsys)) - /* - fsw := fixtures() - t.Run("writes files", func(t *testing.T) { - os.Remove(fixtureFile("afile")) - f, err := writefs.OpenFile(fsw, "afile", os.O_WRONLY|os.O_CREATE, fs.FileMode(0664)) - defer f.Close() - - buf := []byte("ciao") - n, err := f.Write(buf) - assert.NoError(t, err) - assert.Equal(t, n, len(buf)) - actual, err := ioutil.ReadFile(fixtureFile("afile")) - assert.NoError(t, err) - assert.Equal(t, buf, actual) - assert.NoError(t, os.Remove(fixtureFile("afile"))) - }) - - t.Run("creates directories with OpenFile", func(t *testing.T) { - os.RemoveAll("/tmp/adir") - fsys := DirWriteFS("/tmp") - f, err := fsys.OpenFile("adir", os.O_CREATE, fs.FileMode(0755)|fs.ModeDir) - assert.NoError(t, err) - assert.Nil(t, f) - info, err := os.Stat("/tmp/adir") - assert.NoError(t, err) - assert.True(t, info.IsDir()) - err = os.RemoveAll("/tmp/adir") - assert.NoError(t, err) - }) - - t.Run("remove directories with OpenFile", func(t *testing.T) { - os.MkdirAll("/tmp/adir", os.FileMode(0755)) - info, err := os.Stat("/tmp/adir") - assert.NoError(t, err) - assert.True(t, info.IsDir()) - - fsys := DirWriteFS("/tmp") - f, err := fsys.OpenFile("adir", os.O_TRUNC, 0) - assert.NoError(t, err) - assert.Nil(t, f) - - info, err = os.Stat("/tmp/adir") - assert.Error(t, err) - assert.True(t, os.IsNotExist(err)) - assert.Nil(t, info) - - os.RemoveAll("/tmp/adir") - - }) - - t.Run("pass TestFS", func(t *testing.T) { - fstest.TestFS(fsw, "dir1/file2", "file1") - - f, err := writefs.OpenFile(fsw, ".", os.O_RDONLY, fs.FileMode(0664)) - defer f.Close() - assert.NoError(t, err) - dir, ok := f.(fs.ReadDirFile) - files, err := dir.ReadDir(-1) - assert.True(t, ok) - assert.Equal(t, 4, len(files)) - assert.Equal(t, true, files[0].Type().IsDir()) - assert.Equal(t, "fakehost", files[0].Name()) - assert.Equal(t, false, files[1].Type().IsDir()) - assert.Equal(t, "file1", files[1].Name()) - assert.Equal(t, true, files[2].Type().IsDir()) - assert.Equal(t, "dir1", files[2].Name()) - assert.Equal(t, false, files[3].Type().IsDir()) - assert.Equal(t, "anyfile.txt", files[3].Name()) - - }) - */ } diff --git a/sshfs/fs_test.go b/sshfs/fs_test.go index 6c4a93c..da62b2a 100644 --- a/sshfs/fs_test.go +++ b/sshfs/fs_test.go @@ -60,106 +60,5 @@ func TestSSHFS(t *testing.T) { sshClient.Close() }) }) - /* - t.Run("can open files for write", func(t *testing.T) { - fsys, err := Connect("/var/fixtures", hostCfg) - f, err := writefs.OpenFile(fsys, "prova", os.O_WRONLY|os.O_CREATE, fs.FileMode(0664)) - - buf := []byte(time.Now().Format(time.RFC3339Nano)) - n, err := f.Write(buf) - assert.NoError(t, err) - assert.Equal(t, n, len(buf)) - f.Close() - - actual, err := fs.ReadFile(fsys, "prova") - assert.NoError(t, err) - assert.Equal(t, buf, actual) - - }) - - t.Run("creates directories with OpenFile", func(t *testing.T) { - fsys, err := Connect("/tmp", hostCfg) - assert.NoError(t, err) - fsys.client.RemoveDirectory("/tmp/adir") - fsys.client.Remove("/tmp/adir") - f, err := fsys.OpenFile("adir", os.O_CREATE, fs.FileMode(0755)|fs.ModeDir) - assert.NoError(t, err) - assert.Nil(t, f) - info, err := fsys.client.Stat("/tmp/adir") - assert.NoError(t, err) - assert.True(t, info.IsDir()) - err = fsys.client.RemoveDirectory("/tmp/adir") - assert.NoError(t, err) - }) - - t.Run("remove directories with OpenFile", func(t *testing.T) { - fsys, err := Connect("/tmp", hostCfg) - fsys.client.MkdirAll("/tmp/adir") - info, err := fsys.client.Stat("/tmp/adir") - assert.NoError(t, err) - assert.True(t, info.IsDir()) - - f, err := fsys.OpenFile("adir", os.O_TRUNC, 0) - assert.NoError(t, err) - assert.Nil(t, f) - - info, err = fsys.client.Stat("/tmp/adir") - assert.Error(t, err) - assert.True(t, os.IsNotExist(err)) - assert.Nil(t, info) - - fsys.client.RemoveDirectory("/tmp/adir") - - }) - t.Run("can open files", func(t *testing.T) { - fsys, err := Connect("/var/fixtures", hostCfg) - f, err := fsys.Open("ciao.txt") - assert.NoError(t, err) - assert.NotNil(t, f) - buf := make([]byte, 100) - n, err := f.Read(buf) - assert.Equal(t, 5, n) - assert.Equal(t, "ciao\n", string(buf[:n])) - f.Close() - - fsys.Disconnect() - }) - - t.Run("can stat files", func(t *testing.T) { - fsys, err := Connect("/var/fixtures", hostCfg) - info, err := fs.Stat(fsys, "ciao.txt") - assert.NoError(t, err) - assert.NotNil(t, info) - assert.Equal(t, "ciao.txt", info.Name()) - - fsys.Disconnect() - }) - - t.Run("can read files", func(t *testing.T) { - fsys, err := Connect("/var/fixtures", hostCfg) - buf, err := fs.ReadFile(fsys, "ciao.txt") - assert.NoError(t, err) - assert.NotNil(t, buf) - assert.Equal(t, "ciao\n", string(buf)) - - fsys.Disconnect() - }) - - t.Run("can readdir", func(t *testing.T) { - fsys, err := Connect("/var/fixtures", hostCfg) - files, err := fs.ReadDir(fsys, "new-dir") - assert.NoError(t, err) - assert.Equal(t, 4, len(files)) - assert.Equal(t, "file1.txt", files[0].Name()) - - fsys.Disconnect() - }) - t.Run("pass TestFS", func(t *testing.T) { - fsys, err := Connect("/var/fixtures", hostCfg) - assert.NoError(t, err) - err = fstest.TestFS(fsys, "new-dir", "new-dir/file1.txt") - assert.NoError(t, err) - }) - */ } diff --git a/writefstest/testfs.go b/writefstest/testfs.go index b6e8fa3..85c639d 100644 --- a/writefstest/testfs.go +++ b/writefstest/testfs.go @@ -97,17 +97,17 @@ func TestFS(fsys writefs.WriteFS) func(t *testing.T) { fileNotExists(t, dir) } t.Run("creates directories with OpenFile - nested and not recursively", func(t *testing.T) { - dirRemove(t, "adir/nested") - dirRemove(t, "adir") + dirRemove(t, "dir1/adir/nested") + dirRemove(t, "dir1/adir") // nested dir return error - f, err := fsys.OpenFile("adir/nested", os.O_CREATE, fs.FileMode(0755)|fs.ModeDir) + f, err := fsys.OpenFile("dir1/adir/nested", os.O_CREATE, fs.FileMode(0755)|fs.ModeDir) assert.Error(t, err) assert.Nil(t, f) assert.True(t, errors.Is(err, fs.ErrNotExist)) - checkDirCreated(t, "adir") - checkDirCreated(t, "adir/nested") + checkDirCreated(t, "dir1/adir") + checkDirCreated(t, "dir1/adir/nested") }) t.Run("OpenFile return *PathError on bad paths", func(t *testing.T) { @@ -133,14 +133,14 @@ func TestFS(fsys writefs.WriteFS) func(t *testing.T) { t.Run("remove directories with OpenFile - nested and not recursively", func(t *testing.T) { // non empty dir return error - f, err := fsys.OpenFile("adir", os.O_TRUNC, 0) + f, err := fsys.OpenFile("dir1/adir", os.O_TRUNC, 0) assert.Error(t, err) assert.Nil(t, f) assert.True(t, errors.Is(err, fs.ErrInvalid)) //assert.True(t, errors.Is(err, &fs.PathError{})) - checkDirRemoved(t, "adir/nested") - checkDirRemoved(t, "adir") + checkDirRemoved(t, "dir1/adir/nested") + checkDirRemoved(t, "dir1/adir") }) t.Run("create and write on new files", func(t *testing.T) { file := "dir1/file1new"