| 158 | } |
| 159 | |
| 160 | void DoUnixSocketTest(const string& path) { |
| 161 | const string kData = "hello world over a socket"; |
| 162 | |
| 163 | NO_FATALS(BindAndListenUnix(path)); |
| 164 | std::thread t( |
| 165 | [&]{ |
| 166 | Sockaddr new_addr; |
| 167 | Socket sock; |
| 168 | CHECK_OK(listener_.Accept(&sock, &new_addr, 0)); |
| 169 | |
| 170 | // Test GetPeerAddress from server side. |
| 171 | Sockaddr peer_addr; |
| 172 | CHECK_OK(sock.GetPeerAddress(&peer_addr)); |
| 173 | CHECK(HasPrefixString(peer_addr.ToString(), "unix:")); |
| 174 | size_t n_written; |
| 175 | CHECK_OK(sock.BlockingWrite( |
| 176 | reinterpret_cast<const uint8_t*>(kData.data()), kData.size(), &n_written, |
| 177 | MonoTime::Now() + MonoDelta::FromSeconds(10))); |
| 178 | CHECK_OK(sock.Close()); |
| 179 | }); |
| 180 | auto cleanup = MakeScopedCleanup([&] { t.join(); }); |
| 181 | |
| 182 | Socket client = ConnectToListeningServer(); |
| 183 | |
| 184 | // Test GetPeerAddress from client side. |
| 185 | Sockaddr peer_addr; |
| 186 | ASSERT_OK(client.GetPeerAddress(&peer_addr)); |
| 187 | EXPECT_EQ("unix:" + path, peer_addr.ToString()); |
| 188 | |
| 189 | size_t n; |
| 190 | char buf[kData.size()]; |
| 191 | ASSERT_OK(client.BlockingRecv(reinterpret_cast<uint8_t*>(buf), kData.size(), &n, |
| 192 | MonoTime::Now() + MonoDelta::FromSeconds(5))); |
| 193 | cleanup.cancel(); |
| 194 | t.join(); |
| 195 | |
| 196 | ASSERT_OK(client.Close()); |
| 197 | |
| 198 | ASSERT_EQ(n, kData.size()); |
| 199 | ASSERT_EQ(string(buf, n), kData); |
| 200 | } |
| 201 | }; |
| 202 | |
| 203 | TEST_F(SocketTest, TestRecvReset) { |
nothing calls this directly
no test coverage detected