github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/vfs/vfstest/dir.go (about)

     1  package vfstest
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/rclone/rclone/fs"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  // TestDirLs checks out listing
    14  func TestDirLs(t *testing.T) {
    15  	run.skipIfNoFUSE(t)
    16  
    17  	run.checkDir(t, "")
    18  
    19  	run.mkdir(t, "a directory")
    20  	run.createFile(t, "a file", "hello")
    21  
    22  	run.checkDir(t, "a directory/|a file 5")
    23  
    24  	run.rmdir(t, "a directory")
    25  	run.rm(t, "a file")
    26  
    27  	run.checkDir(t, "")
    28  }
    29  
    30  // TestDirCreateAndRemoveDir tests creating and removing a directory
    31  func TestDirCreateAndRemoveDir(t *testing.T) {
    32  	run.skipIfNoFUSE(t)
    33  
    34  	run.mkdir(t, "dir")
    35  	run.mkdir(t, "dir/subdir")
    36  	run.checkDir(t, "dir/|dir/subdir/")
    37  
    38  	// Check we can't delete a directory with stuff in
    39  	err := run.os.Remove(run.path("dir"))
    40  	assert.Error(t, err, "file exists")
    41  
    42  	// Now delete subdir then dir - should produce no errors
    43  	run.rmdir(t, "dir/subdir")
    44  	run.checkDir(t, "dir/")
    45  	run.rmdir(t, "dir")
    46  	run.checkDir(t, "")
    47  }
    48  
    49  // TestDirCreateAndRemoveFile tests creating and removing a file
    50  func TestDirCreateAndRemoveFile(t *testing.T) {
    51  	run.skipIfNoFUSE(t)
    52  
    53  	run.mkdir(t, "dir")
    54  	run.createFile(t, "dir/file", "potato")
    55  	run.checkDir(t, "dir/|dir/file 6")
    56  
    57  	// Check we can't delete a directory with stuff in
    58  	err := run.os.Remove(run.path("dir"))
    59  	assert.Error(t, err, "file exists")
    60  
    61  	// Now delete file
    62  	run.rm(t, "dir/file")
    63  
    64  	run.checkDir(t, "dir/")
    65  	run.rmdir(t, "dir")
    66  	run.checkDir(t, "")
    67  }
    68  
    69  // TestDirRenameFile tests renaming a file
    70  func TestDirRenameFile(t *testing.T) {
    71  	run.skipIfNoFUSE(t)
    72  
    73  	run.mkdir(t, "dir")
    74  	run.createFile(t, "file", "potato")
    75  	run.checkDir(t, "dir/|file 6")
    76  
    77  	err := run.os.Rename(run.path("file"), run.path("file2"))
    78  	require.NoError(t, err)
    79  	run.checkDir(t, "dir/|file2 6")
    80  
    81  	data := run.readFile(t, "file2")
    82  	assert.Equal(t, "potato", data)
    83  
    84  	err = run.os.Rename(run.path("file2"), run.path("dir/file3"))
    85  	require.NoError(t, err)
    86  	run.checkDir(t, "dir/|dir/file3 6")
    87  
    88  	data = run.readFile(t, "dir/file3")
    89  	require.NoError(t, err)
    90  	assert.Equal(t, "potato", data)
    91  
    92  	run.rm(t, "dir/file3")
    93  	run.rmdir(t, "dir")
    94  	run.checkDir(t, "")
    95  }
    96  
    97  // TestDirRenameEmptyDir tests renaming and empty directory
    98  func TestDirRenameEmptyDir(t *testing.T) {
    99  	run.skipIfNoFUSE(t)
   100  
   101  	run.mkdir(t, "dir")
   102  	run.mkdir(t, "dir1")
   103  	run.checkDir(t, "dir/|dir1/")
   104  
   105  	err := run.os.Rename(run.path("dir1"), run.path("dir/dir2"))
   106  	require.NoError(t, err)
   107  	run.checkDir(t, "dir/|dir/dir2/")
   108  
   109  	err = run.os.Rename(run.path("dir/dir2"), run.path("dir/dir3"))
   110  	require.NoError(t, err)
   111  	run.checkDir(t, "dir/|dir/dir3/")
   112  
   113  	run.rmdir(t, "dir/dir3")
   114  	run.rmdir(t, "dir")
   115  	run.checkDir(t, "")
   116  }
   117  
   118  // TestDirRenameFullDir tests renaming a full directory
   119  func TestDirRenameFullDir(t *testing.T) {
   120  	run.skipIfNoFUSE(t)
   121  
   122  	run.mkdir(t, "dir")
   123  	run.mkdir(t, "dir1")
   124  	run.createFile(t, "dir1/potato.txt", "maris piper")
   125  	run.checkDir(t, "dir/|dir1/|dir1/potato.txt 11")
   126  
   127  	err := run.os.Rename(run.path("dir1"), run.path("dir/dir2"))
   128  	require.NoError(t, err)
   129  	run.checkDir(t, "dir/|dir/dir2/|dir/dir2/potato.txt 11")
   130  
   131  	err = run.os.Rename(run.path("dir/dir2"), run.path("dir/dir3"))
   132  	require.NoError(t, err)
   133  	run.checkDir(t, "dir/|dir/dir3/|dir/dir3/potato.txt 11")
   134  
   135  	run.rm(t, "dir/dir3/potato.txt")
   136  	run.rmdir(t, "dir/dir3")
   137  	run.rmdir(t, "dir")
   138  	run.checkDir(t, "")
   139  }
   140  
   141  // TestDirModTime tests mod times
   142  func TestDirModTime(t *testing.T) {
   143  	run.skipIfNoFUSE(t)
   144  
   145  	run.mkdir(t, "dir")
   146  	mtime := time.Date(2012, time.November, 18, 17, 32, 31, 0, time.UTC)
   147  	err := run.os.Chtimes(run.path("dir"), mtime, mtime)
   148  	require.NoError(t, err)
   149  
   150  	info, err := run.os.Stat(run.path("dir"))
   151  	require.NoError(t, err)
   152  
   153  	// avoid errors because of timezone differences
   154  	assert.Equal(t, info.ModTime().Unix(), mtime.Unix())
   155  
   156  	run.rmdir(t, "dir")
   157  }
   158  
   159  // TestDirCacheFlush tests fluching the dir cache
   160  func TestDirCacheFlush(t *testing.T) {
   161  	run.skipIfNoFUSE(t)
   162  
   163  	run.checkDir(t, "")
   164  
   165  	run.mkdir(t, "dir")
   166  	run.mkdir(t, "otherdir")
   167  	run.createFile(t, "dir/file", "1")
   168  	run.createFile(t, "otherdir/file", "1")
   169  
   170  	dm := newDirMap("otherdir/|otherdir/file 1|dir/|dir/file 1")
   171  	localDm := make(dirMap)
   172  	run.readLocal(t, localDm, "")
   173  	assert.Equal(t, dm, localDm, "expected vs fuse mount")
   174  
   175  	err := run.fremote.Mkdir(context.Background(), "dir/subdir")
   176  	require.NoError(t, err)
   177  
   178  	root, err := run.vfs.Root()
   179  	require.NoError(t, err)
   180  
   181  	// expect newly created "subdir" on remote to not show up
   182  	root.ForgetPath("otherdir", fs.EntryDirectory)
   183  	run.readLocal(t, localDm, "")
   184  	assert.Equal(t, dm, localDm, "expected vs fuse mount")
   185  
   186  	root.ForgetPath("dir", fs.EntryDirectory)
   187  	dm = newDirMap("otherdir/|otherdir/file 1|dir/|dir/file 1|dir/subdir/")
   188  	run.readLocal(t, localDm, "")
   189  	assert.Equal(t, dm, localDm, "expected vs fuse mount")
   190  
   191  	run.rm(t, "otherdir/file")
   192  	run.rmdir(t, "otherdir")
   193  	run.rm(t, "dir/file")
   194  	run.rmdir(t, "dir/subdir")
   195  	run.rmdir(t, "dir")
   196  	run.checkDir(t, "")
   197  }
   198  
   199  // TestDirCacheFlushOnDirRename tests flushing the dir cache on rename
   200  func TestDirCacheFlushOnDirRename(t *testing.T) {
   201  	run.skipIfNoFUSE(t)
   202  	run.mkdir(t, "dir")
   203  	run.createFile(t, "dir/file", "1")
   204  
   205  	dm := newDirMap("dir/|dir/file 1")
   206  	localDm := make(dirMap)
   207  	run.readLocal(t, localDm, "")
   208  	assert.Equal(t, dm, localDm, "expected vs fuse mount")
   209  
   210  	// expect remotely created directory to not show up
   211  	err := run.fremote.Mkdir(context.Background(), "dir/subdir")
   212  	require.NoError(t, err)
   213  	run.readLocal(t, localDm, "")
   214  	assert.Equal(t, dm, localDm, "expected vs fuse mount")
   215  
   216  	err = run.os.Rename(run.path("dir"), run.path("rid"))
   217  	require.NoError(t, err)
   218  
   219  	dm = newDirMap("rid/|rid/subdir/|rid/file 1")
   220  	localDm = make(dirMap)
   221  	run.readLocal(t, localDm, "")
   222  	assert.Equal(t, dm, localDm, "expected vs fuse mount")
   223  
   224  	run.rm(t, "rid/file")
   225  	run.rmdir(t, "rid/subdir")
   226  	run.rmdir(t, "rid")
   227  	run.checkDir(t, "")
   228  }