1dc2b01b3SSiva Chandra Reddy //===-- Unittests for read and write --------------------------------------===//
2dc2b01b3SSiva Chandra Reddy //
3dc2b01b3SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dc2b01b3SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5dc2b01b3SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dc2b01b3SSiva Chandra Reddy //
7dc2b01b3SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8dc2b01b3SSiva Chandra Reddy
9dc2b01b3SSiva Chandra Reddy #include "src/fcntl/open.h"
10dc2b01b3SSiva Chandra Reddy #include "src/unistd/close.h"
11dc2b01b3SSiva Chandra Reddy #include "src/unistd/fsync.h"
12dc2b01b3SSiva Chandra Reddy #include "src/unistd/read.h"
13dc2b01b3SSiva Chandra Reddy #include "src/unistd/write.h"
14dc2b01b3SSiva Chandra Reddy #include "test/ErrnoSetterMatcher.h"
15dc2b01b3SSiva Chandra Reddy #include "utils/UnitTest/Test.h"
16dc2b01b3SSiva Chandra Reddy #include "utils/testutils/FDReader.h"
17dc2b01b3SSiva Chandra Reddy
18dc2b01b3SSiva Chandra Reddy #include <errno.h>
19dc2b01b3SSiva Chandra Reddy
TEST(LlvmLibcUniStd,WriteAndReadBackTest)20dc2b01b3SSiva Chandra Reddy TEST(LlvmLibcUniStd, WriteAndReadBackTest) {
21dc2b01b3SSiva Chandra Reddy using __llvm_libc::testing::ErrnoSetterMatcher::Succeeds;
22dc2b01b3SSiva Chandra Reddy constexpr const char *TEST_FILE = "__unistd_read_write.test";
23*a858e25fSSiva Chandra Reddy int write_fd = __llvm_libc::open(TEST_FILE, O_WRONLY | O_CREAT, S_IRWXU);
24dc2b01b3SSiva Chandra Reddy ASSERT_EQ(errno, 0);
25dc2b01b3SSiva Chandra Reddy ASSERT_GT(write_fd, 0);
26dc2b01b3SSiva Chandra Reddy constexpr const char HELLO[] = "hello";
27dc2b01b3SSiva Chandra Reddy constexpr int HELLO_SIZE = sizeof(HELLO);
28dc2b01b3SSiva Chandra Reddy ASSERT_THAT(__llvm_libc::write(write_fd, HELLO, HELLO_SIZE),
29dc2b01b3SSiva Chandra Reddy Succeeds(HELLO_SIZE));
30dc2b01b3SSiva Chandra Reddy ASSERT_THAT(__llvm_libc::fsync(write_fd), Succeeds(0));
31dc2b01b3SSiva Chandra Reddy ASSERT_THAT(__llvm_libc::close(write_fd), Succeeds(0));
32dc2b01b3SSiva Chandra Reddy
33dc2b01b3SSiva Chandra Reddy int read_fd = __llvm_libc::open(TEST_FILE, O_RDONLY);
34dc2b01b3SSiva Chandra Reddy ASSERT_EQ(errno, 0);
35dc2b01b3SSiva Chandra Reddy ASSERT_GT(read_fd, 0);
36dc2b01b3SSiva Chandra Reddy char read_buf[10];
37dc2b01b3SSiva Chandra Reddy ASSERT_THAT(__llvm_libc::read(read_fd, read_buf, HELLO_SIZE),
38dc2b01b3SSiva Chandra Reddy Succeeds(HELLO_SIZE));
39dc2b01b3SSiva Chandra Reddy EXPECT_STREQ(read_buf, HELLO);
40dc2b01b3SSiva Chandra Reddy ASSERT_THAT(__llvm_libc::close(read_fd), Succeeds(0));
41dc2b01b3SSiva Chandra Reddy
42dc2b01b3SSiva Chandra Reddy // TODO: 'remove' the test file after the test.
43dc2b01b3SSiva Chandra Reddy }
44dc2b01b3SSiva Chandra Reddy
TEST(LlvmLibcUniStd,WriteFails)45dc2b01b3SSiva Chandra Reddy TEST(LlvmLibcUniStd, WriteFails) {
46dc2b01b3SSiva Chandra Reddy using __llvm_libc::testing::ErrnoSetterMatcher::Fails;
47dc2b01b3SSiva Chandra Reddy
48dc2b01b3SSiva Chandra Reddy EXPECT_THAT(__llvm_libc::write(-1, "", 1), Fails(EBADF));
49dc2b01b3SSiva Chandra Reddy EXPECT_THAT(__llvm_libc::write(1, reinterpret_cast<const void *>(-1), 1),
50dc2b01b3SSiva Chandra Reddy Fails(EFAULT));
51dc2b01b3SSiva Chandra Reddy }
52dc2b01b3SSiva Chandra Reddy
TEST(LlvmLibcUniStd,ReadFails)53dc2b01b3SSiva Chandra Reddy TEST(LlvmLibcUniStd, ReadFails) {
54dc2b01b3SSiva Chandra Reddy using __llvm_libc::testing::ErrnoSetterMatcher::Fails;
55dc2b01b3SSiva Chandra Reddy
56dc2b01b3SSiva Chandra Reddy EXPECT_THAT(__llvm_libc::read(-1, nullptr, 1), Fails(EBADF));
57dc2b01b3SSiva Chandra Reddy EXPECT_THAT(__llvm_libc::read(0, reinterpret_cast<void *>(-1), 1),
58dc2b01b3SSiva Chandra Reddy Fails(EFAULT));
59dc2b01b3SSiva Chandra Reddy }
60