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