xref: /llvm-project/libc/test/src/unistd/pread_pwrite_test.cpp (revision 7a7d5481ad5c925d4f31bee3ab66bd1d7d514b73)
16e675fbaSSiva Chandra Reddy //===-- Unittests for pread and pwrite ------------------------------------===//
26e675fbaSSiva Chandra Reddy //
36e675fbaSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46e675fbaSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
56e675fbaSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66e675fbaSSiva Chandra Reddy //
76e675fbaSSiva Chandra Reddy //===----------------------------------------------------------------------===//
86e675fbaSSiva Chandra Reddy 
967de5381SSiva Chandra Reddy #include "src/errno/libc_errno.h"
106e675fbaSSiva Chandra Reddy #include "src/fcntl/open.h"
116e675fbaSSiva Chandra Reddy #include "src/unistd/close.h"
126e675fbaSSiva Chandra Reddy #include "src/unistd/fsync.h"
136e675fbaSSiva Chandra Reddy #include "src/unistd/pread.h"
146e675fbaSSiva Chandra Reddy #include "src/unistd/pwrite.h"
156e675fbaSSiva Chandra Reddy #include "src/unistd/unlink.h"
166e675fbaSSiva Chandra Reddy #include "src/unistd/write.h"
174f1fe19dSSiva Chandra Reddy #include "test/UnitTest/ErrnoSetterMatcher.h"
18af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
196e675fbaSSiva Chandra Reddy 
20c0ad6e2fSNick Desaulniers #include <sys/stat.h>
21c0ad6e2fSNick Desaulniers 
TEST(LlvmLibcUniStd,PWriteAndPReadBackTest)226e675fbaSSiva Chandra Reddy TEST(LlvmLibcUniStd, PWriteAndPReadBackTest) {
236e675fbaSSiva Chandra Reddy   // The strategy here is that we first create a file and write to it. Next,
246e675fbaSSiva Chandra Reddy   // we open that file again and write at an offset. Finally, we open the
256e675fbaSSiva Chandra Reddy   // file again and pread at an offset and make sure that only expected data
266e675fbaSSiva Chandra Reddy   // is being read back. This also confirms that pwrite happened successfully.
276e675fbaSSiva Chandra Reddy   constexpr const char HELLO[] = "hello";
286e675fbaSSiva Chandra Reddy   constexpr int HELLO_SIZE = sizeof(HELLO);
296e675fbaSSiva Chandra Reddy   constexpr off_t OFFSET = 3;
306e675fbaSSiva Chandra Reddy   constexpr const char OFFSET_TEXT[] = "helhello";
316e675fbaSSiva Chandra Reddy   constexpr int OFFSET_TEXT_SIZE = sizeof(OFFSET_TEXT);
326e675fbaSSiva Chandra Reddy 
33b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
346e675fbaSSiva Chandra Reddy 
35*7a7d5481Smichaelrj-google   constexpr const char *FILENAME = "pread_pwrite.test";
36*7a7d5481Smichaelrj-google   auto TEST_FILE = libc_make_test_file_path(FILENAME);
37b6bc9d72SGuillaume Chatelet   int fd = LIBC_NAMESPACE::open(TEST_FILE, O_WRONLY | O_CREAT, S_IRWXU);
3873874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
396e675fbaSSiva Chandra Reddy   ASSERT_GT(fd, 0);
40b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::write(fd, HELLO, HELLO_SIZE),
416e675fbaSSiva Chandra Reddy               Succeeds(HELLO_SIZE));
42b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::fsync(fd), Succeeds(0));
43b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
446e675fbaSSiva Chandra Reddy 
45b6bc9d72SGuillaume Chatelet   fd = LIBC_NAMESPACE::open(TEST_FILE, O_WRONLY);
4673874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
47b6bc9d72SGuillaume Chatelet   ASSERT_GT(fd, 0);
48b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::pwrite(fd, HELLO, HELLO_SIZE, OFFSET),
49b6bc9d72SGuillaume Chatelet               Succeeds(HELLO_SIZE));
50b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::fsync(fd), Succeeds(0));
51b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
52b6bc9d72SGuillaume Chatelet 
53b6bc9d72SGuillaume Chatelet   fd = LIBC_NAMESPACE::open(TEST_FILE, O_RDONLY);
5473874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
556e675fbaSSiva Chandra Reddy   ASSERT_GT(fd, 0);
566e675fbaSSiva Chandra Reddy   char read_buf[OFFSET_TEXT_SIZE];
57b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::pread(fd, read_buf, HELLO_SIZE, OFFSET),
586e675fbaSSiva Chandra Reddy               Succeeds(HELLO_SIZE));
596e675fbaSSiva Chandra Reddy   EXPECT_STREQ(read_buf, HELLO);
60b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::pread(fd, read_buf, OFFSET_TEXT_SIZE, 0),
616e675fbaSSiva Chandra Reddy               Succeeds(OFFSET_TEXT_SIZE));
626e675fbaSSiva Chandra Reddy   EXPECT_STREQ(read_buf, OFFSET_TEXT);
63b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
646e675fbaSSiva Chandra Reddy 
65b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE), Succeeds(0));
666e675fbaSSiva Chandra Reddy }
676e675fbaSSiva Chandra Reddy 
TEST(LlvmLibcUniStd,PWriteFails)686e675fbaSSiva Chandra Reddy TEST(LlvmLibcUniStd, PWriteFails) {
69b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
70b6bc9d72SGuillaume Chatelet   EXPECT_THAT(LIBC_NAMESPACE::pwrite(-1, "", 1, 0), Fails(EBADF));
716e675fbaSSiva Chandra Reddy }
726e675fbaSSiva Chandra Reddy 
TEST(LlvmLibcUniStd,PReadFails)736e675fbaSSiva Chandra Reddy TEST(LlvmLibcUniStd, PReadFails) {
74b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
75b6bc9d72SGuillaume Chatelet   EXPECT_THAT(LIBC_NAMESPACE::pread(-1, nullptr, 1, 0), Fails(EBADF));
766e675fbaSSiva Chandra Reddy }
77