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 }