diff options
Diffstat (limited to 'src/lib-imap/test-imap-match.c')
-rw-r--r-- | src/lib-imap/test-imap-match.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/lib-imap/test-imap-match.c b/src/lib-imap/test-imap-match.c new file mode 100644 index 0000000..df911da --- /dev/null +++ b/src/lib-imap/test-imap-match.c @@ -0,0 +1,127 @@ +/* Copyright (c) 2008-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "imap-match.h" +#include "test-common.h" + +struct test_imap_match { + const char *pattern; + const char *input; + enum imap_match_result result; +}; + +static void test_imap_match(void) +{ + struct test_imap_match test[] = { + { "", "", IMAP_MATCH_YES }, + { "a", "b", IMAP_MATCH_NO }, + { "foo", "foo", IMAP_MATCH_YES }, + { "foo", "foo/", IMAP_MATCH_PARENT }, + { "%", "", IMAP_MATCH_YES }, + { "%", "foo", IMAP_MATCH_YES }, + { "%", "foo/", IMAP_MATCH_PARENT }, + { "%/", "foo/", IMAP_MATCH_YES }, + { "%", "foo/bar", IMAP_MATCH_PARENT }, + { "%/%", "foo", IMAP_MATCH_CHILDREN }, + { "%/%", "foo/", IMAP_MATCH_YES }, + { "foo/bar/%", "foo", IMAP_MATCH_CHILDREN }, + { "foo/bar/%", "foo/", IMAP_MATCH_CHILDREN }, + { "foo*", "foo", IMAP_MATCH_YES }, + { "foo*", "foo/", IMAP_MATCH_YES }, + { "foo*", "fobo", IMAP_MATCH_NO }, + { "*foo*", "bar/foo/", IMAP_MATCH_YES }, + { "*foo*", "fobo", IMAP_MATCH_CHILDREN }, + { "foo*bar", "foobar/baz", IMAP_MATCH_CHILDREN | IMAP_MATCH_PARENT }, + { "*foo*", "fobo", IMAP_MATCH_CHILDREN }, + { "%/%/%", "foo/", IMAP_MATCH_CHILDREN }, + { "%/%o/%", "foo/", IMAP_MATCH_CHILDREN }, + { "%/%o/%", "foo", IMAP_MATCH_CHILDREN }, + { "inbox", "inbox", IMAP_MATCH_YES }, + { "inbox", "INBOX", IMAP_MATCH_NO } + }; + struct test_imap_match inbox_test[] = { + { "inbox", "inbox", IMAP_MATCH_YES }, + { "inbox", "iNbOx", IMAP_MATCH_YES }, + { "i%X", "iNbOx", IMAP_MATCH_YES }, + { "%I%N%B%O%X%", "inbox", IMAP_MATCH_YES }, + { "i%X/foo", "iNbOx/foo", IMAP_MATCH_YES }, + { "%I%N%B%O%X%/foo", "inbox/foo", IMAP_MATCH_YES }, + { "i%X/foo", "inbx/foo", IMAP_MATCH_NO } + }; + struct imap_match_glob *glob, *glob2; + unsigned int i; + pool_t pool; + + pool = pool_alloconly_create("imap match", 1024); + + /* first try tests without inboxcasing */ + test_begin("imap match"); + for (i = 0; i < N_ELEMENTS(test); i++) { + glob = imap_match_init(pool, test[i].pattern, + FALSE, '/'); + test_assert(imap_match(glob, test[i].input) == test[i].result); + + glob2 = imap_match_dup(default_pool, glob); + test_assert(imap_match_globs_equal(glob, glob2)); + p_clear(pool); + + /* test the dup after clearing first one's memory */ + test_assert(imap_match(glob2, test[i].input) == test[i].result); + imap_match_deinit(&glob2); + } + + /* inboxcasing tests */ + for (i = 0; i < N_ELEMENTS(inbox_test); i++) { + glob = imap_match_init(pool, inbox_test[i].pattern, + TRUE, '/'); + test_assert(imap_match(glob, inbox_test[i].input) == inbox_test[i].result); + + glob2 = imap_match_dup(default_pool, glob); + test_assert(imap_match_globs_equal(glob, glob2)); + p_clear(pool); + + /* test the dup after clearing first one's memory */ + test_assert(imap_match(glob2, inbox_test[i].input) == inbox_test[i].result); + imap_match_deinit(&glob2); + } + pool_unref(&pool); + test_end(); +} + +static void test_imap_match_globs_equal(void) +{ + struct imap_match_glob *glob; + pool_t pool; + + pool = pool_alloconly_create("imap match globs equal", 1024); + test_begin("imap match globs equal"); + + glob = imap_match_init(pool, "1", FALSE, '/'); + test_assert(imap_match_globs_equal(glob, + imap_match_init(pool, "1", FALSE, '/'))); + test_assert(imap_match_globs_equal(glob, + imap_match_init(pool, "1", TRUE, '/'))); + test_assert(!imap_match_globs_equal(glob, + imap_match_init(pool, "1", FALSE, '.'))); + test_assert(!imap_match_globs_equal(glob, + imap_match_init(pool, "11", FALSE, '/'))); + + glob = imap_match_init(pool, "in%", TRUE, '/'); + test_assert(!imap_match_globs_equal(glob, + imap_match_init(pool, "in%", FALSE, '/'))); + test_assert(!imap_match_globs_equal(glob, + imap_match_init(pool, "In%", TRUE, '/'))); + + pool_unref(&pool); + test_end(); +} + +int main(void) +{ + static void (*const test_functions[])(void) = { + test_imap_match, + test_imap_match_globs_equal, + NULL + }; + return test_run(test_functions); +} |