blob: 07394d6660da016154e26f4707c353b6cd5bc0e2 [file] [log] [blame]
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18
19#include <errno.h>
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080020#include <fcntl.h>
Elliott Hughes625993d2014-07-15 16:53:13 -070021#include <sys/syscall.h>
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -070022#include <sys/time.h>
23
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080024#include <android-base/file.h>
Elliott Hughes27586eb2013-10-28 13:21:06 -070025
Elliott Hughes449eff02016-06-08 19:51:20 -070026// http://b/11383777
27TEST(sys_time, utimes_nullptr) {
28 TemporaryFile tf;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080029 ASSERT_EQ(0, utimes(tf.path, nullptr));
Elliott Hughes449eff02016-06-08 19:51:20 -070030}
31
32TEST(sys_time, utimes_EINVAL) {
33 TemporaryFile tf;
34
35 timeval tv[2] = {};
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -070036
37 tv[0].tv_usec = -123;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080038 ASSERT_EQ(-1, utimes(tf.path, tv));
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -070039 ASSERT_EQ(EINVAL, errno);
40 tv[0].tv_usec = 1234567;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080041 ASSERT_EQ(-1, utimes(tf.path, tv));
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -070042 ASSERT_EQ(EINVAL, errno);
Elliott Hughes449eff02016-06-08 19:51:20 -070043
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -070044 tv[0].tv_usec = 0;
45
46 tv[1].tv_usec = -123;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080047 ASSERT_EQ(-1, utimes(tf.path, tv));
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -070048 ASSERT_EQ(EINVAL, errno);
49 tv[1].tv_usec = 1234567;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080050 ASSERT_EQ(-1, utimes(tf.path, tv));
Elliott Hughesf8fcfbc2013-10-22 13:28:46 -070051 ASSERT_EQ(EINVAL, errno);
52}
Elliott Hughes27586eb2013-10-28 13:21:06 -070053
Elliott Hughes449eff02016-06-08 19:51:20 -070054TEST(sys_time, futimes_nullptr) {
Elliott Hughes27586eb2013-10-28 13:21:06 -070055 TemporaryFile tf;
Elliott Hughes449eff02016-06-08 19:51:20 -070056 ASSERT_EQ(0, futimes(tf.fd, nullptr));
57}
58
59TEST(sys_time, futimes_EINVAL) {
60 TemporaryFile tf;
61
62 timeval tv[2] = {};
63
64 tv[0].tv_usec = -123;
65 ASSERT_EQ(-1, futimes(tf.fd, tv));
66 ASSERT_EQ(EINVAL, errno);
67 tv[0].tv_usec = 1234567;
68 ASSERT_EQ(-1, futimes(tf.fd, tv));
69 ASSERT_EQ(EINVAL, errno);
70
71 tv[0].tv_usec = 0;
72
73 tv[1].tv_usec = -123;
74 ASSERT_EQ(-1, futimes(tf.fd, tv));
75 ASSERT_EQ(EINVAL, errno);
76 tv[1].tv_usec = 1234567;
77 ASSERT_EQ(-1, futimes(tf.fd, tv));
78 ASSERT_EQ(EINVAL, errno);
79}
80
81TEST(sys_time, futimesat_nullptr) {
82 TemporaryFile tf;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080083 ASSERT_EQ(0, futimesat(AT_FDCWD, tf.path, nullptr));
Elliott Hughes449eff02016-06-08 19:51:20 -070084}
85
86TEST(sys_time, futimesat_EINVAL) {
87 TemporaryFile tf;
88
89 timeval tv[2] = {};
90
91 tv[0].tv_usec = -123;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080092 ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -070093 ASSERT_EQ(EINVAL, errno);
94 tv[0].tv_usec = 1234567;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -080095 ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -070096 ASSERT_EQ(EINVAL, errno);
97
98 tv[0].tv_usec = 0;
99
100 tv[1].tv_usec = -123;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -0800101 ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -0700102 ASSERT_EQ(EINVAL, errno);
103 tv[1].tv_usec = 1234567;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -0800104 ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -0700105 ASSERT_EQ(EINVAL, errno);
106}
107
108TEST(sys_time, lutimes_nullptr) {
109 TemporaryFile tf;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -0800110 ASSERT_EQ(0, lutimes(tf.path, nullptr));
Elliott Hughes449eff02016-06-08 19:51:20 -0700111}
112
113TEST(sys_time, lutimes_EINVAL) {
114 TemporaryFile tf;
115
116 timeval tv[2] = {};
117
118 tv[0].tv_usec = -123;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -0800119 ASSERT_EQ(-1, lutimes(tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -0700120 ASSERT_EQ(EINVAL, errno);
121 tv[0].tv_usec = 1234567;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -0800122 ASSERT_EQ(-1, lutimes(tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -0700123 ASSERT_EQ(EINVAL, errno);
124
125 tv[0].tv_usec = 0;
126
127 tv[1].tv_usec = -123;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -0800128 ASSERT_EQ(-1, lutimes(tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -0700129 ASSERT_EQ(EINVAL, errno);
130 tv[1].tv_usec = 1234567;
Mark Salyzyn68a3bcc2018-11-13 07:35:21 -0800131 ASSERT_EQ(-1, lutimes(tf.path, tv));
Elliott Hughes449eff02016-06-08 19:51:20 -0700132 ASSERT_EQ(EINVAL, errno);
Elliott Hughes27586eb2013-10-28 13:21:06 -0700133}
Elliott Hughes625993d2014-07-15 16:53:13 -0700134
Colin Cross35d469b2021-08-16 15:26:28 -0700135// Musl doesn't define __NR_gettimeofday on 32-bit architectures.
136#if !defined(__NR_gettimeofday)
137#define __NR_gettimeofday __NR_gettimeofday_time32
138#endif
139
Elliott Hughes625993d2014-07-15 16:53:13 -0700140TEST(sys_time, gettimeofday) {
141 // Try to ensure that our vdso gettimeofday is working.
142 timeval tv1;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700143 ASSERT_EQ(0, gettimeofday(&tv1, nullptr));
Elliott Hughes625993d2014-07-15 16:53:13 -0700144 timeval tv2;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700145 ASSERT_EQ(0, syscall(__NR_gettimeofday, &tv2, nullptr));
Elliott Hughes625993d2014-07-15 16:53:13 -0700146
147 // What's the difference between the two?
148 tv2.tv_sec -= tv1.tv_sec;
149 tv2.tv_usec -= tv1.tv_usec;
150 if (tv2.tv_usec < 0) {
151 --tv2.tv_sec;
152 tv2.tv_usec += 1000000;
153 }
154
Elliott Hughes0159b642019-01-18 08:20:55 -0800155 // To try to avoid flakiness we'll accept answers within 10,000us (0.01s).
Elliott Hughes625993d2014-07-15 16:53:13 -0700156 ASSERT_EQ(0, tv2.tv_sec);
Elliott Hughes0159b642019-01-18 08:20:55 -0800157 ASSERT_LT(tv2.tv_usec, 10'000);
Elliott Hughes625993d2014-07-15 16:53:13 -0700158}