+ printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
+ }
+EOF
+cat <<EOF > EXPECTED
+== stdout ==
+1
+1
+== stderr ==
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "_notmuch_message_add_term catches exceptions"
+cat c_head0 - c_tail <<'EOF' | test_private_C ${MAIL_DIR}
+ {
+ notmuch_private_status_t status;
+ /* This relies on Xapian throwing an exception for adding empty terms */
+ status = _notmuch_message_add_term (message, "body", "");
+ printf("%d\n%d\n", message != NULL, status != NOTMUCH_STATUS_SUCCESS );
+ }
+EOF
+cat <<EOF > EXPECTED
+== stdout ==
+1
+1
+== stderr ==
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "_notmuch_message_remove_term catches exceptions"
+cat c_head0 - c_tail <<'EOF' | test_private_C ${MAIL_DIR}
+ {
+ notmuch_private_status_t status;
+ /* Xapian throws the same exception for empty and non-existent terms;
+ * error string varies between Xapian versions. */
+ status = _notmuch_message_remove_term (message, "tag", "nonexistent");
+ printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_SUCCESS );
+ }
+EOF
+cat <<EOF > EXPECTED
+== stdout ==
+1
+1
+== stderr ==
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "_notmuch_message_add_filename on closed db"
+cat c_head - c_tail <<'EOF' | test_private_C ${MAIL_DIR}
+ {
+ notmuch_private_status_t status;
+ status = _notmuch_message_add_filename (message, "some-filename");
+ printf("%d\n%d\n", message != NULL, status != NOTMUCH_STATUS_SUCCESS);
+ }
+EOF
+cat <<EOF > EXPECTED
+== stdout ==
+1
+1
+== stderr ==
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "_notmuch_message_remove_filename on closed db"
+cat c_head - c_tail <<'EOF' | test_private_C ${MAIL_DIR}
+ {
+ notmuch_private_status_t status;
+ status = _notmuch_message_remove_filename (message, "some-filename");
+ printf("%d\n%d\n", message != NULL, status != NOTMUCH_STATUS_SUCCESS);