test-time-util.c revision 9983cbb4cef92d68ffde87dcc91913cc2fed3da5
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "test-lib.h"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "time-util.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include <time.h>
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_timeval_cmp(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen static struct timeval input[] = {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 0, 0 }, { 0, 0 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { INT_MAX, 999999 }, { INT_MAX, 999999 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 0, 0 }, { 0, 1 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 0, 0 }, { 1, 0 },
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen { 0, 999999 }, { 1, 0 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 1, 0 }, { 1, 1 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { -INT_MAX, 0 }, { INT_MAX, 0 }
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen };
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen static int output[] = {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen 0,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen 0,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen -1,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen -1,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen -1,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen -1,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen -1
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen };
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen unsigned int i;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_begin("timeval_cmp()");
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen for (i = 0; i < N_ELEMENTS(input); i += 2) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(timeval_cmp(&input[i], &input[i+1]) == output[i/2]);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(timeval_cmp(&input[i+1], &input[i]) == -output[i/2]);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen }
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_end();
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_timeval_diff(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen static struct timeval input[] = {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 1, 0 }, { 0, 999999 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 1, 0 }, { 0, 999001 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 1, 1 }, { 0, 999001 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 2, 1 }, { 1, 0 },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { INT_MAX, 0 }, { INT_MAX-1, 1 }
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen };
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen static int output[] = {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen 1,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen 999,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen 1000,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen 1000001,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen 999999
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen };
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen unsigned int i;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen long long udiff;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen int mdiff;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen test_begin("timeval_diff_*()");
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen for (i = 0; i < N_ELEMENTS(input); i += 2) {
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen udiff = timeval_diff_usecs(&input[i], &input[i+1]);
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen mdiff = timeval_diff_msecs(&input[i], &input[i+1]);
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen test_assert(udiff == output[i/2]);
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen test_assert(mdiff == udiff/1000);
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen udiff = timeval_diff_usecs(&input[i+1], &input[i]);
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen mdiff = timeval_diff_msecs(&input[i+1], &input[i]);
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen test_assert(udiff == -output[i/2]);
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen test_assert(mdiff == udiff/1000);
8bf9eec2783abd32643578460cc6ba4ab0a647f9Timo Sirainen }
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen test_end();
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen}
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainenstatic void test_timestamp(const char *ts, int idx)
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen{
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen /* %G:%H:%M:%S */
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen const char **t = t_strsplit(ts, ":");
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen unsigned len = str_array_length(t);
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen test_assert_idx(len == 4, idx);
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* %G - ISO 8601 year */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(strlen(t[0]) == 4, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen unsigned v;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(str_to_uint(t[0], &v) == 0, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(1000 <= v, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(v <= 3000, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
4970e8dfcb18c1353e44b82e4ec836d165b7de82Timo Sirainen /* %H - hour from 00 to 23 */
4970e8dfcb18c1353e44b82e4ec836d165b7de82Timo Sirainen test_assert_idx(strlen(t[1]) == 2, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(str_to_uint(t[1], &v) == 0, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(v <= 23, idx);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen /* %M - minute from 00 to 59 */
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen test_assert_idx(strlen(t[2]) == 2, idx);
d41ebbd7ae8cfe36a570c644dd7c9c55073fbb20Timo Sirainen test_assert_idx(str_to_uint(t[2], &v) == 0, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(v <= 59, idx);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* %S - second from 00 to 60 */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(strlen(t[3]) == 2, idx);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert_idx(str_to_uint(t[3], &v) == 0, idx);
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen test_assert_idx(v <= 60, idx);
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#define TS_FMT "%G:%H:%M:%S"
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainenstatic void test_strftime_now(void)
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_begin("t_strftime and variants now");
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen time_t now = time(NULL);
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen test_timestamp(t_strftime(TS_FMT, gmtime(&now)), 0);
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen test_timestamp(t_strfgmtime(TS_FMT, now), 1);
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen test_timestamp(t_strflocaltime(TS_FMT, now), 2);
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen test_end();
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen}
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen#define RFC2822_FMT "%a, %d %b %Y %T %z"
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainenstatic void test_strftime_fixed(void)
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen{
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen test_begin("t_strftime and variants fixed timestamp");
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen time_t ts = 1481222536;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *exp = "Thu, 08 Dec 2016 18:42:16 +0000";
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen test_assert(strcmp(t_strftime(RFC2822_FMT, gmtime(&ts)), exp) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(strcmp(t_strfgmtime(RFC2822_FMT, ts), exp) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen test_end();
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen}
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainenvoid test_time_util(void)
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen{
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen test_timeval_cmp();
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen test_timeval_diff();
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen test_strftime_now();
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen test_strftime_fixed();
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen}
44aac2d461b4cb8e05e8c07f2f209372997a8719Timo Sirainen