bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2009-2018 Dovecot authors, see the included COPYING file */
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen#include "lib.h"
bdab9975915a4b6a17088cd2e7a32541b757dec0Timo Sirainen#include "utc-offset.h"
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen#include "mbox-from.h"
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen#include "test-common.h"
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen
d69f76c7e5748bfdcf7a99a7b7b4db4ccdeb69c0Timo Sirainen#include <time.h>
d69f76c7e5748bfdcf7a99a7b7b4db4ccdeb69c0Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainenstruct test_mbox_from_parse_output {
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen time_t time;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen int tz_offset;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen const char *sender;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen int ret;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen};
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainenstatic void test_mbox_from_parse(void)
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen{
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen static const char *input[] = {
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user@domain Thu Nov 29 23:33:09 1973 +0200",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user@domain Thu Nov 29 19:33:09 1973 -0200",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "\"user name\"@domain Fri Jan 2 10:13:52 UTC 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri Jan 2 10:14 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri, 2 Jan 1970 10:14:00 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri, 2 Jan 1970 10:14 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen " Fri Jan 2 10:14 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri, 2 Foo 1970 10:14:00",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "Fri Jan 2 10:14 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri Jan x 10:14 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri Jan 2 0:14 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri Jan 2 xx:14 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri Jan 2 10: 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri Jan 2 10:xx 1970 +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "user Fri Jan 2 10:xx +0000",
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen };
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen static struct test_mbox_from_parse_output output[] = {
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 123456789, 2*60, "user@domain", 0 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 123456789, -2*60, "user@domain", 0 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 123232, 0, "\"user name\"@domain", 0 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 123240, 0, "user", 0 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 123240, 0, "user", 0 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 123240, 0, "user", 0 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 123240, 0, "", 0 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen { 0, 0, NULL, -1 },
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen };
2ac5f36aa7c2e7a07ba8815d43a6d7483f62e74cTimo Sirainen unsigned int i, j;
2ac5f36aa7c2e7a07ba8815d43a6d7483f62e74cTimo Sirainen size_t len;
242cd1c1ec4de78ec340162843b203f4f44c836fTimo Sirainen struct tm *tm;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen char *sender;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen bool success;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen time_t t;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen int tz, ret;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen for (j = 0; j < 2; j++) {
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen for (i = 0; i < N_ELEMENTS(input); i++) {
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen len = strlen(input[i]) - j*6;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen ret = mbox_from_parse((const unsigned char *)input[i],
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen len, &t, &tz, &sender);
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen success = (ret < 0 && output[i].ret < 0) ||
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen (ret == output[i].ret && t == output[i].time &&
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen tz == output[i].tz_offset &&
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen strcmp(sender, output[i].sender) == 0);
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen i_free(sender);
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen test_out(t_strdup_printf("mbox_from_parse(%d,%d)", j, i), success);
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen /* prepare for testing without timezone */
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen if (output[i].ret == 0) {
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen output[i].time += output[i].tz_offset*60;
242cd1c1ec4de78ec340162843b203f4f44c836fTimo Sirainen tm = localtime(&output[i].time);
242cd1c1ec4de78ec340162843b203f4f44c836fTimo Sirainen output[i].tz_offset = utc_offset(tm, output[i].time);
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen output[i].time -= output[i].tz_offset*60;
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen }
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen }
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen }
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen}
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainenstatic void test_mbox_from_create(void)
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen{
bdab9975915a4b6a17088cd2e7a32541b757dec0Timo Sirainen time_t t = 1234567890;
bdab9975915a4b6a17088cd2e7a32541b757dec0Timo Sirainen int tz;
bdab9975915a4b6a17088cd2e7a32541b757dec0Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen test_begin("mbox_from_create()");
bdab9975915a4b6a17088cd2e7a32541b757dec0Timo Sirainen tz = utc_offset(localtime(&t), t) * -60;
bdab9975915a4b6a17088cd2e7a32541b757dec0Timo Sirainen test_assert(strcmp(mbox_from_create("user", t+tz),
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen "From user Fri Feb 13 23:31:30 2009\n") == 0);
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen test_end();
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen}
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainenint main(void)
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen{
baf3e87e186453fda13bd21f7cbcb2efc8492e8bTimo Sirainen static void (*const test_functions[])(void) = {
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen test_mbox_from_parse,
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen test_mbox_from_create,
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen NULL
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen };
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen return test_run(test_functions);
3eff14a98522d188136f9df2067f0f46ed7d0361Timo Sirainen}