Chromium Code Reviews| Index: base/posix/unix_domain_socket_linux_unittest.cc |
| diff --git a/base/posix/unix_domain_socket_linux_unittest.cc b/base/posix/unix_domain_socket_linux_unittest.cc |
| index bb7154fe5e971d568fbaacaf86a2bbee1bd0921a..5a14b41e8db6b4646e389d34194d5d5fe356535b 100644 |
| --- a/base/posix/unix_domain_socket_linux_unittest.cc |
| +++ b/base/posix/unix_domain_socket_linux_unittest.cc |
| @@ -77,6 +77,64 @@ TEST(UnixDomainSocketTest, SendRecvMsgAvoidsSIGPIPE) { |
| ASSERT_EQ(0, sigaction(SIGPIPE, &oldact, NULL)); |
| } |
| +// Simple sanity check within a single process that receiving PIDs works. |
| +TEST(UnixDomainSocketTest, RecvPid) { |
| + int fds[2]; |
| + ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds)); |
| + base::ScopedFD recv_sock(fds[0]); |
| + base::ScopedFD send_sock(fds[1]); |
| + |
| + ASSERT_TRUE(UnixDomainSocket::EnableReceiveProcessId(recv_sock.get())); |
| + |
| + static const char kHello[] = "hello"; |
| + ASSERT_TRUE(UnixDomainSocket::SendMsg( |
| + send_sock.get(), kHello, sizeof(kHello), std::vector<int>())); |
|
willchan no longer on Chromium
2014/04/24 20:44:04
Generally we prefer arraysize to sizeof for arrays
mdempsky
2014/04/24 20:59:14
Noted, but the APIs used here take the number of b
willchan no longer on Chromium
2014/04/24 21:09:56
Oops, I missed that. Fine as is.
|
| + |
| + // Extra receiving buffer space to make sure we really received only |
| + // sizeof(kHello) bytes and it wasn't just truncated to fit the buffer. |
| + char buf[sizeof(kHello) + 1]; |
| + base::ProcessId sender_pid; |
| + std::vector<int> fd_vec; |
| + const ssize_t nread = UnixDomainSocket::RecvMsgWithPid( |
| + recv_sock.get(), buf, sizeof(buf), &fd_vec, &sender_pid); |
| + ASSERT_EQ(sizeof(kHello), static_cast<size_t>(nread)); |
| + ASSERT_EQ(0, memcmp(buf, kHello, sizeof(kHello))); |
| + ASSERT_EQ(0U, fd_vec.size()); |
| + |
| + ASSERT_EQ(getpid(), sender_pid); |
| +} |
| + |
| +// Same as above, but send the max number of file descriptors too. |
| +TEST(UnixDomainSocketTest, RecvPidWithMaxDescriptors) { |
| + int fds[2]; |
| + ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds)); |
| + base::ScopedFD recv_sock(fds[0]); |
| + base::ScopedFD send_sock(fds[1]); |
| + |
| + ASSERT_TRUE(UnixDomainSocket::EnableReceiveProcessId(recv_sock.get())); |
| + |
| + static const char kHello[] = "hello"; |
| + std::vector<int> fd_vec(UnixDomainSocket::kMaxFileDescriptors, |
| + send_sock.get()); |
| + ASSERT_TRUE(UnixDomainSocket::SendMsg( |
| + send_sock.get(), kHello, sizeof(kHello), fd_vec)); |
| + |
| + // Extra receiving buffer space to make sure we really received only |
| + // sizeof(kHello) bytes and it wasn't just truncated to fit the buffer. |
| + char buf[sizeof(kHello) + 1]; |
| + base::ProcessId sender_pid; |
| + const ssize_t nread = UnixDomainSocket::RecvMsgWithPid( |
| + recv_sock.get(), buf, sizeof(buf), &fd_vec, &sender_pid); |
| + ASSERT_EQ(sizeof(kHello), static_cast<size_t>(nread)); |
| + ASSERT_EQ(0, memcmp(buf, kHello, sizeof(kHello))); |
| + ASSERT_EQ(UnixDomainSocket::kMaxFileDescriptors, fd_vec.size()); |
| + for (size_t i = 0; i < UnixDomainSocket::kMaxFileDescriptors; i++) { |
| + ASSERT_EQ(0, IGNORE_EINTR(close(fd_vec[i]))); |
| + } |
| + |
| + ASSERT_EQ(getpid(), sender_pid); |
| +} |
| + |
| } // namespace |
| } // namespace base |