From 865ca64ee8c0af9eba88a4a04e0730630fae6d8b Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Mon, 1 Mar 2021 12:14:47 -0800 Subject: tcp: endpoint.Write has to send all data that has been read from payload io.Reader.ReadFull returns the number of bytes copied and an error if fewer bytes were read. PiperOrigin-RevId: 360247614 --- test/syscalls/linux/BUILD | 1 + test/syscalls/linux/socket_ip_tcp_generic.cc | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) (limited to 'test/syscalls') diff --git a/test/syscalls/linux/BUILD b/test/syscalls/linux/BUILD index f871426f0..5371f825c 100644 --- a/test/syscalls/linux/BUILD +++ b/test/syscalls/linux/BUILD @@ -2384,6 +2384,7 @@ cc_library( "@com_google_absl//absl/memory", "@com_google_absl//absl/time", gtest, + "//test/util:temp_path", "//test/util:test_util", "//test/util:thread_util", ], diff --git a/test/syscalls/linux/socket_ip_tcp_generic.cc b/test/syscalls/linux/socket_ip_tcp_generic.cc index 579e824cd..f10f55b27 100644 --- a/test/syscalls/linux/socket_ip_tcp_generic.cc +++ b/test/syscalls/linux/socket_ip_tcp_generic.cc @@ -29,6 +29,7 @@ #include "absl/time/clock.h" #include "absl/time/time.h" #include "test/syscalls/linux/socket_test_util.h" +#include "test/util/temp_path.h" #include "test/util/test_util.h" #include "test/util/thread_util.h" @@ -1059,6 +1060,28 @@ TEST_P(TCPSocketPairTest, SpliceToPipe) { SyscallSucceedsWithValue(buf.size())); EXPECT_EQ(memcmp(rbuf.data(), buf.data(), buf.size()), 0); } + +#include + +TEST_P(TCPSocketPairTest, SendfileFromRegularFileSucceeds) { + auto sockets = ASSERT_NO_ERRNO_AND_VALUE(NewSocketPair()); + const TempPath in_file = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFile()); + const FileDescriptor in_fd = + ASSERT_NO_ERRNO_AND_VALUE(Open(in_file.path(), O_RDWR)); + // Fill with some random data. + std::vector buf(kPageSize / 2); + RandomizeBuffer(buf.data(), buf.size()); + ASSERT_THAT(pwrite(in_fd.get(), buf.data(), buf.size(), 0), + SyscallSucceedsWithValue(buf.size())); + + EXPECT_THAT( + sendfile(sockets->first_fd(), in_fd.get(), nullptr, buf.size() + 1), + SyscallSucceedsWithValue(buf.size())); + std::vector rbuf(buf.size() + 1); + ASSERT_THAT(read(sockets->second_fd(), rbuf.data(), rbuf.size()), + SyscallSucceedsWithValue(buf.size())); + EXPECT_EQ(memcmp(rbuf.data(), buf.data(), buf.size()), 0); +} #endif // __linux__ TEST_P(TCPSocketPairTest, SetTCPWindowClampBelowMinRcvBufConnectedSocket) { -- cgit v1.2.3