68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
|
package union
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"context"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/rclone/rclone/fs/object"
|
||
|
"github.com/rclone/rclone/fstest"
|
||
|
"github.com/rclone/rclone/fstest/fstests"
|
||
|
"github.com/rclone/rclone/lib/random"
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
func (f *Fs) TestInternalReadOnly(t *testing.T) {
|
||
|
if f.name != "TestUnionRO" {
|
||
|
t.Skip("Only on RO union")
|
||
|
}
|
||
|
dir := "TestInternalReadOnly"
|
||
|
ctx := context.Background()
|
||
|
rofs := f.upstreams[len(f.upstreams)-1]
|
||
|
assert.False(t, rofs.IsWritable())
|
||
|
|
||
|
// Put a file onto the read only fs
|
||
|
contents := random.String(50)
|
||
|
file1 := fstest.NewItem(dir+"/file.txt", contents, time.Now())
|
||
|
_, obj1 := fstests.PutTestContents(ctx, t, rofs, &file1, contents, true)
|
||
|
|
||
|
// Check read from readonly fs via union
|
||
|
o, err := f.NewObject(ctx, file1.Path)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, int64(50), o.Size())
|
||
|
|
||
|
// Now call Update on the union Object with new data
|
||
|
contents2 := random.String(100)
|
||
|
file2 := fstest.NewItem(dir+"/file.txt", contents2, time.Now())
|
||
|
in := bytes.NewBufferString(contents2)
|
||
|
src := object.NewStaticObjectInfo(file2.Path, file2.ModTime, file2.Size, true, nil, nil)
|
||
|
err = o.Update(ctx, in, src)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, int64(100), o.Size())
|
||
|
|
||
|
// Check we read the new object via the union
|
||
|
o, err = f.NewObject(ctx, file1.Path)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, int64(100), o.Size())
|
||
|
|
||
|
// Remove the object
|
||
|
assert.NoError(t, o.Remove(ctx))
|
||
|
|
||
|
// Check we read the old object in the read only layer now
|
||
|
o, err = f.NewObject(ctx, file1.Path)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, int64(50), o.Size())
|
||
|
|
||
|
// Remove file and dir from read only fs
|
||
|
assert.NoError(t, obj1.Remove(ctx))
|
||
|
assert.NoError(t, rofs.Rmdir(ctx, dir))
|
||
|
}
|
||
|
|
||
|
func (f *Fs) InternalTest(t *testing.T) {
|
||
|
t.Run("ReadOnly", f.TestInternalReadOnly)
|
||
|
}
|
||
|
|
||
|
var _ fstests.InternalTester = (*Fs)(nil)
|