brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 4e789ba Raw
65 lines · cpp
1//===-- Unittests for sendfile --------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/CPP/string_view.h"10#include "src/fcntl/open.h"11#include "src/sys/sendfile/sendfile.h"12#include "src/unistd/close.h"13#include "src/unistd/read.h"14#include "src/unistd/unlink.h"15#include "src/unistd/write.h"16#include "test/UnitTest/ErrnoCheckingTest.h"17#include "test/UnitTest/ErrnoSetterMatcher.h"18#include "test/UnitTest/Test.h"19 20#include "hdr/fcntl_macros.h"21#include <sys/stat.h>22 23using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;24using LlvmLibcSendfileTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;25namespace cpp = LIBC_NAMESPACE::cpp;26 27TEST_F(LlvmLibcSendfileTest, CreateAndTransfer) {28  // The test strategy is to29  //   1. Create a temporary file with known data.30  //   2. Use sendfile to copy it to another file.31  //   3. Make sure that the data was actually copied.32  //   4. Clean up the temporary files.33  constexpr const char *IN_FILE = "testdata/sendfile_in.test";34  constexpr const char *OUT_FILE = "testdata/sendfile_out.test";35  const char IN_DATA[] = "sendfile test";36  constexpr ssize_t IN_SIZE = ssize_t(sizeof(IN_DATA));37 38  int in_fd = LIBC_NAMESPACE::open(IN_FILE, O_CREAT | O_WRONLY, S_IRWXU);39  ASSERT_GT(in_fd, 0);40  ASSERT_ERRNO_SUCCESS();41  ASSERT_EQ(LIBC_NAMESPACE::write(in_fd, IN_DATA, IN_SIZE), IN_SIZE);42  ASSERT_THAT(LIBC_NAMESPACE::close(in_fd), Succeeds(0));43 44  in_fd = LIBC_NAMESPACE::open(IN_FILE, O_RDONLY);45  ASSERT_GT(in_fd, 0);46  ASSERT_ERRNO_SUCCESS();47  int out_fd = LIBC_NAMESPACE::open(OUT_FILE, O_CREAT | O_WRONLY, S_IRWXU);48  ASSERT_GT(out_fd, 0);49  ASSERT_ERRNO_SUCCESS();50  ssize_t size = LIBC_NAMESPACE::sendfile(in_fd, out_fd, nullptr, IN_SIZE);51  ASSERT_EQ(size, IN_SIZE);52  ASSERT_THAT(LIBC_NAMESPACE::close(in_fd), Succeeds(0));53  ASSERT_THAT(LIBC_NAMESPACE::close(out_fd), Succeeds(0));54 55  out_fd = LIBC_NAMESPACE::open(OUT_FILE, O_RDONLY);56  ASSERT_GT(out_fd, 0);57  ASSERT_ERRNO_SUCCESS();58  char buf[IN_SIZE];59  ASSERT_EQ(IN_SIZE, LIBC_NAMESPACE::read(out_fd, buf, IN_SIZE));60  ASSERT_EQ(cpp::string_view(buf), cpp::string_view(IN_DATA));61 62  ASSERT_THAT(LIBC_NAMESPACE::unlink(IN_FILE), Succeeds(0));63  ASSERT_THAT(LIBC_NAMESPACE::unlink(OUT_FILE), Succeeds(0));64}65