test-time-util.c revision 45729acb14745ff241dc1059c1c29a7822b9366f
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2009-2018 Dovecot authors, see the included COPYING file */
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen#include "test-lib.h"
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen#include "time-util.h"
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi#include <time.h>
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainenstatic void test_timeval_cmp(void)
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen{
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch static const struct {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch struct timeval tv1, tv2;
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch int output;
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch } tests[] = {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv1 = { 0, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv2 = { 0, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .output = 0,
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch }, {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv1 = { INT_MAX, 999999 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv2 = { INT_MAX, 999999 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .output = 0,
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch }, {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv1 = { 0, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv2 = { 0, 1 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .output = -1,
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch }, {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv1 = { 0, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv2 = { 1, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .output = -1,
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch }, {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv1 = { 0, 999999 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv2 = { 1, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .output = -1,
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch }, {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv1 = { 1, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv2 = { 1, 1 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .output = -1,
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch }, {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv1 = { -INT_MAX, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .tv2 = { INT_MAX, 0 },
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch .output = -1,
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch }
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen };
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen unsigned int i;
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_begin("timeval_cmp()");
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch for (i = 0; i < N_ELEMENTS(tests); i++) {
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch const struct timeval *tv1 = &tests[i].tv1, *tv2 = &tests[i].tv2;
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch int output = tests[i].output;
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch test_assert(timeval_cmp(tv1, tv2) == output);
45729acb14745ff241dc1059c1c29a7822b9366fStephan Bosch test_assert(timeval_cmp(tv2, tv1) == -output);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen }
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_end();
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen}
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainenstatic void test_timeval_diff(void)
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen{
b7324e421e2132cbbf753e6fdbe675bbaecdf929Timo Sirainen static const struct timeval input[] = {
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen { 1, 0 }, { 0, 999999 },
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen { 1, 0 }, { 0, 999001 },
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen { 1, 1 }, { 0, 999001 },
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen { 2, 1 }, { 1, 0 },
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen { INT_MAX, 0 }, { INT_MAX-1, 1 }
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen };
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen static int output[] = {
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen 1,
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen 999,
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen 1000,
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen 1000001,
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen 999999
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen };
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen unsigned int i;
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen long long udiff;
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen int mdiff;
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_begin("timeval_diff_*()");
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen for (i = 0; i < N_ELEMENTS(input); i += 2) {
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen udiff = timeval_diff_usecs(&input[i], &input[i+1]);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen mdiff = timeval_diff_msecs(&input[i], &input[i+1]);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_assert(udiff == output[i/2]);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_assert(mdiff == udiff/1000);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen udiff = timeval_diff_usecs(&input[i+1], &input[i]);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen mdiff = timeval_diff_msecs(&input[i+1], &input[i]);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_assert(udiff == -output[i/2]);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_assert(mdiff == udiff/1000);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen }
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_end();
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen}
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainenstatic void test_time_to_local_day_start(void)
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen{
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen /* Try this around days when DST changes in some of the more popular
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen timezones. If that works, everything else probably works too. */
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen const struct tm tests[] = {
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen /* Europe winter -> summer */
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 2, .tm_mday = 26 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 2, .tm_mday = 26,
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen .tm_hour = 23, .tm_min = 59, .tm_sec = 59 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen /* Europe summer -> winter */
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 9, .tm_mday = 29 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 9, .tm_mday = 29,
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen .tm_hour = 23, .tm_min = 59, .tm_sec = 59 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen /* USA winter -> summer */
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 2, .tm_mday = 12 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 2, .tm_mday = 12,
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen .tm_hour = 23, .tm_min = 59, .tm_sec = 59 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen /* USA summer -> winter */
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 10, .tm_mday = 5 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 10, .tm_mday = 5,
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen .tm_hour = 23, .tm_min = 59, .tm_sec = 59 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen /* (some of) Australia summer -> winter */
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 3, .tm_mday = 2 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 3, .tm_mday = 2,
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen .tm_hour = 23, .tm_min = 59, .tm_sec = 59 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen /* (some of) Australia winter -> summer */
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 9, .tm_mday = 1 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen { .tm_year = 2017-1900, .tm_mon = 9, .tm_mday = 1,
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen .tm_hour = 23, .tm_min = 59, .tm_sec = 59 },
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen };
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen const struct tm *tm;
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen struct tm tm_copy;
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen time_t t;
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen test_begin("time_to_local_day_start()");
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen for (unsigned i = 0; i < N_ELEMENTS(tests); i++) {
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen tm_copy = tests[i];
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen tm_copy.tm_isdst = -1;
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen t = mktime(&tm_copy);
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen test_assert_idx(t != (time_t)-1, i);
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen t = time_to_local_day_start(t);
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen tm = localtime(&t);
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen test_assert_idx(tm->tm_year == tests[i].tm_year &&
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen tm->tm_mon == tests[i].tm_mon &&
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen tm->tm_mday == tests[i].tm_mday, i);
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen test_assert_idx(tm->tm_hour == 0 && tm->tm_min == 0 &&
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen tm->tm_sec == 0, i);
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen }
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen test_end();
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen}
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvistatic void test_timestamp(const char *ts, int idx)
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi{
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi /* %G:%H:%M:%S */
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi const char **t = t_strsplit(ts, ":");
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi unsigned len = str_array_length(t);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(len == 4, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi /* %G - ISO 8601 year */
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(strlen(t[0]) == 4, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi unsigned v;
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(str_to_uint(t[0], &v) == 0, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(1000 <= v, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(v <= 3000, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi /* %H - hour from 00 to 23 */
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(strlen(t[1]) == 2, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(str_to_uint(t[1], &v) == 0, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(v <= 23, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi /* %M - minute from 00 to 59 */
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(strlen(t[2]) == 2, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(str_to_uint(t[2], &v) == 0, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(v <= 59, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi /* %S - second from 00 to 60 */
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(strlen(t[3]) == 2, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(str_to_uint(t[3], &v) == 0, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert_idx(v <= 60, idx);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi}
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi#define TS_FMT "%G:%H:%M:%S"
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvistatic void test_strftime_now(void)
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi{
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_begin("t_strftime and variants now");
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi time_t now = time(NULL);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_timestamp(t_strftime(TS_FMT, gmtime(&now)), 0);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_timestamp(t_strfgmtime(TS_FMT, now), 1);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_timestamp(t_strflocaltime(TS_FMT, now), 2);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_end();
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi}
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
3e6f1c0a999cc0abfc05d817dd89f39fb9337e76Timo Sirainen#define RFC2822_FMT "%a, %d %b %Y %T"
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvistatic void test_strftime_fixed(void)
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi{
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_begin("t_strftime and variants fixed timestamp");
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi time_t ts = 1481222536;
3e6f1c0a999cc0abfc05d817dd89f39fb9337e76Timo Sirainen const char *exp = "Thu, 08 Dec 2016 18:42:16";
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert(strcmp(t_strftime(RFC2822_FMT, gmtime(&ts)), exp) == 0);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_assert(strcmp(t_strfgmtime(RFC2822_FMT, ts), exp) == 0);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_end();
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi}
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainenvoid test_time_util(void)
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen{
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_timeval_cmp();
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen test_timeval_diff();
27a33f6aaa3d02d88c020315ae613e0c4910e950Timo Sirainen test_time_to_local_day_start();
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_strftime_now();
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi test_strftime_fixed();
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen}