2 test_description="error reporting for library"
4 . $(dirname "$0")/test-lib.sh || exit 1
8 test_begin_subtest "building database"
9 test_expect_success "NOTMUCH_NEW"
11 test_begin_subtest "Open null pointer"
15 int main (int argc, char** argv)
17 notmuch_database_t *db;
18 notmuch_status_t stat;
19 stat = notmuch_database_open (NULL, 0, 0);
25 Error: Cannot open a database for a NULL path.
27 test_expect_equal_file EXPECTED OUTPUT
29 test_begin_subtest "Open relative path"
33 int main (int argc, char** argv)
35 notmuch_database_t *db;
36 notmuch_status_t stat;
37 stat = notmuch_database_open ("./nonexistent/foo", 0, 0);
43 Error: Database path must be absolute.
45 test_expect_equal_file EXPECTED OUTPUT
47 test_begin_subtest "Create database in relative path"
51 int main (int argc, char** argv)
53 notmuch_database_t *db;
54 notmuch_status_t stat;
55 stat = notmuch_database_create ("./nonexistent/foo", &db);
61 Error: Database path must be absolute.
63 test_expect_equal_file EXPECTED OUTPUT
65 test_begin_subtest "Open nonexistent database"
66 test_C ${PWD}/nonexistent/foo <<'EOF'
69 int main (int argc, char** argv)
71 notmuch_database_t *db;
72 notmuch_status_t stat;
73 stat = notmuch_database_open (argv[1], 0, 0);
79 Error opening database at CWD/nonexistent/foo/.notmuch: No such file or directory
81 test_expect_equal_file EXPECTED OUTPUT
83 test_begin_subtest "create NULL path"
87 int main (int argc, char** argv)
89 notmuch_status_t stat;
90 stat = notmuch_database_create (NULL, NULL);
96 Error: Cannot create a database for a NULL path.
98 test_expect_equal_file EXPECTED OUTPUT
100 test_begin_subtest "Create database in nonexistent directory"
101 test_C ${PWD}/nonexistent/foo<<'EOF'
104 int main (int argc, char** argv)
106 notmuch_database_t *db;
107 notmuch_status_t stat;
108 stat = notmuch_database_create (argv[1], &db);
111 cat <<'EOF' >EXPECTED
114 Error: Cannot create database at CWD/nonexistent/foo: No such file or directory.
116 test_expect_equal_file EXPECTED OUTPUT
118 test_begin_subtest "Write to read-only database"
119 test_C ${MAIL_DIR} <<'EOF'
122 int main (int argc, char** argv)
124 notmuch_database_t *db;
125 notmuch_status_t stat;
126 stat = notmuch_database_open (argv[1], NOTMUCH_DATABASE_MODE_READ_ONLY, &db);
127 if (stat != NOTMUCH_STATUS_SUCCESS) {
128 fprintf (stderr, "error opening database: %d\n", stat);
130 stat = notmuch_database_index_file (db, "/dev/null", NULL, NULL);
132 fputs (notmuch_database_status_string (db), stderr);
136 cat <<'EOF' >EXPECTED
139 Cannot write to a read-only database.
141 test_expect_equal_file EXPECTED OUTPUT
143 test_begin_subtest "Add non-existent file"
144 test_C ${MAIL_DIR} <<'EOF'
147 int main (int argc, char** argv)
149 notmuch_database_t *db;
150 notmuch_status_t stat;
151 stat = notmuch_database_open (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db);
152 if (stat != NOTMUCH_STATUS_SUCCESS) {
153 fprintf (stderr, "error opening database: %d\n", stat);
155 stat = notmuch_database_index_file (db, "./nonexistent", NULL, NULL);
157 char *status_string = notmuch_database_status_string (db);
158 if (status_string) fputs (status_string, stderr);
162 cat <<'EOF' >EXPECTED
165 Error opening ./nonexistent: No such file or directory
167 test_expect_equal_file EXPECTED OUTPUT
169 test_begin_subtest "compact, overwriting existing backup"
170 test_C ${MAIL_DIR} <<'EOF'
174 status_cb (const char *msg, void *closure)
176 printf ("%s\n", msg);
178 int main (int argc, char** argv)
180 notmuch_database_t *db;
181 notmuch_status_t stat;
182 stat = notmuch_database_compact (argv[1], argv[1], status_cb, NULL);
185 cat <<'EOF' >EXPECTED
187 Path already exists: MAIL_DIR
191 test_expect_equal_file EXPECTED OUTPUT
195 #include <sys/types.h>
196 #include <sys/stat.h>
201 int main (int argc, char** argv)
203 notmuch_database_t *db;
204 notmuch_status_t stat;
209 stat = notmuch_database_open_verbose (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db, &msg);
210 if (stat != NOTMUCH_STATUS_SUCCESS) {
211 fprintf (stderr, "error opening database: %d %s\n", stat, msg ? msg : "");
214 path = talloc_asprintf (db, "%s/.notmuch/xapian/postlist.${db_ending}", argv[1]);
215 fd = open(path,O_WRONLY|O_TRUNC);
217 fprintf (stderr, "error opening %s\n", argv[1]);
223 const char *stat_str = notmuch_database_status_string (db);
225 fputs (stat_str, stderr);
232 test_begin_subtest "Xapian exception finding message"
233 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
235 notmuch_message_t *message = NULL;
236 stat = notmuch_database_find_message (db, "id:nonexistent", &message);
239 sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
240 cat <<'EOF' >EXPECTED
243 A Xapian exception occurred finding message
245 test_expect_equal_file EXPECTED OUTPUT.clean
249 test_begin_subtest "Xapian exception getting tags"
250 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
252 notmuch_tags_t *tags = NULL;
253 tags = notmuch_database_get_all_tags (db);
254 stat = (tags == NULL);
257 sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
258 cat <<'EOF' >EXPECTED
261 A Xapian exception occurred getting tags
263 test_expect_equal_file EXPECTED OUTPUT.clean
267 test_begin_subtest "Xapian exception creating directory"
268 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
270 notmuch_directory_t *directory = NULL;
271 stat = notmuch_database_get_directory (db, "none/existing", &directory);
274 sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
275 cat <<'EOF' >EXPECTED
278 A Xapian exception occurred creating a directory
280 test_expect_equal_file EXPECTED OUTPUT.clean
284 test_begin_subtest "Xapian exception searching messages"
285 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
287 notmuch_messages_t *messages = NULL;
288 notmuch_query_t *query=notmuch_query_create (db, "*");
289 stat = notmuch_query_search_messages (query, &messages);
292 sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
293 cat <<'EOF' >EXPECTED
296 A Xapian exception occurred performing query
299 test_expect_equal_file EXPECTED OUTPUT.clean
303 test_begin_subtest "Xapian exception counting messages"
304 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
307 notmuch_query_t *query=notmuch_query_create (db, "id:87ocn0qh6d.fsf@yoom.home.cworth.org");
308 stat = notmuch_query_count_messages (query, &count);
311 sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
312 cat <<'EOF' >EXPECTED
315 A Xapian exception occurred performing query
316 Query string was: id:87ocn0qh6d.fsf@yoom.home.cworth.org
318 test_expect_equal_file EXPECTED OUTPUT.clean
324 #include <notmuch-test.h>
325 int main (int argc, char** argv)
327 notmuch_database_t *db;
328 notmuch_status_t stat;
330 notmuch_message_t *message = NULL;
331 const char *id = "1258471718-6781-1-git-send-email-dottedmag@dottedmag.net";
333 stat = notmuch_database_open_verbose (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db, &msg);
334 if (stat != NOTMUCH_STATUS_SUCCESS) {
335 fprintf (stderr, "error opening database: %d %s\n", stat, msg ? msg : "");
338 EXPECT0(notmuch_database_find_message (db, id, &message));
339 EXPECT0(notmuch_database_close (db));
342 test_begin_subtest "Handle getting message-id from closed database"
343 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
346 id2=notmuch_message_get_message_id (message);
347 printf("%d\n%d\n", message != NULL, id2==NULL);
348 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
356 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
358 test_expect_equal_file EXPECTED OUTPUT
360 test_begin_subtest "Handle getting thread-id from closed database"
361 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
364 id2=notmuch_message_get_thread_id (message);
365 printf("%d\n%d\n", message != NULL, id2==NULL);
366 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
374 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
376 test_expect_equal_file EXPECTED OUTPUT
378 test_begin_subtest "Handle getting header from closed database"
379 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
382 from=notmuch_message_get_header (message, "from");
383 printf("%s\n%d\n", id, from == NULL);
384 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
389 1258471718-6781-1-git-send-email-dottedmag@dottedmag.net
392 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
394 test_expect_equal_file EXPECTED OUTPUT
396 # XXX TODO: test on a message from notmuch_thread_get_toplevel_messages
397 # XXX this test only tests the trivial code path
398 test_begin_subtest "Handle getting replies from closed database"
399 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
401 notmuch_messages_t *replies;
402 replies = notmuch_message_get_replies (message);
403 printf("%d\n%d\n", message != NULL, replies==NULL);
404 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
413 test_expect_equal_file EXPECTED OUTPUT
415 test_begin_subtest "Handle getting message filename from closed database"
416 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
418 const char *filename;
419 filename = notmuch_message_get_filename (message);
420 printf("%d\n%d\n", message != NULL, filename == NULL);
421 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
429 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
431 test_expect_equal_file EXPECTED OUTPUT
433 test_begin_subtest "Handle getting all message filenames from closed database"
434 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
436 notmuch_filenames_t *filenames;
437 filenames = notmuch_message_get_filenames (message);
438 printf("%d\n%d\n", message != NULL, filenames == NULL);
439 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
447 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
449 test_expect_equal_file EXPECTED OUTPUT
451 test_begin_subtest "Handle getting ghost flag from closed database"
452 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
454 notmuch_bool_t result;
455 result = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_GHOST);
456 printf("%d\n%d\n", message != NULL, result == FALSE);
457 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
465 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
467 test_expect_equal_file EXPECTED OUTPUT
469 test_begin_subtest "Handle getting date from closed database"
470 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
473 result = notmuch_message_get_date (message);
474 printf("%d\n%d\n", message != NULL, result == 0);
475 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
483 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
485 test_expect_equal_file EXPECTED OUTPUT
487 test_begin_subtest "Handle getting tags from closed database"
488 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
490 notmuch_tags_t *result;
491 result = notmuch_message_get_tags (message);
492 printf("%d\n%d\n", message != NULL, result == NULL);
493 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
501 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
503 test_expect_equal_file EXPECTED OUTPUT
505 test_begin_subtest "Handle counting files from closed database"
506 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
509 result = notmuch_message_count_files (message);
510 printf("%d\n%d\n", message != NULL, result < 0);
511 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
519 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
521 test_expect_equal_file EXPECTED OUTPUT
523 test_begin_subtest "Handle adding tag with closed database"
524 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
526 stat = notmuch_message_add_tag (message, "boom");
527 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
535 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
537 test_expect_equal_file EXPECTED OUTPUT
539 test_begin_subtest "Handle removing tag with closed database"
540 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
542 stat = notmuch_message_remove_tag (message, "boom");
543 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
551 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
553 test_expect_equal_file EXPECTED OUTPUT
555 test_begin_subtest "Handle read maildir flag with closed database"
556 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
558 notmuch_bool_t is_set = -1;
559 is_set = notmuch_message_has_maildir_flag (message, 'S');
560 printf("%d\n%d\n", message != NULL, is_set == FALSE || is_set == TRUE);
561 stat = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
569 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
571 test_expect_equal_file EXPECTED OUTPUT
573 test_begin_subtest "Handle checking maildir flag with closed db (new API)"
574 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
577 stat = notmuch_message_has_maildir_flag_st (message, 'S', &out);
578 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
586 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
588 test_expect_equal_file EXPECTED OUTPUT
590 test_begin_subtest "Handle converting maildir flags to tags with closed db"
591 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
593 stat = notmuch_message_maildir_flags_to_tags (message);
594 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
602 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
604 test_expect_equal_file EXPECTED OUTPUT
606 test_begin_subtest "Handle removing all tags with closed db"
607 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
609 stat = notmuch_message_remove_all_tags (message);
610 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
618 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
620 test_expect_equal_file EXPECTED OUTPUT
622 test_begin_subtest "Handle freezing message with closed db"
623 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
625 stat = notmuch_message_freeze (message);
626 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_SUCCESS);
635 test_expect_equal_file EXPECTED OUTPUT
637 test_begin_subtest "Handle thawing message with closed db"
638 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
640 stat = notmuch_message_thaw (message);
641 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW);
650 test_expect_equal_file EXPECTED OUTPUT
652 test_begin_subtest "Handle destroying message with closed db"
653 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
655 notmuch_message_destroy (message);
656 printf("%d\n%d\n", message != NULL, 1);
665 test_expect_equal_file EXPECTED OUTPUT
667 test_begin_subtest "Handle retrieving closed db from message"
668 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
670 notmuch_database_t *db2;
671 db2 = notmuch_message_get_database (message);
672 printf("%d\n%d\n", message != NULL, db == db2);
681 test_expect_equal_file EXPECTED OUTPUT
683 test_begin_subtest "Handle reindexing message with closed db"
684 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR}
686 stat = notmuch_message_reindex (message, NULL);
687 printf("%d\n%d\n", message != NULL, stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
695 A Xapian exception occurred at lib/message.cc:XXX: Database has been closed
697 test_expect_equal_file EXPECTED OUTPUT