1d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes/* 2d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * Copyright (C) 2013 The Android Open Source Project 3d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * 4d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * you may not use this file except in compliance with the License. 6d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * You may obtain a copy of the License at 7d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * 8d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * 10d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * See the License for the specific language governing permissions and 14d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes * limitations under the License. 15d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes */ 16d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 17d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes#include <gtest/gtest.h> 18d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 19d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes#include <errno.h> 20db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#include <fcntl.h> 21d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes#include <stdlib.h> 22d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes#include <sys/stat.h> 23d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 24594b1a4af204aa9de2b4913182f4556e38d71648Elliott Hughes#include "TemporaryFile.h" 25594b1a4af204aa9de2b4913182f4556e38d71648Elliott Hughes 26d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott HughesTEST(sys_stat, futimens) { 27d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes FILE* fp = tmpfile(); 28d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_TRUE(fp != NULL); 29d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 30d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes int fd = fileno(fp); 31d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_NE(fd, -1); 32d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 33d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes timespec times[2]; 34d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[0].tv_sec = 123; 35d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[0].tv_nsec = 0; 36d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[1].tv_sec = 456; 37d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[1].tv_nsec = 0; 38d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_EQ(0, futimens(fd, times)) << strerror(errno); 39d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 40d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes struct stat sb; 41d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_EQ(0, fstat(fd, &sb)); 42d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_EQ(times[0].tv_sec, static_cast<long>(sb.st_atime)); 43d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_EQ(times[1].tv_sec, static_cast<long>(sb.st_mtime)); 44d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 45d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes fclose(fp); 46d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes} 47d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes 48d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott HughesTEST(sys_stat, futimens_EBADF) { 49d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes timespec times[2]; 50d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[0].tv_sec = 123; 51d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[0].tv_nsec = 0; 52d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[1].tv_sec = 456; 53d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes times[1].tv_nsec = 0; 54d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_EQ(-1, futimens(-1, times)); 55d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes ASSERT_EQ(EBADF, errno); 56d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughes} 57594b1a4af204aa9de2b4913182f4556e38d71648Elliott Hughes 58594b1a4af204aa9de2b4913182f4556e38d71648Elliott HughesTEST(sys_stat, mkfifo) { 596c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris if (getuid() == 0) { 606c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris // Racy but probably sufficient way to get a suitable filename. 616c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris std::string path; 626c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris { 636c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris TemporaryFile tf; 646c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris path = tf.filename; 656c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris } 66594b1a4af204aa9de2b4913182f4556e38d71648Elliott Hughes 676c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris ASSERT_EQ(0, mkfifo(path.c_str(), 0666)); 686c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris struct stat sb; 696c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris ASSERT_EQ(0, stat(path.c_str(), &sb)); 706c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris ASSERT_TRUE(S_ISFIFO(sb.st_mode)); 716c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris unlink(path.c_str()); 726c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris } else { 736c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris GTEST_LOG_(INFO) << "This test only performs a test when run as root."; 746c69afdb6ddd56e011b59e3060f12a5bdffb5f5cChristopher Ferris } 75594b1a4af204aa9de2b4913182f4556e38d71648Elliott Hughes} 76db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes 77db1ea3474899ebbd783aba872d3005f95a816d0fElliott HughesTEST(sys_stat, stat64_lstat64_fstat64) { 78db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes struct stat64 sb; 79db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes ASSERT_EQ(0, stat64("/proc/version", &sb)); 80db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes ASSERT_EQ(0, lstat64("/proc/version", &sb)); 81db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes int fd = open("/proc/version", O_RDONLY); 82db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes ASSERT_EQ(0, fstat64(fd, &sb)); 83db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes close(fd); 84db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes} 85