1f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes/*
2f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * Copyright (C) 2013 The Android Open Source Project
3f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes *
4f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * you may not use this file except in compliance with the License.
6f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * You may obtain a copy of the License at
7f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes *
8f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes *
10f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * Unless required by applicable law or agreed to in writing, software
11f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * See the License for the specific language governing permissions and
14f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes * limitations under the License.
15f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes */
16f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes
17f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes#include <gtest/gtest.h>
18f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes
19f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes#include <errno.h>
20625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes#include <sys/syscall.h>
21f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes#include <sys/time.h>
22f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes
2327586ebe1a7f2f45651b855a26b3203d63d015d6Elliott Hughes#include "TemporaryFile.h"
2427586ebe1a7f2f45651b855a26b3203d63d015d6Elliott Hughes
25449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes// http://b/11383777
26449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, utimes_nullptr) {
27449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  TemporaryFile tf;
28449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(0, utimes(tf.filename, nullptr));
29449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes}
30449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
31449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, utimes_EINVAL) {
32449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  TemporaryFile tf;
33449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
34449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  timeval tv[2] = {};
35f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes
36f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  tv[0].tv_usec = -123;
37449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, utimes(tf.filename, tv));
38f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  ASSERT_EQ(EINVAL, errno);
39f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  tv[0].tv_usec = 1234567;
40449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, utimes(tf.filename, tv));
41f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  ASSERT_EQ(EINVAL, errno);
42449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
43f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  tv[0].tv_usec = 0;
44f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes
45f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  tv[1].tv_usec = -123;
46449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, utimes(tf.filename, tv));
47f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  ASSERT_EQ(EINVAL, errno);
48f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  tv[1].tv_usec = 1234567;
49449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, utimes(tf.filename, tv));
50f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes  ASSERT_EQ(EINVAL, errno);
51f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughes}
5227586ebe1a7f2f45651b855a26b3203d63d015d6Elliott Hughes
53449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, futimes_nullptr) {
54449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  TemporaryFile tf;
55449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(0, futimes(tf.fd, nullptr));
56449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes}
57449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
58449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, futimes_EINVAL) {
59449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  TemporaryFile tf;
60449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
61449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  timeval tv[2] = {};
62449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
63449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = -123;
64449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimes(tf.fd, tv));
65449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
66449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = 1234567;
67449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimes(tf.fd, tv));
68449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
69449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
70449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = 0;
71449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
72449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[1].tv_usec = -123;
73449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimes(tf.fd, tv));
74449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
75449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[1].tv_usec = 1234567;
76449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimes(tf.fd, tv));
77449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
78449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes}
79449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
80449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, futimesat_nullptr) {
81449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  TemporaryFile tf;
82449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(0, futimesat(AT_FDCWD, tf.filename, nullptr));
83449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes}
84449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
85449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, futimesat_EINVAL) {
86449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  TemporaryFile tf;
87449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
88449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  timeval tv[2] = {};
89449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
90449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = -123;
91449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
92449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
93449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = 1234567;
94449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
95449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
96449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
97449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = 0;
98449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
99449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[1].tv_usec = -123;
100449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
101449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
102449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[1].tv_usec = 1234567;
103449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, futimesat(AT_FDCWD, tf.filename, tv));
104449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
105449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes}
106449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
107449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, lutimes_nullptr) {
10827586ebe1a7f2f45651b855a26b3203d63d015d6Elliott Hughes  TemporaryFile tf;
109449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(0, lutimes(tf.filename, nullptr));
110449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes}
111449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
112449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott HughesTEST(sys_time, lutimes_EINVAL) {
113449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  TemporaryFile tf;
114449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
115449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  timeval tv[2] = {};
116449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
117449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = -123;
118449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, lutimes(tf.filename, tv));
119449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
120449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = 1234567;
121449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, lutimes(tf.filename, tv));
122449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
123449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
124449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[0].tv_usec = 0;
125449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes
126449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[1].tv_usec = -123;
127449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, lutimes(tf.filename, tv));
128449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
129449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  tv[1].tv_usec = 1234567;
130449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(-1, lutimes(tf.filename, tv));
131449eff02d2a44a2089ed3b6e3082cc416e5dd49eElliott Hughes  ASSERT_EQ(EINVAL, errno);
13227586ebe1a7f2f45651b855a26b3203d63d015d6Elliott Hughes}
133625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes
134625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott HughesTEST(sys_time, gettimeofday) {
135625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  // Try to ensure that our vdso gettimeofday is working.
136625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  timeval tv1;
137625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  ASSERT_EQ(0, gettimeofday(&tv1, NULL));
138625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  timeval tv2;
139625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  ASSERT_EQ(0, syscall(__NR_gettimeofday, &tv2, NULL));
140625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes
141625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  // What's the difference between the two?
142625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  tv2.tv_sec -= tv1.tv_sec;
143625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  tv2.tv_usec -= tv1.tv_usec;
144625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  if (tv2.tv_usec < 0) {
145625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes    --tv2.tv_sec;
146625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes    tv2.tv_usec += 1000000;
147625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  }
148625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes
1497f54348f302eea6cc6f0237ddd8775e061da63acElliott Hughes  // Should be less than (a very generous, to try to avoid flakiness) 2ms (2000us).
150625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes  ASSERT_EQ(0, tv2.tv_sec);
1517f54348f302eea6cc6f0237ddd8775e061da63acElliott Hughes  ASSERT_LT(tv2.tv_usec, 2000);
152625993dfbb085a3cde7492eda8ec1cdc1ee39a78Elliott Hughes}
153