1#!/usr/bin/env bash 2test_description="API tests for notmuch_message_*" 3 4. $(dirname "$0")/test-lib.sh || exit 1 5 6add_email_corpus 7 8test_begin_subtest "building database" 9test_expect_success "NOTMUCH_NEW" 10 11cat <<'EOF' > c_tail 12 if (stat) { 13 const char *stat_str = notmuch_database_status_string (db); 14 if (stat_str) 15 fputs (stat_str, stderr); 16 } 17 18} 19EOF 20 21cat <<EOF > c_head0 22#include <stdio.h> 23#include <notmuch.h> 24#include <notmuch-test.h> 25int main (int argc, char** argv) 26{ 27 notmuch_database_t *db; 28 notmuch_status_t stat; 29 char *msg = NULL; 30 notmuch_message_t *message = NULL; 31 const char *id = "1258471718-6781-1-git-send-email-dottedmag@dottedmag.net"; 32 33 stat = notmuch_database_open_verbose (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db, &msg); 34 if (stat != NOTMUCH_STATUS_SUCCESS) { 35 fprintf (stderr, "error opening database: %d %s\n", stat, msg ? msg : ""); 36 exit (1); 37 } 38 EXPECT0(notmuch_database_find_message (db, id, &message)); 39EOF 40 41cp c_head0 c_head 42echo " EXPECT0(notmuch_database_close (db));" >> c_head 43 44test_begin_subtest "Handle getting message-id from closed database" 45cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 46 { 47 const char *id2; 48 id2=notmuch_message_get_message_id (message); 49 printf("%d\n%d\n", message != NULL, id2==NULL); 50 } 51EOF 52cat <<EOF > EXPECTED 53== stdout == 541 551 56== stderr == 57EOF 58test_expect_equal_file EXPECTED OUTPUT 59 60test_begin_subtest "Handle getting thread-id from closed database" 61cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 62 { 63 const char *id2; 64 id2=notmuch_message_get_thread_id (message); 65 printf("%d\n%d\n", message != NULL, id2==NULL); 66 } 67EOF 68cat <<EOF > EXPECTED 69== stdout == 701 711 72== stderr == 73EOF 74test_expect_equal_file EXPECTED OUTPUT 75 76test_begin_subtest "Handle getting header from closed database" 77cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 78 { 79 const char *from; 80 from=notmuch_message_get_header (message, "from"); 81 printf("%s\n%d\n", id, from == NULL); 82 } 83EOF 84cat <<EOF > EXPECTED 85== stdout == 861258471718-6781-1-git-send-email-dottedmag@dottedmag.net 871 88== stderr == 89EOF 90test_expect_equal_file EXPECTED OUTPUT 91 92# XXX this test only tests the trivial code path 93test_begin_subtest "Handle getting replies from closed database" 94cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 95 { 96 notmuch_messages_t *replies; 97 replies = notmuch_message_get_replies (message); 98 printf("%d\n%d\n", message != NULL, replies==NULL); 99 } 100EOF 101cat <<EOF > EXPECTED 102== stdout == 1031 1041 105== stderr == 106EOF 107test_expect_equal_file EXPECTED OUTPUT 108 109test_begin_subtest "Handle getting message filename from closed database" 110cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 111 { 112 const char *filename; 113 filename = notmuch_message_get_filename (message); 114 printf("%d\n%d\n", message != NULL, filename == NULL); 115 } 116EOF 117cat <<EOF > EXPECTED 118== stdout == 1191 1201 121== stderr == 122EOF 123test_expect_equal_file EXPECTED OUTPUT 124 125test_begin_subtest "Handle getting all message filenames from closed database" 126cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 127 { 128 notmuch_filenames_t *filenames; 129 filenames = notmuch_message_get_filenames (message); 130 printf("%d\n%d\n", message != NULL, filenames == NULL); 131 } 132EOF 133cat <<EOF > EXPECTED 134== stdout == 1351 1361 137== stderr == 138EOF 139test_expect_equal_file EXPECTED OUTPUT 140 141test_begin_subtest "iterate over all message filenames from closed database" 142cat c_head0 - c_tail <<'EOF' | test_C ${MAIL_DIR} 143 { 144 notmuch_filenames_t *filenames; 145 filenames = notmuch_message_get_filenames (message); 146 EXPECT0(notmuch_database_close (db)); 147 for (; notmuch_filenames_valid (filenames); 148 notmuch_filenames_move_to_next (filenames)) { 149 const char *filename = notmuch_filenames_get (filenames); 150 printf("%s\n", filename); 151 } 152 notmuch_filenames_destroy (filenames); 153 printf("SUCCESS\n"); 154 } 155EOF 156cat <<EOF > EXPECTED 157== stdout == 158MAIL_DIR/01:2, 159SUCCESS 160== stderr == 161EOF 162test_expect_equal_file EXPECTED OUTPUT 163 164test_begin_subtest "Handle getting ghost flag from closed database" 165cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 166 { 167 notmuch_bool_t result; 168 result = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_GHOST); 169 printf("%d\n%d\n", message != NULL, result == FALSE); 170 } 171EOF 172cat <<EOF > EXPECTED 173== stdout == 1741 1751 176== stderr == 177EOF 178test_expect_equal_file EXPECTED OUTPUT 179 180test_begin_subtest "Handle getting date from closed database" 181cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 182 { 183 time_t result; 184 result = notmuch_message_get_date (message); 185 printf("%d\n%d\n", message != NULL, result == 0); 186 } 187EOF 188cat <<EOF > EXPECTED 189== stdout == 1901 1911 192== stderr == 193EOF 194test_expect_equal_file EXPECTED OUTPUT 195 196test_begin_subtest "Handle getting tags from closed database" 197cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 198 { 199 notmuch_tags_t *result; 200 result = notmuch_message_get_tags (message); 201 printf("%d\n%d\n", message != NULL, result == NULL); 202 } 203EOF 204cat <<EOF > EXPECTED 205== stdout == 2061 2071 208== stderr == 209EOF 210test_expect_equal_file EXPECTED OUTPUT 211 212test_begin_subtest "Handle counting files from closed database" 213cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 214 { 215 int result; 216 result = notmuch_message_count_files (message); 217 printf("%d\n%d\n", message != NULL, result < 0); 218 } 219EOF 220cat <<EOF > EXPECTED 221== stdout == 2221 2231 224== stderr == 225EOF 226test_expect_equal_file EXPECTED OUTPUT 227 228test_begin_subtest "Handle adding tag with closed database" 229cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 230 { 231 notmuch_status_t status; 232 status = notmuch_message_add_tag (message, "boom"); 233 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION); 234 } 235EOF 236cat <<EOF > EXPECTED 237== stdout == 2381 2391 240== stderr == 241EOF 242test_expect_equal_file EXPECTED OUTPUT 243 244test_begin_subtest "Handle removing tag with closed database" 245cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 246 { 247 notmuch_status_t status; 248 status = notmuch_message_remove_tag (message, "boom"); 249 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION); 250 } 251EOF 252cat <<EOF > EXPECTED 253== stdout == 2541 2551 256== stderr == 257EOF 258test_expect_equal_file EXPECTED OUTPUT 259 260test_begin_subtest "Handle read maildir flag with closed database" 261cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 262 { 263 notmuch_bool_t is_set = -1; 264 is_set = notmuch_message_has_maildir_flag (message, 'S'); 265 printf("%d\n%d\n", message != NULL, is_set == FALSE || is_set == TRUE); 266 } 267EOF 268cat <<EOF > EXPECTED 269== stdout == 2701 2711 272== stderr == 273EOF 274test_expect_equal_file EXPECTED OUTPUT 275 276test_begin_subtest "Handle checking maildir flag with closed db (new API)" 277cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 278 { 279 notmuch_status_t status; 280 notmuch_bool_t out; 281 status = notmuch_message_has_maildir_flag_st (message, 'S', &out); 282 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION); 283 } 284EOF 285cat <<EOF > EXPECTED 286== stdout == 2871 2881 289== stderr == 290EOF 291test_expect_equal_file EXPECTED OUTPUT 292 293test_begin_subtest "Handle converting maildir flags to tags with closed db" 294cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 295 { 296 notmuch_status_t status; 297 status = notmuch_message_maildir_flags_to_tags (message); 298 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION); 299 } 300EOF 301cat <<EOF > EXPECTED 302== stdout == 3031 3041 305== stderr == 306EOF 307test_expect_equal_file EXPECTED OUTPUT 308 309test_begin_subtest "Handle removing all tags with closed db" 310cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 311 { 312 notmuch_status_t status; 313 status = notmuch_message_remove_all_tags (message); 314 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION); 315 } 316EOF 317cat <<EOF > EXPECTED 318== stdout == 3191 3201 321== stderr == 322EOF 323test_expect_equal_file EXPECTED OUTPUT 324 325test_begin_subtest "Handle freezing message with closed db" 326cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 327 { 328 notmuch_status_t status; 329 status = notmuch_message_freeze (message); 330 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_SUCCESS); 331 } 332EOF 333cat <<EOF > EXPECTED 334== stdout == 3351 3361 337== stderr == 338EOF 339test_expect_equal_file EXPECTED OUTPUT 340 341test_begin_subtest "Handle thawing message with closed db" 342cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 343 { 344 notmuch_status_t status; 345 status = notmuch_message_thaw (message); 346 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW); 347 } 348EOF 349cat <<EOF > EXPECTED 350== stdout == 3511 3521 353== stderr == 354EOF 355test_expect_equal_file EXPECTED OUTPUT 356 357test_begin_subtest "Handle destroying message with closed db" 358cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 359 { 360 notmuch_message_destroy (message); 361 printf("%d\n%d\n", message != NULL, 1); 362 } 363EOF 364cat <<EOF > EXPECTED 365== stdout == 3661 3671 368== stderr == 369EOF 370test_expect_equal_file EXPECTED OUTPUT 371 372test_begin_subtest "Handle retrieving closed db from message" 373cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 374 { 375 notmuch_database_t *db2; 376 db2 = notmuch_message_get_database (message); 377 printf("%d\n%d\n", message != NULL, db == db2); 378 } 379EOF 380cat <<EOF > EXPECTED 381== stdout == 3821 3831 384== stderr == 385EOF 386test_expect_equal_file EXPECTED OUTPUT 387 388test_begin_subtest "Handle reindexing message with closed db" 389cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} 390 { 391 notmuch_status_t status; 392 status = notmuch_message_reindex (message, NULL); 393 printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION); 394 } 395EOF 396cat <<EOF > EXPECTED 397== stdout == 3981 3991 400== stderr == 401EOF 402test_expect_equal_file EXPECTED OUTPUT 403 404test_done 405