xref: /aosp_15_r20/bionic/tests/sys_time_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*8d67ca89SAndroid Build Coastguard Worker 
19*8d67ca89SAndroid Build Coastguard Worker #include <errno.h>
20*8d67ca89SAndroid Build Coastguard Worker #include <fcntl.h>
21*8d67ca89SAndroid Build Coastguard Worker #include <sys/syscall.h>
22*8d67ca89SAndroid Build Coastguard Worker #include <sys/time.h>
23*8d67ca89SAndroid Build Coastguard Worker 
24*8d67ca89SAndroid Build Coastguard Worker #include <android-base/file.h>
25*8d67ca89SAndroid Build Coastguard Worker 
26*8d67ca89SAndroid Build Coastguard Worker #include "private/bionic_time_conversions.h"
27*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker // http://b/11383777
TEST(sys_time,utimes_nullptr)30*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, utimes_nullptr) {
31*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
32*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, utimes(tf.path, nullptr));
33*8d67ca89SAndroid Build Coastguard Worker }
34*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,utimes_EINVAL)35*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, utimes_EINVAL) {
36*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
37*8d67ca89SAndroid Build Coastguard Worker 
38*8d67ca89SAndroid Build Coastguard Worker   timeval tv[2] = {};
39*8d67ca89SAndroid Build Coastguard Worker 
40*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = -123;
41*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, utimes(tf.path, tv));
42*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
43*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 1234567;
44*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, utimes(tf.path, tv));
45*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
46*8d67ca89SAndroid Build Coastguard Worker 
47*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 0;
48*8d67ca89SAndroid Build Coastguard Worker 
49*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = -123;
50*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, utimes(tf.path, tv));
51*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
52*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = 1234567;
53*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, utimes(tf.path, tv));
54*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
55*8d67ca89SAndroid Build Coastguard Worker }
56*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,futimes_nullptr)57*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, futimes_nullptr) {
58*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
59*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, futimes(tf.fd, nullptr));
60*8d67ca89SAndroid Build Coastguard Worker }
61*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,futimes_EINVAL)62*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, futimes_EINVAL) {
63*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
64*8d67ca89SAndroid Build Coastguard Worker 
65*8d67ca89SAndroid Build Coastguard Worker   timeval tv[2] = {};
66*8d67ca89SAndroid Build Coastguard Worker 
67*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = -123;
68*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimes(tf.fd, tv));
69*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
70*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 1234567;
71*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimes(tf.fd, tv));
72*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
73*8d67ca89SAndroid Build Coastguard Worker 
74*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 0;
75*8d67ca89SAndroid Build Coastguard Worker 
76*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = -123;
77*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimes(tf.fd, tv));
78*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
79*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = 1234567;
80*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimes(tf.fd, tv));
81*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
82*8d67ca89SAndroid Build Coastguard Worker }
83*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,futimesat_nullptr)84*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, futimesat_nullptr) {
85*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
86*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, futimesat(AT_FDCWD, tf.path, nullptr));
87*8d67ca89SAndroid Build Coastguard Worker }
88*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,futimesat_EINVAL)89*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, futimesat_EINVAL) {
90*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
91*8d67ca89SAndroid Build Coastguard Worker 
92*8d67ca89SAndroid Build Coastguard Worker   timeval tv[2] = {};
93*8d67ca89SAndroid Build Coastguard Worker 
94*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = -123;
95*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
96*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
97*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 1234567;
98*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
99*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
100*8d67ca89SAndroid Build Coastguard Worker 
101*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 0;
102*8d67ca89SAndroid Build Coastguard Worker 
103*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = -123;
104*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
105*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
106*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = 1234567;
107*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
108*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
109*8d67ca89SAndroid Build Coastguard Worker }
110*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,lutimes_nullptr)111*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, lutimes_nullptr) {
112*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
113*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, lutimes(tf.path, nullptr));
114*8d67ca89SAndroid Build Coastguard Worker }
115*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,lutimes_EINVAL)116*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, lutimes_EINVAL) {
117*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
118*8d67ca89SAndroid Build Coastguard Worker 
119*8d67ca89SAndroid Build Coastguard Worker   timeval tv[2] = {};
120*8d67ca89SAndroid Build Coastguard Worker 
121*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = -123;
122*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, lutimes(tf.path, tv));
123*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
124*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 1234567;
125*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, lutimes(tf.path, tv));
126*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
127*8d67ca89SAndroid Build Coastguard Worker 
128*8d67ca89SAndroid Build Coastguard Worker   tv[0].tv_usec = 0;
129*8d67ca89SAndroid Build Coastguard Worker 
130*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = -123;
131*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, lutimes(tf.path, tv));
132*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
133*8d67ca89SAndroid Build Coastguard Worker   tv[1].tv_usec = 1234567;
134*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, lutimes(tf.path, tv));
135*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
136*8d67ca89SAndroid Build Coastguard Worker }
137*8d67ca89SAndroid Build Coastguard Worker 
138*8d67ca89SAndroid Build Coastguard Worker // Musl doesn't define __NR_gettimeofday on 32-bit architectures.
139*8d67ca89SAndroid Build Coastguard Worker #if !defined(__NR_gettimeofday)
140*8d67ca89SAndroid Build Coastguard Worker #define __NR_gettimeofday __NR_gettimeofday_time32
141*8d67ca89SAndroid Build Coastguard Worker #endif
142*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_time,gettimeofday)143*8d67ca89SAndroid Build Coastguard Worker TEST(sys_time, gettimeofday) {
144*8d67ca89SAndroid Build Coastguard Worker   // Try to ensure that our vdso gettimeofday is working.
145*8d67ca89SAndroid Build Coastguard Worker   timeval tv1;
146*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, gettimeofday(&tv1, nullptr));
147*8d67ca89SAndroid Build Coastguard Worker   timeval tv2;
148*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, syscall(__NR_gettimeofday, &tv2, nullptr));
149*8d67ca89SAndroid Build Coastguard Worker 
150*8d67ca89SAndroid Build Coastguard Worker   // What's the difference between the two?
151*8d67ca89SAndroid Build Coastguard Worker   // To try to avoid flakiness we'll accept answers within 10,000us (0.01s).
152*8d67ca89SAndroid Build Coastguard Worker   ASSERT_LT(to_us(tv2) - to_us(tv1), 10'000);
153*8d67ca89SAndroid Build Coastguard Worker }
154