blob: bb6af7f5facdccfa888ad3965e784003665b4311 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Basic tests of things declared in mojio_unistd.h, as well as
// |mojio_creat()|/|mojio_open()| from mojio_fcntl.h. Note that more thorough
// tests are done more directly at a different level.
#include <errno.h>
#include <string.h>
#include "files/public/c/mojio_fcntl.h"
#include "files/public/c/mojio_sys_stat.h"
#include "files/public/c/mojio_unistd.h"
#include "files/public/c/tests/mojio_test_base.h"
namespace {
using MojioUnistdTest = mojio::test::MojioTestBase;
TEST_F(MojioUnistdTest, CreatWriteOpenCloseReadClose) {
const char kTestFileName[] = "test_file";
const char kTestData[] = "Hello mojio!";
errno = 12345;
int write_fd = mojio_creat(kTestFileName, MOJIO_S_IRWXU);
int errno_value = errno; // |ASSERT_EQ()| might conceivably change errno.
ASSERT_EQ(0, write_fd); // FDs are allocated starting from 0.
EXPECT_EQ(12345, errno_value); // errno should be untouched.
errno = 12345;
mojio_ssize_t bytes_written =
mojio_write(write_fd, kTestData, sizeof(kTestData));
errno_value = errno;
EXPECT_EQ(static_cast<mojio_ssize_t>(sizeof(kTestData)), bytes_written);
EXPECT_EQ(12345, errno_value);
errno = 12345;
int read_fd = mojio_open(kTestFileName, MOJIO_O_RDONLY);
errno_value = errno;
ASSERT_EQ(1, read_fd); // |write_fd| is still open, so we should get 1.
EXPECT_EQ(12345, errno_value);
errno = 12345;
int result = mojio_close(write_fd);
errno_value = errno;
EXPECT_EQ(0, result);
EXPECT_EQ(12345, errno_value);
char buffer[100] = {};
errno = 12345;
mojio_ssize_t bytes_read = mojio_read(read_fd, buffer, sizeof(buffer));
errno_value = errno;
EXPECT_EQ(static_cast<mojio_ssize_t>(sizeof(kTestData)), bytes_read);
EXPECT_EQ(12345, errno_value);
EXPECT_EQ(0, memcmp(buffer, kTestData, sizeof(kTestData)));
EXPECT_EQ('\0', buffer[sizeof(kTestData)]);
errno = 12345;
result = mojio_close(read_fd);
errno_value = errno;
EXPECT_EQ(0, result);
EXPECT_EQ(12345, errno_value);
}
TEST_F(MojioUnistdTest, FtruncateLseek) {
const char kTestData[] = "Hello mojio!";
int fd = mojio_open("my_file", MOJIO_O_CREAT | MOJIO_O_RDWR, MOJIO_S_IRWXU);
EXPECT_GE(fd, 0);
mojio_ssize_t bytes_written = mojio_write(fd, kTestData, sizeof(kTestData));
EXPECT_EQ(static_cast<mojio_ssize_t>(sizeof(kTestData)), bytes_written);
errno = 12345;
int result = mojio_ftruncate(fd, sizeof(kTestData) - 2);
int errno_value = errno;
EXPECT_EQ(0, result);
EXPECT_EQ(12345, errno_value);
errno = 12345;
mojio_off_t offset = mojio_lseek(fd, -5, MOJIO_SEEK_END);
errno_value = errno;
EXPECT_EQ(static_cast<mojio_off_t>(sizeof(kTestData)) - 2 - 5, offset);
EXPECT_EQ(12345, errno_value);
char buffer[100] = {};
errno = 12345;
mojio_ssize_t bytes_read = mojio_read(fd, buffer, sizeof(buffer));
errno_value = errno;
EXPECT_EQ(5, bytes_read);
EXPECT_EQ(12345, errno_value);
EXPECT_EQ(0, memcmp(buffer, &kTestData[sizeof(kTestData) - 2 - 5], 5));
EXPECT_EQ('\0', buffer[5]);
EXPECT_EQ(0, mojio_close(fd));
}
TEST_F(MojioUnistdTest, Ebadf) {
errno = 12345;
int result = mojio_close(-1);
int errno_value = errno;
EXPECT_EQ(-1, result);
EXPECT_EQ(EBADF, errno_value);
errno = 12345;
result = mojio_dup(-1);
errno_value = errno;
EXPECT_EQ(-1, result);
EXPECT_EQ(EBADF, errno_value);
errno = 12345;
result = mojio_ftruncate(-1, 0);
errno_value = errno;
EXPECT_EQ(-1, result);
EXPECT_EQ(EBADF, errno_value);
errno = 12345;
mojio_off_t offset = mojio_lseek(-1, 0, MOJIO_SEEK_SET);
errno_value = errno;
EXPECT_EQ(-1, offset);
EXPECT_EQ(EBADF, errno_value);
char buf[10] = {};
errno = 12345;
mojio_ssize_t size = mojio_read(-1, buf, sizeof(buf));
errno_value = errno;
EXPECT_EQ(-1, size);
EXPECT_EQ(EBADF, errno_value);
errno = 12345;
size = mojio_write(-1, buf, sizeof(buf));
errno_value = errno;
EXPECT_EQ(-1, size);
EXPECT_EQ(EBADF, errno_value);
}
// TODO(vtl): mojio_chdir(), mojio_dup().
} // namespace