]> git.notmuchmail.org Git - notmuch/blob - test/T590-libconfig.sh
lib/config: add config_pairs iterators
[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 cat <<'EOF' >EXPECTED
388 == stdout ==
389 MAIL_DIR
390 MAIL_DIR
391 MAIL_DIR/.notmuch/hooks
392 MAIL_DIR/.notmuch/backups
393
394 inbox;unread
395 NULL
396 true
397 NULL
398 NULL
399 NULL
400 == stderr ==
401 EOF
402 unset MAILDIR
403 test_expect_equal_file EXPECTED OUTPUT
404
405 backup_database
406 test_begin_subtest "override config from \${NOTMUCH_CONFIG}"
407 notmuch config set test.key1 overridden
408 # second argument omitted to make argv[2] == NULL
409 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
410 {
411    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
412    printf("test.key1 = %s\n", val);
413    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
414    printf("test.key2 = %s\n", val);
415 }
416 EOF
417 notmuch config set test.key1
418 cat <<'EOF' >EXPECTED
419 == stdout ==
420 test.key1 = overridden
421 test.key2 = testvalue2
422 == stderr ==
423 EOF
424 test_expect_equal_file EXPECTED OUTPUT
425 restore_database
426
427 backup_database
428 test_begin_subtest "override config from \${HOME}/.notmuch-config"
429 ovconfig=${HOME}/.notmuch-config
430 cp ${NOTMUCH_CONFIG} ${ovconfig}
431 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
432 unset NOTMUCH_CONFIG
433 notmuch --config=${ovconfig} config set test.key1 overridden-home
434 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
435 {
436    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
437    printf("test.key1 = %s\n", val);
438    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
439    printf("test.key2 = %s\n", val);
440 }
441 EOF
442 rm -f ${ovconfig}
443 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
444 cat <<'EOF' >EXPECTED
445 == stdout ==
446 test.key1 = overridden-home
447 test.key2 = testvalue2
448 == stderr ==
449 EOF
450 test_expect_equal_file EXPECTED OUTPUT
451 restore_database
452
453 backup_database
454 test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch"
455 ovconfig=${HOME}/.config/notmuch/default/config
456 mkdir -p $(dirname ${ovconfig})
457 cp ${NOTMUCH_CONFIG} ${ovconfig}
458 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
459 unset NOTMUCH_CONFIG
460 notmuch --config=${ovconfig} config set test.key1 overridden-xdg
461 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
462 {
463    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
464    printf("test.key1 = %s\n", val);
465    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
466    printf("test.key2 = %s\n", val);
467 }
468 EOF
469 rm -f ${ovconfig}
470 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
471 cat <<'EOF' >EXPECTED
472 == stdout ==
473 test.key1 = overridden-xdg
474 test.key2 = testvalue2
475 == stderr ==
476 EOF
477 test_expect_equal_file EXPECTED OUTPUT
478 restore_database
479
480 backup_database
481 test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch with profile"
482 ovconfig=${HOME}/.config/notmuch/work/config
483 mkdir -p $(dirname ${ovconfig})
484 cp ${NOTMUCH_CONFIG} ${ovconfig}
485 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
486 unset NOTMUCH_CONFIG
487 notmuch --config=${ovconfig} config set test.key1 overridden-xdg-profile
488 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work
489 {
490    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
491    printf("test.key1 = %s\n", val);
492    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
493    printf("test.key2 = %s\n", val);
494 }
495 EOF
496 rm -f ${ovconfig}
497 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
498 cat <<'EOF' >EXPECTED
499 == stdout ==
500 test.key1 = overridden-xdg-profile
501 test.key2 = testvalue2
502 == stderr ==
503 EOF
504 test_expect_equal_file EXPECTED OUTPUT
505 restore_database
506
507 backup_database
508 test_begin_subtest "override config from \${HOME}/.notmuch-config.work (via args)"
509 ovconfig=${HOME}/.notmuch-config.work
510 cp ${NOTMUCH_CONFIG} ${ovconfig}
511 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
512 unset NOTMUCH_CONFIG
513 notmuch --config=${ovconfig} config set test.key1 overridden-profile
514 cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work
515 {
516    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
517    printf("test.key1 = %s\n", val);
518    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
519    printf("test.key2 = %s\n", val);
520 }
521 EOF
522 #rm -f ${ovconfig}
523 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
524 cat <<'EOF' >EXPECTED
525 == stdout ==
526 test.key1 = overridden-profile
527 test.key2 = testvalue2
528 == stderr ==
529 EOF
530 test_expect_equal_file EXPECTED OUTPUT
531 restore_database
532
533 test_begin_subtest "no config, fail to open database"
534 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
535 unset NOTMUCH_CONFIG
536 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
537 {
538    printf("NOT RUN");
539 }
540 EOF
541 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
542 cat <<'EOF' >EXPECTED
543 == stdout ==
544 == stderr ==
545 error opening database
546 Something went wrong trying to read or write a file
547 Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such file or directory.
548
549 EOF
550 test_expect_equal_file EXPECTED OUTPUT
551
552 test_begin_subtest "open database from NOTMUCH_DATABASE"
553 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
554 unset NOTMUCH_CONFIG
555 export NOTMUCH_DATABASE=${MAIL_DIR}
556 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
557 {
558    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
559    printf("test.key1 = %s\n", val);
560    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
561    printf("test.key2 = %s\n", val);
562 }
563 EOF
564 export NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
565 unset NOTMUCH_DATABASE
566 cat <<'EOF' >EXPECTED
567 == stdout ==
568 test.key1 = testvalue1
569 test.key2 = testvalue2
570 == stderr ==
571 EOF
572 test_expect_equal_file EXPECTED OUTPUT
573
574 test_begin_subtest "NOTMUCH_DATABASE overrides config"
575 cp notmuch-config notmuch-config.bak
576 notmuch config set database.path /nonexistent
577 export NOTMUCH_DATABASE=${MAIL_DIR}
578 cat c_head - c_tail <<'EOF' | test_C %NULL% '' %NULL%
579 {
580    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
581    printf("test.key1 = %s\n", val);
582    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
583    printf("test.key2 = %s\n", val);
584 }
585 EOF
586 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
587 unset NOTMUCH_DATABASE
588 cat <<'EOF' >EXPECTED
589 == stdout ==
590 test.key1 = testvalue1
591 test.key2 = testvalue2
592 == stderr ==
593 EOF
594 cp notmuch-config.bak notmuch-config
595 test_expect_equal_file EXPECTED OUTPUT
596
597 cat <<EOF > c_head2
598 #include <string.h>
599 #include <stdlib.h>
600 #include <notmuch-test.h>
601
602 int main (int argc, char** argv)
603 {
604    notmuch_database_t *db;
605    char *val;
606    notmuch_status_t stat;
607    char *msg = NULL;
608
609    for (int i = 1; i < argc; i++)
610       if (strcmp (argv[i], "%NULL%") == 0) argv[i] = NULL;
611
612    stat = notmuch_database_load_config (argv[1],
613                                         argv[2],
614                                         argv[3],
615                                         &db,
616                                         &msg);
617    if (stat != NOTMUCH_STATUS_SUCCESS  && stat != NOTMUCH_STATUS_NO_CONFIG) {
618      fprintf (stderr, "error opening database\n%d: %s\n%s\n", stat,
619               notmuch_status_to_string (stat), msg ? msg : "");
620      exit (1);
621    }
622 EOF
623
624
625 test_begin_subtest "notmuch_database_get_config (ndlc)"
626 echo NOTMUCH_CONFIG=$NOTMUCH_CONFIG
627 echo NOTMUCH_PROFILE=$NOTMUCH_PROFILE
628 echo HOME=$HOME
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 cat <<'EOF' >EXPECTED
731 == stdout ==
732 MAIL_DIR
733 MAIL_DIR
734 MAIL_DIR/.notmuch/hooks
735 MAIL_DIR/.notmuch/backups
736
737 inbox;unread
738 NULL
739 true
740 NULL
741 NULL
742 NULL
743 == stderr ==
744 EOF
745 test_expect_equal_file EXPECTED OUTPUT
746
747 backup_database
748 test_begin_subtest "override config from \${HOME}/.notmuch-config (ndlc)"
749 ovconfig=${HOME}/.notmuch-config
750 cp ${NOTMUCH_CONFIG} ${ovconfig}
751 old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG}
752 unset NOTMUCH_CONFIG
753 notmuch --config=${ovconfig} config set test.key1 overridden-home
754 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
755 {
756    EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
757    printf("test.key1 = %s\n", val);
758    EXPECT0(notmuch_database_get_config (db, "test.key2", &val));
759    printf("test.key2 = %s\n", val);
760 }
761 EOF
762 rm -f ${ovconfig}
763 NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG}
764 cat <<'EOF' >EXPECTED
765 == stdout ==
766 test.key1 = overridden-home
767 test.key2 = testvalue2
768 == stderr ==
769 EOF
770 test_expect_equal_file EXPECTED OUTPUT
771 restore_database
772
773 test_begin_subtest "notmuch_config_get_pairs: prefix (ndlc)"
774 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
775 {
776    notmuch_config_pairs_t *list;
777    for (list =  notmuch_config_get_pairs (db, "user.");
778         notmuch_config_pairs_valid (list);
779         notmuch_config_pairs_move_to_next (list)) {
780      printf("%s %s\n", notmuch_config_pairs_key (list), notmuch_config_pairs_value(list));
781    }
782    notmuch_config_pairs_destroy (list);
783 }
784 EOF
785 cat <<'EOF' >EXPECTED
786 == stdout ==
787 user.name Notmuch Test Suite
788 user.other_email test_suite_other@notmuchmail.org;test_suite@otherdomain.org
789 user.primary_email test_suite@notmuchmail.org
790 == stderr ==
791 EOF
792 test_expect_equal_file EXPECTED OUTPUT
793
794 test_begin_subtest "notmuch_config_get_pairs: all pairs (ndlc)"
795 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
796 {
797    notmuch_config_pairs_t *list;
798    for (list =  notmuch_config_get_pairs (db, "");
799         notmuch_config_pairs_valid (list);
800         notmuch_config_pairs_move_to_next (list)) {
801      printf("%s %s\n", notmuch_config_pairs_key (list), notmuch_config_pairs_value(list));
802    }
803    notmuch_config_pairs_destroy (list);
804 }
805 EOF
806 cat <<'EOF' >EXPECTED
807 == stdout ==
808 aaabefore beforeval
809 database.backup_dir MAIL_DIR/.notmuch/backups
810 database.hook_dir MAIL_DIR/.notmuch/hooks
811 database.mail_root MAIL_DIR
812 database.path MAIL_DIR
813 key with spaces value, with, spaces!
814 maildir.synchronize_flags true
815 new.ignore sekrit_junk
816 new.tags unread;inbox;
817 search.exclude_tags foo;bar;fub
818 test.key1 testvalue1
819 test.key2 testvalue2
820 user.name Notmuch Test Suite
821 user.other_email test_suite_other@notmuchmail.org;test_suite@otherdomain.org
822 user.primary_email test_suite@notmuchmail.org
823 zzzafter afterval
824 == stderr ==
825 EOF
826 test_expect_equal_file EXPECTED OUTPUT
827
828 test_done