unistd_test.cpp revision 1728b2396591853345507a063ed6075dfd251706
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> 25764a99361130dceda62bbc4f8780bbf395dbc424Elliott Hughes#include <sys/types.h> 26764a99361130dceda62bbc4f8780bbf395dbc424Elliott Hughes#include <sys/wait.h> 27a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 28a55f63083fb16b2595f517a3260083e5f8cddd02Elliott HughesTEST(unistd, sysconf_SC_MONOTONIC_CLOCK) { 29a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes ASSERT_GT(sysconf(_SC_MONOTONIC_CLOCK), 0); 30a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 31428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes 32533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughesstatic void* get_brk() { 33533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes return sbrk(0); 34533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes} 35533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes 36533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughesstatic void* page_align(uintptr_t addr) { 37533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes uintptr_t mask = sysconf(_SC_PAGE_SIZE) - 1; 38533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes return reinterpret_cast<void*>((addr + mask) & ~mask); 39533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes} 40533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes 41533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott HughesTEST(unistd, brk) { 42533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes void* initial_break = get_brk(); 43533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes 44533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes // The kernel aligns the break to a page. 45533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes void* new_break = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(initial_break) + 1); 46533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(0, brk(new_break)); 47533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_GE(get_brk(), new_break); 48428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes 49533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes new_break = page_align(reinterpret_cast<uintptr_t>(initial_break) + sysconf(_SC_PAGE_SIZE)); 50428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes ASSERT_EQ(0, brk(new_break)); 51533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(get_brk(), new_break); 52533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes} 53533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes 54533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott HughesTEST(unistd, brk_ENOMEM) { 55533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(-1, brk(reinterpret_cast<void*>(-1))); 56533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(ENOMEM, errno); 57533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes} 58533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes 59533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott HughesTEST(unistd, sbrk_ENOMEM) { 60533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes intptr_t current_brk = reinterpret_cast<intptr_t>(get_brk()); 61533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes 62533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes // Can't increase by so much that we'd overflow. 63533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(reinterpret_cast<void*>(-1), sbrk(PTRDIFF_MAX)); 64533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(ENOMEM, errno); 65533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes 66533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes // Can't reduce by more than the current break. 67533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(reinterpret_cast<void*>(-1), sbrk(-(current_brk + 1))); 68533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(ENOMEM, errno); 69428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes 70063525c61d24776094d76971f33920e2a2079530Elliott Hughes#if defined(__BIONIC__) 71533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes // The maximum negative value is an interesting special case that glibc gets wrong. 72533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(reinterpret_cast<void*>(-1), sbrk(PTRDIFF_MIN)); 73533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes ASSERT_EQ(ENOMEM, errno); 74533dde4dbf87d6615952be3654fc74e5ff2e1003Elliott Hughes#endif 75428f5567be25b8090e3dd72e2d3d337c305b514eElliott Hughes} 76b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 77b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, truncate) { 78b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes TemporaryFile tf; 79b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, close(tf.fd)); 80b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, truncate(tf.filename, 123)); 81b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 82b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes struct stat sb; 83b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, stat(tf.filename, &sb)); 84b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(123, sb.st_size); 85b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes} 86b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 87b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, truncate64) { 88b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes TemporaryFile tf; 89b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, close(tf.fd)); 90b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, truncate64(tf.filename, 123)); 91b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 92b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes struct stat sb; 93b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, stat(tf.filename, &sb)); 94b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(123, sb.st_size); 95b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes} 96b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 97b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, ftruncate) { 98b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes TemporaryFile tf; 99b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, ftruncate(tf.fd, 123)); 100b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, close(tf.fd)); 101b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 102b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes struct stat sb; 103b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, stat(tf.filename, &sb)); 104b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(123, sb.st_size); 105b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes} 106b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 107b4f7616fd618875768b8fffc122b58bdb84a9969Elliott HughesTEST(unistd, ftruncate64) { 108b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes TemporaryFile tf; 109b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, ftruncate64(tf.fd, 123)); 110b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, close(tf.fd)); 111b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes 112b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes struct stat sb; 113b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(0, stat(tf.filename, &sb)); 114b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes ASSERT_EQ(123, sb.st_size); 115b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughes} 11611952073af22568bba0b661f7a9d4402c443a888Elliott Hughes 1171728b2396591853345507a063ed6075dfd251706Elliott Hughesstatic bool g_pause_test_flag = false; 11811952073af22568bba0b661f7a9d4402c443a888Elliott Hughesstatic void PauseTestSignalHandler(int) { 1191728b2396591853345507a063ed6075dfd251706Elliott Hughes g_pause_test_flag = true; 12011952073af22568bba0b661f7a9d4402c443a888Elliott Hughes} 12111952073af22568bba0b661f7a9d4402c443a888Elliott Hughes 12211952073af22568bba0b661f7a9d4402c443a888Elliott HughesTEST(unistd, pause) { 12313613137bc4266656bffce464e525eb9ae6371f0Christopher Ferris ScopedSignalHandler handler(SIGALRM, PauseTestSignalHandler); 12413613137bc4266656bffce464e525eb9ae6371f0Christopher Ferris 12511952073af22568bba0b661f7a9d4402c443a888Elliott Hughes alarm(1); 1261728b2396591853345507a063ed6075dfd251706Elliott Hughes ASSERT_FALSE(g_pause_test_flag); 12711952073af22568bba0b661f7a9d4402c443a888Elliott Hughes ASSERT_EQ(-1, pause()); 1281728b2396591853345507a063ed6075dfd251706Elliott Hughes ASSERT_TRUE(g_pause_test_flag); 12911952073af22568bba0b661f7a9d4402c443a888Elliott Hughes} 1303d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross 1313d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin CrossTEST(unistd, read) { 1323d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross int fd = open("/proc/version", O_RDONLY); 1333d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_TRUE(fd != -1); 1343d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross 1353d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross char buf[5]; 1363d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(5, read(fd, buf, 5)); 1373d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(buf[0], 'L'); 1383d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(buf[1], 'i'); 1393d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(buf[2], 'n'); 1403d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(buf[3], 'u'); 1413d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(buf[4], 'x'); 1423d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross close(fd); 1433d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross} 1443d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross 1453d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin CrossTEST(unistd, read_EBADF) { 1463d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross // read returns ssize_t which is 64-bits on LP64, so it's worth explicitly checking that 1473d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross // our syscall stubs correctly return a 64-bit -1. 1483d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross char buf[1]; 1493d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(-1, read(-1, buf, sizeof(buf))); 1503d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross ASSERT_EQ(EBADF, errno); 1513d19a8319b9c27af8aa5cfbf495da0fe7fa62d3eColin Cross} 152aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott Hughes 153aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott HughesTEST(unistd, alarm) { 154aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott Hughes ASSERT_EQ(0U, alarm(0)); 155aedb00d04eb7f0b20b6abde702ba94a46577ca68Elliott Hughes} 1569f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes 1579f525644df99cb2f7f81a23ca23840f0a8f82275Elliott HughesTEST(unistd, _exit) { 1589f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes int pid = fork(); 1599f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes ASSERT_NE(-1, pid) << strerror(errno); 1609f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes 1619f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes if (pid == 0) { 1629f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes _exit(99); 1639f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes } 1649f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes 1659f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes int status; 1669f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes ASSERT_EQ(pid, waitpid(pid, &status, 0)); 1679f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes ASSERT_TRUE(WIFEXITED(status)); 1689f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes ASSERT_EQ(99, WEXITSTATUS(status)); 1699f525644df99cb2f7f81a23ca23840f0a8f82275Elliott Hughes} 170cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 171cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy KraynovTEST(unistd, getenv_unsetenv) { 172cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, setenv("test-variable", "hello", 1)); 173cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_STREQ("hello", getenv("test-variable")); 174cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, unsetenv("test-variable")); 175cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_TRUE(getenv("test-variable") == NULL); 176cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov} 177cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 178cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy KraynovTEST(unistd, unsetenv_EINVAL) { 179cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, unsetenv(NULL)); 180cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 181cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, unsetenv("")); 182cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 183cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, unsetenv("a=b")); 184cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 185cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov} 186cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 187cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy KraynovTEST(unistd, setenv_EINVAL) { 188cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, setenv(NULL, "value", 0)); 189cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 190cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, setenv(NULL, "value", 1)); 191cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 192cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, setenv("", "value", 0)); 193cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 194cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, setenv("", "value", 1)); 195cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 196cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, setenv("a=b", "value", 0)); 197cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 198cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(-1, setenv("a=b", "value", 1)); 199cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(EINVAL, errno); 200cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov} 201cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 202cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy KraynovTEST(unistd, setenv) { 203cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, unsetenv("test-variable")); 204cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 205cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov char a[] = "a"; 206cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov char b[] = "b"; 207cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov char c[] = "c"; 208cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 209cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // New value. 210cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(0, setenv("test-variable", a, 0)); 211cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_STREQ(a, getenv("test-variable")); 212cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 213cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // Existing value, no overwrite. 214cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(0, setenv("test-variable", b, 0)); 215cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_STREQ(a, getenv("test-variable")); 216cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 217cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // Existing value, overwrite. 218cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(0, setenv("test-variable", c, 1)); 219cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_STREQ(c, getenv("test-variable")); 220cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // But the arrays backing the values are unchanged. 221cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ('a', a[0]); 222cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ('b', b[0]); 223cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ('c', c[0]); 224cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 225cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, unsetenv("test-variable")); 226cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov} 227cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 228cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy KraynovTEST(unistd, putenv) { 229cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, unsetenv("a")); 230cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 231cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov char* s1 = strdup("a=b"); 232cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, putenv(s1)); 233cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 234cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_STREQ("b", getenv("a")); 235cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov s1[2] = 'c'; 236cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_STREQ("c", getenv("a")); 237cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 238cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov char* s2 = strdup("a=b"); 239cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, putenv(s2)); 240cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 241cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_STREQ("b", getenv("a")); 242cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ('c', s1[2]); 243cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 244cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, unsetenv("a")); 245cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov free(s1); 246cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov free(s2); 247cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov} 248cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 249cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy KraynovTEST(unistd, clearenv) { 250cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov extern char** environ; 251cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 252cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // Guarantee that environ is not initially empty... 253cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, setenv("test-variable", "a", 1)); 254cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 255cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // Stash a copy. 256cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov std::vector<char*> old_environ; 257cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov for (size_t i = 0; environ[i] != NULL; ++i) { 258cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov old_environ.push_back(strdup(environ[i])); 259cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov } 260cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 261cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov ASSERT_EQ(0, clearenv()); 262cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 263cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_TRUE(environ == NULL || environ[0] == NULL); 264cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(NULL, getenv("test-variable")); 265cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(0, setenv("test-variable", "post-clear", 1)); 266cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_STREQ("post-clear", getenv("test-variable")); 267cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 268cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // Put the old environment back. 269cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov for (size_t i = 0; i < old_environ.size(); ++i) { 270cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(0, putenv(old_environ[i])); 271cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov } 272cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 273cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov // Check it wasn't overwritten. 274cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_STREQ("a", getenv("test-variable")); 275cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov 276cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov EXPECT_EQ(0, unsetenv("test-variable")); 277cbf6df0459f05e180d1c50b3f5b36cdd483193c6Grigoriy Kraynov} 278a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 279a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughesstatic void TestFsyncFunction(int (*fn)(int)) { 280a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes int fd; 281a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 282a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes // Can't sync an invalid fd. 283a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes errno = 0; 284a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(-1, fn(-1)); 285a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(EBADF, errno); 286a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 287a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes // It doesn't matter whether you've opened a file for write or not. 288a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes TemporaryFile tf; 289a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes ASSERT_NE(-1, tf.fd); 290a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 291a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(0, fn(tf.fd)); 292a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 293a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes ASSERT_NE(-1, fd = open(tf.filename, O_RDONLY)); 294a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(0, fn(fd)); 295a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes close(fd); 296a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 297a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes ASSERT_NE(-1, fd = open(tf.filename, O_RDWR)); 298a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(0, fn(fd)); 299a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes close(fd); 300a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 301a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes // The fd can even be a directory. 302a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes ASSERT_NE(-1, fd = open("/", O_RDONLY)); 303a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(0, fn(fd)); 304a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes close(fd); 305a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 306a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes // But some file systems may choose to be fussy... 307a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes errno = 0; 308a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes ASSERT_NE(-1, fd = open("/proc/version", O_RDONLY)); 309a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(-1, fn(fd)); 310a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes EXPECT_EQ(EINVAL, errno); 311a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes close(fd); 312a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes} 313a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 314a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott HughesTEST(unistd, fdatasync) { 315a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes TestFsyncFunction(fdatasync); 316a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes} 317a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes 318a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott HughesTEST(unistd, fsync) { 319a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes TestFsyncFunction(fsync); 320a62a28d1d9c8df7cb77e4bca19814922729b5291Elliott Hughes} 321