1 /*
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>
20 #include <sys/syscall.h>
21 #include <sys/time.h>
22 
23 #include "TemporaryFile.h"
24 
25 // http://b/11383777
TEST(sys_time,utimes_nullptr)26 TEST(sys_time, utimes_nullptr) {
27   TemporaryFile tf;
28   ASSERT_EQ(0, utimes(tf.filename, nullptr));
29 }
30 
TEST(sys_time,utimes_EINVAL)31 TEST(sys_time, utimes_EINVAL) {
32   TemporaryFile tf;
33 
34   timeval tv[2] = {};
35 
36   tv[0].tv_usec = -123;
37   ASSERT_EQ(-1, utimes(tf.filename, tv));
38   ASSERT_EQ(EINVAL, errno);
39   tv[0].tv_usec = 1234567;
40   ASSERT_EQ(-1, utimes(tf.filename, tv));
41   ASSERT_EQ(EINVAL, errno);
42 
43   tv[0].tv_usec = 0;
44 
45   tv[1].tv_usec = -123;
46   ASSERT_EQ(-1, utimes(tf.filename, tv));
47   ASSERT_EQ(EINVAL, errno);
48   tv[1].tv_usec = 1234567;
49   ASSERT_EQ(-1, utimes(tf.filename, tv));
50   ASSERT_EQ(EINVAL, errno);
51 }
52 
TEST(sys_time,futimes_nullptr)53 TEST(sys_time, futimes_nullptr) {
54   TemporaryFile tf;
55   ASSERT_EQ(0, futimes(tf.fd, nullptr));
56 }
57 
TEST(sys_time,futimes_EINVAL)58 TEST(sys_time, futimes_EINVAL) {
59   TemporaryFile tf;
60 
61   timeval tv[2] = {};
62 
63   tv[0].tv_usec = -123;
64   ASSERT_EQ(-1, futimes(tf.fd, tv));
65   ASSERT_EQ(EINVAL, errno);
66   tv[0].tv_usec = 1234567;
67   ASSERT_EQ(-1, futimes(tf.fd, tv));
68   ASSERT_EQ(EINVAL, errno);
69 
70   tv[0].tv_usec = 0;
71 
72   tv[1].tv_usec = -123;
73   ASSERT_EQ(-1, futimes(tf.fd, tv));
74   ASSERT_EQ(EINVAL, errno);
75   tv[1].tv_usec = 1234567;
76   ASSERT_EQ(-1, futimes(tf.fd, tv));
77   ASSERT_EQ(EINVAL, errno);
78 }
79 
TEST(sys_time,futimesat_nullptr)80 TEST(sys_time, futimesat_nullptr) {
81   TemporaryFile tf;
82   ASSERT_EQ(0, futimesat(AT_FDCWD, tf.filename, nullptr));
83 }
84 
TEST(sys_time,futimesat_EINVAL)85 TEST(sys_time, futimesat_EINVAL) {
86   TemporaryFile tf;
87 
88   timeval tv[2] = {};
89 
90   tv[0].tv_usec = -123;
91   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
92   ASSERT_EQ(EINVAL, errno);
93   tv[0].tv_usec = 1234567;
94   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
95   ASSERT_EQ(EINVAL, errno);
96 
97   tv[0].tv_usec = 0;
98 
99   tv[1].tv_usec = -123;
100   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
101   ASSERT_EQ(EINVAL, errno);
102   tv[1].tv_usec = 1234567;
103   ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
104   ASSERT_EQ(EINVAL, errno);
105 }
106 
TEST(sys_time,lutimes_nullptr)107 TEST(sys_time, lutimes_nullptr) {
108   TemporaryFile tf;
109   ASSERT_EQ(0, lutimes(tf.filename, nullptr));
110 }
111 
TEST(sys_time,lutimes_EINVAL)112 TEST(sys_time, lutimes_EINVAL) {
113   TemporaryFile tf;
114 
115   timeval tv[2] = {};
116 
117   tv[0].tv_usec = -123;
118   ASSERT_EQ(-1, lutimes(tf.filename, tv));
119   ASSERT_EQ(EINVAL, errno);
120   tv[0].tv_usec = 1234567;
121   ASSERT_EQ(-1, lutimes(tf.filename, tv));
122   ASSERT_EQ(EINVAL, errno);
123 
124   tv[0].tv_usec = 0;
125 
126   tv[1].tv_usec = -123;
127   ASSERT_EQ(-1, lutimes(tf.filename, tv));
128   ASSERT_EQ(EINVAL, errno);
129   tv[1].tv_usec = 1234567;
130   ASSERT_EQ(-1, lutimes(tf.filename, tv));
131   ASSERT_EQ(EINVAL, errno);
132 }
133 
TEST(sys_time,gettimeofday)134 TEST(sys_time, gettimeofday) {
135   // Try to ensure that our vdso gettimeofday is working.
136   timeval tv1;
137   ASSERT_EQ(0, gettimeofday(&tv1, NULL));
138   timeval tv2;
139   ASSERT_EQ(0, syscall(__NR_gettimeofday, &tv2, NULL));
140 
141   // What's the difference between the two?
142   tv2.tv_sec -= tv1.tv_sec;
143   tv2.tv_usec -= tv1.tv_usec;
144   if (tv2.tv_usec < 0) {
145     --tv2.tv_sec;
146     tv2.tv_usec += 1000000;
147   }
148 
149   // Should be less than (a very generous, to try to avoid flakiness) 2ms (2000us).
150   ASSERT_EQ(0, tv2.tv_sec);
151   ASSERT_LT(tv2.tv_usec, 2000);
152 }
153