TEST(SocketAddress, SetFromSocketUnixAnonymous) { // Test an anonymous client talking to a fixed-path unix socket. char serverPath[] = "/tmp/TSocketAddressTest.server.XXXXXX"; int serverPathFd = mkstemp(serverPath); EXPECT_GE(serverPathFd, 0); int rc = unlink(serverPath); EXPECT_EQ(rc, 0); TSocketAddress serverBindAddr; TSocketAddress listenAddr; TSocketAddress acceptAddr; TSocketAddress serverAddr; TSocketAddress serverPeerAddr; TSocketAddress clientAddr; TSocketAddress clientPeerAddr; try { serverBindAddr.setFromPath(serverPath); testSetFromSocket(&serverBindAddr, nullptr, &listenAddr, &acceptAddr, &serverAddr, &serverPeerAddr, &clientAddr, &clientPeerAddr); } catch (...) { // Remove the socket file after we are done unlink(serverPath); throw; } unlink(serverPath); // The server socket's local address should be the same as the listen // address. EXPECT_EQ(serverAddr, listenAddr); // The client's peer address should always be the same as the server // socket's address. EXPECT_EQ(clientPeerAddr, serverAddr); // Since the client is using an anonymous address, it won't compare equal to // any other anonymous addresses. Make sure the addresses are anonymous. EXPECT_EQ(serverPeerAddr.getPath(), ""); EXPECT_EQ(clientAddr.getPath(), ""); EXPECT_EQ(acceptAddr.getPath(), ""); }
TEST(SocketAddress, Unix) { TSocketAddress addr; // Test a small path addr.setFromPath("foo"); EXPECT_EQ(addr.getFamily(), AF_UNIX); EXPECT_EQ(addr.describe(), "foo"); EXPECT_THROW(addr.getAddressStr(), TTransportException); EXPECT_THROW(addr.getPort(), TTransportException); EXPECT_TRUE(addr.isPrivateAddress()); EXPECT_TRUE(addr.isLoopbackAddress()); // Test a path that is too large const char longPath[] = "abcdefghijklmnopqrstuvwxyz0123456789" "abcdefghijklmnopqrstuvwxyz0123456789" "abcdefghijklmnopqrstuvwxyz0123456789" "abcdefghijklmnopqrstuvwxyz0123456789"; EXPECT_THROW(addr.setFromPath(longPath), TTransportException); // The original address should still be the same EXPECT_EQ(addr.getFamily(), AF_UNIX); EXPECT_EQ(addr.describe(), "foo"); // Test a path that exactly fits in sockaddr_un // (not including the NUL terminator) const char exactLengthPath[] = "abcdefghijklmnopqrstuvwxyz0123456789" "abcdefghijklmnopqrstuvwxyz0123456789" "abcdefghijklmnopqrstuvwxyz0123456789"; addr.setFromPath(exactLengthPath); EXPECT_EQ(addr.describe(), exactLengthPath); // Test converting a unix socket address to an IPv4 one, then back addr.setFromHostPort("127.0.0.1", 1234); EXPECT_EQ(addr.getFamily(), AF_INET); EXPECT_EQ(addr.describe(), "127.0.0.1:1234"); addr.setFromPath("/i/am/a/unix/address"); EXPECT_EQ(addr.getFamily(), AF_UNIX); EXPECT_EQ(addr.describe(), "/i/am/a/unix/address"); // Test copy constructor and assignment operator { TSocketAddress copy(addr); EXPECT_EQ(copy, addr); copy.setFromPath("/abc"); EXPECT_NE(copy, addr); copy = addr; EXPECT_EQ(copy, addr); copy.setFromIpPort("127.0.0.1", 80); EXPECT_NE(copy, addr); copy = addr; EXPECT_EQ(copy, addr); } { TSocketAddress copy(addr); EXPECT_EQ(copy, addr); EXPECT_EQ(copy.describe(), "/i/am/a/unix/address"); EXPECT_EQ(copy.getPath(), "/i/am/a/unix/address"); TSocketAddress other("127.0.0.1", 80); EXPECT_NE(other, addr); other = copy; EXPECT_EQ(other, copy); EXPECT_EQ(other, addr); EXPECT_EQ(copy, addr); } #if __GXX_EXPERIMENTAL_CXX0X__ { TSocketAddress copy; { // move a unix address into a non-unix address TSocketAddress tmpCopy(addr); copy = std::move(tmpCopy); } EXPECT_EQ(copy, addr); copy.setFromPath("/another/path"); { // move a unix address into a unix address TSocketAddress tmpCopy(addr); copy = std::move(tmpCopy); } EXPECT_EQ(copy, addr); { // move a non-unix address into a unix address TSocketAddress tmp("127.0.0.1", 80); copy = std::move(tmp); } EXPECT_EQ(copy.getAddressStr(), "127.0.0.1"); EXPECT_EQ(copy.getPort(), 80); copy = addr; // move construct a unix address TSocketAddress other(std::move(copy)); EXPECT_EQ(other, addr); EXPECT_EQ(other.getPath(), addr.getPath()); } #endif }