mirror of
https://github.com/rclone/rclone.git
synced 2024-11-22 16:07:57 +08:00
b4091f282a
Windows shells like cmd and powershell needs to use different quoting/escaping of strings and paths than the unix shell, and also absolute paths must be fixed by removing leading slash that the POSIX formatted paths have (e.g. /C:/Users does not work in shell, it must be converted to C:/Users). Tries to autodetect shell type (cmd, powershell, unix) on first use. Implemented default builtin powershell functions for hashsum and about when remote shell is powershell. See #5763 Fixes #5758
90 lines
2.9 KiB
Go
90 lines
2.9 KiB
Go
//go:build !plan9
|
|
// +build !plan9
|
|
|
|
package sftp
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestShellEscapeUnix(t *testing.T) {
|
|
for i, test := range []struct {
|
|
unescaped, escaped string
|
|
}{
|
|
{"", ""},
|
|
{"/this/is/harmless", "/this/is/harmless"},
|
|
{"$(rm -rf /)", "\\$\\(rm\\ -rf\\ /\\)"},
|
|
{"/test/\n", "/test/'\n'"},
|
|
{":\"'", ":\\\"\\'"},
|
|
} {
|
|
got, err := quoteOrEscapeShellPath("unix", test.unescaped)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, test.escaped, got, fmt.Sprintf("Test %d unescaped = %q", i, test.unescaped))
|
|
}
|
|
}
|
|
|
|
func TestShellEscapeCmd(t *testing.T) {
|
|
for i, test := range []struct {
|
|
unescaped, escaped string
|
|
ok bool
|
|
}{
|
|
{"", "\"\"", true},
|
|
{"c:/this/is/harmless", "\"c:/this/is/harmless\"", true},
|
|
{"c:/test¬epad", "\"c:/test¬epad\"", true},
|
|
{"c:/test\"&\"notepad", "", false},
|
|
} {
|
|
got, err := quoteOrEscapeShellPath("cmd", test.unescaped)
|
|
if test.ok {
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, test.escaped, got, fmt.Sprintf("Test %d unescaped = %q", i, test.unescaped))
|
|
} else {
|
|
assert.Error(t, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestShellEscapePowerShell(t *testing.T) {
|
|
for i, test := range []struct {
|
|
unescaped, escaped string
|
|
}{
|
|
{"", "''"},
|
|
{"c:/this/is/harmless", "'c:/this/is/harmless'"},
|
|
{"c:/test¬epad", "'c:/test¬epad'"},
|
|
{"c:/test\"&\"notepad", "'c:/test\"&\"notepad'"},
|
|
{"c:/test'&'notepad", "'c:/test''&''notepad'"},
|
|
} {
|
|
got, err := quoteOrEscapeShellPath("powershell", test.unescaped)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, test.escaped, got, fmt.Sprintf("Test %d unescaped = %q", i, test.unescaped))
|
|
}
|
|
}
|
|
|
|
func TestParseHash(t *testing.T) {
|
|
for i, test := range []struct {
|
|
sshOutput, checksum string
|
|
}{
|
|
{"8dbc7733dbd10d2efc5c0a0d8dad90f958581821 RELEASE.md\n", "8dbc7733dbd10d2efc5c0a0d8dad90f958581821"},
|
|
{"03cfd743661f07975fa2f1220c5194cbaff48451 -\n", "03cfd743661f07975fa2f1220c5194cbaff48451"},
|
|
} {
|
|
got := parseHash([]byte(test.sshOutput))
|
|
assert.Equal(t, test.checksum, got, fmt.Sprintf("Test %d sshOutput = %q", i, test.sshOutput))
|
|
}
|
|
}
|
|
|
|
func TestParseUsage(t *testing.T) {
|
|
for i, test := range []struct {
|
|
sshOutput string
|
|
usage [3]int64
|
|
}{
|
|
{"Filesystem 1K-blocks Used Available Use% Mounted on\n/dev/root 91283092 81111888 10154820 89% /", [3]int64{93473886208, 83058573312, 10398535680}},
|
|
{"Filesystem 1K-blocks Used Available Use% Mounted on\ntmpfs 818256 1636 816620 1% /run", [3]int64{837894144, 1675264, 836218880}},
|
|
{"Filesystem 1024-blocks Used Available Capacity iused ifree %iused Mounted on\n/dev/disk0s2 244277768 94454848 149566920 39% 997820 4293969459 0% /", [3]int64{250140434432, 96721764352, 153156526080}},
|
|
} {
|
|
gotSpaceTotal, gotSpaceUsed, gotSpaceAvail := parseUsage([]byte(test.sshOutput))
|
|
assert.Equal(t, test.usage, [3]int64{gotSpaceTotal, gotSpaceUsed, gotSpaceAvail}, fmt.Sprintf("Test %d sshOutput = %q", i, test.sshOutput))
|
|
}
|
|
}
|