From: Karl Fleischmann Date: Mon, 24 Jan 2022 13:51:41 +0000 (+0100) Subject: lib-storage: Add unit tests for mail_parse_human_timestamp() X-Git-Tag: 2.4.0~4615 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34fc66fc98ba36fdc5b42e2670f0b863a2eb7345;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add unit tests for mail_parse_human_timestamp() Add one test for one of each branches in mail_parse_human_timestamp() which include: - ISO dates, - IMAP dates, - UNIX timestamps, and - relative time intervals. --- diff --git a/src/lib-storage/test-mail-storage.c b/src/lib-storage/test-mail-storage.c index 0a6b906600..335f48d29d 100644 --- a/src/lib-storage/test-mail-storage.c +++ b/src/lib-storage/test-mail-storage.c @@ -1,10 +1,24 @@ /* Copyright (c) 2017-2018 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "ioloop.h" #include "test-common.h" #include "master-service.h" #include "test-mail-storage-common.h" +/* globally used test date and appropriate time_t value */ +static struct test_globals { + const char *date_str_iso; + const char *date_str_imap; + const char *date_str_unix; + time_t date_time_t; +} test_globals = { + .date_str_iso = "2022-01-21", + .date_str_imap = "21-Jan-2022", + .date_str_unix = "1642723200", + .date_time_t = 1642723200 +}; + static void test_init_storage(struct mail_storage *storage_r) { i_zero(storage_r); @@ -624,6 +638,112 @@ static void test_mailbox_list_mbox(void) test_end(); } + +static void test_mail_parse_human_timestamp_iso(void) +{ + int ret; + time_t timestamp; + bool is_utc; + + test_begin("mail_parse_human_timestamp (iso)"); + + ret = mail_parse_human_timestamp(test_globals.date_str_iso, ×tamp, + &is_utc); + + test_assert(ret == 0); + test_assert(timestamp == test_globals.date_time_t); + test_assert(is_utc); + + test_end(); +} + +static void test_mail_parse_human_timestamp_imap(void) +{ + int ret; + time_t timestamp; + bool is_utc; + + test_begin("mail_parse_human_timestamp (imap)"); + + ret = mail_parse_human_timestamp(test_globals.date_str_imap, ×tamp, + &is_utc); + + test_assert(ret == 0); + test_assert(timestamp == test_globals.date_time_t); + test_assert(!is_utc); + + test_end(); +} + +static void test_mail_parse_human_timestamp_unix(void) +{ + int ret; + time_t timestamp; + bool is_utc; + + test_begin("mail_parse_human_timestamp (unix)"); + + ret = mail_parse_human_timestamp(test_globals.date_str_unix, ×tamp, + &is_utc); + + test_assert(ret == 0); + test_assert(timestamp == test_globals.date_time_t); + test_assert(is_utc); + + test_end(); +} + +static void test_mail_parse_human_timestamp_time_interval(void) +{ + int ret; + time_t timestamp; + bool is_utc; + + test_begin("mail_parse_human_timestamp (time interval)"); + + /* make sure the time interval of 5 minutes (=300 seconds) is + correctly parsed and reduced from the main ioloop's timestamp */ + ret = mail_parse_human_timestamp("5 mins", ×tamp, &is_utc); + + test_assert(ret == 0); + test_assert(timestamp == ioloop_time - 300); + test_assert(is_utc); + + test_end(); +} + +static const char *invalid_timestamps[] = { + /* ISO format, upper case 's' instead of numeric '5' */ + "1234-S6-78", + /* IMAP format, incorrect month abbreviation "Jam" */ + "01-Jam-2022", + /* IMAP format, missing '-' separators */ + "02 Feb 2022", + /* unix timestamp, upper case 'o' instead of numeric '0' */ + "148314240O", + /* time interval, spelling error */ + "1minsa", + /* time interval, negative value */ + "-100D", + /* Note: for further tests regarding time interval, see + `src/lib-settings/test-settings-parser.c` */ + + /* arbitrary string */ + "invalid timestamp" +}; + +static void test_mail_parse_human_timestamp_fail(void) +{ + unsigned int i; + test_begin("mail_parse_human_timestamp (fail)"); + for (i = 0; i < N_ELEMENTS(invalid_timestamps); i++) { + const char *item = invalid_timestamps[i]; + test_assert_idx( + mail_parse_human_timestamp(item, NULL, NULL) == -1, i); + } + test_end(); +} + int main(int argc, char **argv) { int ret; @@ -633,6 +753,11 @@ int main(int argc, char **argv) test_mailbox_verify_name, test_mailbox_list_maildir, test_mailbox_list_mbox, + test_mail_parse_human_timestamp_iso, + test_mail_parse_human_timestamp_imap, + test_mail_parse_human_timestamp_unix, + test_mail_parse_human_timestamp_time_interval, + test_mail_parse_human_timestamp_fail, NULL };