unistd_test.cpp revision 9f525644df99cb2f7f81a23ca23840f0a8f82275
1a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes/*
2a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * Copyright (C) 2012 The Android Open Source Project
3a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes *
4a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * you may not use this file except in compliance with the License.
6a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * You may obtain a copy of the License at
7a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes *
8a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes *
10a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * See the License for the specific language governing permissions and
14a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * limitations under the License.
15a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes */
16a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes
17a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <gtest/gtest.h>
1813613137bc4266656bffce464e525eb9ae6371f0Christopher Ferris#include "ScopedSignalHandler.h"
19b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes#include "TemporaryFile.h"
20a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes
21915fefb62e1beed3da26fe299a8141645733a925Elliott Hughes#include <errno.h>
223d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross#include <fcntl.h>
23428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes#include <stdint.h>
24a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <unistd.h>
25a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes
26a55f63083fb16b2595f517a3260083e5f8cddd02Elliott HughesTEST(unistd, sysconf_SC_MONOTONIC_CLOCK) {
27a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes  ASSERT_GT(sysconf(_SC_MONOTONIC_CLOCK), 0);
28a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes}
29428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes
30428f5567be25b8090e3dd72e2d3d337c305b514eElliott HughesTEST(unistd, sbrk) {
31428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes  void* initial_break = sbrk(0);
32428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes
33428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes  void* new_break = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(initial_break) + 2000);
34428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes  ASSERT_EQ(0, brk(new_break));
35428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes
36428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes  void* final_break = sbrk(0);
37428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes  ASSERT_EQ(final_break, new_break);
38428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes}
39b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
40b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, truncate) {
41b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  TemporaryFile tf;
42b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, close(tf.fd));
43b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, truncate(tf.filename, 123));
44b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
45b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  struct stat sb;
46b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, stat(tf.filename, &sb));
47b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(123, sb.st_size);
48b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes}
49b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
50b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, truncate64) {
51b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  TemporaryFile tf;
52b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, close(tf.fd));
53b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, truncate64(tf.filename, 123));
54b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
55b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  struct stat sb;
56b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, stat(tf.filename, &sb));
57b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(123, sb.st_size);
58b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes}
59b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
60b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, ftruncate) {
61b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  TemporaryFile tf;
62b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, ftruncate(tf.fd, 123));
63b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, close(tf.fd));
64b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
65b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  struct stat sb;
66b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, stat(tf.filename, &sb));
67b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(123, sb.st_size);
68b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes}
69b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
70b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, ftruncate64) {
71b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  TemporaryFile tf;
72b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, ftruncate64(tf.fd, 123));
73b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, close(tf.fd));
74b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes
75b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  struct stat sb;
76b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(0, stat(tf.filename, &sb));
77b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes  ASSERT_EQ(123, sb.st_size);
78b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes}
7911952073af22568bba0b661f7a9d4402c443a888Elliott Hughes
8011952073af22568bba0b661f7a9d4402c443a888Elliott Hughesstatic bool gPauseTestFlag = false;
8111952073af22568bba0b661f7a9d4402c443a888Elliott Hughesstatic void PauseTestSignalHandler(int) {
8211952073af22568bba0b661f7a9d4402c443a888Elliott Hughes  gPauseTestFlag = true;
8311952073af22568bba0b661f7a9d4402c443a888Elliott Hughes}
8411952073af22568bba0b661f7a9d4402c443a888Elliott Hughes
8511952073af22568bba0b661f7a9d4402c443a888Elliott HughesTEST(unistd, pause) {
8613613137bc4266656bffce464e525eb9ae6371f0Christopher Ferris  ScopedSignalHandler handler(SIGALRM, PauseTestSignalHandler);
8713613137bc4266656bffce464e525eb9ae6371f0Christopher Ferris
8811952073af22568bba0b661f7a9d4402c443a888Elliott Hughes  alarm(1);
8911952073af22568bba0b661f7a9d4402c443a888Elliott Hughes  ASSERT_FALSE(gPauseTestFlag);
9011952073af22568bba0b661f7a9d4402c443a888Elliott Hughes  ASSERT_EQ(-1, pause());
9111952073af22568bba0b661f7a9d4402c443a888Elliott Hughes  ASSERT_TRUE(gPauseTestFlag);
9211952073af22568bba0b661f7a9d4402c443a888Elliott Hughes}
933d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross
943d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin CrossTEST(unistd, read) {
953d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  int fd = open("/proc/version", O_RDONLY);
963d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_TRUE(fd != -1);
973d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross
983d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  char buf[5];
993d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(5, read(fd, buf, 5));
1003d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(buf[0], 'L');
1013d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(buf[1], 'i');
1023d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(buf[2], 'n');
1033d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(buf[3], 'u');
1043d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(buf[4], 'x');
1053d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  close(fd);
1063d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross}
1073d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross
1083d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin CrossTEST(unistd, read_EBADF) {
1093d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  // read returns ssize_t which is 64-bits on LP64, so it's worth explicitly checking that
1103d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  // our syscall stubs correctly return a 64-bit -1.
1113d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  char buf[1];
1123d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(-1, read(-1, buf, sizeof(buf)));
1133d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross  ASSERT_EQ(EBADF, errno);
1143d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross}
115aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott Hughes
116aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott HughesTEST(unistd, alarm) {
117aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott Hughes  ASSERT_EQ(0U, alarm(0));
118aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott Hughes}
1199f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes
1209f525644df99cb2f7f81a23ca23840f0a8f82275Elliott HughesTEST(unistd, _exit) {
1219f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  int pid = fork();
1229f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  ASSERT_NE(-1, pid) << strerror(errno);
1239f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes
1249f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  if (pid == 0) {
1259f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes    _exit(99);
1269f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  }
1279f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes
1289f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  int status;
1299f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  ASSERT_EQ(pid, waitpid(pid, &status, 0));
1309f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  ASSERT_TRUE(WIFEXITED(status));
1319f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes  ASSERT_EQ(99, WEXITSTATUS(status));
1329f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes}
133