xref: /unit/src/test/nxt_gmtime_test.c (revision 384:8f86d3ff3e29)
1*384Szelenkov@nginx.com 
2*384Szelenkov@nginx.com /*
3*384Szelenkov@nginx.com  * Copyright (C) Igor Sysoev
4*384Szelenkov@nginx.com  * Copyright (C) NGINX, Inc.
5*384Szelenkov@nginx.com  */
6*384Szelenkov@nginx.com 
7*384Szelenkov@nginx.com #include <nxt_main.h>
8*384Szelenkov@nginx.com #include "nxt_tests.h"
9*384Szelenkov@nginx.com 
10*384Szelenkov@nginx.com 
11*384Szelenkov@nginx.com #if (NXT_TIME_T_SIZE == 4)
12*384Szelenkov@nginx.com 
13*384Szelenkov@nginx.com /* A 86400-fold number below 2^31. */
14*384Szelenkov@nginx.com #define NXT_GMTIME_MAX  2147472000
15*384Szelenkov@nginx.com 
16*384Szelenkov@nginx.com #else
17*384Szelenkov@nginx.com /*
18*384Szelenkov@nginx.com  * March 19, 29398 is maximum valid data if nxt_uint_t
19*384Szelenkov@nginx.com  * is 4 bytes size whilst nxt_time_t is 8 bytes size.
20*384Szelenkov@nginx.com  */
21*384Szelenkov@nginx.com #define NXT_GMTIME_MAX  865550793600
22*384Szelenkov@nginx.com #endif
23*384Szelenkov@nginx.com 
24*384Szelenkov@nginx.com 
25*384Szelenkov@nginx.com nxt_int_t
nxt_gmtime_test(nxt_thread_t * thr)26*384Szelenkov@nginx.com nxt_gmtime_test(nxt_thread_t *thr)
27*384Szelenkov@nginx.com {
28*384Szelenkov@nginx.com     struct tm   tm0, *tm1;
29*384Szelenkov@nginx.com     nxt_time_t  s;
30*384Szelenkov@nginx.com     nxt_nsec_t  start, end;
31*384Szelenkov@nginx.com 
32*384Szelenkov@nginx.com     nxt_thread_time_update(thr);
33*384Szelenkov@nginx.com     nxt_log_error(NXT_LOG_NOTICE, thr->log, "gmtime test started");
34*384Szelenkov@nginx.com 
35*384Szelenkov@nginx.com     for (s = 0; s < NXT_GMTIME_MAX; s += 86400) {
36*384Szelenkov@nginx.com 
37*384Szelenkov@nginx.com         nxt_gmtime(s, &tm0);
38*384Szelenkov@nginx.com         tm1 = gmtime(&s);
39*384Szelenkov@nginx.com 
40*384Szelenkov@nginx.com         if (tm0.tm_mday != tm1->tm_mday
41*384Szelenkov@nginx.com             || tm0.tm_mon != tm1->tm_mon
42*384Szelenkov@nginx.com             || tm0.tm_year != tm1->tm_year
43*384Szelenkov@nginx.com             || tm0.tm_yday != tm1->tm_yday
44*384Szelenkov@nginx.com             || tm0.tm_wday != tm1->tm_wday)
45*384Szelenkov@nginx.com         {
46*384Szelenkov@nginx.com             nxt_log_alert(thr->log,
47*384Szelenkov@nginx.com                           "gmtime test failed: %T @ %02d.%02d.%d",
48*384Szelenkov@nginx.com                           s, tm1->tm_mday, tm1->tm_mon + 1,
49*384Szelenkov@nginx.com                           tm1->tm_year + 1900);
50*384Szelenkov@nginx.com             return NXT_ERROR;
51*384Szelenkov@nginx.com         }
52*384Szelenkov@nginx.com     }
53*384Szelenkov@nginx.com 
54*384Szelenkov@nginx.com 
55*384Szelenkov@nginx.com     nxt_thread_time_update(thr);
56*384Szelenkov@nginx.com     start = nxt_thread_monotonic_time(thr);
57*384Szelenkov@nginx.com 
58*384Szelenkov@nginx.com     for (s = 0; s < 10000000; s++) {
59*384Szelenkov@nginx.com         nxt_gmtime(s, &tm0);
60*384Szelenkov@nginx.com     }
61*384Szelenkov@nginx.com 
62*384Szelenkov@nginx.com     nxt_thread_time_update(thr);
63*384Szelenkov@nginx.com     end = nxt_thread_monotonic_time(thr);
64*384Szelenkov@nginx.com 
65*384Szelenkov@nginx.com     nxt_log_error(NXT_LOG_NOTICE, thr->log, "nxt_gmtime(): %0.1fns",
66*384Szelenkov@nginx.com                   (end - start) / 10000000.0);
67*384Szelenkov@nginx.com 
68*384Szelenkov@nginx.com 
69*384Szelenkov@nginx.com     nxt_thread_time_update(thr);
70*384Szelenkov@nginx.com     start = nxt_thread_monotonic_time(thr);
71*384Szelenkov@nginx.com 
72*384Szelenkov@nginx.com     for (s = 0; s < 10000000; s++) {
73*384Szelenkov@nginx.com         (void) gmtime(&s);
74*384Szelenkov@nginx.com     }
75*384Szelenkov@nginx.com 
76*384Szelenkov@nginx.com     nxt_thread_time_update(thr);
77*384Szelenkov@nginx.com     end = nxt_thread_monotonic_time(thr);
78*384Szelenkov@nginx.com 
79*384Szelenkov@nginx.com     nxt_log_error(NXT_LOG_NOTICE, thr->log, "gmtime(): %0.1fns",
80*384Szelenkov@nginx.com                   (end - start) / 10000000.0);
81*384Szelenkov@nginx.com 
82*384Szelenkov@nginx.com     nxt_log_error(NXT_LOG_NOTICE, thr->log, "gmtime test passed");
83*384Szelenkov@nginx.com     return NXT_OK;
84*384Szelenkov@nginx.com }
85