@@ -902,24 +902,68 @@ class SocketAddr4 : public SocketAddr {
902902 sai_.sin_addr .s_addr = htonl (INADDR_LOOPBACK);
903903 }
904904
905- sockaddr *ptr () override {
906- return reinterpret_cast <sockaddr *>(&sai_);
907- }
905+ sockaddr *ptr () override { return reinterpret_cast <sockaddr *>(&sai_); }
908906
909907 size_t size () const override { return sizeof (sai_); }
910908
911909 private:
912910 sockaddr_in sai_;
913911};
914912
915- template <class ... Args>
916- std::unique_ptr<SocketAddr> CreateSockAddr (Args... args) {
917- return std::unique_ptr<SocketAddr>(new SocketAddr4 (args...));
913+ class SocketAddr6 : public SocketAddr {
914+ public:
915+ SocketAddr6 () { EXPECT_POISONED (sai_); }
916+ explicit SocketAddr6 (uint16_t port) {
917+ memset (&sai_, 0 , sizeof (sai_));
918+ sai_.sin6_family = AF_INET6;
919+ sai_.sin6_port = port;
920+ sai_.sin6_addr = in6addr_loopback;
921+ }
922+
923+ sockaddr *ptr () override { return reinterpret_cast <sockaddr *>(&sai_); }
924+
925+ size_t size () const override { return sizeof (sai_); }
926+
927+ private:
928+ sockaddr_in6 sai_;
929+ };
930+
931+ class MemorySanitizerIpTest : public ::testing::TestWithParam<int > {
932+ public:
933+ void SetUp () override {
934+ ASSERT_TRUE (GetParam () == AF_INET || GetParam () == AF_INET6);
935+ }
936+
937+ template <class ... Args>
938+ std::unique_ptr<SocketAddr> CreateSockAddr (Args... args) const {
939+ if (GetParam () == AF_INET)
940+ return std::unique_ptr<SocketAddr>(new SocketAddr4 (args...));
941+ return std::unique_ptr<SocketAddr>(new SocketAddr6 (args...));
942+ }
943+
944+ int CreateSocket (int socket_type) const {
945+ return socket (GetParam (), socket_type, 0 );
946+ }
947+ };
948+
949+ std::vector<int > GetAvailableIpSocketFamilies () {
950+ std::vector<int > result;
951+
952+ for (int i : std::vector<int >(AF_INET, AF_INET6)) {
953+ int s = socket (i, SOCK_STREAM, 0 );
954+ if (s > 0 ) {
955+ result.push_back (i);
956+ close (s);
957+ }
958+ }
959+
960+ return result;
918961}
919962
920- int CreateSocket (int socket_type) { return socket (AF_INET, socket_type, 0 ); }
963+ INSTANTIATE_TEST_CASE_P (IpTests, MemorySanitizerIpTest,
964+ ::testing::ValuesIn (GetAvailableIpSocketFamilies()));
921965
922- TEST (MemorySanitizer , accept) {
966+ TEST_P (MemorySanitizerIpTest , accept) {
923967 int listen_socket = CreateSocket (SOCK_STREAM);
924968 ASSERT_LT (0 , listen_socket);
925969
@@ -963,7 +1007,7 @@ TEST(MemorySanitizer, accept) {
9631007 close (listen_socket);
9641008}
9651009
966- TEST (MemorySanitizer , recvmsg) {
1010+ TEST_P (MemorySanitizerIpTest , recvmsg) {
9671011 int server_socket = CreateSocket (SOCK_DGRAM);
9681012 ASSERT_LT (0 , server_socket);
9691013
0 commit comments