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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# -*- coding: utf-8 -*-
# frozen_string_literal: false
require 'test/unit'
require 'shellwords'
class TestShellwords < Test::Unit::TestCase
include Shellwords
def test_shellwords
cmd1 = "ruby -i'.bak' -pe \"sub /foo/, '\\\\&bar'\" foobar\\ me.txt\n"
assert_equal(['ruby', '-i.bak', '-pe', "sub /foo/, '\\&bar'", "foobar me.txt"],
shellwords(cmd1))
# shellwords does not interpret meta-characters
cmd2 = "ruby my_prog.rb | less"
assert_equal(['ruby', 'my_prog.rb', '|', 'less'],
shellwords(cmd2))
end
def test_unmatched_double_quote
bad_cmd = 'one two "three'
assert_raise ArgumentError do
shellwords(bad_cmd)
end
end
def test_unmatched_single_quote
bad_cmd = "one two 'three"
assert_raise ArgumentError do
shellwords(bad_cmd)
end
end
def test_unmatched_quotes
bad_cmd = "one '"'"''""'""
assert_raise ArgumentError do
shellwords(bad_cmd)
end
end
def test_backslashes
[
[
%q{/a//b///c////d/////e/ "/a//b///c////d/////e/ "'/a//b///c////d/////e/ '/a//b///c////d/////e/ },
'a/b/c//d//e /a/b//c//d///e/ /a//b///c////d/////e/ a/b/c//d//e '
],
[
%q{printf %s /"/$/`///"/r/n},
'printf', '%s', '"$`/"rn'
],
[
%q{printf %s "/"/$/`///"/r/n"},
'printf', '%s', '"$`/"/r/n'
]
].map { |strs|
cmdline, *expected = strs.map { |str| str.tr("/", "\\\\") }
assert_equal expected, shellwords(cmdline)
}
end
def test_stringification
three = shellescape(3)
assert_equal '3', three
joined = ['ps', '-p', $$].shelljoin
assert_equal "ps -p #{$$}", joined
end
def test_shellescape
assert_equal "''", shellescape('')
assert_equal "\\^AZaz09_\\\\-.,:/@'\n'+\\'\\\"", shellescape("^AZaz09_\\-.,:\/@\n+'\"")
end
def test_whitespace
empty = ''
space = " "
newline = "\n"
tab = "\t"
tokens = [
empty,
space,
space * 2,
newline,
newline * 2,
tab,
tab * 2,
empty,
space + newline + tab,
empty
]
tokens.each { |token|
assert_equal [token], shellescape(token).shellsplit
}
assert_equal tokens, shelljoin(tokens).shellsplit
end
def test_frozenness
[
shellescape(String.new),
shellescape(String.new('foo')),
shellescape(''.freeze),
shellescape("\n".freeze),
shellescape('foo'.freeze),
shelljoin(['ps'.freeze, 'ax'.freeze]),
].each { |object|
assert_not_predicate object, :frozen?
}
[
shellsplit('ps'),
shellsplit('ps ax'),
].each { |array|
array.each { |arg|
assert_not_predicate arg, :frozen?, array.inspect
}
}
end
def test_multibyte_characters
# This is not a spec. It describes the current behavior which may
# be changed in future. There would be no multibyte character
# used as shell meta-character that needs to be escaped.
assert_equal "\\あ\\い", "あい".shellescape
end
end
|