From b350c688e1f36bdfc0343bae714f31b727a92957 Mon Sep 17 00:00:00 2001 From: rhn Date: Mon, 17 Dec 2018 17:57:47 +0000 Subject: [PATCH] test: Check for replies obeying lifetime guarantees The test attempts to check that a message coming from a thread outlives its messages list and gets destroyed together with the thread. --- test/T720-lib-lifetime.sh | 83 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100755 test/T720-lib-lifetime.sh diff --git a/test/T720-lib-lifetime.sh b/test/T720-lib-lifetime.sh new file mode 100755 index 00000000..3d94d4df --- /dev/null +++ b/test/T720-lib-lifetime.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2018 rhn +# + + +test_description="Lifetime constraints for library" + +. $(dirname "$0")/test-lib.sh || exit 1 + +add_email_corpus threading + +test_begin_subtest "building database" +test_expect_success "NOTMUCH_NEW" + +test_begin_subtest "Message outlives parent Messages from replies" + +test_C ${MAIL_DIR} <<'EOF' +#include +#include +#include +int main (int argc, char** argv) +{ + notmuch_database_t *db; + notmuch_status_t stat; + stat = notmuch_database_open (argv[1], NOTMUCH_DATABASE_MODE_READ_ONLY, &db); + if (stat != NOTMUCH_STATUS_SUCCESS) { + fprintf (stderr, "error opening database: %d\n", stat); + exit (1); + } + + notmuch_query_t *query = notmuch_query_create (db, "id:B00-root@example.org"); + notmuch_threads_t *threads; + + stat = notmuch_query_search_threads (query, &threads); + if (stat != NOTMUCH_STATUS_SUCCESS) { + fprintf (stderr, "error querying threads: %d\n", stat); + exit (1); + } + + if (!notmuch_threads_valid (threads)) { + fprintf (stderr, "invalid threads"); + exit (1); + } + + notmuch_thread_t *thread = notmuch_threads_get (threads); + notmuch_messages_t *messages = notmuch_thread_get_messages (thread); + + if (!notmuch_messages_valid (messages)) { + fprintf (stderr, "invalid messages"); + exit (1); + } + + notmuch_message_t *message = notmuch_messages_get (messages); + notmuch_messages_t *replies = notmuch_message_get_replies (message); + if (!notmuch_messages_valid (replies)) { + fprintf (stderr, "invalid replies"); + exit (1); + } + + notmuch_message_t *reply = notmuch_messages_get (replies); + + notmuch_messages_destroy (replies); // the reply should not get destroyed here + notmuch_message_destroy (message); + notmuch_messages_destroy (messages); // nor here + + const char *mid = notmuch_message_get_message_id (reply); // should not crash when accessing + fprintf (stdout, "Reply id: %s\n", mid); + notmuch_message_destroy (reply); + notmuch_thread_destroy (thread); // this destroys the reply + notmuch_threads_destroy (threads); + notmuch_query_destroy (query); + notmuch_database_destroy (db); +} +EOF +cat <<'EOF' >EXPECTED +== stdout == +Reply id: B01-child@example.org +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_done