1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
#!/usr/bin/env bash
test_description='"notmuch count" for messages and threads'
. $(dirname "$0")/test-lib.sh || exit 1
add_email_corpus
# Note: The 'wc -l' results below are wrapped in arithmetic evaluation
# $((...)) to strip whitespace. This is for portability, as 'wc -l'
# emits whitespace on some BSD variants.
test_begin_subtest "message count is the default for notmuch count"
test_expect_equal \
"$((`notmuch search --output=messages '*' | wc -l`))" \
"`notmuch count '*'`"
test_begin_subtest "message count with --output=messages"
test_expect_equal \
"$((`notmuch search --output=messages '*' | wc -l`))" \
"`notmuch count --output=messages '*'`"
test_begin_subtest "thread count with --output=threads"
test_expect_equal \
"$((`notmuch search --output=threads '*' | wc -l`))" \
"`notmuch count --output=threads '*'`"
test_begin_subtest "thread count is the default for notmuch search"
test_expect_equal \
"$((`notmuch search '*' | wc -l`))" \
"`notmuch count --output=threads '*'`"
test_begin_subtest "files count"
test_expect_equal \
"$((`notmuch search --output=files '*' | wc -l`))" \
"`notmuch count --output=files '*'`"
test_begin_subtest "files count for a duplicate message-id"
test_expect_equal \
"2" \
"`notmuch count --output=files id:20091117232137.GA7669@griffis1.net`"
test_begin_subtest "count with no matching messages"
test_expect_equal \
"0" \
"`notmuch count --output=messages from:cworth and not from:cworth`"
test_begin_subtest "count with no matching threads"
test_expect_equal \
"0" \
"`notmuch count --output=threads from:cworth and not from:cworth`"
test_begin_subtest "message count is the default for batch count"
notmuch count --batch >OUTPUT <<EOF
from:cworth
EOF
notmuch count --output=messages >EXPECTED
notmuch count --output=messages from:cworth >>EXPECTED
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "batch message count"
notmuch count --batch --output=messages >OUTPUT <<EOF
from:cworth
tag:inbox
EOF
notmuch count --output=messages from:cworth >EXPECTED
notmuch count --output=messages >>EXPECTED
notmuch count --output=messages tag:inbox >>EXPECTED
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "batch thread count"
notmuch count --batch --output=threads >OUTPUT <<EOF
from:cworth
from:cworth and not from:cworth
foo
EOF
notmuch count --output=threads >EXPECTED
notmuch count --output=threads from:cworth >>EXPECTED
notmuch count --output=threads from:cworth and not from:cworth >>EXPECTED
notmuch count --output=threads foo >>EXPECTED
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "batch message count with input file"
cat >INPUT <<EOF
from:cworth
tag:inbox
EOF
notmuch count --input=INPUT --output=messages >OUTPUT
notmuch count --output=messages from:cworth >EXPECTED
notmuch count --output=messages >>EXPECTED
notmuch count --output=messages tag:inbox >>EXPECTED
test_expect_equal_file EXPECTED OUTPUT
backup_database
test_begin_subtest "error message for database open"
target=(${MAIL_DIR}/.notmuch/xapian/postlist.*)
dd if=/dev/zero of="$target" count=3
notmuch count '*' 2>OUTPUT 1>/dev/null
output=$(sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' OUTPUT)
test_expect_equal "${output}" "A Xapian exception occurred opening database"
restore_database
make_shim qsm-shim<<EOF
#include <notmuch-test.h>
WRAP_DLFUNC (notmuch_status_t, notmuch_query_search_messages, (notmuch_query_t *query, notmuch_messages_t **messages))
/* XXX WARNING THIS CORRUPTS THE DATABASE */
int fd = open ("target_postlist", O_WRONLY|O_TRUNC);
if (fd < 0)
exit (8);
close (fd);
return notmuch_query_search_messages_orig(query, messages);
}
EOF
backup_database
test_begin_subtest "error message from query_search_messages"
ln -s ${MAIL_DIR}/.notmuch/xapian/postlist.* target_postlist
notmuch_with_shim qsm-shim count --output=files '*' 2>OUTPUT 1>/dev/null
cat <<EOF > EXPECTED
notmuch count: A Xapian exception occurred
A Xapian exception occurred performing query
Query string was: *
EOF
sed 's/^\(A Xapian exception [^:]*\):.*$/\1/' < OUTPUT > OUTPUT.clean
test_expect_equal_file EXPECTED OUTPUT.clean
restore_database
test_begin_subtest "count library function is non-destructive"
cat<<EOF > EXPECTED
== stdout ==
1: 52 messages
2: 52 messages
Exclude 'spam'
3: 52 messages
4: 52 messages
== stderr ==
EOF
test_C ${MAIL_DIR} <<'EOF' > OUTPUT
#include <notmuch-test.h>
int main (int argc, char** argv)
{
notmuch_database_t *db;
notmuch_status_t stat = NOTMUCH_STATUS_SUCCESS;
char *msg = NULL;
notmuch_query_t *query;
const char *str = "tag:inbox or tag:spam";
const char *tag_str = "spam";
unsigned int count;
stat=notmuch_database_open_with_config (argv[1],
NOTMUCH_DATABASE_MODE_READ_ONLY,
NULL, NULL, &db, &msg);
if (stat) {
fprintf (stderr, "open: %s\n", msg);
exit(1);
}
EXPECT0(notmuch_query_create_with_syntax (db, str,
NOTMUCH_QUERY_SYNTAX_XAPIAN, &query));
EXPECT0(notmuch_query_count_messages (query, &count));
printf("1: %d messages\n", count);
EXPECT0(notmuch_query_count_messages (query, &count));
printf("2: %d messages\n", count);
printf("Exclude '%s'\n",tag_str);
stat = notmuch_query_add_tag_exclude (query, tag_str);
if (stat && stat != NOTMUCH_STATUS_IGNORED) {
fprintf(stderr, "status=%d\n", stat);
exit(1);
}
EXPECT0(notmuch_query_count_messages (query, &count));
printf("3: %d messages\n", count);
EXPECT0(notmuch_query_count_messages (query, &count));
printf("4: %d messages\n", count);
}
EOF
test_expect_equal_file EXPECTED OUTPUT
if [ "${NOTMUCH_HAVE_SFSEXP-0}" = "1" ]; then
test_begin_subtest "and of exact terms (query=sexp)"
output=$(notmuch count --query=sexp '(and "wonderful" "wizard")')
test_expect_equal "$output" 1
test_begin_subtest "or of exact terms (query=sexp)"
output=$(notmuch count --query=sexp '(or "php" "wizard")')
test_expect_equal "$output" 2
test_begin_subtest "starts-with, case-insensitive (query=sexp)"
output=$(notmuch count --query=sexp '(starts-with FreeB)')
test_expect_equal "$output" 5
test_begin_subtest "query that matches no messages (query=sexp)"
count=$(notmuch count --query=sexp '(and (from keithp) (to keithp))')
test_expect_equal 0 "$count"
test_begin_subtest "Compound subquery (query=sexp)"
output=$(notmuch count --query=sexp '(thread (of (from keithp) (subject Maildir)))')
test_expect_equal "$output" 7
fi
test_done
|