2 test_description="library config API"
4 . $(dirname "$0")/test-lib.sh || exit 1
8 _libconfig_sanitize() {
9 ${NOTMUCH_PYTHON} /dev/fd/3 3<<'EOF'
10 import os, sys, pwd, socket
12 pw = pwd.getpwuid(os.getuid())
14 name = pw.pw_gecos.partition(",")[0]
18 l = l.replace(user, "USERNAME", 1)
20 l = l.replace("'" + name, "'USER_FULL_NAME", 1)
28 #include <notmuch-test.h>
30 int main (int argc, char** argv)
32 notmuch_database_t *db;
34 notmuch_status_t stat;
37 for (int i = 1; i < argc; i++)
38 if (strcmp (argv[i], "%NULL%") == 0) argv[i] = NULL;
40 stat = notmuch_database_open_with_config (argv[1],
41 NOTMUCH_DATABASE_MODE_READ_WRITE,
46 if (stat != NOTMUCH_STATUS_SUCCESS) {
47 fprintf (stderr, "error opening database\n%s\n%s\n", notmuch_status_to_string (stat), msg ? msg : "");
53 EXPECT0(notmuch_database_destroy(db));
57 test_begin_subtest "notmuch_database_{set,get}_config"
58 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
60 EXPECT0(notmuch_database_set_config (db, "test.key1", "testvalue1"));
61 EXPECT0(notmuch_database_set_config (db, "test.key2", "testvalue2"));
62 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
63 printf("test.key1 = %s\n", val);
64 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
65 printf("test.key2 = %s\n", val);
70 test.key1 = testvalue1
71 test.key2 = testvalue2
74 test_expect_equal_file EXPECTED OUTPUT
77 test_begin_subtest "notmuch_database_get_config_list: empty list"
78 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
80 notmuch_config_list_t *list;
81 EXPECT0(notmuch_database_get_config_list (db, "nonexistent", &list));
82 printf("valid = %d\n", notmuch_config_list_valid (list));
83 notmuch_config_list_destroy (list);
91 test_expect_equal_file EXPECTED OUTPUT
93 test_begin_subtest "notmuch_database_get_config_list: closed db"
94 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
96 notmuch_config_list_t *list;
97 EXPECT0(notmuch_database_close (db));
98 stat = notmuch_database_get_config_list (db, "nonexistent", &list);
99 printf("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
102 cat <<'EOF' >EXPECTED
107 test_expect_equal_file EXPECTED OUTPUT
109 test_begin_subtest "notmuch_database_get_config_list: all pairs"
110 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
112 notmuch_config_list_t *list;
113 EXPECT0(notmuch_database_set_config (db, "zzzafter", "afterval"));
114 EXPECT0(notmuch_database_set_config (db, "aaabefore", "beforeval"));
115 EXPECT0(notmuch_database_get_config_list (db, "", &list));
116 for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
117 printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
119 notmuch_config_list_destroy (list);
122 cat <<'EOF' >EXPECTED
130 test_expect_equal_file EXPECTED OUTPUT
132 test_begin_subtest "notmuch_database_get_config_list: all pairs (closed db)"
133 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
135 notmuch_config_list_t *list;
136 EXPECT0(notmuch_database_get_config_list (db, "", &list));
137 EXPECT0(notmuch_database_close (db));
138 for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
139 printf("%s %d\n", notmuch_config_list_key (list), NULL == notmuch_config_list_value(list));
141 notmuch_config_list_destroy (list);
144 cat <<'EOF' >EXPECTED
152 test_expect_equal_file EXPECTED OUTPUT
154 test_begin_subtest "notmuch_database_get_config_list: one prefix"
155 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
157 notmuch_config_list_t *list;
158 EXPECT0(notmuch_database_get_config_list (db, "test.key", &list));
159 for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
160 printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
162 notmuch_config_list_destroy (list);
165 cat <<'EOF' >EXPECTED
171 test_expect_equal_file EXPECTED OUTPUT
173 test_begin_subtest "dump config"
174 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
176 EXPECT0(notmuch_database_set_config (db, "key with spaces", "value, with, spaces!"));
179 notmuch dump --include=config >OUTPUT
180 cat <<'EOF' >EXPECTED
181 #notmuch-dump batch-tag:3 config
182 #@ aaabefore beforeval
183 #@ key%20with%20spaces value,%20with,%20spaces%21
184 #@ test.key1 testvalue1
185 #@ test.key2 testvalue2
188 test_expect_equal_file EXPECTED OUTPUT
190 test_begin_subtest "restore config"
191 notmuch dump --include=config >EXPECTED
192 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
194 EXPECT0(notmuch_database_set_config (db, "test.key1", "mutatedvalue"));
197 notmuch restore --include=config <EXPECTED
198 notmuch dump --include=config >OUTPUT
199 test_expect_equal_file EXPECTED OUTPUT
202 test_begin_subtest "override config from file"
203 notmuch config set test.key1 overridden
204 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
206 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
207 printf("test.key1 = %s\n", val);
208 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
209 printf("test.key2 = %s\n", val);
212 cat <<'EOF' >EXPECTED
214 test.key1 = overridden
215 test.key2 = testvalue2
218 test_expect_equal_file EXPECTED OUTPUT
221 test_begin_subtest "NOTMUCH_CONFIG_HOOK_DIR: traditional"
222 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
224 const char *val = notmuch_config_get (db, NOTMUCH_CONFIG_HOOK_DIR);
225 printf("database.hook_dir = %s\n", val);
228 cat <<'EOF' >EXPECTED
230 database.hook_dir = MAIL_DIR/.notmuch/hooks
233 test_expect_equal_file EXPECTED OUTPUT
235 test_begin_subtest "NOTMUCH_CONFIG_HOOK_DIR: xdg"
236 dir="${HOME}/.config/notmuch/default/hooks"
238 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
240 const char *val = notmuch_config_get (db, NOTMUCH_CONFIG_HOOK_DIR);
241 printf("database.hook_dir = %s\n", val);
244 cat <<'EOF' >EXPECTED
246 database.hook_dir = CWD/home/.config/notmuch/default/hooks
250 test_expect_equal_file EXPECTED OUTPUT
252 test_begin_subtest "notmuch_config_get_values"
253 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
255 notmuch_config_values_t *values;
256 EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
257 for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
258 notmuch_config_values_valid (values);
259 notmuch_config_values_move_to_next (values))
261 puts (notmuch_config_values_get (values));
265 cat <<'EOF' >EXPECTED
272 test_expect_equal_file EXPECTED OUTPUT
275 test_begin_subtest "notmuch_config_get_values (ignore leading/trailing whitespace)"
276 test_subtest_known_broken
277 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
279 notmuch_config_values_t *values;
280 EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, " a ; b c ; d "));
281 for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
282 notmuch_config_values_valid (values);
283 notmuch_config_values_move_to_next (values))
285 puts (notmuch_config_values_get (values));
289 cat <<'EOF' >EXPECTED
296 test_expect_equal_file EXPECTED OUTPUT
299 test_begin_subtest "notmuch_config_get_values_string"
300 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
302 notmuch_config_values_t *values;
303 EXPECT0(notmuch_database_set_config (db, "test.list", "x;y;z"));
304 for (values = notmuch_config_get_values_string (db, "test.list");
305 notmuch_config_values_valid (values);
306 notmuch_config_values_move_to_next (values))
308 puts (notmuch_config_values_get (values));
312 cat <<'EOF' >EXPECTED
319 test_expect_equal_file EXPECTED OUTPUT
322 test_begin_subtest "notmuch_config_get_values (restart)"
323 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
325 notmuch_config_values_t *values;
326 EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
327 for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
328 notmuch_config_values_valid (values);
329 notmuch_config_values_move_to_next (values))
331 puts (notmuch_config_values_get (values));
333 for (notmuch_config_values_start (values);
334 notmuch_config_values_valid (values);
335 notmuch_config_values_move_to_next (values))
337 puts (notmuch_config_values_get (values));
341 cat <<'EOF' >EXPECTED
351 test_expect_equal_file EXPECTED OUTPUT
355 test_begin_subtest "notmuch_config_get_values, trailing ;"
356 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
358 notmuch_config_values_t *values;
359 EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_NEW_TAGS, "a;b;c"));
360 for (values = notmuch_config_get_values (db, NOTMUCH_CONFIG_NEW_TAGS);
361 notmuch_config_values_valid (values);
362 notmuch_config_values_move_to_next (values))
364 puts (notmuch_config_values_get (values));
368 cat <<'EOF' >EXPECTED
375 test_expect_equal_file EXPECTED OUTPUT
379 test_begin_subtest "get config by key"
380 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
382 printf("before = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
383 EXPECT0(notmuch_database_set_config (db, "maildir.synchronize_flags", "false"));
384 printf("after = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
387 cat <<'EOF' >EXPECTED
393 test_expect_equal_file EXPECTED OUTPUT
397 test_begin_subtest "set config by key"
398 notmuch config set test.key1 overridden
399 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
401 printf("before = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
402 EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS, "false"));
403 printf("after = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
406 cat <<'EOF' >EXPECTED
412 test_expect_equal_file EXPECTED OUTPUT
415 test_begin_subtest "load default values"
416 export MAILDIR=${MAIL_DIR}
417 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} '' %NULL%
419 notmuch_config_key_t key;
420 for (key = NOTMUCH_CONFIG_FIRST;
421 key < NOTMUCH_CONFIG_LAST;
422 key = (notmuch_config_key_t)(key + 1)) {
423 const char *val = notmuch_config_get (db, key);
424 printf("%02d: '%s'\n", key, val ? val : "NULL" );
429 _libconfig_sanitize < OUTPUT > OUTPUT.clean
431 cat <<'EOF' >EXPECTED
435 02: 'MAIL_DIR/.notmuch/hooks'
436 03: 'MAIL_DIR/.notmuch/backups'
441 08: 'USERNAME@localhost'
448 test_expect_equal_file EXPECTED OUTPUT.clean
451 test_begin_subtest "override config from \${NOTMUCH_CONFIG}"
452 notmuch config set test.key1 overridden
453 # second argument omitted to make argv[2] == NULL
454 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
456 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
457 printf("test.key1 = %s\n", val);
458 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
459 printf("test.key2 = %s\n", val);
462 notmuch config set test.key1
463 cat <<'EOF' >EXPECTED
465 test.key1 = overridden
466 test.key2 = testvalue2
469 test_expect_equal_file EXPECTED OUTPUT
473 test_begin_subtest "override config from \${HOME}/.notmuch-config"
474 ovconfig=${HOME}/.notmuch-config
475 cp ${NOTMUCH_CONFIG} ${ovconfig}
476 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
478 notmuch --config=${ovconfig} config set test.key1 overridden-home
479 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
481 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
482 printf("test.key1 = %s\n", val);
483 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
484 printf("test.key2 = %s\n", val);
488 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
489 cat <<'EOF' >EXPECTED
491 test.key1 = overridden-home
492 test.key2 = testvalue2
495 test_expect_equal_file EXPECTED OUTPUT
499 test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch"
500 ovconfig=${HOME}/.config/notmuch/default/config
501 mkdir -p $(dirname ${ovconfig})
502 cp ${NOTMUCH_CONFIG} ${ovconfig}
503 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
505 notmuch --config=${ovconfig} config set test.key1 overridden-xdg
506 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
508 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
509 printf("test.key1 = %s\n", val);
510 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
511 printf("test.key2 = %s\n", val);
515 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
516 cat <<'EOF' >EXPECTED
518 test.key1 = overridden-xdg
519 test.key2 = testvalue2
522 test_expect_equal_file EXPECTED OUTPUT
526 test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch with profile"
527 ovconfig=${HOME}/.config/notmuch/work/config
528 mkdir -p $(dirname ${ovconfig})
529 cp ${NOTMUCH_CONFIG} ${ovconfig}
530 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
532 notmuch --config=${ovconfig} config set test.key1 overridden-xdg-profile
533 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work
535 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
536 printf("test.key1 = %s\n", val);
537 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
538 printf("test.key2 = %s\n", val);
542 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
543 cat <<'EOF' >EXPECTED
545 test.key1 = overridden-xdg-profile
546 test.key2 = testvalue2
549 test_expect_equal_file EXPECTED OUTPUT
553 test_begin_subtest "override config from \${HOME}/.notmuch-config.work (via args)"
554 ovconfig=${HOME}/.notmuch-config.work
555 cp ${NOTMUCH_CONFIG} ${ovconfig}
556 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
558 notmuch --config=${ovconfig} config set test.key1 overridden-profile
559 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work
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);
568 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
569 cat <<'EOF' >EXPECTED
571 test.key1 = overridden-profile
572 test.key2 = testvalue2
575 test_expect_equal_file EXPECTED OUTPUT
578 test_begin_subtest "no config, fail to open database"
579 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
581 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
586 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
587 cat <<'EOF' >EXPECTED
590 error opening database
592 Error: could not locate database.
595 test_expect_equal_file EXPECTED OUTPUT
597 test_begin_subtest "open database from NOTMUCH_DATABASE"
598 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
600 export NOTMUCH_DATABASE=${MAIL_DIR}
601 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
603 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
604 printf("test.key1 = %s\n", val);
605 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
606 printf("test.key2 = %s\n", val);
609 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
610 unset NOTMUCH_DATABASE
611 cat <<'EOF' >EXPECTED
613 test.key1 = testvalue1
614 test.key2 = testvalue2
617 test_expect_equal_file EXPECTED OUTPUT
619 test_begin_subtest "NOTMUCH_DATABASE overrides config"
620 cp notmuch-config notmuch-config.bak
621 notmuch config set database.path /nonexistent
622 export NOTMUCH_DATABASE=${MAIL_DIR}
623 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
625 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
626 printf("test.key1 = %s\n", val);
627 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
628 printf("test.key2 = %s\n", val);
631 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
632 unset NOTMUCH_DATABASE
633 cat <<'EOF' >EXPECTED
635 test.key1 = testvalue1
636 test.key2 = testvalue2
639 cp notmuch-config.bak notmuch-config
640 test_expect_equal_file EXPECTED OUTPUT
645 #include <notmuch-test.h>
647 int main (int argc, char** argv)
649 notmuch_database_t *db;
651 notmuch_status_t stat;
654 for (int i = 1; i < argc; i++)
655 if (strcmp (argv[i], "%NULL%") == 0) argv[i] = NULL;
657 stat = notmuch_database_load_config (argv[1],
662 if (stat != NOTMUCH_STATUS_SUCCESS && stat != NOTMUCH_STATUS_NO_CONFIG) {
663 fprintf (stderr, "error opening database\n%d: %s\n%s\n", stat,
664 notmuch_status_to_string (stat), msg ? msg : "");
670 test_begin_subtest "notmuch_database_get_config (ndlc)"
671 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
673 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
674 printf("test.key1 = %s\n", val);
675 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
676 printf("test.key2 = %s\n", val);
679 cat <<'EOF' >EXPECTED
681 test.key1 = testvalue1
682 test.key2 = testvalue2
685 test_expect_equal_file EXPECTED OUTPUT
688 test_begin_subtest "notmuch_database_get_config_list: all pairs (ndlc)"
689 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
691 notmuch_config_list_t *list;
692 EXPECT0(notmuch_database_get_config_list (db, "", &list));
693 for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
694 printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
696 notmuch_config_list_destroy (list);
699 cat <<'EOF' >EXPECTED
702 key with spaces value, with, spaces!
708 test_expect_equal_file EXPECTED OUTPUT
710 test_begin_subtest "notmuch_database_get_config_list: one prefix (ndlc)"
711 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
713 notmuch_config_list_t *list;
714 EXPECT0(notmuch_database_get_config_list (db, "test.key", &list));
715 for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
716 printf("%s %s\n", notmuch_config_list_key (list), notmuch_config_list_value(list));
718 notmuch_config_list_destroy (list);
721 cat <<'EOF' >EXPECTED
727 test_expect_equal_file EXPECTED OUTPUT
729 test_begin_subtest "list by keys (ndlc)"
730 notmuch config set search.exclude_tags "foo;bar;fub"
731 notmuch config set new.ignore "sekrit_junk"
732 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
734 notmuch_config_key_t key;
735 for (key = NOTMUCH_CONFIG_FIRST;
736 key < NOTMUCH_CONFIG_LAST;
737 key = (notmuch_config_key_t)(key + 1)) {
738 const char *val = notmuch_config_get (db, key);
739 printf("%02d: '%s'\n", key, val ? val : "NULL" );
743 cat <<'EOF' >EXPECTED
747 02: 'MAIL_DIR/.notmuch/hooks'
748 03: 'MAIL_DIR/.notmuch/backups'
753 08: 'test_suite@notmuchmail.org'
754 09: 'test_suite_other@notmuchmail.org;test_suite@otherdomain.org'
755 10: 'Notmuch Test Suite'
759 test_expect_equal_file EXPECTED OUTPUT
761 test_begin_subtest "load default values (ndlc, nonexistent config)"
762 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} /nonexistent %NULL%
764 notmuch_config_key_t key;
765 for (key = NOTMUCH_CONFIG_FIRST;
766 key < NOTMUCH_CONFIG_LAST;
767 key = (notmuch_config_key_t)(key + 1)) {
768 const char *val = notmuch_config_get (db, key);
769 printf("%02d: '%s'\n", key, val ? val : "NULL" );
774 _libconfig_sanitize < OUTPUT > OUTPUT.clean
776 cat <<'EOF' >EXPECTED
780 02: 'MAIL_DIR/.notmuch/hooks'
781 03: 'MAIL_DIR/.notmuch/backups'
786 08: 'USERNAME@localhost'
792 test_expect_equal_file EXPECTED OUTPUT.clean
795 test_begin_subtest "override config from \${HOME}/.notmuch-config (ndlc)"
796 ovconfig=${HOME}/.notmuch-config
797 cp ${NOTMUCH_CONFIG} ${ovconfig}
798 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
800 notmuch --config=${ovconfig} config set test.key1 overridden-home
801 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
803 EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
804 printf("test.key1 = %s\n", val);
805 EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
806 printf("test.key2 = %s\n", val);
810 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
811 cat <<'EOF' >EXPECTED
813 test.key1 = overridden-home
814 test.key2 = testvalue2
817 test_expect_equal_file EXPECTED OUTPUT
820 test_begin_subtest "notmuch_config_get_pairs: prefix (ndlc)"
821 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
823 notmuch_config_pairs_t *list;
824 for (list = notmuch_config_get_pairs (db, "user.");
825 notmuch_config_pairs_valid (list);
826 notmuch_config_pairs_move_to_next (list)) {
827 printf("%s %s\n", notmuch_config_pairs_key (list), notmuch_config_pairs_value(list));
829 notmuch_config_pairs_destroy (list);
832 cat <<'EOF' >EXPECTED
834 user.name Notmuch Test Suite
835 user.other_email test_suite_other@notmuchmail.org;test_suite@otherdomain.org
836 user.primary_email test_suite@notmuchmail.org
839 test_expect_equal_file EXPECTED OUTPUT
841 test_begin_subtest "notmuch_config_get_pairs: all pairs (ndlc)"
842 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
844 notmuch_config_pairs_t *list;
845 for (list = notmuch_config_get_pairs (db, "");
846 notmuch_config_pairs_valid (list);
847 notmuch_config_pairs_move_to_next (list)) {
848 printf("%s %s\n", notmuch_config_pairs_key (list), notmuch_config_pairs_value(list));
850 notmuch_config_pairs_destroy (list);
853 cat <<'EOF' >EXPECTED
856 database.autocommit 8000
857 database.backup_dir MAIL_DIR/.notmuch/backups
858 database.hook_dir MAIL_DIR/.notmuch/hooks
859 database.mail_root MAIL_DIR
860 database.path MAIL_DIR
861 key with spaces value, with, spaces!
862 maildir.synchronize_flags true
863 new.ignore sekrit_junk
864 new.tags unread;inbox
865 search.exclude_tags foo;bar;fub
868 user.name Notmuch Test Suite
869 user.other_email test_suite_other@notmuchmail.org;test_suite@otherdomain.org
870 user.primary_email test_suite@notmuchmail.org
874 test_expect_equal_file EXPECTED OUTPUT
877 #include <notmuch-test.h>
878 int main (int argc, char **argv) {
879 notmuch_status_t stat;
880 notmuch_database_t *db = NULL;
884 printf("db == NULL: %d\n", db == NULL);
888 test_begin_subtest "open: database set to null on missing config"
889 cat c_head3 - c_tail3 <<'EOF' | test_C ${MAIL_DIR}
890 notmuch_status_t st = notmuch_database_open_with_config(argv[1],
891 NOTMUCH_DATABASE_MODE_READ_ONLY,
892 "/nonexistent", NULL, &db, NULL);
899 test_expect_equal_file EXPECTED OUTPUT
901 test_begin_subtest "open: database set to null on missing config (env)"
902 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
903 export NOTMUCH_CONFIG="/nonexistent"
904 cat c_head3 - c_tail3 <<'EOF' | test_C ${MAIL_DIR}
905 notmuch_status_t st = notmuch_database_open_with_config(argv[1],
906 NOTMUCH_DATABASE_MODE_READ_ONLY,
907 NULL, NULL, &db, NULL);
909 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
915 test_expect_equal_file EXPECTED OUTPUT
917 test_begin_subtest "create: database set to null on missing config"
918 cat c_head3 - c_tail3 <<'EOF' | test_C ${MAIL_DIR} "/nonexistent"
919 notmuch_status_t st = notmuch_database_create_with_config(argv[1],argv[2], NULL, &db, NULL);
926 test_expect_equal_file EXPECTED OUTPUT
928 test_begin_subtest "create: database set to null on missing config (env)"
929 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
930 export NOTMUCH_CONFIG="/nonexistent"
931 cat c_head3 - c_tail3 <<'EOF' | test_C ${MAIL_DIR}
932 notmuch_status_t st = notmuch_database_create_with_config(argv[1],
933 NULL, NULL, &db, NULL);
935 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
941 test_expect_equal_file EXPECTED OUTPUT
943 test_begin_subtest "load_config: database set non-null on missing config"
944 cat c_head3 - c_tail3 <<'EOF' | test_C ${MAIL_DIR} "/nonexistent"
945 notmuch_status_t st = notmuch_database_load_config(argv[1],argv[2], NULL, &db, NULL);
952 test_expect_equal_file EXPECTED OUTPUT
954 test_begin_subtest "load_config: database non-null on missing config (env)"
955 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
956 export NOTMUCH_CONFIG="/nonexistent"
957 cat c_head3 - c_tail3 <<'EOF' | test_C ${MAIL_DIR}
958 notmuch_status_t st = notmuch_database_load_config(argv[1], NULL, NULL, &db, NULL);
960 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
966 test_expect_equal_file EXPECTED OUTPUT
968 test_begin_subtest "load_config: database set to NULL on fatal error"
969 cat c_head3 - c_tail3 <<'EOF' | test_C
970 notmuch_status_t st = notmuch_database_load_config("relative", NULL, NULL, &db, NULL);
977 test_expect_equal_file EXPECTED OUTPUT
979 test_begin_subtest "open: database parameter overrides implicit config"
980 notmuch config set database.path ${MAIL_DIR}/nonexistent
981 cat c_head3 - c_tail3 <<'EOF' | test_C ${MAIL_DIR}
982 const char *path = NULL;
983 notmuch_status_t st = notmuch_database_open_with_config(argv[1],
984 NOTMUCH_DATABASE_MODE_READ_ONLY,
985 NULL, NULL, &db, NULL);
986 printf ("status: %d\n", st);
987 path = notmuch_database_get_path (db);
988 printf ("path: %s\n", path ? path : "(null)");
997 notmuch_dir_sanitize < OUTPUT > OUTPUT.clean
998 test_expect_equal_file EXPECTED OUTPUT.clean