test: split emacs functionality to its own file

This way it's easier to identify the tests that do require emacs stuff.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
This commit is contained in:
Felipe Contreras 2021-05-15 15:47:44 -05:00 committed by David Bremner
parent bba4788aec
commit 92454bc093
21 changed files with 241 additions and 195 deletions

View file

@ -1,6 +1,7 @@
#!/usr/bin/env bash
test_description="--format=json output"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_begin_subtest "Show message: json"
add_message "[subject]=\"json-show-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[bcc]=\"test_suite+bcc@notmuchmail.org\"" "[reply-to]=\"test_suite+replyto@notmuchmail.org\"" "[body]=\"json-show-message\""

View file

@ -1,6 +1,7 @@
#!/usr/bin/env bash
test_description="--format=sexp output"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_begin_subtest "Show message: sexp"
add_message "[subject]=\"sexp-show-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[bcc]=\"test_suite+bcc@notmuchmail.org\"" "[reply-to]=\"test_suite+replyto@notmuchmail.org\"" "[body]=\"sexp-show-message\""

View file

@ -2,6 +2,7 @@
test_description="emacs interface"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
EXPECTED=$NOTMUCH_SRCDIR/test/emacs.expected-output

View file

@ -1,11 +1,14 @@
#!/usr/bin/env bash
test_description="Emacs with large search results buffer"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
x=xxxxxxxxxx # 10
x=$x$x$x$x$x$x$x$x$x$x # 100
x=$x$x$x$x$x$x$x$x$x # 900
test_require_emacs
# We generate a long subject here (over 900 bytes) so that the emacs
# search results get large quickly. With 30 such messages we should
# cross several 4kB page boundaries and see the bug.

View file

@ -2,6 +2,9 @@
test_description="emacs: mail subject to filename"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_require_emacs
# emacs server can't be started in a child process with $(test_emacs ...)
test_emacs '(ignore)' > /dev/null

View file

@ -6,6 +6,7 @@
test_description='PGP/MIME signature verification and decryption'
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
##################################################

View file

@ -2,6 +2,7 @@
test_description='S/MIME signature verification and decryption'
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_require_emacs
test_require_external_prereq openssl

View file

@ -4,6 +4,7 @@
test_description='indexing decrypted mail'
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
##################################################

View file

@ -2,8 +2,10 @@
test_description="protected headers in emacs interface"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
# testing protected headers with emacs
test_require_emacs
add_gnupg_home
add_email_corpus protected-headers

View file

@ -2,6 +2,7 @@
test_description="emacs test function sanity"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_begin_subtest "emacs test function sanity"
test_emacs_expect_t 't'

View file

@ -2,6 +2,9 @@
test_description="emacs address cleaning"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_require_emacs
test_begin_subtest "notmuch-test-address-clean part 1"
test_emacs_expect_t '(notmuch-test-address-cleaning-1)'

View file

@ -2,9 +2,11 @@
test_description="emacs notmuch-hello view"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
EXPECTED=$NOTMUCH_SRCDIR/test/emacs.expected-output
test_require_emacs
add_email_corpus
test_begin_subtest "User-defined section with inbox tag"

View file

@ -2,6 +2,7 @@
test_description="emacs notmuch-show view"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
EXPECTED=$NOTMUCH_SRCDIR/test/emacs-show.expected-output

View file

@ -2,11 +2,14 @@
test_description="emacs notmuch-show charset handling"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
UTF8_YEN=$'\xef\xbf\xa5'
BIG5_YEN=$'\xa2\x44'
test_require_emacs
# Add four messages with unusual encoding requirements:
#
# 1) text/plain in quoted-printable big5

View file

@ -2,6 +2,7 @@
test_description="emacs tree view interface"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
EXPECTED=$NOTMUCH_SRCDIR/test/emacs-tree.expected-output

View file

@ -10,6 +10,7 @@ test_description='test of proper handling of in-reply-to and references headers'
# non-RFC-compliant headers'
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_begin_subtest "Use References when In-Reply-To is broken"
add_message '[id]="foo@one.com"' \

View file

@ -1,7 +1,9 @@
#!/usr/bin/env bash
test_description="Emacs Draft Handling"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_require_emacs
add_email_corpus
notmuch config set search.exclude_tags deleted

View file

@ -2,6 +2,9 @@
test_description="emacs attachment warnings"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_require_emacs
test_begin_subtest "notmuch-test-attachment-warning part 1"
test_emacs_expect_t '(notmuch-test-attachment-warning-1)'

View file

@ -2,6 +2,7 @@
test_description="emacs forwarding"
. $(dirname "$0")/test-lib.sh || exit 1
. $(dirname "$0")/test-lib-emacs.sh || exit 1
test_require_emacs

