On Fri, 24 Feb 2017, David Bremner <david@tethera.net> wrote: > There are several of these to track down, but one that is in quite a > few code paths is _notmuch_message_ensure_metadata. > --- > test/T640-database-modified.sh | 60 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 60 insertions(+) > create mode 100755 test/T640-database-modified.sh > > diff --git a/test/T640-database-modified.sh b/test/T640-database-modified.sh > new file mode 100755 > index 00000000..41869eaa > --- /dev/null > +++ b/test/T640-database-modified.sh > @@ -0,0 +1,60 @@ > +#!/usr/bin/env bash > +test_description="DatabaseModifiedError handling" > +. ./test-lib.sh || exit 1 > + > +add_email_corpus Is the whole corpus necessary? Just add a single message? > + > +test_begin_subtest "catching DatabaseModifiedError in _notmuch_message_ensure_metadata" > +test_subtest_known_broken > +test_C ${MAIL_DIR} <<'EOF' I'm not entirely thrilled by the whole test_C thing, but I guess I've lost that battle... :/ > +#include <unistd.h> > +#include <stdlib.h> > +#include <notmuch-test.h> > +#include <talloc.h> > +int > +main (int argc, char **argv) > +{ > + pid_t child; Leftover variable? > + const char *path = argv[1]; > + > + notmuch_database_t *rw_db, *ro_db; > + notmuch_messages_t *messages; > + notmuch_message_t *message, *ro_message; > + notmuch_query_t *query; > + notmuch_tags_t *tags; > + > + EXPECT0 (notmuch_database_open (path, NOTMUCH_DATABASE_MODE_READ_ONLY, &ro_db)); > + EXPECT0 (notmuch_database_find_message (ro_db, "4EFC743A.3060609@april.org", &ro_message)); How about add_message with a specific message-id, and using that here? I think we rely too much on the test corpus and hard-code stuff from there too much. Otherwise, LGTM. > + > + EXPECT0 (notmuch_database_open (path, NOTMUCH_DATABASE_MODE_READ_WRITE, &rw_db)); > + query = notmuch_query_create(rw_db, ""); > + EXPECT0 (notmuch_query_search_messages_st (query, &messages)); > + > + for (int count=0; > + notmuch_messages_valid (messages); > + notmuch_messages_move_to_next (messages), count++) { > + message = notmuch_messages_get (messages); > + for (int i=0; i<200; i++) { > + char *tag_str = talloc_asprintf(rw_db, "%d", i); > + EXPECT0 (notmuch_message_add_tag (message, tag_str)); > + talloc_free (tag_str); > + } > + } > + > + notmuch_database_close (rw_db); > + > + tags = notmuch_message_get_tags (ro_message); > + if (tags) > + printf("SUCCESS\n"); > + return 0; > +} > +EOF > + > +cat <<'EOF' >EXPECTED > +== stdout == > +SUCCESS > +== stderr == > +EOF > +test_expect_equal_file EXPECTED OUTPUT > + > +test_done > -- > 2.11.0 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > https://notmuchmail.org/mailman/listinfo/notmuch