unistd_test.cpp revision 764a99361130dceda62bbc4f8780bbf395dbc424
1/* 2 * Copyright (C) 2012 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#include "ScopedSignalHandler.h" 19#include "TemporaryFile.h" 20 21#include <errno.h> 22#include <fcntl.h> 23#include <stdint.h> 24#include <unistd.h> 25#include <sys/types.h> 26#include <sys/wait.h> 27 28TEST(unistd, sysconf_SC_MONOTONIC_CLOCK) { 29 ASSERT_GT(sysconf(_SC_MONOTONIC_CLOCK), 0); 30} 31 32TEST(unistd, sbrk) { 33 void* initial_break = sbrk(0); 34 35 void* new_break = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(initial_break) + 2000); 36 ASSERT_EQ(0, brk(new_break)); 37 38 void* final_break = sbrk(0); 39 ASSERT_EQ(final_break, new_break); 40} 41 42TEST(unistd, truncate) { 43 TemporaryFile tf; 44 ASSERT_EQ(0, close(tf.fd)); 45 ASSERT_EQ(0, truncate(tf.filename, 123)); 46 47 struct stat sb; 48 ASSERT_EQ(0, stat(tf.filename, &sb)); 49 ASSERT_EQ(123, sb.st_size); 50} 51 52TEST(unistd, truncate64) { 53 TemporaryFile tf; 54 ASSERT_EQ(0, close(tf.fd)); 55 ASSERT_EQ(0, truncate64(tf.filename, 123)); 56 57 struct stat sb; 58 ASSERT_EQ(0, stat(tf.filename, &sb)); 59 ASSERT_EQ(123, sb.st_size); 60} 61 62TEST(unistd, ftruncate) { 63 TemporaryFile tf; 64 ASSERT_EQ(0, ftruncate(tf.fd, 123)); 65 ASSERT_EQ(0, close(tf.fd)); 66 67 struct stat sb; 68 ASSERT_EQ(0, stat(tf.filename, &sb)); 69 ASSERT_EQ(123, sb.st_size); 70} 71 72TEST(unistd, ftruncate64) { 73 TemporaryFile tf; 74 ASSERT_EQ(0, ftruncate64(tf.fd, 123)); 75 ASSERT_EQ(0, close(tf.fd)); 76 77 struct stat sb; 78 ASSERT_EQ(0, stat(tf.filename, &sb)); 79 ASSERT_EQ(123, sb.st_size); 80} 81 82static bool gPauseTestFlag = false; 83static void PauseTestSignalHandler(int) { 84 gPauseTestFlag = true; 85} 86 87TEST(unistd, pause) { 88 ScopedSignalHandler handler(SIGALRM, PauseTestSignalHandler); 89 90 alarm(1); 91 ASSERT_FALSE(gPauseTestFlag); 92 ASSERT_EQ(-1, pause()); 93 ASSERT_TRUE(gPauseTestFlag); 94} 95 96TEST(unistd, read) { 97 int fd = open("/proc/version", O_RDONLY); 98 ASSERT_TRUE(fd != -1); 99 100 char buf[5]; 101 ASSERT_EQ(5, read(fd, buf, 5)); 102 ASSERT_EQ(buf[0], 'L'); 103 ASSERT_EQ(buf[1], 'i'); 104 ASSERT_EQ(buf[2], 'n'); 105 ASSERT_EQ(buf[3], 'u'); 106 ASSERT_EQ(buf[4], 'x'); 107 close(fd); 108} 109 110TEST(unistd, read_EBADF) { 111 // read returns ssize_t which is 64-bits on LP64, so it's worth explicitly checking that 112 // our syscall stubs correctly return a 64-bit -1. 113 char buf[1]; 114 ASSERT_EQ(-1, read(-1, buf, sizeof(buf))); 115 ASSERT_EQ(EBADF, errno); 116} 117 118TEST(unistd, alarm) { 119 ASSERT_EQ(0U, alarm(0)); 120} 121 122TEST(unistd, _exit) { 123 int pid = fork(); 124 ASSERT_NE(-1, pid) << strerror(errno); 125 126 if (pid == 0) { 127 _exit(99); 128 } 129 130 int status; 131 ASSERT_EQ(pid, waitpid(pid, &status, 0)); 132 ASSERT_TRUE(WIFEXITED(status)); 133 ASSERT_EQ(99, WEXITSTATUS(status)); 134} 135