github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/vfs/dir_handle_test.go (about) 1 package vfs 2 3 import ( 4 "context" 5 "io" 6 "os" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestDirHandleMethods(t *testing.T) { 14 _, _, dir, _ := dirCreate(t) 15 16 h, err := dir.Open(os.O_RDONLY) 17 require.NoError(t, err) 18 fh, ok := h.(*DirHandle) 19 assert.True(t, ok) 20 21 // String 22 assert.Equal(t, "dir/ (r)", fh.String()) 23 assert.Equal(t, "<nil *DirHandle>", (*DirHandle)(nil).String()) 24 assert.Equal(t, "<nil *DirHandle.d>", newDirHandle(nil).String()) 25 26 // Stat 27 fi, err := fh.Stat() 28 require.NoError(t, err) 29 assert.Equal(t, dir, fi) 30 31 // Node 32 assert.Equal(t, dir, fh.Node()) 33 34 // Close 35 require.NoError(t, h.Close()) 36 assert.Equal(t, []os.FileInfo(nil), fh.fis) 37 } 38 39 func TestDirHandleReaddir(t *testing.T) { 40 r, vfs := newTestVFS(t) 41 42 file1 := r.WriteObject(context.Background(), "dir/file1", "file1 contents", t1) 43 file2 := r.WriteObject(context.Background(), "dir/file2", "file2- contents", t2) 44 file3 := r.WriteObject(context.Background(), "dir/subdir/file3", "file3-- contents", t3) 45 r.CheckRemoteItems(t, file1, file2, file3) 46 47 node, err := vfs.Stat("dir") 48 require.NoError(t, err) 49 dir := node.(*Dir) 50 51 // Read in one chunk 52 fh, err := dir.Open(os.O_RDONLY) 53 require.NoError(t, err) 54 55 fis, err := fh.Readdir(-1) 56 require.NoError(t, err) 57 require.Equal(t, 3, len(fis)) 58 assert.Equal(t, "file1", fis[0].Name()) 59 assert.Equal(t, "file2", fis[1].Name()) 60 assert.Equal(t, "subdir", fis[2].Name()) 61 assert.False(t, fis[0].IsDir()) 62 assert.False(t, fis[1].IsDir()) 63 assert.True(t, fis[2].IsDir()) 64 65 require.NoError(t, fh.Close()) 66 67 // Read in multiple chunks 68 fh, err = dir.Open(os.O_RDONLY) 69 require.NoError(t, err) 70 71 fis, err = fh.Readdir(2) 72 require.NoError(t, err) 73 require.Equal(t, 2, len(fis)) 74 assert.Equal(t, "file1", fis[0].Name()) 75 assert.Equal(t, "file2", fis[1].Name()) 76 assert.False(t, fis[0].IsDir()) 77 assert.False(t, fis[1].IsDir()) 78 79 fis, err = fh.Readdir(2) 80 require.NoError(t, err) 81 require.Equal(t, 1, len(fis)) 82 assert.Equal(t, "subdir", fis[0].Name()) 83 assert.True(t, fis[0].IsDir()) 84 85 fis, err = fh.Readdir(2) 86 assert.Equal(t, io.EOF, err) 87 require.Equal(t, 0, len(fis)) 88 89 require.NoError(t, fh.Close()) 90 91 } 92 93 func TestDirHandleReaddirnames(t *testing.T) { 94 _, _, dir, _ := dirCreate(t) 95 96 fh, err := dir.Open(os.O_RDONLY) 97 require.NoError(t, err) 98 99 // Smoke test only since heavy lifting done in Readdir 100 fis, err := fh.Readdirnames(-1) 101 require.NoError(t, err) 102 require.Equal(t, 1, len(fis)) 103 assert.Equal(t, "file1", fis[0]) 104 105 require.NoError(t, fh.Close()) 106 }