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  }