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