]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: add t_strfgmtime and t_strftime
authorMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Thu, 8 Dec 2016 11:01:48 +0000 (13:01 +0200)
committerMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Thu, 8 Dec 2016 19:05:22 +0000 (21:05 +0200)
src/lib/test-time-util.c
src/lib/time-util.c
src/lib/time-util.h

index 4a9a74d1775f570ecc55e119aa6a6d2573377395..9dfd5735855b8c7407604eb45c44fd623d0eb992 100644 (file)
@@ -3,6 +3,8 @@
 #include "test-lib.h"
 #include "time-util.h"
 
+#include <time.h>
+
 static void test_timeval_cmp(void)
 {
        static struct timeval input[] = {
@@ -68,8 +70,66 @@ static void test_timeval_diff(void)
        test_end();
 }
 
+static void test_timestamp(const char *ts, int idx)
+{
+       /* %G:%H:%M:%S */
+       const char **t = t_strsplit(ts, ":");
+       unsigned len = str_array_length(t);
+       test_assert_idx(len == 4, idx);
+
+       /* %G - ISO 8601 year */
+       test_assert_idx(strlen(t[0]) == 4, idx);
+       unsigned v;
+       test_assert_idx(str_to_uint(t[0], &v) == 0, idx);
+       test_assert_idx(1000 <= v, idx);
+       test_assert_idx(v <= 3000, idx);
+
+       /* %H - hour from 00 to 23 */
+       test_assert_idx(strlen(t[1]) == 2, idx);
+       test_assert_idx(str_to_uint(t[1], &v) == 0, idx);
+       test_assert_idx(v <= 23, idx);
+
+       /* %M - minute from 00 to 59 */
+       test_assert_idx(strlen(t[2]) == 2, idx);
+       test_assert_idx(str_to_uint(t[2], &v) == 0, idx);
+       test_assert_idx(v <= 59, idx);
+
+       /* %S - second from 00 to 60 */
+       test_assert_idx(strlen(t[3]) == 2, idx);
+       test_assert_idx(str_to_uint(t[3], &v) == 0, idx);
+       test_assert_idx(v <= 60, idx);
+}
+
+#define TS_FMT "%G:%H:%M:%S"
+static void test_strftime_now(void)
+{
+       test_begin("t_strftime and variants now");
+
+       time_t now = time(NULL);
+       test_timestamp(t_strftime(TS_FMT, gmtime(&now)), 0);
+       test_timestamp(t_strfgmtime(TS_FMT, now), 1);
+       test_timestamp(t_strflocaltime(TS_FMT, now), 2);
+
+       test_end();
+}
+
+#define RFC2822_FMT "%a, %d %b %Y %T %z"
+static void test_strftime_fixed(void)
+{
+       test_begin("t_strftime and variants fixed timestamp");
+
+       time_t ts = 1481222536;
+       const char *exp = "Thu, 08 Dec 2016 18:42:16 +0000";
+       test_assert(strcmp(t_strftime(RFC2822_FMT, gmtime(&ts)), exp) == 0);
+       test_assert(strcmp(t_strfgmtime(RFC2822_FMT, ts), exp) == 0);
+
+       test_end();
+}
+
 void test_time_util(void)
 {
        test_timeval_cmp();
        test_timeval_diff();
+       test_strftime_now();
+       test_strftime_fixed();
 }
index 3ab1a86821aee92b0fb5a74c91d3aca7570a3383..eebc1f738bd5c7ce62005df00d79258b0ac26778 100644 (file)
@@ -55,14 +55,12 @@ long long timeval_diff_usecs(const struct timeval *tv1,
        return ((long long)secs * 1000000LL) + usecs;
 }
 
-const char *t_strflocaltime(const char *fmt, time_t t)
+static const char *strftime_real(const char *fmt, const struct tm *tm)
 {
-       const struct tm *tm;
        size_t bufsize = strlen(fmt) + 32;
        char *buf = t_buffer_get(bufsize);
        size_t ret;
 
-       tm = localtime(&t);
        while ((ret = strftime(buf, bufsize, fmt, tm)) == 0) {
                bufsize *= 2;
                i_assert(bufsize <= STRFTIME_MAX_BUFSIZE);
@@ -71,3 +69,18 @@ const char *t_strflocaltime(const char *fmt, time_t t)
        t_buffer_alloc(ret + 1);
        return buf;
 }
+
+const char *t_strftime(const char *fmt, const struct tm *tm)
+{
+       return strftime_real(fmt, tm);
+}
+
+const char *t_strflocaltime(const char *fmt, time_t t)
+{
+       return strftime_real(fmt, localtime(&t));
+}
+
+const char *t_strfgmtime(const char *fmt, time_t t)
+{
+       return strftime_real(fmt, gmtime(&t));
+}
index befeebb40ca23c8435510d7b545652db909251a0..ef3643ce64ef0c3416f6b8b6ef3f7adca1e396c4 100644 (file)
@@ -36,7 +36,9 @@ timeval_sub_msecs(struct timeval *tv, unsigned int msecs)
        }
 }
 
-/* Wrapper to strftime() */
+/* Wrappers to strftime() */
+const char *t_strftime(const char *fmt, const struct tm *tm) ATTR_STRFTIME(1);
 const char *t_strflocaltime(const char *fmt, time_t t) ATTR_STRFTIME(1);
+const char *t_strfgmtime(const char *fmt, time_t t) ATTR_STRFTIME(1);
 
 #endif