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