1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
package shellescape
import (
"testing"
"github.com/stretchr/testify/assert"
)
type parseTC struct {
shellCmd string
want []string
wantErr string
}
func TestParse(t *testing.T) {
testCases := []parseTC{
parseTC{shellCmd: ``, want: nil},
parseTC{shellCmd: `foo bar bazzzz`, want: []string{`foo`, `bar`, `bazzzz`}},
parseTC{shellCmd: `foo bar bazzzz`, want: []string{`foo`, `bar`, `bazzzz`}},
parseTC{shellCmd: ` foo bar bazzzz `, want: []string{`foo`, `bar`, `bazzzz`}},
parseTC{shellCmd: `foo 'bar' bazzzz`, want: []string{`foo`, `bar`, `bazzzz`}},
parseTC{shellCmd: `'foo' 'bar' 'bazzzz'`, want: []string{`foo`, `bar`, `bazzzz`}},
parseTC{shellCmd: `' foo' 'bar ' 'bazzzz'`, want: []string{` foo`, `bar `, `bazzzz`}},
parseTC{shellCmd: `foo 'bar bazz'zz`, want: []string{`foo`, `bar bazzzz`}},
parseTC{shellCmd: `foo 'bar ba'"zz z"z`, want: []string{`foo`, `bar bazz zz`}},
parseTC{shellCmd: `'foo bar bazzzz'`, want: []string{`foo bar bazzzz`}},
parseTC{shellCmd: `"foo bar bazzzz"`, want: []string{`foo bar bazzzz`}},
parseTC{shellCmd: `"foo bar" bazzzz`, want: []string{`foo bar`, `bazzzz`}},
parseTC{shellCmd: `"foo bar" bazzzz`, want: []string{`foo bar`, `bazzzz`}},
parseTC{shellCmd: `"foo \"bar" bazzzz`, want: []string{`foo "bar`, `bazzzz`}},
parseTC{shellCmd: `"foo \" bar" bazzzz`, want: []string{`foo " bar`, `bazzzz`}},
parseTC{shellCmd: `"foo \\ bar" bazzzz`, want: []string{`foo \ bar`, `bazzzz`}},
parseTC{shellCmd: `'foo \" bar' bazzzz`, want: []string{`foo \" bar`, `bazzzz`}},
parseTC{shellCmd: `'foo '"'"'bar'"'"' baz'`, want: []string{`foo 'bar' baz`}},
parseTC{shellCmd: `"foo \" bar bazzzz`, wantErr: "unfinished quote"},
parseTC{shellCmd: `'foo \" bar bazzzz`, wantErr: "unfinished quote"},
}
for i, tc := range testCases {
assertArgs := []interface{}{"testCase %d %q", i, tc.shellCmd}
got, gotErr := Parse(tc.shellCmd)
if tc.wantErr != "" {
assert.Nil(t, got)
assert.Equal(t, tc.wantErr, gotErr.Error(), assertArgs...)
if gotErr != nil {
assert.Equal(t, tc.wantErr, gotErr.Error(), assertArgs...)
}
} else {
assert.Equal(t, tc.want, got, assertArgs...)
assert.Nil(t, gotErr, assertArgs...)
}
}
}
type escapeTC struct {
parts []string
want string
}
func TestEscape(t *testing.T) {
testCases := []escapeTC{
escapeTC{parts: nil, want: ""},
escapeTC{parts: []string{`foo`, `bar`, `baz`}, want: `foo bar baz`},
escapeTC{parts: []string{`foo/bar-baz/hey_foo`, `bar`, `baz`}, want: `foo/bar-baz/hey_foo bar baz`},
escapeTC{parts: []string{`foo/bar-\baz/hey_foo`, `bar`, `baz`}, want: `'foo/bar-\baz/hey_foo' bar baz`},
escapeTC{parts: []string{`foo13`, `bar`, `baz`}, want: `foo13 bar baz`},
escapeTC{parts: []string{`foo bar`, `baz`}, want: `'foo bar' baz`},
escapeTC{parts: []string{`foo "bar`, `baz`}, want: `'foo "bar' baz`},
escapeTC{parts: []string{`'foo bar`, `baz`}, want: `''"'"'foo bar' baz`},
escapeTC{parts: []string{`foo`, `bar, baz`}, want: `foo 'bar, baz'`},
}
for i, tc := range testCases {
assertArgs := []interface{}{"testCase %d %q", i, tc.parts}
got := Escape(tc.parts)
assert.Equal(t, tc.want, got, assertArgs...)
// Also make sure we can parse it back and get the same result
gotParsed, gotParsedErr := Parse(got)
assert.Equal(t, tc.parts, gotParsed, assertArgs...)
assert.Nil(t, gotParsedErr, assertArgs...)
}
}
|