@@ -6,15 +6,18 @@ import (
6
6
"os"
7
7
"testing"
8
8
9
+ "github.com/rclone/rclone/fs"
9
10
"github.com/rclone/rclone/fstest"
10
11
"github.com/rclone/rclone/fstest/mockfs"
11
12
"github.com/rclone/rclone/fstest/mockobject"
12
13
"github.com/stretchr/testify/assert"
13
14
"github.com/stretchr/testify/require"
14
15
)
15
16
16
- func fileCreate (t * testing.T , r * fstest.Run ) (* VFS , * File , fstest.Item ) {
17
- vfs := New (r .Fremote , nil )
17
+ func fileCreate (t * testing.T , r * fstest.Run , mode CacheMode ) (* VFS , * File , fstest.Item ) {
18
+ opt := DefaultOpt
19
+ opt .CacheMode = mode
20
+ vfs := New (r .Fremote , & opt )
18
21
19
22
file1 := r .WriteObject (context .Background (), "dir/file1" , "file1 contents" , t1 )
20
23
fstest .CheckItems (t , r .Fremote , file1 )
@@ -29,7 +32,7 @@ func fileCreate(t *testing.T, r *fstest.Run) (*VFS, *File, fstest.Item) {
29
32
func TestFileMethods (t * testing.T ) {
30
33
r := fstest .NewRun (t )
31
34
defer r .Finalise ()
32
- vfs , file , _ := fileCreate (t , r )
35
+ vfs , file , _ := fileCreate (t , r , CacheModeOff )
33
36
34
37
// String
35
38
assert .Equal (t , "dir/file1" , file .String ())
@@ -84,7 +87,7 @@ func TestFileSetModTime(t *testing.T) {
84
87
return
85
88
}
86
89
defer r .Finalise ()
87
- vfs , file , file1 := fileCreate (t , r )
90
+ vfs , file , file1 := fileCreate (t , r , CacheModeOff )
88
91
89
92
err := file .SetModTime (t2 )
90
93
require .NoError (t , err )
@@ -97,12 +100,8 @@ func TestFileSetModTime(t *testing.T) {
97
100
assert .Equal (t , EROFS , err )
98
101
}
99
102
100
- func TestFileOpenRead (t * testing.T ) {
101
- r := fstest .NewRun (t )
102
- defer r .Finalise ()
103
- _ , file , _ := fileCreate (t , r )
104
-
105
- fd , err := file .openRead ()
103
+ func fileCheckContents (t * testing.T , file * File ) {
104
+ fd , err := file .Open (os .O_RDONLY )
106
105
require .NoError (t , err )
107
106
108
107
contents , err := ioutil .ReadAll (fd )
@@ -112,6 +111,14 @@ func TestFileOpenRead(t *testing.T) {
112
111
require .NoError (t , fd .Close ())
113
112
}
114
113
114
+ func TestFileOpenRead (t * testing.T ) {
115
+ r := fstest .NewRun (t )
116
+ defer r .Finalise ()
117
+ _ , file , _ := fileCreate (t , r , CacheModeOff )
118
+
119
+ fileCheckContents (t , file )
120
+ }
121
+
115
122
func TestFileOpenReadUnknownSize (t * testing.T ) {
116
123
var (
117
124
contents = []byte ("file contents" )
@@ -160,7 +167,7 @@ func TestFileOpenReadUnknownSize(t *testing.T) {
160
167
func TestFileOpenWrite (t * testing.T ) {
161
168
r := fstest .NewRun (t )
162
169
defer r .Finalise ()
163
- vfs , file , _ := fileCreate (t , r )
170
+ vfs , file , _ := fileCreate (t , r , CacheModeOff )
164
171
165
172
fd , err := file .openWrite (os .O_WRONLY | os .O_TRUNC )
166
173
require .NoError (t , err )
@@ -181,7 +188,7 @@ func TestFileOpenWrite(t *testing.T) {
181
188
func TestFileRemove (t * testing.T ) {
182
189
r := fstest .NewRun (t )
183
190
defer r .Finalise ()
184
- vfs , file , _ := fileCreate (t , r )
191
+ vfs , file , _ := fileCreate (t , r , CacheModeOff )
185
192
186
193
err := file .Remove ()
187
194
require .NoError (t , err )
@@ -196,7 +203,7 @@ func TestFileRemove(t *testing.T) {
196
203
func TestFileRemoveAll (t * testing.T ) {
197
204
r := fstest .NewRun (t )
198
205
defer r .Finalise ()
199
- vfs , file , _ := fileCreate (t , r )
206
+ vfs , file , _ := fileCreate (t , r , CacheModeOff )
200
207
201
208
err := file .RemoveAll ()
202
209
require .NoError (t , err )
@@ -211,7 +218,7 @@ func TestFileRemoveAll(t *testing.T) {
211
218
func TestFileOpen (t * testing.T ) {
212
219
r := fstest .NewRun (t )
213
220
defer r .Finalise ()
214
- _ , file , _ := fileCreate (t , r )
221
+ _ , file , _ := fileCreate (t , r , CacheModeOff )
215
222
216
223
fd , err := file .Open (os .O_RDONLY )
217
224
require .NoError (t , err )
@@ -233,3 +240,90 @@ func TestFileOpen(t *testing.T) {
233
240
fd , err = file .Open (3 )
234
241
assert .Equal (t , EPERM , err )
235
242
}
243
+
244
+ func testFileRename (t * testing.T , mode CacheMode ) {
245
+ r := fstest .NewRun (t )
246
+ defer r .Finalise ()
247
+ vfs , file , item := fileCreate (t , r , mode )
248
+
249
+ rootDir , err := vfs .Root ()
250
+ require .NoError (t , err )
251
+
252
+ // check file in cache
253
+ if mode != CacheModeOff {
254
+ // read contents to get file in cache
255
+ fileCheckContents (t , file )
256
+ assert .True (t , vfs .cache .exists (item .Path ))
257
+ }
258
+
259
+ dir := file .Dir ()
260
+
261
+ // start with "dir/file1"
262
+ fstest .CheckItems (t , r .Fremote , item )
263
+
264
+ // rename file to "newLeaf"
265
+ err = dir .Rename ("file1" , "newLeaf" , rootDir )
266
+ require .NoError (t , err )
267
+
268
+ item .Path = "newLeaf"
269
+ fstest .CheckItems (t , r .Fremote , item )
270
+
271
+ // check file in cache
272
+ if mode != CacheModeOff {
273
+ assert .True (t , vfs .cache .exists (item .Path ))
274
+ }
275
+
276
+ // check file exists in the vfs layer at its new name
277
+ _ , err = vfs .Stat ("newLeaf" )
278
+ require .NoError (t , err )
279
+
280
+ // rename it back to "dir/file1"
281
+ err = rootDir .Rename ("newLeaf" , "file1" , dir )
282
+ require .NoError (t , err )
283
+
284
+ item .Path = "dir/file1"
285
+ fstest .CheckItems (t , r .Fremote , item )
286
+
287
+ // check file in cache
288
+ if mode != CacheModeOff {
289
+ assert .True (t , vfs .cache .exists (item .Path ))
290
+ }
291
+
292
+ // now try renaming it with the file open
293
+ // first open it and write to it but dont close it
294
+ fd , err := file .Open (os .O_WRONLY | os .O_TRUNC )
295
+ require .NoError (t , err )
296
+ newContents := []byte ("this is some new contents" )
297
+ _ , err = fd .Write (newContents )
298
+ require .NoError (t , err )
299
+
300
+ // rename file to "newLeaf"
301
+ err = dir .Rename ("file1" , "newLeaf" , rootDir )
302
+ require .NoError (t , err )
303
+ newItem := fstest .NewItem ("newLeaf" , string (newContents ), item .ModTime )
304
+
305
+ // check file has been renamed immediately in the cache
306
+ if mode != CacheModeOff {
307
+ assert .True (t , vfs .cache .exists ("newLeaf" ))
308
+ }
309
+
310
+ // check file exists in the vfs layer at its new name
311
+ _ , err = vfs .Stat ("newLeaf" )
312
+ require .NoError (t , err )
313
+
314
+ // Close the file
315
+ require .NoError (t , fd .Close ())
316
+
317
+ // Check file has now been renamed on the remote
318
+ item .Path = "newLeaf"
319
+ fstest .CheckListingWithPrecision (t , r .Fremote , []fstest.Item {newItem }, nil , fs .ModTimeNotSupported )
320
+ }
321
+
322
+ func TestFileRename (t * testing.T ) {
323
+ t .Run ("CacheModeOff" , func (t * testing.T ) {
324
+ testFileRename (t , CacheModeOff )
325
+ })
326
+ t .Run ("CacheModeFull" , func (t * testing.T ) {
327
+ testFileRename (t , CacheModeFull )
328
+ })
329
+ }
0 commit comments