]> git.notmuchmail.org Git - notmuch/blob - test/T590-libconfig.sh
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / test / T590-libconfig.sh
1 #!/usr/bin/env bash
2 test_description="library config API"
3
4 . $(dirname "$0")/test-lib.sh || exit 1
5
6 add_email_corpus
7
8 cat <<EOF > c_head
9 #include <string.h>
10 #include <stdlib.h>
11 #include <notmuch-test.h>
12
13 int main (int argc, char** argv)
14 {
15    notmuch_database_t *db;
16    char *val;
17    notmuch_status_t stat;
18    char *msg = NULL;
19
20    for (int i = 1; i < argc; i++)
21       if (strcmp (argv[i], "%NULL%") == 0) argv[i] = NULL;
22
23    stat = notmuch_database_open_with_config (argv[1],
24                                               NOTMUCH_DATABASE_MODE_READ_WRITE,
25                                               argv[2],
26                                               argv[3],
27                                               &db,
28                                               &msg);
29    if (stat != NOTMUCH_STATUS_SUCCESS) {
30      fprintf (stderr, "error opening database\n%s\n%s\n", notmuch_status_to_string (stat), msg ? msg : "");
31      exit (1);
32    }
33 EOF
34
35 cat <<EOF > c_tail
36    EXPECT0(notmuch_database_destroy(db));
37 }
38 EOF
39
40 test_begin_subtest "notmuch_database_{set,get}_config"
41 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
42 {
43    EXPECT0(notmuch_database_set_config (db, "test.key1", "testvalue1"));
44    EXPECT0(notmuch_database_set_config (db, "test.key2", "testvalue2"));
45    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
46    printf("test.key1 = %s\n", val);
47    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
48    printf("test.key2 = %s\n", val);
49 }
50 EOF
51 cat <<'EOF' >EXPECTED
52 == stdout ==
53 test.key1 = testvalue1
54 test.key2 = testvalue2
55 == stderr ==
56 EOF
57 test_expect_equal_file EXPECTED OUTPUT
58
59
60 test_begin_subtest "notmuch_database_get_config_list: empty list"
61 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
62 {
63    notmuch_config_list_t *list;
64    EXPECT0(notmuch_database_get_config_list (db, "nonexistent", &list));
65    printf("valid = %d\n", notmuch_config_list_valid (list));
66    notmuch_config_list_destroy (list);
67 }
68 EOF
69 cat <<'EOF' >EXPECTED
70 == stdout ==
71 valid = 0
72 == stderr ==
73 EOF
74 test_expect_equal_file EXPECTED OUTPUT
75
76 test_begin_subtest "notmuch_database_get_config_list: closed db"
77 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
78 {
79    notmuch_config_list_t *list;
80    EXPECT0(notmuch_database_close (db));
81    stat = notmuch_database_get_config_list (db, "nonexistent", &list);
82    printf("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
83 }
84 EOF
85 cat <<'EOF' >EXPECTED
86 == stdout ==
87 1
88 == stderr ==
89 EOF
90 test_expect_equal_file EXPECTED OUTPUT
91
92 test_begin_subtest "notmuch_database_get_config_list: all pairs"
93 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
94 {
95    notmuch_config_list_t *list;
96    EXPECT0(notmuch_database_set_config (db, "zzzafter", "afterval"));
97    EXPECT0(notmuch_database_set_config (db, "aaabefore", "beforeval"));
98    EXPECT0(notmuch_database_get_config_list (db, "", &list));
99    for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
100       printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
101    }
102    notmuch_config_list_destroy (list);
103 }
104 EOF
105 cat <<'EOF' >EXPECTED
106 == stdout ==
107 aaabefore beforeval
108 test.key1 testvalue1
109 test.key2 testvalue2
110 zzzafter afterval
111 == stderr ==
112 EOF
113 test_expect_equal_file EXPECTED OUTPUT
114
115 test_begin_subtest "notmuch_database_get_config_list: all pairs (closed db)"
116 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
117 {
118    notmuch_config_list_t *list;
119    EXPECT0(notmuch_database_get_config_list (db, "", &list));
120    EXPECT0(notmuch_database_close (db));
121    for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
122       printf("%s %d\n", notmuch_config_list_key (list), NULL == notmuch_config_list_value(list));
123    }
124    notmuch_config_list_destroy (list);
125 }
126 EOF
127 cat <<'EOF' >EXPECTED
128 == stdout ==
129 aaabefore 1
130 test.key1 1
131 test.key2 1
132 zzzafter 1
133 == stderr ==
134 EOF
135 test_expect_equal_file EXPECTED OUTPUT
136
137 test_begin_subtest "notmuch_database_get_config_list: one prefix"
138 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
139 {
140    notmuch_config_list_t *list;
141    EXPECT0(notmuch_database_get_config_list (db, "test.key", &list));
142    for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
143       printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
144    }
145    notmuch_config_list_destroy (list);
146 }
147 EOF
148 cat <<'EOF' >EXPECTED
149 == stdout ==
150 test.key1 testvalue1
151 test.key2 testvalue2
152 == stderr ==
153 EOF
154 test_expect_equal_file EXPECTED OUTPUT
155
156 test_begin_subtest "dump config"
157 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
158 {
159     EXPECT0(notmuch_database_set_config (db, "key with spaces", "value, with, spaces!"));
160 }
161 EOF
162 notmuch dump --include=config >OUTPUT
163 cat <<'EOF' >EXPECTED
164 #notmuch-dump batch-tag:3 config
165 #@ aaabefore beforeval
166 #@ key%20with%20spaces value,%20with,%20spaces%21
167 #@ test.key1 testvalue1
168 #@ test.key2 testvalue2
169 #@ zzzafter afterval
170 EOF
171 test_expect_equal_file EXPECTED OUTPUT
172
173 test_begin_subtest "restore config"
174 notmuch dump --include=config >EXPECTED
175 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
176 {
177     EXPECT0(notmuch_database_set_config (db, "test.key1", "mutatedvalue"));
178 }
179 EOF
180 notmuch restore --include=config <EXPECTED
181 notmuch dump --include=config >OUTPUT
182 test_expect_equal_file EXPECTED OUTPUT
183
184 backup_database
185 test_begin_subtest "override config from file"
186 notmuch config set test.key1 overridden
187 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
188 {
189    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
190    printf("test.key1 = %s\n", val);
191    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
192    printf("test.key2 = %s\n", val);
193 }
194 EOF
195 cat <<'EOF' >EXPECTED
196 == stdout ==
197 test.key1 = overridden
198 test.key2 = testvalue2
199 == stderr ==
200 EOF
201 test_expect_equal_file EXPECTED OUTPUT
202 restore_database
203
204 test_begin_subtest "NOTMUCH_CONFIG_HOOK_DIR: traditional"
205 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
206 {
207    const char *val = notmuch_config_get (db, NOTMUCH_CONFIG_HOOK_DIR);
208    printf("database.hook_dir = %s\n", val);
209 }
210 EOF
211 cat <<'EOF' >EXPECTED
212 == stdout ==
213 database.hook_dir = MAIL_DIR/.notmuch/hooks
214 == stderr ==
215 EOF
216 test_expect_equal_file EXPECTED OUTPUT
217
218 test_begin_subtest "NOTMUCH_CONFIG_HOOK_DIR: xdg"
219 dir="${HOME}/.config/notmuch/default/hooks"
220 mkdir -p $dir
221 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
222 {
223    const char *val = notmuch_config_get (db, NOTMUCH_CONFIG_HOOK_DIR);
224    printf("database.hook_dir = %s\n", val);
225 }
226 EOF
227 cat <<'EOF' >EXPECTED
228 == stdout ==
229 database.hook_dir = CWD/home/.config/notmuch/default/hooks
230 == stderr ==
231 EOF
232 rmdir $dir
233 test_expect_equal_file EXPECTED OUTPUT
234
235 test_begin_subtest "notmuch_config_get_values"
236 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
237 {
238     notmuch_config_values_t *values;
239     EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
240     for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
241          notmuch_config_values_valid (values);
242          notmuch_config_values_move_to_next (values))
243     {
244           puts (notmuch_config_values_get (values));
245     }
246 }
247 EOF
248 cat <<'EOF' >EXPECTED
249 == stdout ==
250 a
251 b
252 c
253 == stderr ==
254 EOF
255 test_expect_equal_file EXPECTED OUTPUT
256 restore_database
257
258 test_begin_subtest "notmuch_config_get_values_string"
259 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
260 {
261     notmuch_config_values_t *values;
262     EXPECT0(notmuch_database_set_config (db, "test.list", "x;y;z"));
263     for (values = notmuch_config_get_values_string (db, "test.list");
264          notmuch_config_values_valid (values);
265          notmuch_config_values_move_to_next (values))
266     {
267           puts (notmuch_config_values_get (values));
268     }
269 }
270 EOF
271 cat <<'EOF' >EXPECTED
272 == stdout ==
273 x
274 y
275 z
276 == stderr ==
277 EOF
278 test_expect_equal_file EXPECTED OUTPUT
279 restore_database
280
281 test_begin_subtest "notmuch_config_get_values (restart)"
282 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
283 {
284     notmuch_config_values_t *values;
285     EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
286     for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
287          notmuch_config_values_valid (values);
288          notmuch_config_values_move_to_next (values))
289     {
290           puts (notmuch_config_values_get (values));
291     }
292     for (notmuch_config_values_start (values);
293          notmuch_config_values_valid (values);
294          notmuch_config_values_move_to_next (values))
295     {
296           puts (notmuch_config_values_get (values));
297     }
298 }
299 EOF
300 cat <<'EOF' >EXPECTED
301 == stdout ==
302 a
303 b
304 c
305 a
306 b
307 c
308 == stderr ==
309 EOF
310 test_expect_equal_file EXPECTED OUTPUT
311 restore_database
312
313 backup_database
314 test_begin_subtest "notmuch_config_get_values, trailing ;"
315 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
316 {
317     notmuch_config_values_t *values;
318     EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
319     for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
320          notmuch_config_values_valid (values);
321          notmuch_config_values_move_to_next (values))
322     {
323           puts (notmuch_config_values_get (values));
324     }
325 }
326 EOF
327 cat <<'EOF' >EXPECTED
328 == stdout ==
329 a
330 b
331 c
332 == stderr ==
333 EOF
334 test_expect_equal_file EXPECTED OUTPUT
335 restore_database
336
337 backup_database
338 test_begin_subtest "get config by key"
339 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
340 {
341    printf("before = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
342    EXPECT0(notmuch_database_set_config (db, "maildir.synchronize_flags", "false"));
343    printf("after = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
344 }
345 EOF
346 cat <<'EOF' >EXPECTED
347 == stdout ==
348 before = true
349 after = false
350 == stderr ==
351 EOF
352 test_expect_equal_file EXPECTED OUTPUT
353 restore_database
354
355 backup_database
356 test_begin_subtest "set config by key"
357 notmuch config set test.key1 overridden
358 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
359 {
360    printf("before = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
361    EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS, "false"));
362    printf("after = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
363 }
364 EOF
365 cat <<'EOF' >EXPECTED
366 == stdout ==
367 before = true
368 after = false
369 == stderr ==
370 EOF
371 test_expect_equal_file EXPECTED OUTPUT
372 restore_database
373
374 test_begin_subtest "load default values"
375 export MAILDIR=${MAIL_DIR}
376 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} '' %NULL%
377 {
378     notmuch_config_key_t key;
379     for (key = NOTMUCH_CONFIG_FIRST;
380          key < NOTMUCH_CONFIG_LAST;
381          key = (notmuch_config_key_t)(key + 1)) {
382         const char *val = notmuch_config_get (db, key);
383         printf("%s\n", val ? val : "NULL" );
384     }
385 }
386 EOF
387
388 notmuch_passwd_sanitize < OUTPUT > OUTPUT.clean
389
390 cat <<'EOF' >EXPECTED
391 == stdout ==
392 MAIL_DIR
393 MAIL_DIR
394 MAIL_DIR/.notmuch/hooks
395 MAIL_DIR/.notmuch/backups
396
397 unread;inbox
398
399 true
400 USERNAME@FQDN
401 NULL
402 USER_FULL_NAME
403 == stderr ==
404 EOF
405 unset MAILDIR
406 test_expect_equal_file EXPECTED OUTPUT.clean
407
408 backup_database
409 test_begin_subtest "override config from \${NOTMUCH_CONFIG}"
410 notmuch config set test.key1 overridden
411 # second argument omitted to make argv[2] == NULL
412 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
413 {
414    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
415    printf("test.key1 = %s\n", val);
416    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
417    printf("test.key2 = %s\n", val);
418 }
419 EOF
420 notmuch config set test.key1
421 cat <<'EOF' >EXPECTED
422 == stdout ==
423 test.key1 = overridden
424 test.key2 = testvalue2
425 == stderr ==
426 EOF
427 test_expect_equal_file EXPECTED OUTPUT
428 restore_database
429
430 backup_database
431 test_begin_subtest "override config from \${HOME}/.notmuch-config"
432 ovconfig=${HOME}/.notmuch-config
433 cp ${NOTMUCH_CONFIG} ${ovconfig}
434 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
435 unset NOTMUCH_CONFIG
436 notmuch --config=${ovconfig} config set test.key1 overridden-home
437 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
438 {
439    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
440    printf("test.key1 = %s\n", val);
441    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
442    printf("test.key2 = %s\n", val);
443 }
444 EOF
445 rm -f ${ovconfig}
446 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
447 cat <<'EOF' >EXPECTED
448 == stdout ==
449 test.key1 = overridden-home
450 test.key2 = testvalue2
451 == stderr ==
452 EOF
453 test_expect_equal_file EXPECTED OUTPUT
454 restore_database
455
456 backup_database
457 test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch"
458 ovconfig=${HOME}/.config/notmuch/default/config
459 mkdir -p $(dirname ${ovconfig})
460 cp ${NOTMUCH_CONFIG} ${ovconfig}
461 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
462 unset NOTMUCH_CONFIG
463 notmuch --config=${ovconfig} config set test.key1 overridden-xdg
464 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
465 {
466    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
467    printf("test.key1 = %s\n", val);
468    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
469    printf("test.key2 = %s\n", val);
470 }
471 EOF
472 rm -f ${ovconfig}
473 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
474 cat <<'EOF' >EXPECTED
475 == stdout ==
476 test.key1 = overridden-xdg
477 test.key2 = testvalue2
478 == stderr ==
479 EOF
480 test_expect_equal_file EXPECTED OUTPUT
481 restore_database
482
483 backup_database
484 test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch with profile"
485 ovconfig=${HOME}/.config/notmuch/work/config
486 mkdir -p $(dirname ${ovconfig})
487 cp ${NOTMUCH_CONFIG} ${ovconfig}
488 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
489 unset NOTMUCH_CONFIG
490 notmuch --config=${ovconfig} config set test.key1 overridden-xdg-profile
491 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work
492 {
493    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
494    printf("test.key1 = %s\n", val);
495    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
496    printf("test.key2 = %s\n", val);
497 }
498 EOF
499 rm -f ${ovconfig}
500 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
501 cat <<'EOF' >EXPECTED
502 == stdout ==
503 test.key1 = overridden-xdg-profile
504 test.key2 = testvalue2
505 == stderr ==
506 EOF
507 test_expect_equal_file EXPECTED OUTPUT
508 restore_database
509
510 backup_database
511 test_begin_subtest "override config from \${HOME}/.notmuch-config.work (via args)"
512 ovconfig=${HOME}/.notmuch-config.work
513 cp ${NOTMUCH_CONFIG} ${ovconfig}
514 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
515 unset NOTMUCH_CONFIG
516 notmuch --config=${ovconfig} config set test.key1 overridden-profile
517 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work
518 {
519    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
520    printf("test.key1 = %s\n", val);
521    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
522    printf("test.key2 = %s\n", val);
523 }
524 EOF
525 #rm -f ${ovconfig}
526 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
527 cat <<'EOF' >EXPECTED
528 == stdout ==
529 test.key1 = overridden-profile
530 test.key2 = testvalue2
531 == stderr ==
532 EOF
533 test_expect_equal_file EXPECTED OUTPUT
534 restore_database
535
536 test_begin_subtest "no config, fail to open database"
537 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
538 unset NOTMUCH_CONFIG
539 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
540 {
541    printf("NOT RUN");
542 }
543 EOF
544 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
545 cat <<'EOF' >EXPECTED
546 == stdout ==
547 == stderr ==
548 error opening database
549 Something went wrong trying to read or write a file
550 Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such file or directory.
551
552 EOF
553 test_expect_equal_file EXPECTED OUTPUT
554
555 test_begin_subtest "open database from NOTMUCH_DATABASE"
556 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
557 unset NOTMUCH_CONFIG
558 export NOTMUCH_DATABASE=${MAIL_DIR}
559 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
560 {
561    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
562    printf("test.key1 = %s\n", val);
563    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
564    printf("test.key2 = %s\n", val);
565 }
566 EOF
567 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
568 unset NOTMUCH_DATABASE
569 cat <<'EOF' >EXPECTED
570 == stdout ==
571 test.key1 = testvalue1
572 test.key2 = testvalue2
573 == stderr ==
574 EOF
575 test_expect_equal_file EXPECTED OUTPUT
576
577 test_begin_subtest "NOTMUCH_DATABASE overrides config"
578 cp notmuch-config notmuch-config.bak
579 notmuch config set database.path /nonexistent
580 export NOTMUCH_DATABASE=${MAIL_DIR}
581 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
582 {
583    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
584    printf("test.key1 = %s\n", val);
585    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
586    printf("test.key2 = %s\n", val);
587 }
588 EOF
589 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
590 unset NOTMUCH_DATABASE
591 cat <<'EOF' >EXPECTED
592 == stdout ==
593 test.key1 = testvalue1
594 test.key2 = testvalue2
595 == stderr ==
596 EOF
597 cp notmuch-config.bak notmuch-config
598 test_expect_equal_file EXPECTED OUTPUT
599
600 cat <<EOF > c_head2
601 #include <string.h>
602 #include <stdlib.h>
603 #include <notmuch-test.h>
604
605 int main (int argc, char** argv)
606 {
607    notmuch_database_t *db;
608    char *val;
609    notmuch_status_t stat;
610    char *msg = NULL;
611
612    for (int i = 1; i < argc; i++)
613       if (strcmp (argv[i], "%NULL%") == 0) argv[i] = NULL;
614
615    stat = notmuch_database_load_config (argv[1],
616                                         argv[2],
617                                         argv[3],
618                                         &db,
619                                         &msg);
620    if (stat != NOTMUCH_STATUS_SUCCESS  && stat != NOTMUCH_STATUS_NO_CONFIG) {
621      fprintf (stderr, "error opening database\n%d: %s\n%s\n", stat,
622               notmuch_status_to_string (stat), msg ? msg : "");
623      exit (1);
624    }
625 EOF
626
627
628 test_begin_subtest "notmuch_database_get_config (ndlc)"
629 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
630 {
631    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
632    printf("test.key1 = %s\n", val);
633    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
634    printf("test.key2 = %s\n", val);
635 }
636 EOF
637 cat <<'EOF' >EXPECTED
638 == stdout ==
639 test.key1 = testvalue1
640 test.key2 = testvalue2
641 == stderr ==
642 EOF
643 test_expect_equal_file EXPECTED OUTPUT
644
645
646 test_begin_subtest "notmuch_database_get_config_list: all pairs (ndlc)"
647 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
648 {
649    notmuch_config_list_t *list;
650    EXPECT0(notmuch_database_get_config_list (db, "", &list));
651    for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
652       printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
653    }
654    notmuch_config_list_destroy (list);
655 }
656 EOF
657 cat <<'EOF' >EXPECTED
658 == stdout ==
659 aaabefore beforeval
660 key with spaces value, with, spaces!
661 test.key1 testvalue1
662 test.key2 testvalue2
663 zzzafter afterval
664 == stderr ==
665 EOF
666 test_expect_equal_file EXPECTED OUTPUT
667
668 test_begin_subtest "notmuch_database_get_config_list: one prefix (ndlc)"
669 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
670 {
671    notmuch_config_list_t *list;
672    EXPECT0(notmuch_database_get_config_list (db, "test.key", &list));
673    for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
674       printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
675    }
676    notmuch_config_list_destroy (list);
677 }
678 EOF
679 cat <<'EOF' >EXPECTED
680 == stdout ==
681 test.key1 testvalue1
682 test.key2 testvalue2
683 == stderr ==
684 EOF
685 test_expect_equal_file EXPECTED OUTPUT
686
687 test_begin_subtest "list by keys (ndlc)"
688 notmuch config set search.exclude_tags "foo;bar;fub"
689 notmuch config set new.ignore "sekrit_junk"
690 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
691 {
692     notmuch_config_key_t key;
693     for (key = NOTMUCH_CONFIG_FIRST;
694          key < NOTMUCH_CONFIG_LAST;
695          key = (notmuch_config_key_t)(key + 1)) {
696         const char *val = notmuch_config_get (db, key);
697         printf("%s\n", val ? val : "NULL" );
698     }
699 }
700 EOF
701 cat <<'EOF' >EXPECTED
702 == stdout ==
703 MAIL_DIR
704 MAIL_DIR
705 MAIL_DIR/.notmuch/hooks
706 MAIL_DIR/.notmuch/backups
707 foo;bar;fub
708 unread;inbox
709 sekrit_junk
710 true
711 test_suite@notmuchmail.org
712 test_suite_other@notmuchmail.org;test_suite@otherdomain.org
713 Notmuch Test Suite
714 == stderr ==
715 EOF
716 test_expect_equal_file EXPECTED OUTPUT
717
718 test_begin_subtest "load default values (ndlc, nonexistent config)"
719 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} /nonexistent %NULL%
720 {
721     notmuch_config_key_t key;
722     for (key = NOTMUCH_CONFIG_FIRST;
723          key < NOTMUCH_CONFIG_LAST;
724          key = (notmuch_config_key_t)(key + 1)) {
725         const char *val = notmuch_config_get (db, key);
726         printf("%s\n", val ? val : "NULL" );
727     }
728 }
729 EOF
730
731 notmuch_passwd_sanitize < OUTPUT > OUTPUT.clean
732 cat <<'EOF' >EXPECTED
733 == stdout ==
734 MAIL_DIR
735 MAIL_DIR
736 MAIL_DIR/.notmuch/hooks
737 MAIL_DIR/.notmuch/backups
738
739 unread;inbox
740
741 true
742 USERNAME@FQDN
743 NULL
744 USER_FULL_NAME
745 == stderr ==
746 EOF
747 test_expect_equal_file EXPECTED OUTPUT.clean
748
749 backup_database
750 test_begin_subtest "override config from \${HOME}/.notmuch-config (ndlc)"
751 ovconfig=${HOME}/.notmuch-config
752 cp ${NOTMUCH_CONFIG} ${ovconfig}
753 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
754 unset NOTMUCH_CONFIG
755 notmuch --config=${ovconfig} config set test.key1 overridden-home
756 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
757 {
758    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
759    printf("test.key1 = %s\n", val);
760    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
761    printf("test.key2 = %s\n", val);
762 }
763 EOF
764 rm -f ${ovconfig}
765 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
766 cat <<'EOF' >EXPECTED
767 == stdout ==
768 test.key1 = overridden-home
769 test.key2 = testvalue2
770 == stderr ==
771 EOF
772 test_expect_equal_file EXPECTED OUTPUT
773 restore_database
774
775 test_begin_subtest "notmuch_config_get_pairs: prefix (ndlc)"
776 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
777 {
778    notmuch_config_pairs_t *list;
779    for (list =  notmuch_config_get_pairs (db, "user.");
780         notmuch_config_pairs_valid (list);
781         notmuch_config_pairs_move_to_next (list)) {
782      printf("%s %s\n", notmuch_config_pairs_key (list), notmuch_config_pairs_value(list));
783    }
784    notmuch_config_pairs_destroy (list);
785 }
786 EOF
787 cat <<'EOF' >EXPECTED
788 == stdout ==
789 user.name Notmuch Test Suite
790 user.other_email test_suite_other@notmuchmail.org;test_suite@otherdomain.org
791 user.primary_email test_suite@notmuchmail.org
792 == stderr ==
793 EOF
794 test_expect_equal_file EXPECTED OUTPUT
795
796 test_begin_subtest "notmuch_config_get_pairs: all pairs (ndlc)"
797 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
798 {
799    notmuch_config_pairs_t *list;
800    for (list =  notmuch_config_get_pairs (db, "");
801         notmuch_config_pairs_valid (list);
802         notmuch_config_pairs_move_to_next (list)) {
803      printf("%s %s\n", notmuch_config_pairs_key (list), notmuch_config_pairs_value(list));
804    }
805    notmuch_config_pairs_destroy (list);
806 }
807 EOF
808 cat <<'EOF' >EXPECTED
809 == stdout ==
810 aaabefore beforeval
811 database.backup_dir MAIL_DIR/.notmuch/backups
812 database.hook_dir MAIL_DIR/.notmuch/hooks
813 database.mail_root MAIL_DIR
814 database.path MAIL_DIR
815 key with spaces value, with, spaces!
816 maildir.synchronize_flags true
817 new.ignore sekrit_junk
818 new.tags unread;inbox
819 search.exclude_tags foo;bar;fub
820 test.key1 testvalue1
821 test.key2 testvalue2
822 user.name Notmuch Test Suite
823 user.other_email test_suite_other@notmuchmail.org;test_suite@otherdomain.org
824 user.primary_email test_suite@notmuchmail.org
825 zzzafter afterval
826 == stderr ==
827 EOF
828 test_expect_equal_file EXPECTED OUTPUT
829
830 test_done