After test_emacs() has started emacs, it re-defines
itself as just calling the started emacs.

First call to test_emacs() will execute to the end of it;
next calls will just execute the 2 lines, first clearing OUTPUT,
second and last executing TEST_EMACSCLIENT...

This simplifies away one if constructs and reduces xtrace
output when doing test debugging with set -x.
---

This has been laying around like 6 years, every now thinking whether
to post or not. Now needed to rebase so finally polished to a
sendable format. re-defining functions just may be too much
to understand (or not)...

 test/test-lib-emacs.sh | 79 +++++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 36 deletions(-)

diff --git a/test/test-lib-emacs.sh b/test/test-lib-emacs.sh
index dde32177..b2b490be 100644
--- a/test/test-lib-emacs.sh
+++ b/test/test-lib-emacs.sh
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2010-2020 Notmuch Developers
+# Copyright (c) 2010-2021 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
@@ -166,44 +166,51 @@ EOF
 }
 
 test_emacs () {
-       # test dependencies beforehand to avoid the waiting loop below
+       # Note: This test_emacs() is re-defined after emacs started 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
+       local emacs_tests load_emacs_tests server_name
 
-       # 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_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
+
+       # re-define test_emacs() -- further calls will use this one
+       test_emacs () {
+               # 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.
+               : > OUTPUT
+               ${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" \
+                       --eval "(notmuch-test-progn $*)"
+       }
+
+       # wait until the emacs server is up (now calling "new" test_emacs())
+       until test_emacs '()' >/dev/null 2>/dev/null; do
+               sleep 1
+       done
+
+       # and finally, call new test_emacs() with given args
+       test_emacs "$@"
 }
 
 emacs_generate_script
-- 
2.25.1

_______________________________________________
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org

Reply via email to