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