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  }