@@ -252,6 +252,49 @@ TEST(NetworkUtility, ParseInternetAddressAndPort) {
252252 EXPECT_EQ (" [::1]:0" , Utility::parseInternetAddressAndPortNoThrow (" [::1]:0" )->asString ());
253253}
254254
255+ TEST (NetworkUtility, GetAddressWithPort) {
256+ // Test basic IPv4.
257+ auto addr_v4 = std::make_shared<Address::Ipv4Instance>(" 1.2.3.4" , 80 );
258+ auto addr_v4_new_port = Utility::getAddressWithPort (*addr_v4, 8080 );
259+ EXPECT_EQ (" 1.2.3.4:8080" , addr_v4_new_port->asString ());
260+ EXPECT_EQ (Address::IpVersion::v4, addr_v4_new_port->ip ()->version ());
261+
262+ // Test basic IPv6.
263+ auto addr_v6 = std::make_shared<Address::Ipv6Instance>(" ::1" , 80 );
264+ auto addr_v6_new_port = Utility::getAddressWithPort (*addr_v6, 8080 );
265+ EXPECT_EQ (" [::1]:8080" , addr_v6_new_port->asString ());
266+ EXPECT_EQ (Address::IpVersion::v6, addr_v6_new_port->ip ()->version ());
267+
268+ // Test IPv6 with scope ID.
269+ sockaddr_in6 scoped_addr;
270+ memset (&scoped_addr, 0 , sizeof (scoped_addr));
271+ scoped_addr.sin6_family = AF_INET6;
272+ EXPECT_EQ (1 , inet_pton (AF_INET6, " fe80::1" , &scoped_addr.sin6_addr ));
273+ scoped_addr.sin6_port = htons (80 );
274+ scoped_addr.sin6_scope_id = 5 ;
275+
276+ auto addr_v6_scoped = std::make_shared<Address::Ipv6Instance>(scoped_addr);
277+ EXPECT_EQ (" [fe80::1%5]:80" , addr_v6_scoped->asString ());
278+ EXPECT_EQ (5u , addr_v6_scoped->ip ()->ipv6 ()->scopeId ());
279+
280+ auto addr_v6_scoped_new_port = Utility::getAddressWithPort (*addr_v6_scoped, 8080 );
281+ EXPECT_EQ (" [fe80::1%5]:8080" , addr_v6_scoped_new_port->asString ());
282+ EXPECT_EQ (Address::IpVersion::v6, addr_v6_scoped_new_port->ip ()->version ());
283+ EXPECT_EQ (5u , addr_v6_scoped_new_port->ip ()->ipv6 ()->scopeId ());
284+ EXPECT_EQ (8080u , addr_v6_scoped_new_port->ip ()->port ());
285+
286+ // Verify v6only is preserved.
287+ sockaddr_in6 v6only_addr;
288+ memset (&v6only_addr, 0 , sizeof (v6only_addr));
289+ v6only_addr.sin6_family = AF_INET6;
290+ EXPECT_EQ (1 , inet_pton (AF_INET6, " ::1" , &v6only_addr.sin6_addr ));
291+ v6only_addr.sin6_port = htons (80 );
292+ auto addr_v6only_false = std::make_shared<Address::Ipv6Instance>(v6only_addr, false );
293+ EXPECT_FALSE (addr_v6only_false->ip ()->ipv6 ()->v6only ());
294+ auto addr_v6only_false_new_port = Utility::getAddressWithPort (*addr_v6only_false, 8080 );
295+ EXPECT_FALSE (addr_v6only_false_new_port->ip ()->ipv6 ()->v6only ());
296+ }
297+
255298class NetworkUtilityGetLocalAddress : public testing ::TestWithParam<Address::IpVersion> {};
256299
257300INSTANTIATE_TEST_SUITE_P (IpVersions, NetworkUtilityGetLocalAddress,
@@ -706,7 +749,7 @@ TEST(ResolvedUdpSocketConfig, Warning) {
706749 ResolvedUdpSocketConfig resolved_config (envoy::config::core::v3::UdpSocketConfig (), true ));
707750}
708751
709- #ifndef WIN32
752+ #if defined(__linux__)
710753TEST (PacketLoss, LossTest) {
711754 class ZeroTimeSource : public TimeSource {
712755 public:
0 commit comments