File: shell_escape_test.go

package info (click to toggle)
nerdlog 1.10.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,296 kB
  • sloc: sh: 1,004; makefile: 85
file content (88 lines) | stat: -rw-r--r-- 3,427 bytes parent folder | download
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...)
	}
}