Improve usabilty of ServiceAddress.

PiperOrigin-RevId: 842439675
This commit is contained in:
Francis Tsui
2025-12-09 16:22:25 -08:00
committed by Copybara-Service
parent 4652aef48c
commit 63f943aaed
10 changed files with 308 additions and 8 deletions
@@ -354,6 +354,7 @@ cc_library(
"//:__subpackages__",
],
deps = [
"//internal/platform:base",
"//internal/platform:logging",
"@com_google_absl//absl/types:span",
],
@@ -23,6 +23,7 @@
#include "absl/types/span.h"
#include "internal/platform/logging.h"
#include "internal/platform/service_address.h"
namespace nearby::windows {
@@ -149,6 +150,11 @@ bool SocketAddress::FromBytes(SocketAddress& address,
return true;
}
bool SocketAddress::FromServiceAddress(SocketAddress& address,
const ServiceAddress& service_address) {
return FromBytes(address, service_address.address, service_address.port);
}
int SocketAddress::port() const {
DCHECK(address_.ss_family == AF_INET || address_.ss_family == AF_INET6);
if (address_.ss_family == AF_INET) {
@@ -23,6 +23,7 @@
#include <string>
#include "absl/types/span.h"
#include "internal/platform/service_address.h"
namespace nearby::windows {
@@ -63,6 +64,9 @@ class SocketAddress {
static bool FromBytes(SocketAddress& address,
absl::Span<const char> address_bytes, int port = 0);
static bool FromServiceAddress(SocketAddress& address,
const ServiceAddress& service_address);
// Returns true if dual stack support has been enabled.
bool dual_stack() const { return dual_stack_; }
@@ -15,6 +15,7 @@
#include "internal/platform/implementation/windows/socket_address.h"
#include "gtest/gtest.h"
#include "internal/platform/service_address.h"
namespace nearby::windows {
namespace {
@@ -201,5 +202,58 @@ TEST(SocketAddressTest, IPv6LinkLocalFail) {
EXPECT_FALSE(address.IsV6LinkLocal());
}
TEST(SocketAddressTest, FromServiceAddressIPv4) {
SocketAddress address;
ServiceAddress service_address = {
.address = {192, 168, 1, 1},
.port = 8080,
};
EXPECT_TRUE(SocketAddress::FromServiceAddress(address, service_address));
EXPECT_EQ(address.ToString(), "192.168.1.1:8080");
EXPECT_EQ(address.port(), 8080);
}
TEST(SocketAddressTest, FromServiceAddressIPv4DualStack) {
SocketAddress address(/*dual_stack=*/true);
ServiceAddress service_address = {
.address = {192, 168, 1, 1},
.port = 8080,
};
EXPECT_TRUE(SocketAddress::FromServiceAddress(address, service_address));
EXPECT_EQ(address.ToString(), "[::ffff:192.168.1.1]:8080");
EXPECT_EQ(address.port(), 8080);
}
TEST(SocketAddressTest, FromServiceAddressIPv6) {
SocketAddress address(/*dual_stack=*/true);
ServiceAddress service_address = {
.address = {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x4d, 0xb2, 0xb3, 0x5c, 0x22,
0x03, 0x98, 0xa1},
.port = 8080,
};
EXPECT_TRUE(SocketAddress::FromServiceAddress(address, service_address));
EXPECT_EQ(address.ToString(), "[fe80::4db2:b35c:2203:98a1]:8080");
EXPECT_EQ(address.port(), 8080);
}
TEST(SocketAddressTest, FromServiceAddressIPv6NoDualStack) {
SocketAddress address;
ServiceAddress service_address = {
.address = {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x4d, 0xb2, 0xb3, 0x5c, 0x22,
0x03, 0x98, 0xa1},
.port = 8080,
};
EXPECT_FALSE(SocketAddress::FromServiceAddress(address, service_address));
}
TEST(SocketAddressTest, FromServiceAddressInvalidAddress) {
SocketAddress address;
ServiceAddress service_address = {
.address = {192, 168, 1},
.port = 8080,
};
EXPECT_FALSE(SocketAddress::FromServiceAddress(address, service_address));
}
} // namespace
} // namespace nearby::windows