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