From c9d9899ea90a7d022a6a03cf3cfb200230f57fa8 Mon Sep 17 00:00:00 2001 From: Alex Konradi Date: Tue, 27 Sep 2022 09:07:39 -0700 Subject: [PATCH] Add test for TCP getpeername This doesn't appear to be covered by any existing tests. Check that the peer address for a connected TCP socket matches the local address for the corresponding accepted socket, and vice-versa. Fixes #8020 PiperOrigin-RevId: 477186443 --- test/syscalls/linux/tcp_socket.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test/syscalls/linux/tcp_socket.cc b/test/syscalls/linux/tcp_socket.cc index 1e93871ef..5dff40ab9 100644 --- a/test/syscalls/linux/tcp_socket.cc +++ b/test/syscalls/linux/tcp_socket.cc @@ -172,6 +172,35 @@ void TcpSocketTest::TearDown() { } } +TEST_P(TcpSocketTest, ConnectedAcceptedPeerAndLocalAreReciprocals) { + struct FdAndAddrs { + int fd; + sockaddr_storage peer; + socklen_t peer_len = sizeof(peer); + sockaddr_storage name; + socklen_t name_len = sizeof(name); + }; + + FdAndAddrs connected{.fd = first_fd}, accepted{.fd = second_fd}; + + for (FdAndAddrs* fd_and_addrs : {&connected, &accepted}) { + ASSERT_THAT(getpeername(fd_and_addrs->fd, AsSockAddr(&fd_and_addrs->peer), + &fd_and_addrs->peer_len), + SyscallSucceeds()); + ASSERT_NE(fd_and_addrs->peer_len, 0); + ASSERT_THAT(getsockname(fd_and_addrs->fd, AsSockAddr(&fd_and_addrs->name), + &fd_and_addrs->name_len), + SyscallSucceeds()); + ASSERT_NE(fd_and_addrs->name_len, 0); + } + + ASSERT_EQ(connected.peer_len, accepted.name_len); + EXPECT_EQ(memcmp(&connected.peer, &accepted.name, connected.peer_len), 0); + + ASSERT_EQ(connected.name_len, accepted.peer_len); + EXPECT_EQ(memcmp(&connected.name, &accepted.peer, connected.name_len), 0); +} + TEST_P(TcpSocketTest, ConnectOnEstablishedConnection) { sockaddr_storage addr = ASSERT_NO_ERRNO_AND_VALUE(InetLoopbackAddr(GetParam()));