]> git.notmuchmail.org Git - notmuch/blobdiff - test/test-lib.sh
test: provide machinery to make and use test_shims
[notmuch] / test / test-lib.sh
index e75f93b3dcab73a701559d006b72f958937ebf57..7f8a3a4dd93ace28c3bb4bcb8d64972e92cbe338 100644 (file)
@@ -55,6 +55,9 @@ done,*)
        ;;
 esac
 
+# STDIN from /dev/null. EOF for readers (and ENOTTY for tty related ioctls).
+exec </dev/null
+
 # 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:
@@ -92,6 +95,8 @@ TEST_EMACSCLIENT=${TEST_EMACSCLIENT:-emacsclient}
 TEST_GDB=${TEST_GDB:-gdb}
 TEST_CC=${TEST_CC:-cc}
 TEST_CFLAGS=${TEST_CFLAGS:-"-g -O0"}
+TEST_SHIM_CFLAGS=${TEST_SHIM_CFLAGS:-"-fpic -shared"}
+TEST_SHIM_LDFLAGS=${TEST_SHIM_LDFLAGS:-"-ldl"}
 
 # Protect ourselves from common misconfiguration to export
 # CDPATH into the environment
@@ -109,7 +114,7 @@ add_gnupg_home ()
     _gnupg_exit () { gpgconf --kill all 2>/dev/null || true; }
     at_exit_function _gnupg_exit
     mkdir -m 0700 "$GNUPGHOME"
-    gpg --no-tty --import <$TEST_DIRECTORY/gnupg-secret-key.asc >"$GNUPGHOME"/import.log 2>&1
+    gpg --no-tty --import <$NOTMUCH_SRCDIR/test/gnupg-secret-key.asc >"$GNUPGHOME"/import.log 2>&1
     test_debug "cat $GNUPGHOME/import.log"
     if (gpg --quick-random --version >/dev/null 2>&1) ; then
        echo quick-random >> "$GNUPGHOME"/gpg.conf
@@ -117,6 +122,11 @@ add_gnupg_home ()
        echo debug-quick-random >> "$GNUPGHOME"/gpg.conf
     fi
     echo no-emit-version >> "$GNUPGHOME"/gpg.conf
+
+    # Change this if we ship a new test key
+    FINGERPRINT="5AEAB11F5E33DCE875DDB75B6D92612D94E46381"
+    SELF_USERID="Notmuch Test Suite <test_suite@notmuchmail.org> (INSECURE!)"
+    printf '%s:6:\n' "$FINGERPRINT" | gpg --quiet --batch --no-tty --import-ownertrust
 }
 
 # Each test should start with something like this, after copyright notices:
@@ -126,15 +136,7 @@ add_gnupg_home ()
 # '
 # . ./test-lib.sh || exit 1
 
-[ "x$ORIGINAL_TERM" != "xdumb" ] && (
-               TERM=$ORIGINAL_TERM &&
-               export TERM &&
-               [ -t 1 ] &&
-               tput bold >/dev/null 2>&1 &&
-               tput setaf 1 >/dev/null 2>&1 &&
-               tput sgr0 >/dev/null 2>&1
-       ) &&
-       color=t
+color=maybe
 
 while test "$#" -ne 0
 do
@@ -160,9 +162,6 @@ do
                valgrind=t; verbose=t; shift ;;
        --tee)
                shift ;; # was handled already
-       --root=*)
-               root=$(expr "z$1" : 'z[^=]*=\(.*\)')
-               shift ;;
        *)
                echo "error: unknown test option '$1'" >&2; exit 1 ;;
        esac
@@ -178,6 +177,21 @@ else
     }
 fi
 
