/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "ScopedSignalHandler.h" #include "TemporaryFile.h" #include #include #include #include TEST(unistd, sysconf_SC_MONOTONIC_CLOCK) { ASSERT_GT(sysconf(_SC_MONOTONIC_CLOCK), 0); } TEST(unistd, sbrk) { void* initial_break = sbrk(0); void* new_break = reinterpret_cast(reinterpret_cast(initial_break) + 2000); ASSERT_EQ(0, brk(new_break)); void* final_break = sbrk(0); ASSERT_EQ(final_break, new_break); } TEST(unistd, truncate) { TemporaryFile tf; ASSERT_EQ(0, close(tf.fd)); ASSERT_EQ(0, truncate(tf.filename, 123)); struct stat sb; ASSERT_EQ(0, stat(tf.filename, &sb)); ASSERT_EQ(123, sb.st_size); } TEST(unistd, truncate64) { TemporaryFile tf; ASSERT_EQ(0, close(tf.fd)); ASSERT_EQ(0, truncate64(tf.filename, 123)); struct stat sb; ASSERT_EQ(0, stat(tf.filename, &sb)); ASSERT_EQ(123, sb.st_size); } TEST(unistd, ftruncate) { TemporaryFile tf; ASSERT_EQ(0, ftruncate(tf.fd, 123)); ASSERT_EQ(0, close(tf.fd)); struct stat sb; ASSERT_EQ(0, stat(tf.filename, &sb)); ASSERT_EQ(123, sb.st_size); } TEST(unistd, ftruncate64) { TemporaryFile tf; ASSERT_EQ(0, ftruncate64(tf.fd, 123)); ASSERT_EQ(0, close(tf.fd)); struct stat sb; ASSERT_EQ(0, stat(tf.filename, &sb)); ASSERT_EQ(123, sb.st_size); } static bool gPauseTestFlag = false; static void PauseTestSignalHandler(int) { gPauseTestFlag = true; } TEST(unistd, pause) { ScopedSignalHandler handler(SIGALRM, PauseTestSignalHandler); alarm(1); ASSERT_FALSE(gPauseTestFlag); ASSERT_EQ(-1, pause()); ASSERT_TRUE(gPauseTestFlag); } TEST(unistd, read) { int fd = open("/proc/version", O_RDONLY); ASSERT_TRUE(fd != -1); char buf[5]; ASSERT_EQ(5, read(fd, buf, 5)); ASSERT_EQ(buf[0], 'L'); ASSERT_EQ(buf[1], 'i'); ASSERT_EQ(buf[2], 'n'); ASSERT_EQ(buf[3], 'u'); ASSERT_EQ(buf[4], 'x'); close(fd); } TEST(unistd, read_EBADF) { // read returns ssize_t which is 64-bits on LP64, so it's worth explicitly checking that // our syscall stubs correctly return a 64-bit -1. char buf[1]; ASSERT_EQ(-1, read(-1, buf, sizeof(buf))); ASSERT_EQ(EBADF, errno); }