MCPcopy
hub / github.com/rclone/rclone / TestWriteFileHandleReadonly

Function TestWriteFileHandleReadonly

vfs/write_test.go:33–90  ·  view source on GitHub ↗

Test write when underlying storage is readonly, must be run as non-root

(t *testing.T)

Source from the content-addressed store, hash-verified

31
32// Test write when underlying storage is readonly, must be run as non-root
33func TestWriteFileHandleReadonly(t *testing.T) {
34 if runtime.GOOS == "windows" {
35 t.Skipf("Skipping test on %s", runtime.GOOS)
36 }
37 if *fstest.RemoteName != "" {
38 t.Skip("Skipping test on non local remote")
39 }
40 r, vfs, fh := writeHandleCreate(t)
41
42 // Name
43 assert.Equal(t, "file1", fh.Name())
44
45 // Write a file, so underlying remote will be created
46 _, err := fh.Write([]byte("hello"))
47 assert.NoError(t, err)
48
49 err = fh.Close()
50 assert.NoError(t, err)
51
52 var info os.FileInfo
53 info, err = os.Stat(r.FremoteName)
54 assert.NoError(t, err)
55
56 // Remove write permission
57 oldMode := info.Mode()
58 err = os.Chmod(r.FremoteName, oldMode^(oldMode&0222))
59 assert.NoError(t, err)
60
61 var h Handle
62 h, err = vfs.OpenFile("file2", os.O_WRONLY|os.O_CREATE, 0777)
63 require.NoError(t, err)
64
65 var ok bool
66 fh, ok = h.(*WriteFileHandle)
67 require.True(t, ok)
68
69 // error is propagated to Close()
70 _, err = fh.Write([]byte("hello"))
71 assert.NoError(t, err)
72
73 err = fh.Close()
74 assert.NotNil(t, err)
75
76 // Remove should fail
77 err = vfs.Remove("file1")
78 assert.NotNil(t, err)
79
80 // Only file1 should exist
81 _, err = vfs.Stat("file1")
82 assert.NoError(t, err)
83
84 _, err = vfs.Stat("file2")
85 assert.Equal(t, true, errors.Is(err, os.ErrNotExist))
86
87 // Restore old permission
88 err = os.Chmod(r.FremoteName, oldMode)
89 assert.NoError(t, err)
90}

Callers

nothing calls this directly

Calls 11

ModeMethod · 0.95
writeHandleCreateFunction · 0.85
IsMethod · 0.80
NameMethod · 0.65
WriteMethod · 0.65
CloseMethod · 0.65
StatMethod · 0.65
ChmodMethod · 0.65
OpenFileMethod · 0.65
RemoveMethod · 0.65
EqualMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…