+test -n "$COLORS_WITHOUT_TTY" || [ -t 1 ] || color=
+
+if [ -n "$color" ] && [ "$ORIGINAL_TERM" != 'dumb' ] && (
+               TERM=$ORIGINAL_TERM &&
+               export TERM &&
+               tput bold
+               tput setaf
+               tput sgr0
+       ) >/dev/null 2>&1
+then
+       color=t
+else
+       color=
+fi
+
 if test -n "$color"; then
        say_color () {
                (
@@ -315,16 +329,17 @@ emacs_deliver_message ()
     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
-    smtp_dummy_pid=
+    # eval'ing smtp-dummy --background will set smtp_dummy_pid and -_port
+    local 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\")
+              (mail-host-address \"example.com\")
               (smtpmail-smtp-server \"localhost\")
-              (smtpmail-smtp-service \"25025\"))
+              (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\")
@@ -332,7 +347,7 @@ emacs_deliver_message ()
           (insert \"${subject}\")
           (message-goto-body)
           (insert \"${body}\")
-          $@
+          $*
           (notmuch-mua-send-and-exit))"
 
     # In case message was sent properly, client waits for confirmation
@@ -349,8 +364,17 @@ emacs_deliver_message ()
 # 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=''
+    while [[ "$1" =~ ^-- ]]; do
+        nmn_args="$nmn_args $1"
+        shift
+    done
     local subject="$1"
     local body="$2"
     shift 2
@@ -367,9 +391,9 @@ emacs_fcc_message ()
           (insert \"${subject}\")
           (message-goto-body)
           (insert \"${body}\")
-          $@
+          $*
           (notmuch-mua-send-and-exit))" || return 1
-    notmuch new >/dev/null
+    notmuch new $nmn_args >/dev/null
 }
 
 # Add an existing, fixed corpus of email to the database.
@@ -385,14 +409,8 @@ add_email_corpus ()
     corpus=${1:-default}
 
     rm -rf ${MAIL_DIR}
-    if [ -d $TEST_DIRECTORY/corpora.mail/$corpus ]; then
-       cp -a $TEST_DIRECTORY/corpora.mail/$corpus ${MAIL_DIR}
-    else
-       cp -a $NOTMUCH_SRCDIR/test/corpora/$corpus ${MAIL_DIR}
-       notmuch new >/dev/null || die "'notmuch new' failed while adding email corpus"
-       mkdir -p $TEST_DIRECTORY/corpora.mail
-       cp -a ${MAIL_DIR} $TEST_DIRECTORY/corpora.mail/$corpus
-    fi
+    cp -a $NOTMUCH_SRCDIR/test/corpora/$corpus ${MAIL_DIR}
+    notmuch new >/dev/null || die "'notmuch new' failed while adding email corpus"
 }
 
 test_begin_subtest ()
@@ -491,6 +509,30 @@ test_sort_json () {
         "import sys, json; json.dump(sorted(json.load(sys.stdin)),sys.stdout)"
 }
 
+# test for json objects:
+# read the source of test/json_check_nodes.py (or the output when
+# invoking it without arguments) for an explanation of the syntax.
+test_json_nodes () {
+        exec 1>&6 2>&7         # Restore stdout and stderr
+       if [ -z "$inside_subtest" ]; then
+               error "bug in the test script: test_json_eval without test_begin_subtest"
+       fi
+       inside_subtest=
+       test "$#" > 0 ||
+           error "bug in the test script: test_json_nodes needs at least 1 parameter"
+
+       if ! test_skip "$test_subtest_name"
+       then
+           output=$(PYTHONIOENCODING=utf-8 $NOTMUCH_PYTHON "$TEST_DIRECTORY"/json_check_nodes.py "$@")
+               if [ "$?" = 0 ]
+               then
+                       test_ok_
+               else
+                       test_failure_ "$output"
+               fi
+       fi
+}
+
 test_emacs_expect_t () {
        test "$#" = 1 ||
        error "bug in the test script: not 1 parameter to test_emacs_expect_t"
@@ -615,6 +657,11 @@ notmuch_config_sanitize ()
     notmuch_dir_sanitize | notmuch_built_with_sanitize
 }
 
+notmuch_show_part ()
+{
+    awk '/^\014part}/{ f=0 }; { if (f) { print $0 } } /^\014part{ ID: '"$1"'/{ f=1 }'
+}
+
 # End of notmuch helper functions
 
 # Use test_set_prereq to tell that a particular prerequisite is available.
@@ -986,7 +1033,7 @@ test_emacs () {
        rm -f OUTPUT
        touch OUTPUT
 
-       ${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(notmuch-test-progn $@)"
+       ${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(notmuch-test-progn $*)"
 }
 
 test_python() {
@@ -997,7 +1044,7 @@ test_python() {
 }
 
 test_ruby() {
-    MAIL_DIR=$MAIL_DIR ruby -I $NOTMUCH_SRCDIR/bindings/ruby> OUTPUT
+    MAIL_DIR=$MAIL_DIR $NOTMUCH_RUBY -I $NOTMUCH_SRCDIR/bindings/ruby> OUTPUT
 }
 
 test_C () {
@@ -1011,6 +1058,20 @@ test_C () {
     notmuch_dir_sanitize OUTPUT.stdout OUTPUT.stderr > OUTPUT
 }
 
+make_shim () {
+    base_name="$1"
+    test_file="${base_name}.c"
+    shim_file="${base_name}.so"
+    cat > ${test_file}
+    ${TEST_CC} ${TEST_CFLAGS} ${TEST_SHIM_CFLAGS} -I${NOTMUCH_SRCDIR}/test -I${NOTMUCH_SRCDIR}/lib -o ${shim_file} ${test_file} ${TEST_SHIM_LDFLAGS}
+}
+
+notmuch_with_shim () {
+    base_name="$1"
+    shift
+    shim_file="${base_name}.so"
+    LD_PRELOAD=./${shim_file}${LD_PRELOAD:+:$LD_PRELOAD} notmuch-shared "$@"
+}
 
 # Creates a script that counts how much time it is executed and calls
 # notmuch.  $notmuch_counter_command is set to the path to the
@@ -1060,30 +1121,17 @@ test_init_ () {
 }
 
 
-. "$NOTMUCH_SRCDIR/test/test-lib-common.sh" || exit 1
+# Where to run the tests
+TEST_DIRECTORY=$NOTMUCH_BUILDDIR/test
 
-if [ "${NOTMUCH_GMIME_MAJOR}" = 3 ]; then
-    test_subtest_broken_gmime_3 () {
-       test_subtest_known_broken
-    }
-    test_subtest_broken_gmime_2 () {
-       true
-    }
-else
-    test_subtest_broken_gmime_3 () {
-       true
-    }
-    test_subtest_broken_gmime_2 () {
-       test_subtest_known_broken
-    }
-fi
+. "$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 "$test" || error "Cannot set up test environment"
+cd -P "$TMP_DIRECTORY" || error "Cannot set up test environment"
 
 if test "$verbose" = "t"
 then