f8d56bebaf
Restructuring of config code in v1.55 resulted in config file being loaded early at process startup. If configuration file is encrypted this means user will need to supply the password, even when running commands that does not use config. This also lead to an issue where mount with --deamon failed to decrypt the config file when it had to prompt user for passord. Fixes #5236 Fixes #5228
107 lines
2.7 KiB
Go
107 lines
2.7 KiB
Go
package mountlib_test
|
|
|
|
import (
|
|
"context"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"testing"
|
|
"time"
|
|
|
|
_ "github.com/rclone/rclone/backend/local"
|
|
_ "github.com/rclone/rclone/cmd/cmount"
|
|
_ "github.com/rclone/rclone/cmd/mount"
|
|
_ "github.com/rclone/rclone/cmd/mount2"
|
|
"github.com/rclone/rclone/fs/config/configfile"
|
|
"github.com/rclone/rclone/fs/rc"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRc(t *testing.T) {
|
|
ctx := context.Background()
|
|
configfile.Install()
|
|
mount := rc.Calls.Get("mount/mount")
|
|
assert.NotNil(t, mount)
|
|
unmount := rc.Calls.Get("mount/unmount")
|
|
assert.NotNil(t, unmount)
|
|
getMountTypes := rc.Calls.Get("mount/types")
|
|
assert.NotNil(t, getMountTypes)
|
|
|
|
localDir, err := ioutil.TempDir("", "rclone-mountlib-localDir")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(localDir) }()
|
|
err = ioutil.WriteFile(filepath.Join(localDir, "file.txt"), []byte("hello"), 0666)
|
|
require.NoError(t, err)
|
|
|
|
mountPoint, err := ioutil.TempDir("", "rclone-mountlib-mountPoint")
|
|
require.NoError(t, err)
|
|
if runtime.GOOS == "windows" {
|
|
// Windows requires the mount point not to exist
|
|
require.NoError(t, os.RemoveAll(mountPoint))
|
|
} else {
|
|
defer func() { _ = os.RemoveAll(mountPoint) }()
|
|
}
|
|
|
|
out, err := getMountTypes.Fn(ctx, nil)
|
|
require.NoError(t, err)
|
|
var mountTypes []string
|
|
|
|
err = out.GetStruct("mountTypes", &mountTypes)
|
|
require.NoError(t, err)
|
|
t.Logf("Mount types %v", mountTypes)
|
|
|
|
t.Run("Errors", func(t *testing.T) {
|
|
_, err := mount.Fn(ctx, rc.Params{})
|
|
assert.Error(t, err)
|
|
|
|
_, err = mount.Fn(ctx, rc.Params{"fs": "/tmp"})
|
|
assert.Error(t, err)
|
|
|
|
_, err = mount.Fn(ctx, rc.Params{"mountPoint": "/tmp"})
|
|
assert.Error(t, err)
|
|
})
|
|
|
|
t.Run("Mount", func(t *testing.T) {
|
|
if len(mountTypes) == 0 {
|
|
t.Skip("Can't mount")
|
|
}
|
|
in := rc.Params{
|
|
"fs": localDir,
|
|
"mountPoint": mountPoint,
|
|
"vfsOpt": rc.Params{
|
|
"FilePerms": 0400,
|
|
},
|
|
}
|
|
|
|
// check file.txt is not there
|
|
filePath := filepath.Join(mountPoint, "file.txt")
|
|
_, err := os.Stat(filePath)
|
|
require.Error(t, err)
|
|
require.True(t, os.IsNotExist(err))
|
|
|
|
// mount
|
|
_, err = mount.Fn(ctx, in)
|
|
if err != nil {
|
|
t.Skipf("Mount failed - skipping test: %v", err)
|
|
}
|
|
|
|
// check file.txt is there now
|
|
fi, err := os.Stat(filePath)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, int64(5), fi.Size())
|
|
if runtime.GOOS == "linux" {
|
|
assert.Equal(t, os.FileMode(0400), fi.Mode())
|
|
}
|
|
|
|
// FIXME the OS sometimes appears to be using the mount
|
|
// immediately after it appears so wait a moment
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
t.Run("Unmount", func(t *testing.T) {
|
|
_, err := unmount.Fn(ctx, in)
|
|
require.NoError(t, err)
|
|
})
|
|
})
|
|
}
|