1*e7be843bSPierre Pronchery /*
2*e7be843bSPierre Pronchery * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved.
3*e7be843bSPierre Pronchery *
4*e7be843bSPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use
5*e7be843bSPierre Pronchery * this file except in compliance with the License. You can obtain a copy
6*e7be843bSPierre Pronchery * in the file LICENSE in the source distribution or at
7*e7be843bSPierre Pronchery * https://www.openssl.org/source/license.html
8*e7be843bSPierre Pronchery */
9*e7be843bSPierre Pronchery
10*e7be843bSPierre Pronchery #include "testutil.h"
11*e7be843bSPierre Pronchery #include "internal/time.h"
12*e7be843bSPierre Pronchery
test_time_to_timeval(void)13*e7be843bSPierre Pronchery static int test_time_to_timeval(void)
14*e7be843bSPierre Pronchery {
15*e7be843bSPierre Pronchery OSSL_TIME a;
16*e7be843bSPierre Pronchery struct timeval tv;
17*e7be843bSPierre Pronchery
18*e7be843bSPierre Pronchery a = ossl_time_zero();
19*e7be843bSPierre Pronchery
20*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
21*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 0) || !TEST_long_eq(tv.tv_usec, 0))
22*e7be843bSPierre Pronchery return 0;
23*e7be843bSPierre Pronchery
24*e7be843bSPierre Pronchery /* Test that zero round trips */
25*e7be843bSPierre Pronchery if (!TEST_true(ossl_time_is_zero(ossl_time_from_timeval(tv))))
26*e7be843bSPierre Pronchery return 0;
27*e7be843bSPierre Pronchery
28*e7be843bSPierre Pronchery /* We should round up nano secs to the next usec */
29*e7be843bSPierre Pronchery a = ossl_ticks2time(1);
30*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
31*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 0) || !TEST_long_eq(tv.tv_usec, 1))
32*e7be843bSPierre Pronchery return 0;
33*e7be843bSPierre Pronchery a = ossl_ticks2time(999);
34*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
35*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 0) || !TEST_long_eq(tv.tv_usec, 1))
36*e7be843bSPierre Pronchery return 0;
37*e7be843bSPierre Pronchery a = ossl_ticks2time(1000);
38*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
39*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 0) || !TEST_long_eq(tv.tv_usec, 1))
40*e7be843bSPierre Pronchery return 0;
41*e7be843bSPierre Pronchery a = ossl_ticks2time(1001);
42*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
43*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 0) || !TEST_long_eq(tv.tv_usec, 2))
44*e7be843bSPierre Pronchery return 0;
45*e7be843bSPierre Pronchery a = ossl_ticks2time(999000);
46*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
47*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 0) || !TEST_long_eq(tv.tv_usec, 999))
48*e7be843bSPierre Pronchery return 0;
49*e7be843bSPierre Pronchery a = ossl_ticks2time(999999001);
50*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
51*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 1) || !TEST_long_eq(tv.tv_usec, 0))
52*e7be843bSPierre Pronchery return 0;
53*e7be843bSPierre Pronchery a = ossl_ticks2time(999999999);
54*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
55*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 1) || !TEST_long_eq(tv.tv_usec, 0))
56*e7be843bSPierre Pronchery return 0;
57*e7be843bSPierre Pronchery a = ossl_ticks2time(1000000000);
58*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
59*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 1) || !TEST_long_eq(tv.tv_usec, 0))
60*e7be843bSPierre Pronchery return 0;
61*e7be843bSPierre Pronchery a = ossl_ticks2time(1000000001);
62*e7be843bSPierre Pronchery tv = ossl_time_to_timeval(a);
63*e7be843bSPierre Pronchery if (!TEST_long_eq(tv.tv_sec, 1) || !TEST_long_eq(tv.tv_usec, 1))
64*e7be843bSPierre Pronchery return 0;
65*e7be843bSPierre Pronchery
66*e7be843bSPierre Pronchery /*
67*e7be843bSPierre Pronchery * Note that we don't currently support infinity round tripping. Instead
68*e7be843bSPierre Pronchery * callers need to explicitly test for infinity.
69*e7be843bSPierre Pronchery */
70*e7be843bSPierre Pronchery
71*e7be843bSPierre Pronchery return 1;
72*e7be843bSPierre Pronchery }
73*e7be843bSPierre Pronchery
setup_tests(void)74*e7be843bSPierre Pronchery int setup_tests(void)
75*e7be843bSPierre Pronchery {
76*e7be843bSPierre Pronchery ADD_TEST(test_time_to_timeval);
77*e7be843bSPierre Pronchery
78*e7be843bSPierre Pronchery return 1;
79*e7be843bSPierre Pronchery }
80