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 }