notmuch/test/T400-hooks.sh
Tomi Ollila 02a2eeb427 test: make script exit (1) if it "fails" to source (.) a file
The files (test) scripts source (with builtin command `.`) provides
information which the scripts depend, and without the `source` to
succeed allowing script to continue may lead to dangerous situations
(e.g. rm -rf "${undefined_variable}"/*).

At the end of all source (.) lines construct ' || exit 1' was added;
In our case the script script will exit if it cannot find (or read) the
file to be sourced. Additionally script would also exits if the last
command of the sourced file exited nonzero.
2015-08-07 21:56:39 +02:00

119 lines
3.1 KiB
Bash
Executable file

#!/usr/bin/env bash
test_description='hooks'
. ./test-lib.sh || exit 1
HOOK_DIR=${MAIL_DIR}/.notmuch/hooks
create_echo_hook () {
local TOKEN="${RANDOM}"
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/${1}"
#!/bin/sh
echo "${TOKEN}" > ${3}
EOF
chmod +x "${HOOK_DIR}/${1}"
echo "${TOKEN}" > ${2}
}
create_failing_hook () {
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/${1}"
#!/bin/sh
exit 13
EOF
chmod +x "${HOOK_DIR}/${1}"
}
rm_hooks () {
rm -rf ${HOOK_DIR}
}
# add a message to generate mail dir and database
add_message
# create maildir structure for notmuch-insert
mkdir -p "$MAIL_DIR"/{cur,new,tmp}
test_begin_subtest "pre-new is run"
rm_hooks
generate_message
create_echo_hook "pre-new" expected output
notmuch new > /dev/null
test_expect_equal_file expected output
test_begin_subtest "post-new is run"
rm_hooks
generate_message
create_echo_hook "post-new" expected output
notmuch new > /dev/null
test_expect_equal_file expected output
test_begin_subtest "post-insert hook is run"
rm_hooks
generate_message
create_echo_hook "post-insert" expected output
notmuch insert < "$gen_msg_filename"
test_expect_equal_file expected output
test_begin_subtest "pre-new is run before post-new"
rm_hooks
generate_message
create_echo_hook "pre-new" pre-new.expected pre-new.output
create_echo_hook "post-new" post-new.expected post-new.output
notmuch new > /dev/null
test_expect_equal_file post-new.expected post-new.output
test_begin_subtest "pre-new non-zero exit status (hook status)"
rm_hooks
generate_message
create_failing_hook "pre-new"
output=`notmuch new 2>&1`
test_expect_equal "$output" "Error: pre-new hook failed with status 13"
# depends on the previous subtest leaving broken hook behind
test_expect_code 1 "pre-new non-zero exit status (notmuch status)" "notmuch new"
# depends on the previous subtests leaving 1 new message behind
test_begin_subtest "pre-new non-zero exit status aborts new"
rm_hooks
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "Added 1 new message to the database."
test_begin_subtest "post-new non-zero exit status (hook status)"
rm_hooks
generate_message
create_failing_hook "post-new"
NOTMUCH_NEW 2>output.stderr >output
cat output.stderr >> output
echo "Added 1 new message to the database." > expected
echo "Error: post-new hook failed with status 13" >> expected
test_expect_equal_file expected output
# depends on the previous subtest leaving broken hook behind
test_expect_code 1 "post-new non-zero exit status (notmuch status)" "notmuch new"
rm_hooks
generate_message
create_failing_hook "post-insert"
test_expect_success "post-insert hook does not affect insert status" \
"notmuch insert < \"$gen_msg_filename\" > /dev/null"
# test_begin_subtest "hook without executable permissions"
rm_hooks
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/pre-new"
#!/bin/sh
echo foo
EOF
output=`notmuch new 2>&1`
test_expect_code 1 "hook without executable permissions" "notmuch new"
# test_begin_subtest "hook execution failure"
rm_hooks
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/pre-new"
no hashbang, execl fails
EOF
chmod +x "${HOOK_DIR}/pre-new"
test_expect_code 1 "hook execution failure" "notmuch new"
test_done