test-mail-search-args-imap.c revision b7324e421e2132cbbf753e6fdbe675bbaecdf929
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2015-2016 Dovecot authors, see the included COPYING file */
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "lib.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "ioloop.h"
c96eb61168670cfdd7596baba18856d3f086a093Timo Sirainen#include "str.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "test-common.h"
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen#include "mail-search-build.h"
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen#include "mail-search-parser.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "mail-search.h"
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#define CURRENT_UNIX_TIME 1000000
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainenstatic const struct {
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen const char *input, *output;
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen} tests[] = {
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen { "ALL", NULL },
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen { "1,5:6,10:15", NULL },
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen { "UID 1,5:6,10:15", NULL },
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen { "ANSWERED FLAGGED DELETED SEEN DRAFT RECENT",
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen "(ANSWERED) (FLAGGED) (DELETED) (SEEN) (DRAFT) (RECENT)" },
ccd83028a34cc6e2b6370eb7ecf1cf25e717c2d3Timo Sirainen { "KEYWORD foo KEYWORD bar", NULL },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "BEFORE 20-May-2015", "BEFORE \"20-May-2015\"" },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "ON 20-May-2015", "ON \"20-May-2015\"" },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "SINCE 20-May-2015", "SINCE \"20-May-2015\"" },
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen { "SENTBEFORE 20-May-2015", "SENTBEFORE \"20-May-2015\"" },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "SENTON 20-May-2015", "SENTON \"20-May-2015\"" },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "SENTSINCE 20-May-2015", "SENTSINCE \"20-May-2015\"" },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "X-SAVEDBEFORE 20-May-2015", "X-SAVEDBEFORE \"20-May-2015\"" },
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen { "X-SAVEDON 20-May-2015", "X-SAVEDON \"20-May-2015\"" },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "X-SAVEDSINCE 20-May-2015", "X-SAVEDSINCE \"20-May-2015\"" },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "OLDER 1", NULL },
8039af9679af6fb56116b353fe44f7dd4c08f031Timo Sirainen { "OLDER 1000", NULL },
923eb3dde28e4d8841c14fd6b4a69635b7070c3eTimo Sirainen { "YOUNGER 1", NULL },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "YOUNGER 1000", NULL },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "SMALLER 0", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "SMALLER 1", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "SMALLER 4294967295", NULL },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "LARGER 0", NULL },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "LARGER 1", NULL },
150e64c376365becf1ec5c9d45912ecb840eea96Timo Sirainen { "LARGER 4294967295", NULL },
150e64c376365becf1ec5c9d45912ecb840eea96Timo Sirainen { "FROM foo", NULL },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "TO foo", NULL },
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen { "CC foo", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "BCC foo", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "SUBJECT foo", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "HEADER subjecT foo", "SUBJECT foo" },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "HEADER subjecT2 foo", "HEADER SUBJECT2 foo" },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "BODY foo", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "TEXT foo", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "MODSEQ 0", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "MODSEQ 1", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "MODSEQ 18446744073709551615", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "MODSEQ /flags/keyword all 0", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "MODSEQ /flags/\\Seen all 0", NULL },
5afa8e2edf4f313cd56e5909f92f39c3b5b7b4d3Timo Sirainen { "MODSEQ /flags/\\Seen priv 0", NULL },
5afa8e2edf4f313cd56e5909f92f39c3b5b7b4d3Timo Sirainen { "MODSEQ /flags/\\Seen shared 0", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "INTHREAD REFERENCES seen", "INTHREAD REFERENCES ((SEEN))" },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "INTHREAD ORDEREDSUBJECT seen", "INTHREAD ORDEREDSUBJECT ((SEEN))" },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "INTHREAD REFS seen", "INTHREAD REFS ((SEEN))" },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "INTHREAD REFS ( OR text foo OR keyword bar seen )",
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen "INTHREAD REFS (((OR TEXT foo OR KEYWORD bar (SEEN))))" },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "X-GUID foo", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "X-MAILBOX foo", NULL },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { "X-REAL-UID 1,5:6,10:15", NULL }
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen};
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainenstatic struct mail_search_arg test_failures[] = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_MAILBOX },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_MAILBOX_GUID },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_BEFORE, .value = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen .date_type = MAIL_SEARCH_DATE_TYPE_SENT, .time = 86400-1 } },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_ON, .value = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen .date_type = MAIL_SEARCH_DATE_TYPE_SENT, .time = 86400-1 } },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_SINCE, .value = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen .date_type = MAIL_SEARCH_DATE_TYPE_SENT, .time = 86400-1 } },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_ON, .value = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen .date_type = MAIL_SEARCH_DATE_TYPE_RECEIVED, .time = 86400-1 } },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_BEFORE, .value = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen .date_type = MAIL_SEARCH_DATE_TYPE_SAVED, .time = 86400-1 } },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_ON, .value = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen .date_type = MAIL_SEARCH_DATE_TYPE_SAVED, .time = 86400-1 } },
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen { .type = SEARCH_SINCE, .value = {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen .date_type = MAIL_SEARCH_DATE_TYPE_SAVED, .time = 86400-1 } }
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen};
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainenstatic struct mail_search_args *
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainentest_build_search_args(const char *args)
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainen{
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen struct mail_search_parser *parser;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen struct mail_search_args *sargs;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen const char *error, *charset = "UTF-8";
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen parser = mail_search_parser_init_cmdline(t_strsplit(args, " "));
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen if (mail_search_build(mail_search_register_get_imap(),
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen parser, &charset, &sargs, &error) < 0)
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainen i_panic("%s", error);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen mail_search_parser_deinit(&parser);
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainen return sargs;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainenstatic void test_mail_search_args_imap(void)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen{
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainen struct mail_search_args *args;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen string_t *str = t_str_new(256);
f2bd9e507b8befdd95a983f86664febf5c19bd95Timo Sirainen const char *output, *error;
303a87c31cb4aa198326694e231df53a043e63c7Timo Sirainen unsigned int i;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen ioloop_time = CURRENT_UNIX_TIME; /* YOUNGER/OLDER tests need this */
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen test_begin("mail search args imap");
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen for (i = 0; i < N_ELEMENTS(tests); i++) {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen args = test_build_search_args(tests[i].input);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen output = tests[i].output != NULL ?
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen tests[i].output : tests[i].input;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen str_truncate(str, 0);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen test_assert_idx(mail_search_args_to_imap(str, args->args, &error), i);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen test_assert_idx(strcmp(str_c(str), output) == 0, i);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen mail_search_args_unref(&args);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen }
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen for (i = 0; i < N_ELEMENTS(test_failures); i++)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen test_assert_idx(!mail_search_args_to_imap(str, &test_failures[i], &error), i);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen test_end();
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen}
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainenint main(void)
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen{
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen static void (*test_functions[])(void) = {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen test_mail_search_args_imap,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen NULL
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen };
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen return test_run(test_functions);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen