Skip to content

Commit 6b6fa45

Browse files
committed
Enable test assertions to spot erraneous word-splitting in bash
1 parent d9bdc90 commit 6b6fa45

File tree

3 files changed

+49
-52
lines changed

3 files changed

+49
-52
lines changed

test/build.bats

Lines changed: 33 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ tarball() {
3535

3636
executable "$configure" <<OUT
3737
#!$BASH
38-
echo "$name: \$@" \${RUBYOPT:+RUBYOPT=\$RUBYOPT} >> build.log
38+
IFS=,
39+
echo "$name: [\$*]" \${RUBYOPT:+RUBYOPT=\$RUBYOPT} >> build.log
3940
OUT
4041

4142
for file; do
@@ -48,8 +49,8 @@ OUT
4849

4950
stub_make_install() {
5051
stub "$MAKE" \
51-
" : echo \"$MAKE \$@\" >> build.log" \
52-
"install : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'"
52+
" : echo \"$MAKE \$(inspect_args \"\$@\")\" >> build.log" \
53+
"install : echo \"$MAKE \$(inspect_args \"\$@\")\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'"
5354
}
5455

5556
assert_build_log() {
@@ -74,10 +75,10 @@ assert_build_log() {
7475
unstub make
7576

7677
assert_build_log <<OUT
77-
yaml-0.1.6: --prefix=$INSTALL_ROOT
78+
yaml-0.1.6: [--prefix=$INSTALL_ROOT]
7879
make -j 2
7980
make install
80-
ruby-2.0.0: --prefix=$INSTALL_ROOT
81+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
8182
make -j 2
8283
make install
8384
OUT
@@ -106,11 +107,11 @@ PATCH
106107
unstub patch
107108

108109
assert_build_log <<OUT
109-
yaml-0.1.6: --prefix=$INSTALL_ROOT
110+
yaml-0.1.6: [--prefix=$INSTALL_ROOT]
110111
make -j 2
111112
make install
112113
patch -p0 --force -i $TMP/ruby-patch.XXX
113-
ruby-2.0.0: --prefix=$INSTALL_ROOT
114+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
114115
make -j 2
115116
make install
116117
OUT
@@ -139,11 +140,11 @@ PATCH
139140
unstub patch
140141

141142
assert_build_log <<OUT
142-
yaml-0.1.6: --prefix=$INSTALL_ROOT
143+
yaml-0.1.6: [--prefix=$INSTALL_ROOT]
143144
make -j 2
144145
make install
145146
patch -p1 --force -i $TMP/ruby-patch.XXX
146-
ruby-2.0.0: --prefix=$INSTALL_ROOT
147+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
147148
make -j 2
148149
make install
149150
OUT
@@ -173,11 +174,11 @@ PATCH
173174
unstub patch
174175

175176
assert_build_log <<OUT
176-
yaml-0.1.6: --prefix=$INSTALL_ROOT
177+
yaml-0.1.6: [--prefix=$INSTALL_ROOT]
177178
make -j 2
178179
make install
179180
patch -p1 --force -i $TMP/ruby-patch.XXX
180-
ruby-2.0.0: --prefix=$INSTALL_ROOT
181+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
181182
make -j 2
182183
make install
183184
OUT
@@ -203,7 +204,7 @@ DEF
203204
unstub make
204205

205206
assert_build_log <<OUT
206-
ruby-2.0.0: --prefix=$INSTALL_ROOT --with-libyaml-dir=$brew_libdir
207+
ruby-2.0.0: [--prefix=$INSTALL_ROOT,--with-libyaml-dir=$brew_libdir]
207208
make -j 2
208209
make install
209210
OUT
@@ -227,7 +228,7 @@ DEF
227228
unstub make
228229

229230
assert_build_log <<OUT
230-
ruby-2.0.0: --prefix=$INSTALL_ROOT --with-gmp-dir=$gmp_libdir
231+
ruby-2.0.0: [--prefix=$INSTALL_ROOT,--with-gmp-dir=$gmp_libdir]
231232
make -j 2
232233
make install
233234
OUT
@@ -251,7 +252,7 @@ DEF
251252
unstub make
252253

253254
assert_build_log <<OUT
254-
ruby-2.0.0: --prefix=$INSTALL_ROOT --with-readline-dir=$readline_libdir
255+
ruby-2.0.0: [--prefix=$INSTALL_ROOT,--with-readline-dir=$readline_libdir]
255256
make -j 2
256257
make install
257258
OUT
@@ -273,7 +274,7 @@ DEF
273274
unstub make
274275

275276
assert_build_log <<OUT
276-
ruby-2.0.0: --prefix=$INSTALL_ROOT --with-readline-dir=/custom
277+
ruby-2.0.0: [--prefix=$INSTALL_ROOT,--with-readline-dir=/custom]
277278
make -j 2
278279
make install
279280
OUT
@@ -296,7 +297,7 @@ DEF
296297
unstub make
297298

298299
assert_build_log <<OUT
299-
ruby-2.0.0: --prefix=$INSTALL_ROOT
300+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
300301
make -j 2
301302
make install
302303
OUT
@@ -320,7 +321,7 @@ DEF
320321
unstub make
321322

322323
assert_build_log <<OUT
323-
ruby-2.0.0: --prefix=$INSTALL_ROOT
324+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
324325
make -j 4
325326
make install
326327
OUT
@@ -345,19 +346,20 @@ DEF
345346
unstub make
346347

347348
assert_build_log <<OUT
348-
ruby-2.0.0: --prefix=$INSTALL_ROOT --with-openssl-dir=/test
349+
ruby-2.0.0: [--prefix=$INSTALL_ROOT,--with-openssl-dir=/test]
349350
make -j 1
350351
make install
351352
OUT
352353
}
353354

354-
@test "setting RUBY_MAKE_INSTALL_OPTS to a multi-word string" {
355+
@test "using MAKE_INSTALL_OPTS" {
355356
cached_tarball "ruby-2.0.0"
356357

357358
stub_repeated uname '-s : echo Linux'
358359
stub_make_install
359360

360-
export RUBY_MAKE_INSTALL_OPTS="DOGE=\"such wow\""
361+
export MAKE_INSTALL_OPTS="--globalmake"
362+
export RUBY_MAKE_INSTALL_OPTS="RUBYMAKE=true with spaces"
361363
run_inline_definition <<DEF
362364
install_package "ruby-2.0.0" "http://ruby-lang.org/ruby/2.0/ruby-2.0.0.tar.gz"
363365
DEF
@@ -367,31 +369,9 @@ DEF
367369
unstub make
368370

369371
assert_build_log <<OUT
370-
ruby-2.0.0: --prefix=$INSTALL_ROOT
372+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
371373
make -j 2
372-
make install DOGE="such wow"
373-
OUT
374-
}
375-
376-
@test "setting MAKE_INSTALL_OPTS to a multi-word string" {
377-
cached_tarball "ruby-2.0.0"
378-
379-
stub_repeated uname '-s : echo Linux'
380-
stub_make_install
381-
382-
export MAKE_INSTALL_OPTS="DOGE=\"such wow\""
383-
run_inline_definition <<DEF
384-
install_package "ruby-2.0.0" "http://ruby-lang.org/ruby/2.0/ruby-2.0.0.tar.gz"
385-
DEF
386-
assert_success
387-
388-
unstub uname
389-
unstub make
390-
391-
assert_build_log <<OUT
392-
ruby-2.0.0: --prefix=$INSTALL_ROOT
393-
make -j 2
394-
make install DOGE="such wow"
374+
make install --globalmake RUBYMAKE=true with spaces
395375
OUT
396376
}
397377

@@ -429,7 +409,7 @@ DEF
429409

430410
assert_build_log <<OUT
431411
apply -p1 -i /my/patch.diff
432-
ruby-2.0.0: --prefix=$INSTALL_ROOT
412+
ruby-2.0.0: [--prefix=$INSTALL_ROOT]
433413
make -j 2
434414
make install
435415
OUT
@@ -454,7 +434,8 @@ OUT
454434
executable "$package/minirake" <<OUT
455435
#!$BASH
456436
set -e
457-
echo \$0 "\$@" >> '$INSTALL_ROOT'/build.log
437+
IFS=,
438+
echo "\$0 [\$*]" >> '$INSTALL_ROOT'/build.log
458439
mkdir -p build/host/bin
459440
touch build/host/bin/{mruby,mirb}
460441
chmod +x build/host/bin/{mruby,mirb}
@@ -477,7 +458,7 @@ install_package "mruby-1.0" "http://ruby-lang.org/pub/mruby-1.0.tar.gz" mruby
477458
DEF
478459
assert_success
479460
assert_build_log <<OUT
480-
./minirake
461+
./minirake []
481462
OUT
482463

483464
assert [ -w "$INSTALL_ROOT/bin/mruby" ]
@@ -506,7 +487,7 @@ DEF
506487

507488
assert_build_log <<OUT
508489
bundle --path=vendor/bundle
509-
rubinius-2.0.0: --prefix=$INSTALL_ROOT RUBYOPT=-rrubygems
490+
rubinius-2.0.0: [--prefix=$INSTALL_ROOT] RUBYOPT=-rrubygems
510491
bundle exec rake install
511492
OUT
512493
}
@@ -562,7 +543,8 @@ OUT
562543
@test "JRuby build" {
563544
executable "${RUBY_BUILD_CACHE_PATH}/jruby-1.7.9/bin/jruby" <<OUT
564545
#!${BASH}
565-
echo jruby "\$@" >> ../build.log
546+
IFS=,
547+
echo "jruby [\$*]" >> ../build.log
566548
OUT
567549
executable "${RUBY_BUILD_CACHE_PATH}/jruby-1.7.9/bin/gem" <<OUT
568550
#!/usr/bin/env jruby
@@ -576,8 +558,8 @@ DEF
576558
assert_success
577559

578560
assert_build_log <<OUT
579-
jruby -e puts JRUBY_VERSION
580-
jruby gem install jruby-launcher
561+
jruby [-e,puts JRUBY_VERSION]
562+
jruby [gem,install,jruby-launcher]
581563
OUT
582564

583565
run ls "${INSTALL_ROOT}/bin"

test/compiler.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export -n RUBY_CONFIGURE_OPTS
1414
stub_repeated uname '-s : echo Darwin'
1515
stub sw_vers '-productVersion : echo 10.10'
1616
stub_repeated brew 'false'
17-
stub_repeated make 'echo make $@'
17+
stub_repeated make 'echo "make $(inspect_args "$@")"'
1818

1919
cat > ./configure <<CON
2020
#!${BASH}

test/stubs/stub

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,21 @@ eval "${_STUB_INDEX}"=1
2727
eval "${_STUB_RESULT}"=0
2828
[ ! -e "${!_STUB_RUN}" ] || source "${!_STUB_RUN}"
2929

30+
# Expose this for stub scripts.
31+
inspect_args() {
32+
local arg
33+
local sep=''
34+
for arg; do
35+
if [[ $arg == *' '* ]]; then
36+
printf '%s"%s"' "$sep" "${arg//\"/\\\"}"
37+
elif [[ $arg == *'"'* ]]; then
38+
printf "%s'%s'" "$sep" "$arg"
39+
else
40+
printf '%s%s' "$sep" "$arg"
41+
fi
42+
sep=" "
43+
done
44+
}
3045

3146
# Loop over each line in the plan.
3247
index=0

0 commit comments

Comments
 (0)