209
test/test-lib-emacs.sh Normal file
View file

@ -0,0 +1,209 @@
#
# Copyright (c) 2010-2020 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
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see https://www.gnu.org/licenses/ .
test_require_emacs () {
local ret=0
test_require_external_prereq "$TEST_EMACS" || ret=1
test_require_external_prereq "$TEST_EMACSCLIENT" || ret=1
test_require_external_prereq dtach || ret=1
return $ret
}
# Deliver a message with emacs and add it to the database
#
# Uses emacs to generate and deliver a message to the mail store.
# Accepts arbitrary extra emacs/elisp functions to modify the message
# before sending, which is useful to doing things like attaching files
# to the message and encrypting/signing.
emacs_deliver_message () {
local subject body smtp_dummy_pid smtp_dummy_port
subject="$1"
body="$2"
shift 2
# before we can send a message, we have to prepare the FCC maildir
mkdir -p "$MAIL_DIR"/sent/{cur,new,tmp}
# eval'ing smtp-dummy --background will set smtp_dummy_pid and -_port
smtp_dummy_pid= smtp_dummy_port=
eval `$TEST_DIRECTORY/smtp-dummy --background sent_message`
test -n "$smtp_dummy_pid" || return 1
test -n "$smtp_dummy_port" || return 1
test_emacs \
"(let ((message-send-mail-function 'message-smtpmail-send-it)
(mail-host-address \"example.com\")
(smtpmail-smtp-server \"localhost\")
(smtpmail-smtp-service \"${smtp_dummy_port}\"))
(notmuch-mua-mail)
(message-goto-to)
(insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\")
(message-goto-subject)
(insert \"${subject}\")
(message-goto-body)
(insert \"${body}\")
$*
(notmuch-mua-send-and-exit))"
# In case message was sent properly, client waits for confirmation
# before exiting and resuming control here; therefore making sure
# that server exits by sending (KILL) signal to it is safe.
kill -9 $smtp_dummy_pid
notmuch new >/dev/null
}
# Pretend to deliver a message with emacs. Really save it to a file
# and add it to the database
#
# Uses emacs to generate and deliver a message to the mail store.
# Accepts arbitrary extra emacs/elisp functions to modify the message
# before sending, which is useful to doing things like attaching files
# to the message and encrypting/signing.
#
# If any GNU-style long-arguments (like --quiet or --decrypt=true) are
# at the head of the argument list, they are sent directly to "notmuch
# new" after message delivery
emacs_fcc_message () {
local nmn_args subject body
nmn_args=''
while [[ "$1" =~ ^-- ]]; do
nmn_args="$nmn_args $1"
shift
done
subject="$1"
body="$2"
shift 2
# before we can send a message, we have to prepare the FCC maildir
mkdir -p "$MAIL_DIR"/sent/{cur,new,tmp}
test_emacs \
"(let ((message-send-mail-function (lambda () t))
(mail-host-address \"example.com\"))
(notmuch-mua-mail)
(message-goto-to)
(insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\")
(message-goto-subject)
(insert \"${subject}\")
(message-goto-body)
(insert \"${body}\")
$*
(let ((mml-secure-smime-sign-with-sender t)
(mml-secure-openpgp-sign-with-sender t))
(notmuch-mua-send-and-exit)))" || return 1
notmuch new $nmn_args >/dev/null
}
test_emacs_expect_t () {
local result
test "$#" = 1 ||
error "bug in the test script: not 1 parameter to test_emacs_expect_t"
if [ -z "$inside_subtest" ]; then
error "bug in the test script: test_emacs_expect_t without test_begin_subtest"
fi
# Run the test.
if ! test_skip "$test_subtest_name"
then
test_emacs "(notmuch-test-run $1)" >/dev/null
# Restore state after the test.
exec 1>&6 2>&7 # Restore stdout and stderr
inside_subtest=
# test_emacs may update missing external prerequisites
test_check_missing_external_prereqs_ "$test_subtest_name" && return
# Report success/failure.
result=$(cat OUTPUT)
if [ "$result" = t ]
then
test_ok_
else
test_failure_ "${result}"
fi
else
# Restore state after the (non) test.
exec 1>&6 2>&7 # Restore stdout and stderr
inside_subtest=
fi
}
emacs_generate_script () {
# Construct a little test script here for the benefit of the user,
# (who can easily run "run_emacs" to get the same emacs environment
# for investigating any failures).
cat <<EOF >"$TMP_DIRECTORY/run_emacs"
#!/bin/sh
export PATH=$PATH
export NOTMUCH_CONFIG=$NOTMUCH_CONFIG
# Here's what we are using here:
#
# --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} --quick \
--directory "$NOTMUCH_BUILDDIR/emacs" --load notmuch.el \
--directory "$NOTMUCH_SRCDIR/test" --load test-lib.el \
"\$@"
EOF
chmod a+x "$TMP_DIRECTORY/run_emacs"
}
test_emacs () {
# test dependencies beforehand to avoid the waiting loop below
test_require_emacs || return
if [ -z "$EMACS_SERVER" ]; then
emacs_tests="$NOTMUCH_SRCDIR/test/${this_test_bare}.el"
if [ -f "$emacs_tests" ]; then
load_emacs_tests="--eval '(load \"$emacs_tests\")'"
else
load_emacs_tests=
fi
server_name="notmuch-test-suite-$$"
# start a detached session with an emacs server
# user's TERM (or 'vt100' in case user's TERM is known dumb
# or unknown) is given to dtach which assumes a minimally
# VT100-compatible terminal -- and emacs inherits that
TERM=$SMART_TERM dtach -n "$TEST_TMPDIR/emacs-dtach-socket.$$" \
sh -c "stty rows 24 cols 80; exec '$TMP_DIRECTORY/run_emacs' \
--no-window-system \
$load_emacs_tests \
--eval '(setq server-name \"$server_name\")' \
--eval '(server-start)' \
--eval '(orphan-watchdog $$)'" || return
EMACS_SERVER="$server_name"
# wait until the emacs server is up
until test_emacs '()' >/dev/null 2>/dev/null; do
sleep 1
done
fi
# Clear test-output output file. Most Emacs tests end with a
# call to (test-output). If the test code fails with an
# exception before this call, the output file won't get
# updated. Since we don't want to compare against an output
# file from another test, so start out with an empty file.
rm -f OUTPUT
touch OUTPUT
${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(notmuch-test-progn $*)"
}
emacs_generate_script

View file

@ -114,14 +114,6 @@ unset ALTERNATE_EDITOR
unset EMAIL
unset NAME
test_require_emacs () {
local ret=0
test_require_external_prereq "$TEST_EMACS" || ret=1
test_require_external_prereq "$TEST_EMACSCLIENT" || ret=1
test_require_external_prereq dtach || ret=1
return $ret
}
add_gnupg_home () {
[ -e "${GNUPGHOME}/gpg.conf" ] && return
_gnupg_exit () { gpgconf --kill all 2>/dev/null || true; }
@ -348,88 +340,6 @@ export GNUPGHOME="${TEST_TMPDIR}/gnupg"
trap 'trap_exit' EXIT
trap 'trap_signal' HUP INT TERM
# Deliver a message with emacs and add it to the database
#
# Uses emacs to generate and deliver a message to the mail store.
# Accepts arbitrary extra emacs/elisp functions to modify the message
# before sending, which is useful to doing things like attaching files
# to the message and encrypting/signing.
emacs_deliver_message () {
local subject body smtp_dummy_pid smtp_dummy_port
subject="$1"
body="$2"
shift 2
# before we can send a message, we have to prepare the FCC maildir
mkdir -p "$MAIL_DIR"/sent/{cur,new,tmp}
# eval'ing smtp-dummy --background will set smtp_dummy_pid and -_port
smtp_dummy_pid= smtp_dummy_port=
eval `$TEST_DIRECTORY/smtp-dummy --background sent_message`
test -n "$smtp_dummy_pid" || return 1
test -n "$smtp_dummy_port" || return 1
test_emacs \
"(let ((message-send-mail-function 'message-smtpmail-send-it)
(mail-host-address \"example.com\")
(smtpmail-smtp-server \"localhost\")
(smtpmail-smtp-service \"${smtp_dummy_port}\"))
(notmuch-mua-mail)
(message-goto-to)
(insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\")
(message-goto-subject)
(insert \"${subject}\")
(message-goto-body)
(insert \"${body}\")
$*
(notmuch-mua-send-and-exit))"
# In case message was sent properly, client waits for confirmation
# before exiting and resuming control here; therefore making sure
# that server exits by sending (KILL) signal to it is safe.
kill -9 $smtp_dummy_pid
notmuch new >/dev/null
}
# Pretend to deliver a message with emacs. Really save it to a file
# and add it to the database
#
# Uses emacs to generate and deliver a message to the mail store.
# Accepts arbitrary extra emacs/elisp functions to modify the message
# before sending, which is useful to doing things like attaching files
# to the message and encrypting/signing.
#
# If any GNU-style long-arguments (like --quiet or --decrypt=true) are
# at the head of the argument list, they are sent directly to "notmuch
# new" after message delivery
emacs_fcc_message () {
local nmn_args subject body
nmn_args=''
while [[ "$1" =~ ^-- ]]; do
nmn_args="$nmn_args $1"
shift
done
subject="$1"
body="$2"
shift 2
# before we can send a message, we have to prepare the FCC maildir
mkdir -p "$MAIL_DIR"/sent/{cur,new,tmp}
test_emacs \
"(let ((message-send-mail-function (lambda () t))
(mail-host-address \"example.com\"))
(notmuch-mua-mail)
(message-goto-to)
(insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\")
(message-goto-subject)
(insert \"${subject}\")
(message-goto-body)
(insert \"${body}\")
$*
(let ((mml-secure-smime-sign-with-sender t)
(mml-secure-openpgp-sign-with-sender t))
(notmuch-mua-send-and-exit)))" || return 1
notmuch new $nmn_args >/dev/null
}
# Add an existing, fixed corpus of email to the database.
#
# $1 is the corpus dir under corpora to add, using "default" if unset.
@ -574,41 +484,6 @@ test_json_nodes () {
fi
}
test_emacs_expect_t () {
local result
test "$#" = 1 ||
error "bug in the test script: not 1 parameter to test_emacs_expect_t"
if [ -z "$inside_subtest" ]; then
error "bug in the test script: test_emacs_expect_t without test_begin_subtest"
fi
# Run the test.
if ! test_skip "$test_subtest_name"
then
test_emacs "(notmuch-test-run $1)" >/dev/null
# Restore state after the test.
exec 1>&6 2>&7 # Restore stdout and stderr
inside_subtest=
# test_emacs may update missing external prerequisites
test_check_missing_external_prereqs_ "$test_subtest_name" && return
# Report success/failure.
result=$(cat OUTPUT)
if [ "$result" = t ]
then
test_ok_
else
test_failure_ "${result}"
fi
else
# Restore state after the (non) test.
exec 1>&6 2>&7 # Restore stdout and stderr
inside_subtest=
fi
}
NOTMUCH_NEW () {
notmuch new "${@}" | grep -v -E -e '^Processed [0-9]*( total)? file|Found [0-9]* total file'
}
@ -1022,73 +897,6 @@ test_done () {
fi
}
emacs_generate_script () {
# Construct a little test script here for the benefit of the user,
# (who can easily run "run_emacs" to get the same emacs environment
# for investigating any failures).
cat <<EOF >"$TMP_DIRECTORY/run_emacs"
#!/bin/sh
export PATH=$PATH
export NOTMUCH_CONFIG=$NOTMUCH_CONFIG
# Here's what we are using here:
#
# --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} --quick \
--directory "$NOTMUCH_BUILDDIR/emacs" --load notmuch.el \
--directory "$NOTMUCH_SRCDIR/test" --load test-lib.el \
"\$@"
EOF
chmod a+x "$TMP_DIRECTORY/run_emacs"
}
test_emacs () {
# test dependencies beforehand to avoid the waiting loop below
test_require_emacs || return
if [ -z "$EMACS_SERVER" ]; then
emacs_tests="$NOTMUCH_SRCDIR/test/${this_test_bare}.el"
if [ -f "$emacs_tests" ]; then
load_emacs_tests="--eval '(load \"$emacs_tests\")'"
else
load_emacs_tests=
fi
server_name="notmuch-test-suite-$$"
# start a detached session with an emacs server
# user's TERM (or 'vt100' in case user's TERM is known dumb
# or unknown) is given to dtach which assumes a minimally
# VT100-compatible terminal -- and emacs inherits that
TERM=$SMART_TERM dtach -n "$TEST_TMPDIR/emacs-dtach-socket.$$" \
sh -c "stty rows 24 cols 80; exec '$TMP_DIRECTORY/run_emacs' \
--no-window-system \
$load_emacs_tests \
--eval '(setq server-name \"$server_name\")' \
--eval '(server-start)' \
--eval '(orphan-watchdog $$)'" || return
EMACS_SERVER="$server_name"
# wait until the emacs server is up
until test_emacs '()' >/dev/null 2>/dev/null; do
sleep 1
done
fi
# Clear test-output output file. Most Emacs tests end with a
# call to (test-output). If the test code fails with an
# exception before this call, the output file won't get
# updated. Since we don't want to compare against an output
# file from another test, so start out with an empty file.
rm -f OUTPUT
touch OUTPUT
${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(notmuch-test-progn $*)"
}
test_python () {
# Note: if there is need to print debug information from python program,
# use stdout = os.fdopen(6, 'w') or stderr = os.fdopen(7, 'w')
@ -1178,9 +986,6 @@ TEST_DIRECTORY=$NOTMUCH_BUILDDIR/test
. "$NOTMUCH_SRCDIR/test/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 "$TMP_DIRECTORY" || error "Cannot set up test environment"