1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
| | #!/usr/bin/env bash
test_description='hooks'
. $(dirname "$0")/test-lib.sh || exit 1
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 () {
local HOOK_DIR=${2}
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/${1}"
#!/bin/sh
exit 13
EOF
chmod +x "${HOOK_DIR}/${1}"
}
# add a message to generate mail dir and database
add_message
# create maildir structure for notmuch-insert
mkdir -p "$MAIL_DIR"/{cur,new,tmp}
for config in traditional profile explicit XDG split; do
unset NOTMUCH_PROFILE
notmuch config set database.hook_dir
notmuch config set database.path ${MAIL_DIR}
case $config in
traditional)
HOOK_DIR=${MAIL_DIR}/.notmuch/hooks
;;
profile)
dir=${HOME}/.config/notmuch/other
mkdir -p ${dir}
HOOK_DIR=${dir}/hooks
cp ${NOTMUCH_CONFIG} ${dir}/config
export NOTMUCH_PROFILE=other
;;
explicit)
HOOK_DIR=${HOME}/.notmuch-hooks
mkdir -p $HOOK_DIR
notmuch config set database.hook_dir $HOOK_DIR
;;
XDG)
HOOK_DIR=${HOME}/.config/notmuch/default/hooks
;;
split)
dir="$TMP_DIRECTORY/database.$test_count"
notmuch config set database.path $dir
notmuch config set database.mail_root $MAIL_DIR
HOOK_DIR=${dir}/hooks
;;
esac
test_begin_subtest "pre-new is run [${config}]"
rm -rf ${HOOK_DIR}
generate_message
create_echo_hook "pre-new" expected output $HOOK_DIR
notmuch new > /dev/null
test_expect_equal_file expected output
test_begin_subtest "post-new is run [${config}]"
rm -rf ${HOOK_DIR}
generate_message
create_echo_hook "post-new" expected output $HOOK_DIR
notmuch new > /dev/null
test_expect_equal_file expected output
test_begin_subtest "post-insert hook is run [${config}]"
rm -rf ${HOOK_DIR}
generate_message
create_echo_hook "post-insert" expected output $HOOK_DIR
notmuch insert < "$gen_msg_filename"
test_expect_equal_file expected output
test_begin_subtest "pre-new is run before post-new [${config}]"
rm -rf ${HOOK_DIR}
generate_message
create_echo_hook "pre-new" pre-new.expected pre-new.output $HOOK_DIR
create_echo_hook "post-new" post-new.expected post-new.output $HOOK_DIR
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) [${config}]"
rm -rf ${HOOK_DIR}
generate_message
create_failing_hook "pre-new" $HOOK_DIR
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_begin_subtest "pre-new non-zero exit status (notmuch status) [${config}]"
test_expect_code 1 "notmuch new"
# depends on the previous subtests leaving 1 new message behind
test_begin_subtest "pre-new non-zero exit status aborts new [${config}]"
rm -rf ${HOOK_DIR}
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) [${config}]"
rm -rf ${HOOK_DIR}
generate_message
create_failing_hook "post-new" $HOOK_DIR
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_begin_subtest "post-new non-zero exit status (notmuch status) [${config}]"
test_expect_code 1 "notmuch new"
test_begin_subtest "post-insert hook does not affect insert status [${config}]"
rm -rf ${HOOK_DIR}
generate_message
create_failing_hook "post-insert" $HOOK_DIR
test_expect_success "notmuch insert < \"$gen_msg_filename\" > /dev/null"
test_begin_subtest "hook without executable permissions [${config}]"
rm -rf ${HOOK_DIR}
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/pre-new"
#!/bin/sh
echo foo
EOF
output=`notmuch new 2>&1`
test_expect_code 1 "notmuch new"
test_begin_subtest "hook execution failure [${config}]"
rm -rf ${HOOK_DIR}
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 "notmuch new"
rm -rf ${HOOK_DIR}
done
test_done
|