Commit 2a22ce5c authored by Jakob Otto's avatar Jakob Otto

Add operator overloads for socket_guard

parent 113653c4
......@@ -27,6 +27,10 @@ namespace net {
template <class Socket>
class socket_guard {
public:
socket_guard() : sock_(invalid_socket_id) {
// nop
}
explicit socket_guard(Socket sock) : sock_(sock) {
// nop
}
......@@ -36,12 +40,30 @@ public:
close(sock_);
}
void reset(Socket x) noexcept {
if (sock_.id != invalid_socket_id)
close(sock_);
sock_ = x;
}
Socket release() {
auto sock = sock_;
sock_.id = invalid_socket_id;
return sock;
}
Socket* get() noexcept {
return &sock_;
}
Socket* operator->() noexcept {
return &sock_;
}
Socket& operator*() noexcept {
return sock_;
}
private:
Socket sock_;
};
......
......@@ -32,7 +32,9 @@ namespace {
constexpr socket_id dummy_id = 13;
struct dummy_socket {
dummy_socket(socket_id& id, bool& closed) : id(id), closed(closed) {
dummy_socket() = default;
dummy_socket(socket_id id, bool& closed) : id(id), closed(closed) {
// nop
}
......@@ -44,20 +46,20 @@ struct dummy_socket {
return *this;
}
socket_id& id;
socket_id id;
bool& closed;
};
void close(dummy_socket x) {
x.id = invalid_socket_id;
x.closed = true;
}
struct fixture {
fixture() : id{dummy_id}, closed{false}, sock{id, closed} {
fixture() : closed{false}, sock{dummy_id, closed} {
// nop
}
socket_id id;
bool closed;
dummy_socket sock;
};
......@@ -69,17 +71,29 @@ CAF_TEST_FIXTURE_SCOPE(socket_guard_tests, fixture)
CAF_TEST(cleanup) {
{
auto guard = make_socket_guard(sock);
CAF_CHECK_EQUAL(sock.id, dummy_id);
CAF_CHECK_EQUAL(guard->id, dummy_id);
}
CAF_CHECK(sock.closed);
}
CAF_TEST(reset) {
{
auto guard = make_socket_guard(sock);
CAF_CHECK_EQUAL(guard->id, dummy_id);
guard.release();
CAF_CHECK_EQUAL(guard->id, invalid_socket_id);
guard.reset(sock);
CAF_CHECK_EQUAL(guard->id, dummy_id);
}
CAF_CHECK_EQUAL(sock.closed, true);
}
CAF_TEST(release) {
{
auto guard = make_socket_guard(sock);
CAF_CHECK_EQUAL(sock.id, dummy_id);
CAF_CHECK_EQUAL(guard->id, dummy_id);
guard.release();
CAF_CHECK_EQUAL(sock.id, invalid_socket_id);
CAF_CHECK_EQUAL(guard->id, invalid_socket_id);
}
CAF_CHECK_EQUAL(sock.closed, false);
}
......
......@@ -32,6 +32,7 @@
#include "caf/net/endpoint_manager_impl.hpp"
#include "caf/net/make_endpoint_manager.hpp"
#include "caf/net/multiplexer.hpp"
#include "caf/net/socket_guard.hpp"
#include "caf/net/stream_socket.hpp"
#include "caf/serializer_impl.hpp"
#include "caf/span.hpp"
......@@ -54,24 +55,20 @@ struct fixture : test_coordinator_fixture<>, host_fixture {
mpx->set_thread_id();
CAF_CHECK_EQUAL(mpx->num_socket_managers(), 1u);
auto sockets = unbox(make_stream_socket_pair());
send_socket = sockets.first;
recv_socket = sockets.second;
if (auto err = nonblocking(recv_socket, true))
send_socket.reset(sockets.first);
recv_socket.reset(sockets.second);
if (auto err = nonblocking(*recv_socket, true))
CAF_FAIL("nonblocking returned an error: " << err);
}
~fixture() {
close(send_socket);
}
bool handle_io_event() override {
return mpx->poll_once(false);
}
multiplexer_ptr mpx;
buffer_type recv_buf;
stream_socket send_socket;
stream_socket recv_socket;
socket_guard<stream_socket> send_socket;
socket_guard<stream_socket> recv_socket;
buffer_ptr shared_buf;
};
......@@ -160,7 +157,7 @@ CAF_TEST_FIXTURE_SCOPE(endpoint_manager_tests, fixture)
CAF_TEST(receive) {
using transport_type = stream_transport<dummy_application>;
auto mgr = make_endpoint_manager(mpx, sys,
transport_type{recv_socket,
transport_type{recv_socket.release(),
dummy_application{
shared_buf}});
CAF_CHECK_EQUAL(mgr->init(), none);
......@@ -169,7 +166,7 @@ CAF_TEST(receive) {
auto& transport = mgr_impl->transport();
transport.configure_read(receive_policy::exactly(hello_manager.size()));
CAF_CHECK_EQUAL(mpx->num_socket_managers(), 2u);
CAF_CHECK_EQUAL(write(send_socket, as_bytes(make_span(hello_manager))),
CAF_CHECK_EQUAL(write(*send_socket, as_bytes(make_span(hello_manager))),
hello_manager.size());
CAF_MESSAGE("wrote " << hello_manager.size() << " bytes.");
run();
......@@ -181,7 +178,7 @@ CAF_TEST(receive) {
CAF_TEST(resolve and proxy communication) {
using transport_type = stream_transport<dummy_application>;
auto mgr = make_endpoint_manager(mpx, sys,
transport_type{send_socket,
transport_type{send_socket.release(),
dummy_application{
shared_buf}});
CAF_CHECK_EQUAL(mgr->init(), none);
......@@ -196,7 +193,7 @@ CAF_TEST(resolve and proxy communication) {
after(std::chrono::seconds(0)) >>
[&] { CAF_FAIL("manager did not respond with a proxy."); });
run();
auto read_res = read(recv_socket, make_span(recv_buf));
auto read_res = read(*recv_socket, make_span(recv_buf));
if (!holds_alternative<size_t>(read_res))
CAF_FAIL("read() returned an error: " << sys.render(get<sec>(read_res)));
recv_buf.resize(get<size_t>(read_res));
......
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