1
mirror of https://github.com/rclone/rclone synced 2024-12-23 14:23:44 +01:00
rclone/vfs/dir_handle_test.go
Nick Craig-Wood e18122e88b vfs: add tests and subsequent fixes
* Tests for VFS layer
  * Small fixes found during testing
  * Fix Close, Flush and Release behaviour for ReadFileHandle and WriteFileHandle
  * Fix nil object bugs on File
2017-11-04 10:24:10 +00:00

113 lines
2.6 KiB
Go

package vfs
import (
"io"
"os"
"testing"
"github.com/ncw/rclone/fstest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestDirHandleMethods(t *testing.T) {
r := fstest.NewRun(t)
defer r.Finalise()
_, dir, _ := dirCreate(t, r)
h, err := dir.Open(os.O_RDONLY)
require.NoError(t, err)
fh, ok := h.(*DirHandle)
assert.True(t, ok)
// String
assert.Equal(t, "dir/ (r)", fh.String())
assert.Equal(t, "<nil *DirHandle>", (*DirHandle)(nil).String())
assert.Equal(t, "<nil *DirHandle.d>", newDirHandle(nil).String())
// Stat
fi, err := fh.Stat()
require.NoError(t, err)
assert.Equal(t, dir, fi)
// Node
assert.Equal(t, dir, fh.Node())
// Close
require.NoError(t, h.Close())
assert.Equal(t, []os.FileInfo(nil), fh.fis)
}
func TestDirHandleReaddir(t *testing.T) {
r := fstest.NewRun(t)
defer r.Finalise()
vfs := New(r.Fremote, nil)
file1 := r.WriteObject("dir/file1", "file1 contents", t1)
file2 := r.WriteObject("dir/file2", "file2- contents", t2)
file3 := r.WriteObject("dir/subdir/file3", "file3-- contents", t3)
fstest.CheckItems(t, r.Fremote, file1, file2, file3)
node, err := vfs.Stat("dir")
require.NoError(t, err)
dir := node.(*Dir)
// Read in one chunk
fh, err := dir.Open(os.O_RDONLY)
require.NoError(t, err)
fis, err := fh.Readdir(-1)
require.NoError(t, err)
require.Equal(t, 3, len(fis))
assert.Equal(t, "file1", fis[0].Name())
assert.Equal(t, "file2", fis[1].Name())
assert.Equal(t, "subdir", fis[2].Name())
assert.False(t, fis[0].IsDir())
assert.False(t, fis[1].IsDir())
assert.True(t, fis[2].IsDir())
require.NoError(t, fh.Close())
// Read in multiple chunks
fh, err = dir.Open(os.O_RDONLY)
require.NoError(t, err)
fis, err = fh.Readdir(2)
require.NoError(t, err)
require.Equal(t, 2, len(fis))
assert.Equal(t, "file1", fis[0].Name())
assert.Equal(t, "file2", fis[1].Name())
assert.False(t, fis[0].IsDir())
assert.False(t, fis[1].IsDir())
fis, err = fh.Readdir(2)
require.NoError(t, err)
require.Equal(t, 1, len(fis))
assert.Equal(t, "subdir", fis[0].Name())
assert.True(t, fis[0].IsDir())
fis, err = fh.Readdir(2)
assert.Equal(t, io.EOF, err)
require.Equal(t, 0, len(fis))
require.NoError(t, fh.Close())
}
func TestDirHandleReaddirnames(t *testing.T) {
r := fstest.NewRun(t)
defer r.Finalise()
_, dir, _ := dirCreate(t, r)
fh, err := dir.Open(os.O_RDONLY)
require.NoError(t, err)
// Smoke test only since heavy lifting done in Readdir
fis, err := fh.Readdirnames(-1)
require.NoError(t, err)
require.Equal(t, 1, len(fis))
assert.Equal(t, "file1", fis[0])
require.NoError(t, fh.Close())
}