Skip to content
Snippets Groups Projects

First unit tests

Merged Leon Dietrich requested to merge first_unit_tests into master
Compare and Show latest version
7 files
+ 126
67
Compare changes
  • Side-by-side
  • Inline
Files
7
@@ -44,7 +44,7 @@ namespace rmrf::net {
}
}
bool decode_address(std::list<socketaddr>& l, addrinfo* looked_up_addrs, const uint16_t port) {
bool decode_address(std::list<socketaddr>& l, addrinfo* looked_up_addrs, const int port) {
if (looked_up_addrs->ai_family == AF_UNIX) {
const sockaddr_un* unix_addr = (sockaddr_un*) looked_up_addrs->ai_addr;
const sockaddr_un addr{*unix_addr};
@@ -53,13 +53,15 @@ namespace rmrf::net {
} else if(looked_up_addrs->ai_family == AF_INET6) {
const sockaddr_in6* ip6_addr = (sockaddr_in6*) looked_up_addrs->ai_addr;
sockaddr_in6 addr{*ip6_addr};
addr.sin6_port = htons(port);
if(port != -1)
addr.sin6_port = htons((uint16_t) port);
socketaddr sa{addr};
l.push_back(sa);
} else if(looked_up_addrs->ai_family == AF_INET) {
const sockaddr_in* ip6_addr = (sockaddr_in*) looked_up_addrs->ai_addr;
sockaddr_in addr{*ip6_addr};
addr.sin_port = htons(port);
if(port != -1)
addr.sin_port = htons((uint16_t) port);
socketaddr sa{addr};
l.push_back(sa);
} else {
@@ -121,18 +123,27 @@ namespace rmrf::net {
}
}
std::list<socketaddr> get_socketaddr_list(const std::string& interface_description, const uint16_t port, const socket_t socket_type) {
if(is_plain_ip_address(interface_description)) {
std::list<socketaddr> l = {parse_plain_ip_address(interface_description, port, socket_type)};
std::list<socketaddr> get_socketaddr_list(const std::string& interface_description, const std::string& service_or_port, const socket_t socket_type) {
int port = -1;
try {
port = (uint16_t) std::stoi(service_or_port);
} catch (const std::invalid_argument& _) {
// Could not parse port. Continue as service
}
// TODO sort to prioritize local addresses over more remote ones
if(port != -1 && is_plain_ip_address(interface_description)) {
std::list<socketaddr> l = {parse_plain_ip_address(interface_description, (uint16_t) port, socket_type)};
return l;
}
struct addrinfo hints = {};
struct addrinfo* addrs;
hints.ai_family = AF_INET6;
hints.ai_socktype = socket_type == TCP ? SOCK_STREAM : SOCK_DGRAM;
hints.ai_protocol = socket_type == TCP ? IPPROTO_TCP : IPPROTO_UDP;
hints.ai_socktype = socket_type == socket_t::TCP ? SOCK_STREAM : SOCK_DGRAM;
hints.ai_protocol = socket_type == socket_t::TCP ? IPPROTO_TCP : IPPROTO_UDP;
if (auto dns_error = getaddrinfo(interface_description.c_str(), NULL, &hints, &addrs); dns_error != 0) {
if (auto dns_error = getaddrinfo(interface_description.c_str(), port == -1 ? service_or_port.c_str() : NULL, &hints, &addrs); dns_error != 0) {
hints.ai_family = AF_UNSPEC;
dns_error = getaddrinfo(interface_description.c_str(), NULL, &hints, &addrs);
if(dns_error != 0){
@@ -148,12 +159,16 @@ namespace rmrf::net {
return l;
}
socketaddr get_first_general_socketaddr(const std::string& interface_description, const uint16_t port, const socket_t socket_type) {
const auto l = get_socketaddr_list(interface_description, port, socket_type);
socketaddr get_first_general_socketaddr(const std::string& interface_description, const std::string& service, const socket_t socket_type) {
const auto l = get_socketaddr_list(interface_description, service, socket_type);
if (l.size() > 0) {
return l.front();
} else {
throw std::invalid_argument("No suitable socket address was found.");
}
}
socketaddr get_first_general_socketaddr(const std::string& interface_description, const uint16_t port, const socket_t socket_type) {
return get_first_general_socketaddr(interface_description, std::to_string(port), socket_type);
}
}
Loading