On Tue, Mar 24 2015, David Bremner <david@tethera.net> wrote: > This includes tests for all of the error fprintfs in the library I > could figure out how to test without using gdb scripts. It boils down > to errors opening files and exceptions caused by corrupted Xapian > databases. > --- > test/T560-lib-error.sh | 250 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 250 insertions(+) > create mode 100755 test/T560-lib-error.sh > > diff --git a/test/T560-lib-error.sh b/test/T560-lib-error.sh > new file mode 100755 > index 0000000..c2964cb > --- /dev/null > +++ b/test/T560-lib-error.sh > @@ -0,0 +1,250 @@ > +#!/usr/bin/env bash > +test_description="error reporting for library" > + > +. ./test-lib.sh > + > +backup_database (){ missing space: backup_database () { ( fgrep '()' test/* shows consistent style there ) > + rm -rf notmuch-dir-backup > + cp -a ${MAIL_DIR}/.notmuch notmuch-dir-backup cp -a is not solaris compatible (it is freebsd 10.1) cp -pR would be more portable option > +} > +restore_database (){ missing space > + rm -rf ${MAIL_DIR}/.notmuch > + cp -a notmuch-dir-backup ${MAIL_DIR}/.notmuch cp -a ... > +} > + > + > +add_email_corpus > + > +test_expect_success "building database" "NOTMUCH_NEW" > + > +test_begin_subtest "Open null pointer" > +test_C <<EOF Like discussed in IRC, test_C <<'EOF' would be mode convenient to reviewer when there is nothing to be interpolated -- so reviewer can ignore checking potential interpolations (e.g. $... and `...`:s) grep '<<.*EOF' test/* doesn't show that this is ever user, though :/ > +#include <stdio.h> > +#include <notmuch.h> > +int main (int argc, char** argv) > +{ > + notmuch_database_t *db; > + notmuch_status_t stat; > + stat = notmuch_database_open (NULL, 0, 0); > +} > +EOF > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +Error: Cannot open a database for a NULL path. > +EOF > +test_expect_equal_file EXPECTED OUTPUT > + > +test_begin_subtest "Open nonexistent database" > +test_C <<EOF > +#include <stdio.h> > +#include <notmuch.h> > +int main (int argc, char** argv) > +{ > + notmuch_database_t *db; > + notmuch_status_t stat; > + stat = notmuch_database_open ("/nonexistent/foo", 0, 0); > +} > +EOF > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +Error opening database at /nonexistent/foo/.notmuch: No such file or directory > +EOF > +test_expect_equal_file EXPECTED OUTPUT > + > +test_begin_subtest "Write to read-only database" > +test_C ${MAIL_DIR} <<EOF > +#include <stdio.h> > +#include <notmuch.h> > +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); > + } > + stat = notmuch_database_add_message (db, "/dev/null", NULL); > +} > +EOF > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +Cannot write to a read-only database. > +EOF > +test_expect_equal_file EXPECTED OUTPUT > + > +test_begin_subtest "Add non-existent file" > +test_C ${MAIL_DIR} <<EOF > +#include <stdio.h> > +#include <notmuch.h> > +int main (int argc, char** argv) > +{ > + notmuch_database_t *db; > + notmuch_status_t stat; > + stat = notmuch_database_open (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db); > + if (stat != NOTMUCH_STATUS_SUCCESS) { > + fprintf (stderr, "error opening database: %d\n", stat); > + } > + stat = notmuch_database_add_message (db, "/nonexistent", NULL); > + if (stat) > + fputs (notmuch_database_status_string (db), stderr); > + > +} > +EOF > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +Error opening /nonexistent: No such file or directory > +EOF > +test_expect_equal_file EXPECTED OUTPUT > + > +test_begin_subtest "compact, overwriting existing backup" > +test_C ${MAIL_DIR} <<EOF > +#include <stdio.h> > +#include <notmuch.h> > +static void > +status_cb (const char *msg, void *closure) > +{ > + printf ("%s\n", msg); > +} > +int main (int argc, char** argv) > +{ > + notmuch_database_t *db; > + notmuch_status_t stat; > + stat = notmuch_database_compact (argv[1], argv[1], status_cb, NULL); > +} > +EOF > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +Path already exists: CWD/mail > +EOF > +test_expect_equal_file EXPECTED OUTPUT > + > +cat <<EOF > head.c One usually expects *.c files to be "complete" source files; as an alternative I suggest filenames c_head and c_tail > +#include <stdio.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <fcntl.h> > +#include <talloc.h> > +#include <notmuch.h> > + > +int main (int argc, char** argv) > +{ > + notmuch_database_t *db; > + notmuch_status_t stat; > + char *path; > + int fd; > + > + stat = notmuch_database_open (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db); > + if (stat != NOTMUCH_STATUS_SUCCESS) { > + fprintf (stderr, "error opening database: %d\n", stat); > + } > + path = talloc_asprintf (db, "%s/.notmuch/xapian/postlist.DB", argv[1]); > + fd = open(path,O_WRONLY|O_TRUNC); > + if (fd < 0) > + fprintf (stderr, "error opening %s\n"); > +EOF > +cat <<EOF > tail.c > + if (stat) { > + const char *stat_str = notmuch_database_status_string (db); > + if (stat_str) > + fputs (stat_str, stderr); > + } > + > +} > +EOF > + > +backup_database > +test_begin_subtest "Xapian exception finding message" > +cat head.c - tail.c <<EOF | test_C ${MAIL_DIR} > + { > + notmuch_message_t *message = NULL; > + stat = notmuch_database_find_message (db, "id:nonexistant", &message); > + } > +EOF > +sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean (I was going to suggest sed 's/...' OUTPUT > OUTPUT.clean (i.e remove '<' but I actually cannot determine which would be better :D) > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +A Xapian exception occurred finding message > +EOF > +test_expect_equal_file EXPECTED OUTPUT.clean > +restore_database > + > +backup_database > +test_begin_subtest "Xapian exception getting tags" > +cat head.c - tail.c <<EOF | test_C ${MAIL_DIR} > + { > + notmuch_tags_t *tags = NULL; > + tags = notmuch_database_get_all_tags (db); > + stat = (tags == NULL); > + } > +EOF > +sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +A Xapian exception occurred getting tags > +EOF > +test_expect_equal_file EXPECTED OUTPUT.clean > +restore_database > + > +backup_database > +test_begin_subtest "Xapian exception creating directory" > +cat head.c - tail.c <<EOF | test_C ${MAIL_DIR} > + { > + notmuch_directory_t *directory = NULL; > + stat = notmuch_database_get_directory (db, "none/existing", &directory); > + } > +EOF > +sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +A Xapian exception occurred creating a directory > +EOF > +test_expect_equal_file EXPECTED OUTPUT.clean > +restore_database > + > +backup_database > +test_begin_subtest "Xapian exception searching messages" > +cat head.c - tail.c <<EOF | test_C ${MAIL_DIR} > + { > + notmuch_messages_t *messages = NULL; > + notmuch_query_t *query=notmuch_query_create (db, "*"); > + stat = notmuch_query_search_messages_st (query, &messages); > + } > +EOF > +sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +A Xapian exception occurred performing query > +Query string was: * > +EOF > +test_expect_equal_file EXPECTED OUTPUT.clean > +restore_database > + > +backup_database > +test_begin_subtest "Xapian exception counting messages" > +cat head.c - tail.c <<EOF | test_C ${MAIL_DIR} > + { > + notmuch_query_t *query=notmuch_query_create (db, "id:87ocn0qh6d.fsf@yoom.home.cworth.org"); > + int count = notmuch_query_count_messages (query); > + stat = (count == 0); > + } > +EOF > +sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean > +cat <<EOF >EXPECTED > +== stdout == > +== stderr == > +A Xapian exception occurred performing query > +Query string was: id:87ocn0qh6d.fsf@yoom.home.cworth.org > +EOF > +test_expect_equal_file EXPECTED OUTPUT.clean > +restore_database > + > +test_done > -- > 2.1.4