github.com/xhghs/rclone@v1.51.1-0.20200430155106-e186a28cced8/cmd/mountlib/mounttest/dir.go (about)

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