#
# Copyright (c) 2005 Junio C Hamano
+# Copyright (c) 2010 Notmuch Developers
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
;;
esac
+# Save STDOUT to fd 6 and STDERR to fd 7.
+exec 6>&1 7>&2
+# Make xtrace debugging (when used) use redirected STDERR, with verbose lead:
+BASH_XTRACEFD=7
+export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
+
# Keep the original TERM for say_color and test_emacs
ORIGINAL_TERM=$TERM
fi
TEST_EMACS=${TEST_EMACS:-${EMACS:-emacs}}
TEST_EMACSCLIENT=${TEST_EMACSCLIENT:-emacsclient}
+TEST_CC=${TEST_CC:-cc}
+TEST_CFLAGS=${TEST_CFLAGS:-"-g -O0"}
# Protect ourselves from common misconfiguration to export
# CDPATH into the environment
unset GREP_OPTIONS
+# For emacsclient
+unset ALTERNATE_EDITOR
+
# Convenience
#
# A regexp to match 5 and 40 hexdigits
# test_description='Description of this test...
# This test checks if command xyzzy does the right thing...
# '
-# . ./test-lib.sh
+# . ./test-lib.sh || exit 1
+
[ "x$ORIGINAL_TERM" != "xdumb" ] && (
TERM=$ORIGINAL_TERM &&
export TERM &&
{
test -z "$test_description_printed" || return 0
echo
- echo $this_test_bare: "Testing ${test_description}"
+ echo $this_test: "Testing ${test_description}"
test_description_printed=1
}
if [ -z "$NOTMUCH_TEST_QUIET" ]
print_test_description
fi
-exec 5>&1
-
test_failure=0
test_count=0
test_fixed=0
then
exit $code
else
- exec >&5
+ exec >&6
say_color error '%-6s' FATAL
echo " $test_subtest_name"
echo
die_signal () {
_die_common
- echo >&5 "FATAL: $0: interrupted by signal" $((code - 128))
+ echo >&6 "FATAL: $0: interrupted by signal" $((code - 128))
exit $code
}
else
template[subject]="Test message #${gen_msg_cnt}"
fi
+ elif [ "${template[subject]}" = "@FORCE_EMPTY" ]; then
+ template[subject]=""
fi
if [ -z "${template[date]}" ]; then
# we use decreasing timestamps here for historical reasons;
# the existing test suite when we converted to unique timestamps just
# happened to have signicantly fewer failures with that choice.
- template[date]=$(TZ=UTC printf "%(%a, %d %b %Y %T %z)T\n" \
- $((978709437 - gen_msg_cnt)))
+ local date_secs=$((978709437 - gen_msg_cnt))
+ # printf %(..)T is bash 4.2+ feature. use perl fallback if needed...
+ TZ=UTC printf -v template[date] "%(%a, %d %b %Y %T %z)T" $date_secs 2>/dev/null ||
+ template[date]=`perl -le 'use POSIX "strftime";
+ @time = gmtime '"$date_secs"';
+ print strftime "%a, %d %b %Y %T +0000", @time'`
fi
additional_headers=""
(message-goto-body)
(insert \"${body}\")
$@
- (message-send-and-exit))"
+ (notmuch-mua-send-and-exit))"
# In case message was sent properly, client waits for confirmation
# before exiting and resuming control here; therefore making sure
(message-goto-body)
(insert \"${body}\")
$@
- (message-send-and-exit))" || return 1
+ (notmuch-mua-send-and-exit))" || return 1
notmuch new >/dev/null
}
fi
test_subtest_name="$1"
test_reset_state_
- # Remember stdout and stderr file descriptors and redirect test
- # output to the previously prepared file descriptors 3 and 4 (see
- # below)
+ # Redirect test output to the previously prepared file descriptors
+ # 3 and 4 (see below)
if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
- exec 6>&1 7>&2 >&3 2>&4
+ exec >&3 2>&4
inside_subtest=t
}
# The test suite forces LC_ALL=C, but this causes Python 3 to
# decode stdin as ASCII. We need to read JSON in UTF-8, so
# override Python's stdio encoding defaults.
- output=$(echo "$1" | PYTHONIOENCODING=utf-8 python -mjson.tool \
+ output=$(echo "$1" | PYTHONIOENCODING=utf-8 $NOTMUCH_PYTHON -mjson.tool \
|| echo "$1")
- expected=$(echo "$2" | PYTHONIOENCODING=utf-8 python -mjson.tool \
+ expected=$(echo "$2" | PYTHONIOENCODING=utf-8 $NOTMUCH_PYTHON -mjson.tool \
|| echo "$2")
shift 2
test_expect_equal "$output" "$expected" "$@"
}
+# Sort the top-level list of JSON data from stdin.
+test_sort_json () {
+ PYTHONIOENCODING=utf-8 python -c \
+ "import sys, json; json.dump(sorted(json.load(sys.stdin)),sys.stdout)"
+}
+
test_emacs_expect_t () {
test "$#" = 2 && { prereq=$1; shift; } || prereq=
test "$#" = 1 ||
perl -pe 's/("?thread"?: ?)("?)................("?)/\1\2XXX\3/'
}
+notmuch_search_files_sanitize ()
+{
+ notmuch_dir_sanitize
+}
+
+notmuch_dir_sanitize ()
+{
+ sed -e "s,$MAIL_DIR,MAIL_DIR," -e "s,${PWD},CWD,g" "$@"
+}
+
NOTMUCH_SHOW_FILENAME_SQUELCH='s,filename:.*/mail,filename:/XXX/mail,'
notmuch_show_sanitize ()
{
sed \
-e 's|"id": "[^"]*",|"id": "XXXXX",|g' \
-e 's|"Date": "Fri, 05 Jan 2001 [^"]*0000"|"Date": "GENERATED_DATE"|g' \
+ -e 's|"filename": "signature.asc",||g' \
-e 's|"filename": "/[^"]*",|"filename": "YYYYY",|g' \
-e 's|"timestamp": 97.......|"timestamp": 42|g'
}
sed \
-e 's/^Date: Fri, 05 Jan 2001 .*0000/Date: GENERATED_DATE/'
}
+
+notmuch_uuid_sanitize ()
+{
+ sed 's/[0-9a-f]\{8\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{12\}/UUID/g'
+}
+
+notmuch_built_with_sanitize ()
+{
+ sed 's/^built_with[.]\(.*\)=.*$/built_with.\1=something/'
+}
+
# End of notmuch helper functions
# Use test_set_prereq to tell that a particular prerequisite is available.
case $this_test.$test_count in
$skp)
to_skip=t
+ break
+ esac
+ case $this_test_bare.$test_count in
+ $skp)
+ to_skip=t
+ break
esac
done
if test -z "$to_skip" && test -n "$prereq" &&
test_external () {
test "$#" = 4 && { prereq=$1; shift; } || prereq=
test "$#" = 3 ||
- error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
+ error >&6 "bug in the test script: not 3 or 4 parameters to test_external"
test_subtest_name="$1"
shift
test_reset_state_
# Here's what we are using here:
#
-# --no-init-file Don't load users ~/.emacs
-#
-# --no-site-file Don't load the site-wide startup stuff
+# --quick Use minimal customization. This implies --no-init-file,
+# --no-site-file and (emacs 24) --no-site-lisp
#
# --directory Ensure that the local elisp sources are found
#
# --load Force loading of notmuch.el and test-lib.el
-exec ${TEST_EMACS} --no-init-file --no-site-file \
+exec ${TEST_EMACS} --quick \
--directory "$TEST_DIRECTORY/../emacs" --load notmuch.el \
--directory "$TEST_DIRECTORY" --load test-lib.el \
"\$@"
rm -f OUTPUT
touch OUTPUT
- ${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(progn $@)"
+ ${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(notmuch-test-progn $@)"
}
test_python() {
export LD_LIBRARY_PATH=$TEST_DIRECTORY/../lib
export PYTHONPATH=$TEST_DIRECTORY/../bindings/python
- # Some distros (e.g. Arch Linux) ship Python 2.* as /usr/bin/python2,
- # most others as /usr/bin/python. So first try python2, and fallback to
- # python if python2 doesn't exist.
- cmd=python2
- [[ ${test_missing_external_prereq_[python2]} == t ]] && cmd=python
-
(echo "import sys; _orig_stdout=sys.stdout; sys.stdout=open('OUTPUT', 'w')"; cat) \
- | $cmd -
+ | $NOTMUCH_PYTHON -
+}
+
+test_ruby() {
+ export LD_LIBRARY_PATH=$TEST_DIRECTORY/../lib
+ MAIL_DIR=$MAIL_DIR ruby -I $TEST_DIRECTORY/../bindings/ruby> OUTPUT
+}
+
+test_C () {
+ exec_file="test${test_count}"
+ test_file="${exec_file}.c"
+ cat > ${test_file}
+ export LD_LIBRARY_PATH=${TEST_DIRECTORY}/../lib
+ ${TEST_CC} ${TEST_CFLAGS} -I${TEST_DIRECTORY}/../lib -o ${exec_file} ${test_file} -L${TEST_DIRECTORY}/../lib/ -lnotmuch -ltalloc
+ echo "== stdout ==" > OUTPUT.stdout
+ echo "== stderr ==" > OUTPUT.stderr
+ ./${exec_file} "$@" 1>>OUTPUT.stdout 2>>OUTPUT.stderr
+ notmuch_dir_sanitize OUTPUT.stdout OUTPUT.stderr > OUTPUT
}
+
# Creates a script that counts how much time it is executed and calls
# notmuch. $notmuch_counter_command is set to the path to the
# generated script. Use notmuch_counter_value() function to get the
}
-. ./test-lib-common.sh
+. ./test-lib-common.sh || exit 1
emacs_generate_script
# Use -P to resolve symlinks in our working directory so that the cwd
# in subprocesses like git equals our $PWD (for pathname comparisons).
-cd -P "$test" || error "Cannot setup test environment"
+cd -P "$test" || error "Cannot set up test environment"
if test "$verbose" = "t"
then
case "$this_test" in
$skp)
to_skip=t
+ break
+ esac
+ case "$this_test_bare" in
+ $skp)
+ to_skip=t
+ break
esac
done
case "$to_skip" in
ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
rm -f y
+# convert variable from configure to more convenient form
+case "$NOTMUCH_DEFAULT_XAPIAN_BACKEND" in
+ glass)
+ db_ending=glass
+ ;;
+ chert)
+ db_ending=DB
+ ;;
+ *)
+ error "Unknown Xapian backend $NOTMUCH_DEFAULT_XAPIAN_BACKEND"
+esac
# declare prerequisites for external binaries used in tests
test_declare_external_prereq dtach
test_declare_external_prereq emacs
test_declare_external_prereq ${TEST_EMACSCLIENT}
test_declare_external_prereq gdb
test_declare_external_prereq gpg
-test_declare_external_prereq python
-test_declare_external_prereq python2
+test_declare_external_prereq openssl
+test_declare_external_prereq gpgsm
+test_declare_external_prereq ${NOTMUCH_PYTHON}