111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
package command
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func Test_Split(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testCases := map[string]struct {
|
|
command string
|
|
words []string
|
|
errWrapped error
|
|
errMessage string
|
|
}{
|
|
"empty": {
|
|
command: "",
|
|
errWrapped: ErrCommandEmpty,
|
|
errMessage: "command is empty",
|
|
},
|
|
"concrete_sh_command": {
|
|
command: `/bin/sh -c "echo 123"`,
|
|
words: []string{"/bin/sh", "-c", "echo 123"},
|
|
},
|
|
"single_word": {
|
|
command: "word1",
|
|
words: []string{"word1"},
|
|
},
|
|
"two_words_single_space": {
|
|
command: "word1 word2",
|
|
words: []string{"word1", "word2"},
|
|
},
|
|
"two_words_multiple_space": {
|
|
command: "word1 word2",
|
|
words: []string{"word1", "word2"},
|
|
},
|
|
"two_words_no_expansion": {
|
|
command: "word1* word2?",
|
|
words: []string{"word1*", "word2?"},
|
|
},
|
|
"escaped_single quote": {
|
|
command: "ain\\'t good",
|
|
words: []string{"ain't", "good"},
|
|
},
|
|
"escaped_single_quote_all_single_quoted": {
|
|
command: "'ain'\\''t good'",
|
|
words: []string{"ain't good"},
|
|
},
|
|
"empty_single_quoted": {
|
|
command: "word1 '' word2",
|
|
words: []string{"word1", "", "word2"},
|
|
},
|
|
"escaped_newline": {
|
|
command: "word1\\\nword2",
|
|
words: []string{"word1word2"},
|
|
},
|
|
"quoted_newline": {
|
|
command: "text \"with\na\" quoted newline",
|
|
words: []string{"text", "with\na", "quoted", "newline"},
|
|
},
|
|
"quoted_escaped_newline": {
|
|
command: "\"word1\\d\\\\\\\" word2\\\nword3 word4\"",
|
|
words: []string{"word1\\d\\\" word2word3 word4"},
|
|
},
|
|
"escaped_separated_newline": {
|
|
command: "word1 \\\n word2",
|
|
words: []string{"word1", "word2"},
|
|
},
|
|
"double_quotes_no_spacing": {
|
|
command: "word1\"word2\"word3",
|
|
words: []string{"word1word2word3"},
|
|
},
|
|
"unterminated_single_quote": {
|
|
command: "'abc'\\''def",
|
|
errWrapped: ErrSingleQuoteUnterminated,
|
|
errMessage: `splitting word in "'abc'\\''def": unterminated single-quoted string`,
|
|
},
|
|
"unterminated_double_quote": {
|
|
command: "\"abc'def",
|
|
errWrapped: ErrDoubleQuoteUnterminated,
|
|
errMessage: `splitting word in "\"abc'def": unterminated double-quoted string`,
|
|
},
|
|
"unterminated_escape": {
|
|
command: "abc\\",
|
|
errWrapped: ErrEscapeUnterminated,
|
|
errMessage: `splitting word in "abc\\": unterminated backslash-escape`,
|
|
},
|
|
"unterminated_escape_only": {
|
|
command: " \\",
|
|
errWrapped: ErrEscapeUnterminated,
|
|
errMessage: `unterminated backslash-escape: " \\"`,
|
|
},
|
|
}
|
|
|
|
for name, testCase := range testCases {
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
words, err := Split(testCase.command)
|
|
|
|
assert.Equal(t, testCase.words, words)
|
|
assert.ErrorIs(t, err, testCase.errWrapped)
|
|
if testCase.errWrapped != nil {
|
|
assert.EqualError(t, err, testCase.errMessage)
|
|
}
|
|
})
|
|
}
|
|
}
|