Commit bf48be27 authored by Jakob Otto's avatar Jakob Otto

Use local_addresses() in udp_datagram_socket test

parent 3694f195
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include "host_fixture.hpp" #include "host_fixture.hpp"
#include "caf/detail/net_syscall.hpp" #include "caf/detail/net_syscall.hpp"
#include "caf/detail/socket_sys_includes.hpp"
#include "caf/ip_address.hpp" #include "caf/ip_address.hpp"
#include "caf/ip_endpoint.hpp" #include "caf/ip_endpoint.hpp"
#include "caf/ipv4_address.hpp" #include "caf/ipv4_address.hpp"
...@@ -34,49 +33,50 @@ ...@@ -34,49 +33,50 @@
using namespace caf; using namespace caf;
using namespace caf::net; using namespace caf::net;
using namespace caf::net::ip;
namespace { namespace {
constexpr string_view hello_test = "Hello test!"; constexpr string_view hello_test = "Hello test!";
struct fixture : host_fixture { struct fixture : host_fixture {
fixture() fixture() : host_fixture() {
: host_fixture(), addresses = local_addresses("localhost");
v4_local{make_ipv4_address(127, 0, 0, 1)}, CAF_CHECK(!addresses.empty());
v6_local{{0}, {0x1}}, ep = ip_endpoint(*addresses.begin(), 0);
// TODO: use local_addresses() when merged auto send_pair = unbox(make_udp_datagram_socket(ep));
addrs{net::ip::resolve("localhost")} { send_socket = send_pair.first;
auto receive_pair = unbox(make_udp_datagram_socket(ep));
receive_socket = receive_pair.first;
ep.port(ntohs(receive_pair.second));
} }
bool contains(ip_address x) { ~fixture() {
return std::count(addrs.begin(), addrs.end(), x) > 0; close(send_socket);
close(receive_socket);
} }
void test_send_receive(ip_address addr) { std::vector<ip_address> addresses;
actor_system_config cfg;
actor_system sys{cfg};
ip_endpoint ep;
udp_datagram_socket send_socket;
udp_datagram_socket receive_socket;
};
} // namespace
CAF_TEST_FIXTURE_SCOPE(udp_datagram_socket_test, fixture)
CAF_TEST(send and receive) {
std::vector<byte> buf(1024); std::vector<byte> buf(1024);
ip_endpoint ep(addr, 0);
auto send_pair = unbox(make_udp_datagram_socket(ep));
auto send_socket = send_pair.first;
auto receive_pair = unbox(make_udp_datagram_socket(ep));
auto receive_socket = receive_pair.first;
ep.port(ntohs(receive_pair.second));
CAF_MESSAGE("sending data to: " << to_string(ep)); CAF_MESSAGE("sending data to: " << to_string(ep));
auto send_guard = make_socket_guard(send_socket);
auto receive_guard = make_socket_guard(receive_socket);
if (auto err = nonblocking(socket_cast<net::socket>(receive_socket), true)) if (auto err = nonblocking(socket_cast<net::socket>(receive_socket), true))
CAF_FAIL("nonblocking returned an error" << err); CAF_FAIL("nonblocking returned an error" << err);
auto test_read_res = read(receive_socket, make_span(buf)); CAF_CHECK_EQUAL(read(receive_socket, make_span(buf)),
if (auto err = get_if<sec>(&test_read_res)) sec::unavailable_or_would_block);
CAF_CHECK_EQUAL(*err, sec::unavailable_or_would_block); CAF_CHECK_EQUAL(write(send_socket, as_bytes(make_span(hello_test)), ep),
else hello_test.size());
CAF_FAIL("read should have failed");
auto write_ret = write(send_socket, as_bytes(make_span(hello_test)), ep);
if (auto num_bytes = get_if<size_t>(&write_ret))
CAF_CHECK_EQUAL(*num_bytes, hello_test.size());
else
CAF_FAIL("write returned an error: " << sys.render(get<sec>(write_ret)));
variant<std::pair<size_t, ip_endpoint>, sec> read_ret; variant<std::pair<size_t, ip_endpoint>, sec> read_ret;
do { do {
read_ret = read(receive_socket, make_span(buf)); read_ret = read(receive_socket, make_span(buf));
...@@ -88,31 +88,8 @@ struct fixture : host_fixture { ...@@ -88,31 +88,8 @@ struct fixture : host_fixture {
} }
} while (holds_alternative<sec>(read_ret) } while (holds_alternative<sec>(read_ret)
&& get<sec>(read_ret) == sec::unavailable_or_would_block); && get<sec>(read_ret) == sec::unavailable_or_would_block);
string_view buf_view{reinterpret_cast<const char*>(buf.data()), buf.size()}; string_view received{reinterpret_cast<const char*>(buf.data()), buf.size()};
CAF_CHECK_EQUAL(buf_view, hello_test); CAF_CHECK_EQUAL(received, hello_test);
}
actor_system_config cfg;
actor_system sys{cfg};
ip_address v4_local;
ip_address v6_local;
std::vector<ip_address> addrs;
};
} // namespace
CAF_TEST_FIXTURE_SCOPE(udp_datagram_socket_test, fixture)
CAF_TEST(send and receive) {
// TODO: check which versions exist and test existing versions accordingly
// -> local_addresses()
if (contains(v4_local)) {
test_send_receive(v4_local);
} else if (contains(v6_local)) {
test_send_receive(v6_local);
} else {
CAF_FAIL("could not resolve 'localhost'");
}
} }
CAF_TEST_FIXTURE_SCOPE_END() CAF_TEST_FIXTURE_SCOPE_END()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment