String -> base-string
[sbcl.git] / tests / subr.sh
blobb4fb44effb381b92552c9a9873eee72286a8e370
1 # To be sourced by shell scripts in the test suite.
3 # This software is part of the SBCL system. See the README file for
4 # more information.
6 # While most of SBCL is derived from the CMU CL system, the test
7 # files (like this one) were written from scratch after the fork
8 # from CMU CL.
10 # This software is in the public domain and is provided with
11 # absolutely no warranty. See the COPYING and CREDITS files for
12 # more information.
14 # Before sbcl-1.0.13 or so, we set up some environment variables to
15 # the absolute (POSIX) pathname naming the SBCL runtime, core, and
16 # home; but this runs afoul of the Bourne shell's repeated
17 # tokenization of its inputs, so now we use some shell functions.
18 . ../sbcl-pwd.sh
19 sbcl_pwd
21 # Make the shell bomb out whenever an unset shell variable is used.
22 # Note that scripts may toggle this if necessary.
23 set -u
25 # Initialize variables.
26 set -a # export all variables at assignment-time.
27 # Note: any script that uses the variables that name files should
28 # quote them (with double quotes), to contend with whitespace.
29 SBCL_HOME="${TEST_SBCL_HOME:-$SBCL_PWD/../obj/sbcl-home}"
30 SBCL_CORE="${TEST_SBCL_CORE:-$SBCL_PWD/../output/sbcl.core}"
31 SBCL_RUNTIME="${TEST_SBCL_RUNTIME:-$SBCL_PWD/../src/runtime/sbcl}"
32 SBCL_ARGS="${TEST_SBCL_ARGS:---noinform --no-sysinit --no-userinit --noprint --disable-debugger}"
34 # Scripts that use these variables should quote them.
35 TEST_BASENAME=`basename $0`
36 TEST_FILESTEM=`basename "${TEST_BASENAME}" | sed -e 's/\.sh$//' -e 's/\./-/g'`
37 : ${TEST_BASEDIR:="$SBCL_PWD"}
38 TEST_DIRECTORY="${TEST_BASEDIR}/${TEST_FILESTEM}-$$"
39 export TEST_DIRECTORY
41 # "Ten four" is the closest numerical slang I can find to "OK", so
42 # it's the Unix status value that we expect from a successful test.
43 # (Of course, zero is the usual success value, but we don't want to
44 # use that because SBCL returns that by default, so we might think
45 # we passed a test when in fact some error caused us to exit SBCL
46 # in a weird unexpected way. In contrast, 104 is unlikely to be
47 # returned unless we exit through the intended explicit "test
48 # successful" path.
49 EXIT_TEST_WIN=104
50 # Shell scripts in this test suite also return 104, so we need a
51 # convention for distinguishing successful execution of SBCL in one of
52 # our scripts.
53 EXIT_LISP_WIN=52
54 # Any test that exits with status 1 is an explicit failure.
55 EXIT_LOSE=1
57 LANG=C
58 LC_ALL=C
59 set +a
61 run_sbcl () (
62 set -u
63 if [ $# -gt 0 ]; then
64 "$SBCL_RUNTIME" --core "$SBCL_CORE" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})" "$@"
65 else
66 "$SBCL_RUNTIME" --core "$SBCL_CORE" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})"
70 run_sbcl_with_args () (
71 set -u
72 echo "$SBCL_RUNTIME" --core "$SBCL_CORE" "$@"
73 "$SBCL_RUNTIME" --core "$SBCL_CORE" "$@"
76 run_sbcl_with_core () (
77 set -u
78 core="$1"
79 shift
80 if [ $# -gt 0 ]; then
81 "$SBCL_RUNTIME" --core "$core" "$@"
82 else
83 "$SBCL_RUNTIME" --core "$core" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})"
87 # Most tests that run an SBCL have to check whether the child's exit
88 # status. Our convention is that SBCL exits with status
89 # $EXIT_LISP_WIN to indicate a successful run; but some tests can't do
90 # this (e.g., ones that end in S-L-A-D), or need to indicate some
91 # other ways of succeeding. So this routine takes a test name, the
92 # exit status of the child, and then an arbitrary number extra
93 # arguments that will be treated as status-code/message pairs for
94 # unusual successful ways for the inferior SBCL to exit. If the exit
95 # code of the SBCL isn't found in the status-codes, the calling script
96 # will exit with a failure code.
97 check_status_maybe_lose () {
98 testname=$1
99 status=$2
100 lose=1
101 if [ $status = $EXIT_LISP_WIN ]; then
102 echo "test $testname ok"
103 lose=0
104 else
105 shift; shift;
106 while [ $# -gt 0 ]; do
107 if [ $status = $1 ]; then
108 shift;
109 echo "test $testname ok $1"
110 lose=0
111 break
113 shift; shift
114 done
116 if [ $lose = 1 ]; then
117 echo "test $testname failed: $status"
118 exit $EXIT_LOSE
120 unset lose
121 unset status
122 unset testname
125 # Not every test needs to touch the file system, but enough do to have
126 # them consistently do so in subdirectories. Note that such tests
127 # should not change their exit action, or do so only very carefully.
128 use_test_subdirectory () {
129 if test -d "$TEST_DIRECTORY"
130 then
131 cleanup_test_subdirectory
133 mkdir "$TEST_DIRECTORY"
134 cd "$TEST_DIRECTORY"
135 trap "cleanup_test_subdirectory" EXIT
138 cleanup_test_subdirectory () {
139 cd "$SBCL_PWD"
140 ( set -f; rm -r "$TEST_DIRECTORY" )