1#!/usr/bin/env bash
2test_description="API tests for notmuch_message_*"
3
4. $(dirname "$0")/test-lib.sh || exit 1
5
6add_email_corpus
7
8test_begin_subtest "building database"
9test_expect_success "NOTMUCH_NEW"
10
11cat <<'EOF' > c_tail
12   if (stat) {
13       const char *stat_str = notmuch_database_status_string (db);
14       if (stat_str)
15           fputs (stat_str, stderr);
16    }
17
18}
19EOF
20
21cat <<EOF > c_head0
22#include <stdio.h>
23#include <notmuch.h>
24#include <notmuch-test.h>
25int main (int argc, char** argv)
26{
27   notmuch_database_t *db;
28   notmuch_status_t stat;
29   char *msg = NULL;
30   notmuch_message_t *message = NULL;
31   const char *id = "1258471718-6781-1-git-send-email-dottedmag@dottedmag.net";
32
33   stat = notmuch_database_open_verbose (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db, &msg);
34   if (stat != NOTMUCH_STATUS_SUCCESS) {
35     fprintf (stderr, "error opening database: %d %s\n", stat, msg ? msg : "");
36     exit (1);
37   }
38   EXPECT0(notmuch_database_find_message (db, id, &message));
39EOF
40
41cp c_head0 c_head
42echo "   EXPECT0(notmuch_database_close (db));" >> c_head
43
44test_begin_subtest "Handle getting message-id from closed database"
45cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
46    {
47        const char *id2;
48        id2=notmuch_message_get_message_id (message);
49        printf("%d\n%d\n", message != NULL, id2==NULL);
50    }
51EOF
52cat <<EOF > EXPECTED
53== stdout ==
541
551
56== stderr ==
57EOF
58test_expect_equal_file EXPECTED OUTPUT
59
60test_begin_subtest "Handle getting thread-id from closed database"
61cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
62    {
63        const char *id2;
64        id2=notmuch_message_get_thread_id (message);
65        printf("%d\n%d\n", message != NULL, id2==NULL);
66    }
67EOF
68cat <<EOF > EXPECTED
69== stdout ==
701
711
72== stderr ==
73EOF
74test_expect_equal_file EXPECTED OUTPUT
75
76test_begin_subtest "Handle getting header from closed database"
77cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
78    {
79        const char *from;
80        from=notmuch_message_get_header (message, "from");
81        printf("%s\n%d\n", id, from == NULL);
82    }
83EOF
84cat <<EOF > EXPECTED
85== stdout ==
861258471718-6781-1-git-send-email-dottedmag@dottedmag.net
871
88== stderr ==
89EOF
90test_expect_equal_file EXPECTED OUTPUT
91
92# XXX this test only tests the trivial code path
93test_begin_subtest "Handle getting replies from closed database"
94cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
95    {
96        notmuch_messages_t *replies;
97        replies = notmuch_message_get_replies (message);
98        printf("%d\n%d\n", message != NULL, replies==NULL);
99    }
100EOF
101cat <<EOF > EXPECTED
102== stdout ==
1031
1041
105== stderr ==
106EOF
107test_expect_equal_file EXPECTED OUTPUT
108
109test_begin_subtest "Handle getting message filename from closed database"
110cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
111    {
112        const char *filename;
113        filename = notmuch_message_get_filename (message);
114        printf("%d\n%d\n", message != NULL, filename == NULL);
115    }
116EOF
117cat <<EOF > EXPECTED
118== stdout ==
1191
1201
121== stderr ==
122EOF
123test_expect_equal_file EXPECTED OUTPUT
124
125test_begin_subtest "Handle getting all message filenames from closed database"
126cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
127    {
128        notmuch_filenames_t *filenames;
129        filenames = notmuch_message_get_filenames (message);
130        printf("%d\n%d\n", message != NULL, filenames == NULL);
131    }
132EOF
133cat <<EOF > EXPECTED
134== stdout ==
1351
1361
137== stderr ==
138EOF
139test_expect_equal_file EXPECTED OUTPUT
140
141test_begin_subtest "iterate over all message filenames from closed database"
142cat c_head0 - c_tail <<'EOF' | test_C ${MAIL_DIR}
143    {
144        notmuch_filenames_t *filenames;
145        filenames = notmuch_message_get_filenames (message);
146        EXPECT0(notmuch_database_close (db));
147        for (; notmuch_filenames_valid (filenames);
148               notmuch_filenames_move_to_next (filenames)) {
149            const char *filename = notmuch_filenames_get (filenames);
150            printf("%s\n", filename);
151        }
152        notmuch_filenames_destroy (filenames);
153        printf("SUCCESS\n");
154    }
155EOF
156cat <<EOF > EXPECTED
157== stdout ==
158MAIL_DIR/01:2,
159SUCCESS
160== stderr ==
161EOF
162test_expect_equal_file EXPECTED OUTPUT
163
164test_begin_subtest "Handle getting ghost flag from closed database"
165cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
166    {
167        notmuch_bool_t result;
168        result = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_GHOST);
169        printf("%d\n%d\n", message != NULL, result == FALSE);
170    }
171EOF
172cat <<EOF > EXPECTED
173== stdout ==
1741
1751
176== stderr ==
177EOF
178test_expect_equal_file EXPECTED OUTPUT
179
180test_begin_subtest "Handle getting date from closed database"
181cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
182    {
183        time_t result;
184        result = notmuch_message_get_date (message);
185        printf("%d\n%d\n", message != NULL, result == 0);
186    }
187EOF
188cat <<EOF > EXPECTED
189== stdout ==
1901
1911
192== stderr ==
193EOF
194test_expect_equal_file EXPECTED OUTPUT
195
196test_begin_subtest "Handle getting tags from closed database"
197cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
198    {
199        notmuch_tags_t *result;
200        result = notmuch_message_get_tags (message);
201        printf("%d\n%d\n", message != NULL, result == NULL);
202    }
203EOF
204cat <<EOF > EXPECTED
205== stdout ==
2061
2071
208== stderr ==
209EOF
210test_expect_equal_file EXPECTED OUTPUT
211
212test_begin_subtest "Handle counting files from closed database"
213cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
214    {
215        int result;
216        result = notmuch_message_count_files (message);
217        printf("%d\n%d\n", message != NULL, result < 0);
218    }
219EOF
220cat <<EOF > EXPECTED
221== stdout ==
2221
2231
224== stderr ==
225EOF
226test_expect_equal_file EXPECTED OUTPUT
227
228test_begin_subtest "Handle adding tag with closed database"
229cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
230    {
231        notmuch_status_t status;
232        status = notmuch_message_add_tag (message, "boom");
233        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
234    }
235EOF
236cat <<EOF > EXPECTED
237== stdout ==
2381
2391
240== stderr ==
241EOF
242test_expect_equal_file EXPECTED OUTPUT
243
244test_begin_subtest "Handle removing tag with closed database"
245cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
246    {
247        notmuch_status_t status;
248        status = notmuch_message_remove_tag (message, "boom");
249        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
250    }
251EOF
252cat <<EOF > EXPECTED
253== stdout ==
2541
2551
256== stderr ==
257EOF
258test_expect_equal_file EXPECTED OUTPUT
259
260test_begin_subtest "Handle read maildir flag with closed database"
261cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
262    {
263        notmuch_bool_t is_set = -1;
264        is_set = notmuch_message_has_maildir_flag (message, 'S');
265        printf("%d\n%d\n", message != NULL, is_set == FALSE || is_set == TRUE);
266    }
267EOF
268cat <<EOF > EXPECTED
269== stdout ==
2701
2711
272== stderr ==
273EOF
274test_expect_equal_file EXPECTED OUTPUT
275
276test_begin_subtest "Handle checking maildir flag with closed db (new API)"
277cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
278    {
279        notmuch_status_t status;
280        notmuch_bool_t out;
281        status = notmuch_message_has_maildir_flag_st (message, 'S', &out);
282        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
283    }
284EOF
285cat <<EOF > EXPECTED
286== stdout ==
2871
2881
289== stderr ==
290EOF
291test_expect_equal_file EXPECTED OUTPUT
292
293test_begin_subtest "Handle converting maildir flags to tags with closed db"
294cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
295    {
296        notmuch_status_t status;
297        status = notmuch_message_maildir_flags_to_tags (message);
298        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
299    }
300EOF
301cat <<EOF > EXPECTED
302== stdout ==
3031
3041
305== stderr ==
306EOF
307test_expect_equal_file EXPECTED OUTPUT
308
309test_begin_subtest "Handle removing all tags with closed db"
310cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
311    {
312        notmuch_status_t status;
313        status = notmuch_message_remove_all_tags (message);
314        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
315    }
316EOF
317cat <<EOF > EXPECTED
318== stdout ==
3191
3201
321== stderr ==
322EOF
323test_expect_equal_file EXPECTED OUTPUT
324
325test_begin_subtest "Handle freezing message with closed db"
326cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
327    {
328        notmuch_status_t status;
329        status = notmuch_message_freeze (message);
330        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_SUCCESS);
331    }
332EOF
333cat <<EOF > EXPECTED
334== stdout ==
3351
3361
337== stderr ==
338EOF
339test_expect_equal_file EXPECTED OUTPUT
340
341test_begin_subtest "Handle thawing message with closed db"
342cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
343    {
344        notmuch_status_t status;
345        status = notmuch_message_thaw (message);
346        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW);
347    }
348EOF
349cat <<EOF > EXPECTED
350== stdout ==
3511
3521
353== stderr ==
354EOF
355test_expect_equal_file EXPECTED OUTPUT
356
357test_begin_subtest "Handle destroying message with closed db"
358cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
359    {
360        notmuch_message_destroy (message);
361        printf("%d\n%d\n", message != NULL, 1);
362    }
363EOF
364cat <<EOF > EXPECTED
365== stdout ==
3661
3671
368== stderr ==
369EOF
370test_expect_equal_file EXPECTED OUTPUT
371
372test_begin_subtest "Handle retrieving closed db from message"
373cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
374    {
375        notmuch_database_t *db2;
376        db2 = notmuch_message_get_database (message);
377        printf("%d\n%d\n", message != NULL, db == db2);
378    }
379EOF
380cat <<EOF > EXPECTED
381== stdout ==
3821
3831
384== stderr ==
385EOF
386test_expect_equal_file EXPECTED OUTPUT
387
388test_begin_subtest "Handle reindexing message with closed db"
389cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
390    {
391        notmuch_status_t status;
392        status = notmuch_message_reindex (message, NULL);
393        printf("%d\n%d\n", message != NULL, status == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
394    }
395EOF
396cat <<EOF > EXPECTED
397== stdout ==
3981
3991
400== stderr ==
401EOF
402test_expect_equal_file EXPECTED OUTPUT
403
404test_done
405