• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2
3set -e -u
4
5if [ -x /bin/echo ]; then
6    ECHO='/bin/echo'
7else
8    ECHO='echo'
9fi
10
11# Prints the absolute path of a directory to stdout
12abs_path() {
13    local path="$1"
14    # Unset CDPATH because it causes havok: it makes the destination unpredictable
15    # and triggers 'cd' to print the path to stdout. Route `cd`'s output to /dev/null
16    # for good measure.
17    (unset CDPATH && cd "$path" > /dev/null && pwd)
18}
19
20S="$(abs_path $(dirname $0))"
21
22TEST_DIR="$S/test"
23WORK_DIR="$TMP_DIR/workdir"
24OUT_DIR="$TMP_DIR/outdir"
25PREFIX_DIR="$TMP_DIR/prefix"
26
27case $(uname -s) in
28
29    MINGW* | MSYS*)
30    WINDOWS=1
31        ;;
32esac
33
34say() {
35    echo "test: $1"
36}
37
38pre() {
39    echo "test: $1"
40    rm -Rf "$WORK_DIR"
41    rm -Rf "$OUT_DIR"
42    rm -Rf "$PREFIX_DIR"
43    mkdir -p "$WORK_DIR"
44    mkdir -p "$OUT_DIR"
45    mkdir -p "$PREFIX_DIR"
46}
47
48need_ok() {
49    if [ $? -ne 0 ]
50    then
51    echo
52    echo "TEST FAILED!"
53    echo
54    exit 1
55    fi
56}
57
58fail() {
59    echo
60    echo "$1"
61    echo
62    echo "TEST FAILED!"
63    echo
64    exit 1
65}
66
67try() {
68    set +e
69    _cmd="$@"
70    _output=`$@ 2>&1`
71    if [ $? -ne 0 ]; then
72    echo \$ "$_cmd"
73    # Using /bin/echo to avoid escaping
74    $ECHO "$_output"
75    echo
76    echo "TEST FAILED!"
77    echo
78    exit 1
79    else
80    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
81        echo \$ "$_cmd"
82    fi
83    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
84        $ECHO "$_output"
85    fi
86    fi
87    set -e
88}
89
90expect_fail() {
91    set +e
92    _cmd="$@"
93    _output=`$@ 2>&1`
94    if [ $? -eq 0 ]; then
95    echo \$ "$_cmd"
96    # Using /bin/echo to avoid escaping
97    $ECHO "$_output"
98    echo
99    echo "TEST FAILED!"
100    echo
101    exit 1
102    else
103    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
104        echo \$ "$_cmd"
105    fi
106    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
107        $ECHO "$_output"
108    fi
109    fi
110    set -e
111}
112
113expect_output_ok() {
114    set +e
115    local _expected="$1"
116    shift 1
117    _cmd="$@"
118    _output=`$@ 2>&1`
119    if [ $? -ne 0 ]; then
120    echo \$ "$_cmd"
121    # Using /bin/echo to avoid escaping
122    $ECHO "$_output"
123    echo
124    echo "TEST FAILED!"
125    echo
126    exit 1
127    elif ! echo "$_output" | grep -q "$_expected"; then
128    echo \$ "$_cmd"
129    $ECHO "$_output"
130    echo
131    echo "missing expected output '$_expected'"
132    echo
133    echo
134    echo "TEST FAILED!"
135    echo
136    exit 1
137    else
138    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
139        echo \$ "$_cmd"
140    fi
141    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
142        $ECHO "$_output"
143    fi
144    fi
145    set -e
146}
147
148expect_output_fail() {
149    set +e
150    local _expected="$1"
151    shift 1
152    _cmd="$@"
153    _output=`$@ 2>&1`
154    if [ $? -eq 0 ]; then
155    echo \$ "$_cmd"
156    # Using /bin/echo to avoid escaping
157    $ECHO "$_output"
158    echo
159    echo "TEST FAILED!"
160    echo
161    exit 1
162    elif ! echo "$_output" | grep -q "$_expected"; then
163    echo \$ "$_cmd"
164    $ECHO "$_output"
165    echo
166    echo "missing expected output '$_expected'"
167    echo
168    echo
169    echo "TEST FAILED!"
170    echo
171    exit 1
172    else
173    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
174        echo \$ "$_cmd"
175    fi
176    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
177        $ECHO "$_output"
178    fi
179    fi
180    set -e
181}
182
183expect_not_output_ok() {
184    set +e
185    local _expected="$1"
186    shift 1
187    _cmd="$@"
188    _output=`$@ 2>&1`
189    if [ $? -ne 0 ]; then
190    echo \$ "$_cmd"
191    # Using /bin/echo to avoid escaping
192    $ECHO "$_output"
193    echo
194    echo "TEST FAILED!"
195    echo
196    exit 1
197    elif echo "$_output" | grep -q "$_expected"; then
198    echo \$ "$_cmd"
199    $ECHO "$_output"
200    echo
201    echo "unexpected output '$_expected'"
202    echo
203    echo
204    echo "TEST FAILED!"
205    echo
206    exit 1
207    else
208    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
209        echo \$ "$_cmd"
210    fi
211    if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
212        $ECHO "$_output"
213    fi
214    fi
215    set -e
216}
217
218runtest() {
219    local _testname="$1"
220    if [ -n "${TESTNAME-}" ]; then
221    if ! echo "$_testname" | grep -q "$TESTNAME"; then
222        return 0
223    fi
224    fi
225
226    pre "$_testname"
227    "$_testname"
228}
229
230# Installation tests
231
232basic_install() {
233    try sh "$S/gen-installer.sh" \
234    --image-dir="$TEST_DIR/image1" \
235    --work-dir="$WORK_DIR" \
236    --output-dir="$OUT_DIR"
237    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
238    try test -e "$PREFIX_DIR/something-to-install"
239    try test -e "$PREFIX_DIR/dir-to-install/foo"
240    try test -e "$PREFIX_DIR/bin/program"
241    try test -e "$PREFIX_DIR/bin/program2"
242    try test -e "$PREFIX_DIR/bin/bad-bin"
243}
244runtest basic_install
245
246basic_uninstall() {
247    try sh "$S/gen-installer.sh" \
248    --image-dir="$TEST_DIR/image1" \
249    --work-dir="$WORK_DIR" \
250    --output-dir="$OUT_DIR"
251    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
252    try "$WORK_DIR/package/install.sh --uninstall" --prefix="$PREFIX_DIR"
253    try test ! -e "$PREFIX_DIR/something-to-install"
254    try test ! -e "$PREFIX_DIR/dir-to-install/foo"
255    try test ! -e "$PREFIX_DIR/bin/program"
256    try test ! -e "$PREFIX_DIR/bin/program2"
257    try test ! -e "$PREFIX_DIR/bin/bad-bin"
258    try test ! -e "$PREFIX_DIR/lib/packagelib"
259}
260runtest basic_uninstall
261
262not_installed_files() {
263    mkdir -p "$WORK_DIR/overlay"
264    touch "$WORK_DIR/overlay/not-installed"
265    try sh "$S/gen-installer.sh" \
266    --image-dir="$TEST_DIR/image1" \
267    --work-dir="$WORK_DIR" \
268    --output-dir="$OUT_DIR" \
269    --non-installed-overlay="$WORK_DIR/overlay"
270    try test -e "$WORK_DIR/package/not-installed"
271    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
272    try test ! -e "$PREFIX_DIR/not-installed"
273}
274runtest not_installed_files
275
276tarball_with_package_name() {
277    try sh "$S/gen-installer.sh" \
278    --image-dir="$TEST_DIR/image1" \
279    --work-dir="$WORK_DIR" \
280    --output-dir="$OUT_DIR" \
281    --package-name=rustc-nightly
282    try "$WORK_DIR/rustc-nightly/install.sh" --prefix="$PREFIX_DIR"
283    try test -e "$OUT_DIR/rustc-nightly.tar.gz"
284    try test -e "$OUT_DIR/rustc-nightly.tar.xz"
285}
286runtest tarball_with_package_name
287
288install_overwrite_backup() {
289    try sh "$S/gen-installer.sh" \
290    --image-dir="$TEST_DIR/image1" \
291    --work-dir="$WORK_DIR" \
292    --output-dir="$OUT_DIR"
293    try mkdir -p "$PREFIX_DIR/bin"
294    touch "$PREFIX_DIR/bin/program"
295    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
296    # The existing program was backed up by 'install'
297    try test -e "$PREFIX_DIR/bin/program.old"
298}
299runtest install_overwrite_backup
300
301bulk_directory() {
302    try sh "$S/gen-installer.sh" \
303    --image-dir="$TEST_DIR/image1" \
304    --work-dir="$WORK_DIR" \
305    --output-dir="$OUT_DIR" \
306    --bulk-dirs=dir-to-install
307    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
308    try test -e "$PREFIX_DIR/something-to-install"
309    try test -e "$PREFIX_DIR/dir-to-install/foo"
310    try test -e "$PREFIX_DIR/bin/program"
311    try test -e "$PREFIX_DIR/bin/program2"
312    try test -e "$PREFIX_DIR/bin/bad-bin"
313    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR" --uninstall
314    try test ! -e "$PREFIX_DIR/dir-to-install"
315}
316runtest bulk_directory
317
318bulk_directory_overwrite() {
319    try sh "$S/gen-installer.sh" \
320    --image-dir="$TEST_DIR/image1" \
321    --work-dir="$WORK_DIR" \
322    --output-dir="$OUT_DIR" \
323    --bulk-dirs=dir-to-install
324    try mkdir -p "$PREFIX_DIR/dir-to-install"
325    try touch "$PREFIX_DIR/dir-to-install/overwrite"
326    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
327    # The file that used to exist in the directory no longer does
328    try test ! -e "$PREFIX_DIR/dir-to-install/overwrite"
329    # It was backed up
330    try test -e "$PREFIX_DIR/dir-to-install.old/overwrite"
331}
332runtest bulk_directory_overwrite
333
334bulk_directory_overwrite_existing_backup() {
335    try sh "$S/gen-installer.sh" \
336    --image-dir="$TEST_DIR/image1" \
337    --work-dir="$WORK_DIR" \
338    --output-dir="$OUT_DIR" \
339    --bulk-dirs=dir-to-install
340    try mkdir -p "$PREFIX_DIR/dir-to-install"
341    try touch "$PREFIX_DIR/dir-to-install/overwrite"
342    # This time we've already got an existing backup of the overwritten directory.
343    # The install should still succeed.
344    try mkdir -p "$PREFIX_DIR/dir-to-install~"
345    try touch "$PREFIX_DIR/dir-to-install~/overwrite"
346    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
347    try test ! -e "$PREFIX_DIR/dir-to-install/overwrite"
348    try test -e "$PREFIX_DIR/dir-to-install~/overwrite"
349}
350runtest bulk_directory_overwrite_existing_backup
351
352nested_bulk_directory() {
353    try sh "$S/gen-installer.sh" \
354    --image-dir="$TEST_DIR/image4" \
355    --work-dir="$WORK_DIR" \
356    --output-dir="$OUT_DIR" \
357    --bulk-dirs=dir-to-install/qux
358    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
359    try test -e "$PREFIX_DIR/dir-to-install/qux/bar"
360    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR" --uninstall
361    try test ! -e "$PREFIX_DIR/dir-to-install/qux"
362}
363runtest nested_bulk_directory
364
365only_bulk_directory_no_files() {
366    try sh "$S/gen-installer.sh" \
367    --image-dir="$TEST_DIR/image5" \
368    --work-dir="$WORK_DIR" \
369    --output-dir="$OUT_DIR" \
370    --bulk-dirs=dir-to-install
371    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
372    try test -e "$PREFIX_DIR/dir-to-install/foo"
373    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR" --uninstall
374    try test ! -e "$PREFIX_DIR/dir-to-install/foo"
375}
376runtest only_bulk_directory_no_files
377
378nested_not_installed_files() {
379    mkdir -p "$WORK_DIR/overlay"
380    touch "$WORK_DIR/overlay/not-installed"
381    try sh "$S/gen-installer.sh" \
382    --image-dir="$TEST_DIR/image4" \
383    --work-dir="$WORK_DIR" \
384    --output-dir="$OUT_DIR" \
385    --non-installed-overlay="$WORK_DIR/overlay"
386    try test -e "$WORK_DIR/package/not-installed"
387    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
388    try test ! -e "$PREFIX_DIR/not-installed"
389}
390runtest nested_not_installed_files
391
392multiple_components() {
393    try sh "$S/gen-installer.sh" \
394    --image-dir="$TEST_DIR/image1" \
395    --work-dir="$WORK_DIR/c1" \
396    --output-dir="$OUT_DIR/c1" \
397    --component-name=rustc
398    try sh "$S/gen-installer.sh" \
399    --image-dir="$TEST_DIR/image3" \
400    --work-dir="$WORK_DIR/c2" \
401    --output-dir="$OUT_DIR/c2" \
402    --component-name=cargo
403    try "$WORK_DIR/c1/package/install.sh" --prefix="$PREFIX_DIR"
404    try "$WORK_DIR/c2/package/install.sh" --prefix="$PREFIX_DIR"
405    try test -e "$PREFIX_DIR/something-to-install"
406    try test -e "$PREFIX_DIR/dir-to-install/foo"
407    try test -e "$PREFIX_DIR/bin/program"
408    try test -e "$PREFIX_DIR/bin/program2"
409    try test -e "$PREFIX_DIR/bin/bad-bin"
410    try test -e "$PREFIX_DIR/bin/cargo"
411    try "$WORK_DIR/c1/package/install.sh" --prefix="$PREFIX_DIR" --uninstall
412    try test ! -e "$PREFIX_DIR/something-to-install"
413    try test ! -e "$PREFIX_DIR/dir-to-install/foo"
414    try test ! -e "$PREFIX_DIR/bin/program"
415    try test ! -e "$PREFIX_DIR/bin/program2"
416    try test ! -e "$PREFIX_DIR/bin/bad-bin"
417    try "$WORK_DIR/c2/package/install.sh" --prefix="$PREFIX_DIR" --uninstall
418    try test ! -e "$PREFIX_DIR/bin/cargo"
419    try test ! -e "$PREFIX_DIR/lib/packagelib"
420}
421runtest multiple_components
422
423uninstall_from_installed_script() {
424    try sh "$S/gen-installer.sh" \
425    --image-dir="$TEST_DIR/image1" \
426    --work-dir="$WORK_DIR/c1" \
427    --output-dir="$OUT_DIR/c1" \
428    --component-name=rustc
429    try sh "$S/gen-installer.sh" \
430    --image-dir="$TEST_DIR/image3" \
431    --work-dir="$WORK_DIR/c2" \
432    --output-dir="$OUT_DIR/c2" \
433    --component-name=cargo
434    try "$WORK_DIR/c1/package/install.sh" --prefix="$PREFIX_DIR"
435    try "$WORK_DIR/c2/package/install.sh" --prefix="$PREFIX_DIR"
436    try test -e "$PREFIX_DIR/something-to-install"
437    try test -e "$PREFIX_DIR/dir-to-install/foo"
438    try test -e "$PREFIX_DIR/bin/program"
439    try test -e "$PREFIX_DIR/bin/program2"
440    try test -e "$PREFIX_DIR/bin/bad-bin"
441    try test -e "$PREFIX_DIR/bin/cargo"
442    # All components should be uninstalled by this script
443    try sh "$PREFIX_DIR/lib/packagelib/uninstall.sh"
444    try test ! -e "$PREFIX_DIR/something-to-install"
445    try test ! -e "$PREFIX_DIR/dir-to-install/foo"
446    try test ! -e "$PREFIX_DIR/bin/program"
447    try test ! -e "$PREFIX_DIR/bin/program2"
448    try test ! -e "$PREFIX_DIR/bin/bad-bin"
449    try test ! -e "$PREFIX_DIR/bin/cargo"
450    try test ! -e "$PREFIX_DIR/lib/packagelib"
451}
452runtest uninstall_from_installed_script
453
454uninstall_from_installed_script_with_args_fails() {
455    try sh "$S/gen-installer.sh" \
456    --image-dir="$TEST_DIR/image1" \
457    --work-dir="$WORK_DIR/c1" \
458    --output-dir="$OUT_DIR/c1" \
459    --component-name=rustc
460    try "$WORK_DIR/c1/package/install.sh" --prefix="$PREFIX_DIR"
461    expect_output_fail "uninstall.sh does not take any arguments" \
462    sh "$PREFIX_DIR/lib/packagelib/uninstall.sh" --prefix=foo
463}
464runtest uninstall_from_installed_script_with_args_fails
465
466# Combined installer tests
467
468combine_installers() {
469    try sh "$S/gen-installer.sh" \
470    --image-dir="$TEST_DIR/image1" \
471    --work-dir="$WORK_DIR" \
472    --output-dir="$OUT_DIR" \
473    --package-name=rustc \
474    --component-name=rustc
475    try sh "$S/gen-installer.sh" \
476    --image-dir="$TEST_DIR/image3" \
477    --work-dir="$WORK_DIR" \
478    --output-dir="$OUT_DIR" \
479    --package-name=cargo \
480    --component-name=cargo
481    try sh "$S/combine-installers.sh" \
482    --work-dir="$WORK_DIR" \
483    --output-dir="$OUT_DIR" \
484    --package-name=rust \
485    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz"
486    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
487    try test -e "$PREFIX_DIR/something-to-install"
488    try test -e "$PREFIX_DIR/dir-to-install/foo"
489    try test -e "$PREFIX_DIR/bin/program"
490    try test -e "$PREFIX_DIR/bin/program2"
491    try test -e "$PREFIX_DIR/bin/bad-bin"
492    try test -e "$PREFIX_DIR/bin/cargo"
493    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
494    try test ! -e "$PREFIX_DIR/something-to-install"
495    try test ! -e "$PREFIX_DIR/dir-to-install/foo"
496    try test ! -e "$PREFIX_DIR/bin/program"
497    try test ! -e "$PREFIX_DIR/bin/program2"
498    try test ! -e "$PREFIX_DIR/bin/bad-bin"
499    try test ! -e "$PREFIX_DIR/bin/cargo"
500    try test ! -e "$PREFIX_DIR/lib/packagelib"
501}
502runtest combine_installers
503
504combine_three_installers() {
505    try sh "$S/gen-installer.sh" \
506    --image-dir="$TEST_DIR/image1" \
507    --work-dir="$WORK_DIR" \
508    --output-dir="$OUT_DIR" \
509    --package-name=rustc \
510    --component-name=rustc
511    try sh "$S/gen-installer.sh" \
512    --image-dir="$TEST_DIR/image3" \
513    --work-dir="$WORK_DIR" \
514    --output-dir="$OUT_DIR" \
515    --package-name=cargo \
516    --component-name=cargo
517    try sh "$S/gen-installer.sh" \
518    --image-dir="$TEST_DIR/image4" \
519    --work-dir="$WORK_DIR" \
520    --output-dir="$OUT_DIR" \
521    --package-name=rust-docs \
522    --component-name=rust-docs
523    try sh "$S/combine-installers.sh" \
524    --work-dir="$WORK_DIR" \
525    --output-dir="$OUT_DIR" \
526    --package-name=rust \
527    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
528    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
529    try test -e "$PREFIX_DIR/something-to-install"
530    try test -e "$PREFIX_DIR/dir-to-install/foo"
531    try test -e "$PREFIX_DIR/bin/program"
532    try test -e "$PREFIX_DIR/bin/program2"
533    try test -e "$PREFIX_DIR/bin/bad-bin"
534    try test -e "$PREFIX_DIR/bin/cargo"
535    try test -e "$PREFIX_DIR/dir-to-install/qux/bar"
536    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
537    try test ! -e "$PREFIX_DIR/something-to-install"
538    try test ! -e "$PREFIX_DIR/dir-to-install/foo"
539    try test ! -e "$PREFIX_DIR/bin/program"
540    try test ! -e "$PREFIX_DIR/bin/program2"
541    try test ! -e "$PREFIX_DIR/bin/bad-bin"
542    try test ! -e "$PREFIX_DIR/bin/cargo"
543    try test ! -e "$PREFIX_DIR/lib/packagelib"
544    try test ! -e "$PREFIX_DIR/dir-to-install/qux/bar"
545}
546runtest combine_three_installers
547
548combine_installers_with_overlay() {
549    try sh "$S/gen-installer.sh" \
550    --image-dir="$TEST_DIR/image1" \
551    --work-dir="$WORK_DIR" \
552    --output-dir="$OUT_DIR" \
553    --package-name=rustc \
554    --component-name=rustc
555    try sh "$S/gen-installer.sh" \
556    --image-dir="$TEST_DIR/image3" \
557    --work-dir="$WORK_DIR" \
558    --output-dir="$OUT_DIR" \
559    --package-name=cargo \
560    --component-name=cargo
561    mkdir -p "$WORK_DIR/overlay"
562    touch "$WORK_DIR/overlay/README"
563    try sh "$S/combine-installers.sh" \
564    --work-dir="$WORK_DIR" \
565    --output-dir="$OUT_DIR" \
566    --package-name=rust \
567    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz" \
568    --non-installed-overlay="$WORK_DIR/overlay"
569    try test -e "$WORK_DIR/rust/README"
570    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
571    try test ! -e "$PREFIX_DIR/README"
572}
573runtest combine_installers_with_overlay
574
575combined_with_bulk_dirs() {
576    try sh "$S/gen-installer.sh" \
577    --image-dir="$TEST_DIR/image1" \
578    --work-dir="$WORK_DIR" \
579    --output-dir="$OUT_DIR" \
580    --package-name=rustc \
581    --component-name=rustc \
582    --bulk-dirs=dir-to-install
583    try sh "$S/gen-installer.sh" \
584    --image-dir="$TEST_DIR/image3" \
585    --work-dir="$WORK_DIR" \
586    --output-dir="$OUT_DIR" \
587    --package-name=cargo \
588    --component-name=cargo
589    try sh "$S/combine-installers.sh" \
590    --work-dir="$WORK_DIR" \
591    --output-dir="$OUT_DIR" \
592    --package-name=rust \
593    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz"
594    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
595    try test -e "$PREFIX_DIR/dir-to-install/foo"
596    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
597    try test ! -e "$PREFIX_DIR/dir-to-install"
598}
599runtest combined_with_bulk_dirs
600
601combine_install_with_separate_uninstall() {
602    try sh "$S/gen-installer.sh" \
603    --image-dir="$TEST_DIR/image1" \
604    --work-dir="$WORK_DIR" \
605    --output-dir="$OUT_DIR" \
606    --package-name=rustc \
607    --component-name=rustc \
608    --rel-manifest-dir=rustlib
609    try sh "$S/gen-installer.sh" \
610    --image-dir="$TEST_DIR/image3" \
611    --work-dir="$WORK_DIR" \
612    --output-dir="$OUT_DIR" \
613    --package-name=cargo \
614    --component-name=cargo \
615    --rel-manifest-dir=rustlib
616    try sh "$S/combine-installers.sh" \
617    --work-dir="$WORK_DIR" \
618    --output-dir="$OUT_DIR" \
619    --package-name=rust \
620    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz" \
621    --rel-manifest-dir=rustlib
622    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
623    try test -e "$PREFIX_DIR/something-to-install"
624    try test -e "$PREFIX_DIR/dir-to-install/foo"
625    try test -e "$PREFIX_DIR/bin/program"
626    try test -e "$PREFIX_DIR/bin/program2"
627    try test -e "$PREFIX_DIR/bin/bad-bin"
628    try test -e "$PREFIX_DIR/bin/cargo"
629    try "$WORK_DIR/rustc/install.sh --uninstall" --prefix="$PREFIX_DIR"
630    try test ! -e "$PREFIX_DIR/something-to-install"
631    try test ! -e "$PREFIX_DIR/dir-to-install/foo"
632    try test ! -e "$PREFIX_DIR/bin/program"
633    try test ! -e "$PREFIX_DIR/bin/program2"
634    try test ! -e "$PREFIX_DIR/bin/bad-bin"
635    try "$WORK_DIR/cargo/install.sh --uninstall" --prefix="$PREFIX_DIR"
636    try test ! -e "$PREFIX_DIR/bin/cargo"
637    try test ! -e "$PREFIX_DIR/lib/packagelib"
638}
639runtest combine_install_with_separate_uninstall
640
641select_components_to_install() {
642    try sh "$S/gen-installer.sh" \
643    --image-dir="$TEST_DIR/image1" \
644    --work-dir="$WORK_DIR" \
645    --output-dir="$OUT_DIR" \
646    --package-name=rustc \
647    --component-name=rustc
648    try sh "$S/gen-installer.sh" \
649    --image-dir="$TEST_DIR/image3" \
650    --work-dir="$WORK_DIR" \
651    --output-dir="$OUT_DIR" \
652    --package-name=cargo \
653    --component-name=cargo
654    try sh "$S/gen-installer.sh" \
655    --image-dir="$TEST_DIR/image4" \
656    --work-dir="$WORK_DIR" \
657    --output-dir="$OUT_DIR" \
658    --package-name=rust-docs \
659    --component-name=rust-docs
660    try sh "$S/combine-installers.sh" \
661    --work-dir="$WORK_DIR" \
662    --output-dir="$OUT_DIR" \
663    --package-name=rust \
664    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
665    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --components=rustc
666    try test -e "$PREFIX_DIR/bin/program"
667    try test ! -e "$PREFIX_DIR/bin/cargo"
668    try test ! -e "$PREFIX_DIR/baz"
669    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
670    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --components=cargo
671    try test ! -e "$PREFIX_DIR/bin/program"
672    try test -e "$PREFIX_DIR/bin/cargo"
673    try test ! -e "$PREFIX_DIR/baz"
674    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
675    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --components=rust-docs
676    try test ! -e "$PREFIX_DIR/bin/program"
677    try test ! -e "$PREFIX_DIR/bin/cargo"
678    try test -e "$PREFIX_DIR/baz"
679    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
680    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --components=rustc,cargo
681    try test -e "$PREFIX_DIR/bin/program"
682    try test -e "$PREFIX_DIR/bin/cargo"
683    try test ! -e "$PREFIX_DIR/baz"
684    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" \
685    --components=rustc,cargo,rust-docs
686    try test ! -e "$PREFIX_DIR/bin/program"
687    try test ! -e "$PREFIX_DIR/bin/cargo"
688    try test ! -e "$PREFIX_DIR/baz"
689    try test ! -e "$PREFIX_DIR/lib/packagelib"
690}
691runtest select_components_to_install
692
693select_components_to_uninstall() {
694    try sh "$S/gen-installer.sh" \
695    --image-dir="$TEST_DIR/image1" \
696    --work-dir="$WORK_DIR" \
697    --output-dir="$OUT_DIR" \
698    --package-name=rustc \
699    --component-name=rustc
700    try sh "$S/gen-installer.sh" \
701    --image-dir="$TEST_DIR/image3" \
702    --work-dir="$WORK_DIR" \
703    --output-dir="$OUT_DIR" \
704    --package-name=cargo \
705    --component-name=cargo
706    try sh "$S/gen-installer.sh" \
707    --image-dir="$TEST_DIR/image4" \
708    --work-dir="$WORK_DIR" \
709    --output-dir="$OUT_DIR" \
710    --package-name=rust-docs \
711    --component-name=rust-docs
712    try sh "$S/combine-installers.sh" \
713    --work-dir="$WORK_DIR" \
714    --output-dir="$OUT_DIR" \
715    --package-name=rust \
716    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
717    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
718    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" --components=rustc
719    try test ! -e "$PREFIX_DIR/bin/program"
720    try test -e "$PREFIX_DIR/bin/cargo"
721    try test -e "$PREFIX_DIR/baz"
722    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
723    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" --components=cargo
724    try test -e "$PREFIX_DIR/bin/program"
725    try test ! -e "$PREFIX_DIR/bin/cargo"
726    try test -e "$PREFIX_DIR/baz"
727    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
728    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" --components=rust-docs
729    try test -e "$PREFIX_DIR/bin/program"
730    try test -e "$PREFIX_DIR/bin/cargo"
731    try test ! -e "$PREFIX_DIR/baz"
732    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
733    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" --components=rustc,cargo
734    try test ! -e "$PREFIX_DIR/bin/program"
735    try test ! -e "$PREFIX_DIR/bin/cargo"
736    try test -e "$PREFIX_DIR/baz"
737    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
738    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" \
739    --components=rustc,cargo,rust-docs
740    try test ! -e "$PREFIX_DIR/bin/program"
741    try test ! -e "$PREFIX_DIR/bin/cargo"
742    try test ! -e "$PREFIX_DIR/baz"
743    try test ! -e "$PREFIX_DIR/lib/packagelib"
744}
745runtest select_components_to_uninstall
746
747invalid_component() {
748    try sh "$S/gen-installer.sh" \
749    --image-dir="$TEST_DIR/image1" \
750    --work-dir="$WORK_DIR" \
751    --output-dir="$OUT_DIR" \
752    --package-name=rustc \
753    --component-name=rustc
754    try sh "$S/gen-installer.sh" \
755    --image-dir="$TEST_DIR/image3" \
756    --work-dir="$WORK_DIR" \
757    --output-dir="$OUT_DIR" \
758    --package-name=cargo \
759    --component-name=cargo
760    try sh "$S/gen-installer.sh" \
761    --image-dir="$TEST_DIR/image4" \
762    --work-dir="$WORK_DIR" \
763    --output-dir="$OUT_DIR" \
764    --package-name=rust-docs \
765    --component-name=rust-docs
766    try sh "$S/combine-installers.sh" \
767    --work-dir="$WORK_DIR" \
768    --output-dir="$OUT_DIR" \
769    --package-name=rust \
770    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
771    expect_output_fail "unknown component" "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" \
772    --components=foo
773}
774runtest invalid_component
775
776without_components() {
777    try sh "$S/gen-installer.sh" \
778    --image-dir="$TEST_DIR/image1" \
779    --work-dir="$WORK_DIR" \
780    --output-dir="$OUT_DIR" \
781    --package-name=rustc \
782    --component-name=rustc
783    try sh "$S/gen-installer.sh" \
784    --image-dir="$TEST_DIR/image3" \
785    --work-dir="$WORK_DIR" \
786    --output-dir="$OUT_DIR" \
787    --package-name=cargo \
788    --component-name=cargo
789    try sh "$S/gen-installer.sh" \
790    --image-dir="$TEST_DIR/image4" \
791    --work-dir="$WORK_DIR" \
792    --output-dir="$OUT_DIR" \
793    --package-name=rust-docs \
794    --component-name=rust-docs
795    try sh "$S/combine-installers.sh" \
796    --work-dir="$WORK_DIR" \
797    --output-dir="$OUT_DIR" \
798    --package-name=rust \
799    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
800    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --without=rust-docs
801    try test -e "$PREFIX_DIR/bin/program"
802    try test -e "$PREFIX_DIR/bin/cargo"
803    try test ! -e "$PREFIX_DIR/baz"
804    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
805    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --without=rust-docs,cargo
806    try test -e "$PREFIX_DIR/bin/program"
807    try test ! -e "$PREFIX_DIR/bin/cargo"
808    try test ! -e "$PREFIX_DIR/baz"
809    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
810    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --without=rust-docs,rustc
811    try test ! -e "$PREFIX_DIR/bin/program"
812    try test -e "$PREFIX_DIR/bin/cargo"
813    try test ! -e "$PREFIX_DIR/baz"
814    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR"
815}
816runtest without_components
817
818# --uninstall --without is kind of weird,
819# --without causes components to remain installed
820uninstall_without_components() {
821    try sh "$S/gen-installer.sh" \
822    --image-dir="$TEST_DIR/image1" \
823    --work-dir="$WORK_DIR" \
824    --output-dir="$OUT_DIR" \
825    --package-name=rustc \
826    --component-name=rustc
827    try sh "$S/gen-installer.sh" \
828    --image-dir="$TEST_DIR/image3" \
829    --work-dir="$WORK_DIR" \
830    --output-dir="$OUT_DIR" \
831    --package-name=cargo \
832    --component-name=cargo
833    try sh "$S/gen-installer.sh" \
834    --image-dir="$TEST_DIR/image4" \
835    --work-dir="$WORK_DIR" \
836    --output-dir="$OUT_DIR" \
837    --package-name=rust-docs \
838    --component-name=rust-docs
839    try sh "$S/combine-installers.sh" \
840    --work-dir="$WORK_DIR" \
841    --output-dir="$OUT_DIR" \
842    --package-name=rust \
843    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
844    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
845    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" --without=rust-docs
846    try test ! -e "$PREFIX_DIR/bin/program"
847    try test ! -e "$PREFIX_DIR/bin/cargo"
848    try test -e "$PREFIX_DIR/baz"
849    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
850    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" --without=rust-docs,cargo
851    try test ! -e "$PREFIX_DIR/bin/program"
852    try test -e "$PREFIX_DIR/bin/cargo"
853    try test -e "$PREFIX_DIR/baz"
854    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
855    try "$WORK_DIR/rust/install.sh --uninstall" --prefix="$PREFIX_DIR" --without=rust-docs,rustc
856    try test -e "$PREFIX_DIR/bin/program"
857    try test ! -e "$PREFIX_DIR/bin/cargo"
858    try test -e "$PREFIX_DIR/baz"
859}
860runtest uninstall_without_components
861
862without_any_components() {
863    try sh "$S/gen-installer.sh" \
864    --image-dir="$TEST_DIR/image1" \
865    --work-dir="$WORK_DIR" \
866    --output-dir="$OUT_DIR" \
867    --package-name=rustc \
868    --component-name=rustc
869    try sh "$S/gen-installer.sh" \
870    --image-dir="$TEST_DIR/image3" \
871    --work-dir="$WORK_DIR" \
872    --output-dir="$OUT_DIR" \
873    --package-name=cargo \
874    --component-name=cargo
875    try sh "$S/gen-installer.sh" \
876    --image-dir="$TEST_DIR/image4" \
877    --work-dir="$WORK_DIR" \
878    --output-dir="$OUT_DIR" \
879    --package-name=rust-docs \
880    --component-name=rust-docs
881    try sh "$S/combine-installers.sh" \
882    --work-dir="$WORK_DIR" \
883    --output-dir="$OUT_DIR" \
884    --package-name=rust \
885    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
886    expect_output_fail "no components selected for installation" \
887    "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --without=rust-docs,rustc,cargo
888}
889runtest without_any_components
890
891uninstall_without_any_components() {
892    try sh "$S/gen-installer.sh" \
893    --image-dir="$TEST_DIR/image1" \
894    --work-dir="$WORK_DIR" \
895    --output-dir="$OUT_DIR" \
896    --package-name=rustc \
897    --component-name=rustc
898    try sh "$S/gen-installer.sh" \
899    --image-dir="$TEST_DIR/image3" \
900    --work-dir="$WORK_DIR" \
901    --output-dir="$OUT_DIR" \
902    --package-name=cargo \
903    --component-name=cargo
904    try sh "$S/gen-installer.sh" \
905    --image-dir="$TEST_DIR/image4" \
906    --work-dir="$WORK_DIR" \
907    --output-dir="$OUT_DIR" \
908    --package-name=rust-docs \
909    --component-name=rust-docs
910    try sh "$S/combine-installers.sh" \
911    --work-dir="$WORK_DIR" \
912    --output-dir="$OUT_DIR" \
913    --package-name=rust \
914    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
915    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR"
916    expect_output_fail "no components selected for uninstallation" \
917    "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" \
918    --uninstall --without=rust-docs,rustc,cargo
919}
920runtest uninstall_without_any_components
921
922list_components() {
923    try sh "$S/gen-installer.sh" \
924    --image-dir="$TEST_DIR/image1" \
925    --work-dir="$WORK_DIR" \
926    --output-dir="$OUT_DIR" \
927    --package-name=rustc \
928    --component-name=rustc
929    try sh "$S/gen-installer.sh" \
930    --image-dir="$TEST_DIR/image3" \
931    --work-dir="$WORK_DIR" \
932    --output-dir="$OUT_DIR" \
933    --package-name=cargo \
934    --component-name=cargo
935    try sh "$S/gen-installer.sh" \
936    --image-dir="$TEST_DIR/image4" \
937    --work-dir="$WORK_DIR" \
938    --output-dir="$OUT_DIR" \
939    --package-name=rust-docs \
940    --component-name=rust-docs
941    try sh "$S/combine-installers.sh" \
942    --work-dir="$WORK_DIR" \
943    --output-dir="$OUT_DIR" \
944    --package-name=rust \
945    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
946    expect_output_ok "rustc" "$WORK_DIR/rust/install.sh" --list-components
947    expect_output_ok "cargo" "$WORK_DIR/rust/install.sh" --list-components
948    expect_output_ok "rust-docs" "$WORK_DIR/rust/install.sh" --list-components
949}
950runtest list_components
951
952combined_remains() {
953    try sh "$S/gen-installer.sh" \
954    --image-dir="$TEST_DIR/image1" \
955    --work-dir="$WORK_DIR" \
956    --output-dir="$OUT_DIR" \
957    --package-name=rustc \
958    --component-name=rustc
959    try sh "$S/gen-installer.sh" \
960    --image-dir="$TEST_DIR/image3" \
961    --work-dir="$WORK_DIR" \
962    --output-dir="$OUT_DIR" \
963    --package-name=cargo \
964    --component-name=cargo
965    try sh "$S/gen-installer.sh" \
966    --image-dir="$TEST_DIR/image4" \
967    --work-dir="$WORK_DIR" \
968    --output-dir="$OUT_DIR" \
969    --package-name=rust-docs \
970    --component-name=rust-docs
971    try sh "$S/combine-installers.sh" \
972    --work-dir="$WORK_DIR" \
973    --output-dir="$OUT_DIR" \
974    --package-name=rust \
975    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz,$OUT_DIR/rust-docs.tar.gz"
976    for component in rustc cargo rust-docs; do
977    # rustbuild wants the original extracted package intact too
978    try test -d "$WORK_DIR/$component/$component"
979    try test -d "$WORK_DIR/rust/$component"
980    done
981}
982runtest combined_remains
983
984# Smoke tests
985
986cannot_write_error() {
987    # chmod doesn't work on windows
988    if [ ! -n "${WINDOWS-}" ]; then
989    try sh "$S/gen-installer.sh" \
990        --image-dir="$TEST_DIR/image1" \
991        --work-dir="$WORK_DIR" \
992        --output-dir="$OUT_DIR"
993    chmod u-w "$PREFIX_DIR"
994    expect_fail "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
995    chmod u+w "$PREFIX_DIR"
996    fi
997}
998runtest cannot_write_error
999
1000cannot_install_to_installer() {
1001    try sh "$S/gen-installer.sh" \
1002    --image-dir="$TEST_DIR/image1" \
1003    --work-dir="$WORK_DIR" \
1004    --output-dir="$OUT_DIR" \
1005    --package-name=my-package
1006    expect_output_fail "cannot install to same directory as installer" \
1007    "$WORK_DIR/my-package/install.sh" --prefix="$WORK_DIR/my-package"
1008}
1009runtest cannot_install_to_installer
1010
1011upgrade_from_future_installer_error() {
1012    try sh "$S/gen-installer.sh" \
1013    --image-dir="$TEST_DIR/image1" \
1014    --work-dir="$WORK_DIR" \
1015    --output-dir="$OUT_DIR" \
1016    --rel-manifest-dir=rustlib
1017    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
1018    echo 100 > "$PREFIX_DIR/lib/rustlib/rust-installer-version"
1019    expect_fail "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
1020}
1021runtest upgrade_from_future_installer_error
1022
1023destdir() {
1024    try sh "$S/gen-installer.sh" \
1025    --image-dir="$TEST_DIR/image1" \
1026    --work-dir="$WORK_DIR" \
1027    --output-dir="$OUT_DIR"
1028    try "$WORK_DIR/package/install.sh" --destdir="$PREFIX_DIR/" --prefix=prefix
1029    try test -e "$PREFIX_DIR/prefix/bin/program"
1030}
1031runtest destdir
1032
1033destdir_no_trailing_slash() {
1034    try sh "$S/gen-installer.sh" \
1035    --image-dir="$TEST_DIR/image1" \
1036    --work-dir="$WORK_DIR" \
1037    --output-dir="$OUT_DIR"
1038    try "$WORK_DIR/package/install.sh" --destdir="$PREFIX_DIR" --prefix=prefix
1039    try test -e "$PREFIX_DIR/prefix/bin/program"
1040}
1041runtest destdir_no_trailing_slash
1042
1043disable_verify_noop() {
1044    # Obsolete --disable-verify flag doesn't generate error
1045    try sh "$S/gen-installer.sh" \
1046       --image-dir="$TEST_DIR/image1" \
1047       --work-dir="$WORK_DIR" \
1048       --output-dir="$OUT_DIR"
1049    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR" --disable-verify
1050}
1051runtest disable_verify_noop
1052
1053create_log() {
1054    try sh "$S/gen-installer.sh" \
1055       --image-dir="$TEST_DIR/image1" \
1056       --work-dir="$WORK_DIR" \
1057       --output-dir="$OUT_DIR"
1058    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
1059    try test -e "$PREFIX_DIR/lib/packagelib/install.log"
1060    local _log="$(cat "$PREFIX_DIR/lib/packagelib/install.log")"
1061    if [ -z "$_log" ]; then
1062    fail "log is empty"
1063    fi
1064}
1065runtest create_log
1066
1067leave_log_after_failure() {
1068    # chmod doesn't work on windows
1069    if [ ! -n "${WINDOWS-}" ]; then
1070    try sh "$S/gen-installer.sh" \
1071        --image-dir="$TEST_DIR/image1" \
1072        --work-dir="$WORK_DIR" \
1073        --output-dir="$OUT_DIR"
1074    mkdir -p "$PREFIX_DIR/lib/packagelib"
1075    touch "$PREFIX_DIR/lib/packagelib/components"
1076    chmod u-w "$PREFIX_DIR/lib/packagelib/components"
1077    expect_fail "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
1078    chmod u+w "$PREFIX_DIR/lib/packagelib/components"
1079    try test -e "$PREFIX_DIR/lib/packagelib/install.log"
1080    local _log="$(cat "$PREFIX_DIR/lib/packagelib/install.log")"
1081    if [ -z "$_log" ]; then
1082        fail "log is empty"
1083    fi
1084    # script should tell user where the logs are
1085    if ! grep -q "see logs at" "$PREFIX_DIR/lib/packagelib/install.log"; then
1086        fail "missing log message"
1087    fi
1088    fi
1089}
1090runtest leave_log_after_failure
1091
1092# https://github.com/rust-lang/rust-installer/issues/22
1093help() {
1094    try sh "$S/gen-installer.sh" \
1095    --image-dir="$TEST_DIR/image1" \
1096    --work-dir="$WORK_DIR" \
1097    --output-dir="$OUT_DIR"
1098    try "$WORK_DIR/package/install.sh" --help
1099}
1100runtest help
1101
1102# https://github.com/rust-lang/rust-installer/issues/31
1103CDPATH_does_not_destroy_things() {
1104    try sh "$S/gen-installer.sh" \
1105    --image-dir="$TEST_DIR/image1" \
1106    --work-dir="$WORK_DIR" \
1107    --output-dir="$OUT_DIR"
1108    cd "$WORK_DIR" || exit 1
1109    export CDPATH="../$(basename $WORK_DIR)/foo"
1110    try sh "package/install.sh" --prefix="$PREFIX_DIR"
1111    cd "$S" || exit 1
1112    cd "$PREFIX_DIR" || exit 1
1113    export CDPATH="../$(basename $PREFIX_DIR)"
1114    try sh "lib/packagelib/uninstall.sh"
1115    cd "$S" || exit 1
1116    unset CDPATH
1117}
1118runtest CDPATH_does_not_destroy_things
1119
1120docdir_default() {
1121    try sh "$S/gen-installer.sh" \
1122    --image-dir="$TEST_DIR/image-docdir1" \
1123    --work-dir="$WORK_DIR" \
1124    --output-dir="$OUT_DIR"
1125    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR"
1126    try test -e "$PREFIX_DIR/share/doc/rust/README"
1127    try test -e "$PREFIX_DIR/share/doc/rust/rustdocs.txt"
1128}
1129runtest docdir_default
1130
1131docdir() {
1132    try sh "$S/gen-installer.sh" \
1133    --image-dir="$TEST_DIR/image-docdir1" \
1134    --work-dir="$WORK_DIR" \
1135    --output-dir="$OUT_DIR"
1136    try mkdir "$WORK_DIR/docdir"
1137    try "$WORK_DIR/package/install.sh" --prefix="$PREFIX_DIR" --docdir="$WORK_DIR/docdir"
1138    try test -e "$WORK_DIR/docdir/README"
1139    try test -e "$WORK_DIR/docdir/rustdocs.txt"
1140}
1141runtest docdir
1142
1143docdir_combined() {
1144    try sh "$S/gen-installer.sh" \
1145    --image-dir="$TEST_DIR/image-docdir1" \
1146    --work-dir="$WORK_DIR" \
1147    --output-dir="$OUT_DIR" \
1148        --package-name="rustc" \
1149        --component-name="rustc"
1150    try sh "$S/gen-installer.sh" \
1151    --image-dir="$TEST_DIR/image-docdir2" \
1152    --work-dir="$WORK_DIR" \
1153    --output-dir="$OUT_DIR" \
1154        --package-name="cargo" \
1155        --component-name="cargo"
1156    try sh "$S/combine-installers.sh" \
1157    --work-dir="$WORK_DIR" \
1158    --output-dir="$OUT_DIR" \
1159    --package-name=rust \
1160    --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz"
1161    try mkdir "$WORK_DIR/docdir"
1162    try "$WORK_DIR/rust/install.sh" --prefix="$PREFIX_DIR" --docdir="$WORK_DIR/docdir"
1163    try test -e "$WORK_DIR/docdir/README"
1164    try test -e "$WORK_DIR/docdir/rustdocs.txt"
1165    try test -e "$WORK_DIR/docdir/README"
1166    try test -e "$WORK_DIR/docdir/cargodocs.txt"
1167}
1168runtest docdir_combined
1169
1170combine_installers_different_input_compression_formats() {
1171    try sh "$S/gen-installer.sh" \
1172        --image-dir="$TEST_DIR/image1" \
1173        --work-dir="$WORK_DIR" \
1174        --output-dir="$OUT_DIR" \
1175        --package-name=rustc \
1176        --component-name=rustc \
1177        --compression-formats=xz
1178    try sh "$S/gen-installer.sh" \
1179        --image-dir="$TEST_DIR/image3" \
1180        --work-dir="$WORK_DIR" \
1181        --output-dir="$OUT_DIR" \
1182        --package-name=cargo \
1183        --component-name=cargo \
1184        --compression-formats=gz
1185    try sh "$S/combine-installers.sh" \
1186        --work-dir="$WORK_DIR" \
1187        --output-dir="$OUT_DIR" \
1188        --package-name=rust \
1189        --input-tarballs="$OUT_DIR/rustc.tar.xz,$OUT_DIR/cargo.tar.gz"
1190
1191    try test -e "${OUT_DIR}/rust.tar.gz"
1192    try test -e "${OUT_DIR}/rust.tar.xz"
1193}
1194runtest combine_installers_different_input_compression_formats
1195
1196generate_compression_formats_one() {
1197    try sh "$S/gen-installer.sh" \
1198        --image-dir="$TEST_DIR/image1" \
1199        --work-dir="$WORK_DIR" \
1200        --output-dir="$OUT_DIR" \
1201        --package-name="rustc" \
1202        --component-name="rustc" \
1203        --compression-formats="xz"
1204
1205    try test ! -e "${OUT_DIR}/rustc.tar.gz"
1206    try test -e "${OUT_DIR}/rustc.tar.xz"
1207}
1208runtest generate_compression_formats_one
1209
1210generate_compression_formats_multiple() {
1211    try sh "$S/gen-installer.sh" \
1212        --image-dir="$TEST_DIR/image1" \
1213        --work-dir="$WORK_DIR" \
1214        --output-dir="$OUT_DIR" \
1215        --package-name="rustc" \
1216        --component-name="rustc" \
1217        --compression-formats="gz,xz"
1218
1219    try test -e "${OUT_DIR}/rustc.tar.gz"
1220    try test -e "${OUT_DIR}/rustc.tar.xz"
1221}
1222runtest generate_compression_formats_multiple
1223
1224generate_compression_formats_error() {
1225    expect_fail sh "$S/gen-installer.sh" \
1226        --image-dir="$TEST_DIR/image1" \
1227        --work-dir="$WORK_DIR" \
1228        --output-dir="$OUT_DIR" \
1229        --package-name="rustc" \
1230        --component-name="rustc" \
1231        --compression-formats="xz,foobar"
1232}
1233runtest generate_compression_formats_error
1234
1235combine_compression_formats_one() {
1236    try sh "$S/gen-installer.sh" \
1237        --image-dir="$TEST_DIR/image1" \
1238        --work-dir="$WORK_DIR" \
1239        --output-dir="$OUT_DIR" \
1240        --package-name=rustc \
1241        --component-name=rustc
1242    try sh "$S/gen-installer.sh" \
1243        --image-dir="$TEST_DIR/image3" \
1244        --work-dir="$WORK_DIR" \
1245        --output-dir="$OUT_DIR" \
1246        --package-name=cargo \
1247        --component-name=cargo
1248    try sh "$S/combine-installers.sh" \
1249        --work-dir="$WORK_DIR" \
1250        --output-dir="$OUT_DIR" \
1251        --package-name=rust \
1252        --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz" \
1253        --compression-formats=xz
1254
1255    try test ! -e "${OUT_DIR}/rust.tar.gz"
1256    try test -e "${OUT_DIR}/rust.tar.xz"
1257}
1258runtest combine_compression_formats_one
1259
1260combine_compression_formats_multiple() {
1261    try sh "$S/gen-installer.sh" \
1262        --image-dir="$TEST_DIR/image1" \
1263        --work-dir="$WORK_DIR" \
1264        --output-dir="$OUT_DIR" \
1265        --package-name=rustc \
1266        --component-name=rustc
1267    try sh "$S/gen-installer.sh" \
1268        --image-dir="$TEST_DIR/image3" \
1269        --work-dir="$WORK_DIR" \
1270        --output-dir="$OUT_DIR" \
1271        --package-name=cargo \
1272        --component-name=cargo
1273    try sh "$S/combine-installers.sh" \
1274        --work-dir="$WORK_DIR" \
1275        --output-dir="$OUT_DIR" \
1276        --package-name=rust \
1277        --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz" \
1278        --compression-formats=xz,gz
1279
1280    try test -e "${OUT_DIR}/rust.tar.gz"
1281    try test -e "${OUT_DIR}/rust.tar.xz"
1282}
1283runtest combine_compression_formats_multiple
1284
1285combine_compression_formats_error() {
1286    try sh "$S/gen-installer.sh" \
1287        --image-dir="$TEST_DIR/image1" \
1288        --work-dir="$WORK_DIR" \
1289        --output-dir="$OUT_DIR" \
1290        --package-name=rustc \
1291        --component-name=rustc
1292    try sh "$S/gen-installer.sh" \
1293        --image-dir="$TEST_DIR/image3" \
1294        --work-dir="$WORK_DIR" \
1295        --output-dir="$OUT_DIR" \
1296        --package-name=cargo \
1297        --component-name=cargo
1298    expect_fail sh "$S/combine-installers.sh" \
1299        --work-dir="$WORK_DIR" \
1300        --output-dir="$OUT_DIR" \
1301        --package-name=rust \
1302        --input-tarballs="$OUT_DIR/rustc.tar.gz,$OUT_DIR/cargo.tar.gz" \
1303        --compression-formats=xz,foobar
1304}
1305runtest combine_compression_formats_error
1306
1307tarball_compression_formats_one() {
1308    try cp -r "${TEST_DIR}/image1" "${WORK_DIR}/image"
1309    try sh "$S/make-tarballs.sh" \
1310        --input="${WORK_DIR}/image" \
1311        --work-dir="${WORK_DIR}" \
1312        --output="${OUT_DIR}/rustc" \
1313        --compression-formats="xz"
1314
1315    try test ! -e "${OUT_DIR}/rustc.tar.gz"
1316    try test -e "${OUT_DIR}/rustc.tar.xz"
1317}
1318runtest tarball_compression_formats_one
1319
1320tarball_compression_formats_multiple() {
1321    try cp -r "${TEST_DIR}/image1" "${WORK_DIR}/image"
1322    try sh "$S/make-tarballs.sh" \
1323        --input="${WORK_DIR}/image" \
1324        --work-dir="${WORK_DIR}" \
1325        --output="${OUT_DIR}/rustc" \
1326        --compression-formats="xz,gz"
1327
1328    try test -e "${OUT_DIR}/rustc.tar.gz"
1329    try test -e "${OUT_DIR}/rustc.tar.xz"
1330}
1331runtest tarball_compression_formats_multiple
1332
1333tarball_compression_formats_error() {
1334    try cp -r "${TEST_DIR}/image1" "${WORK_DIR}/image"
1335    expect_fail sh "$S/make-tarballs.sh" \
1336        --input="${WORK_DIR}/image" \
1337        --work-dir="${WORK_DIR}" \
1338        --output="${OUT_DIR}/rustc" \
1339        --compression-formats="xz,foobar"
1340}
1341runtest tarball_compression_formats_error
1342
1343echo
1344echo "TOTAL SUCCESS!"
1345echo
1346