10#include <util/threadinterrupt.h>
12#include <boost/test/unit_test.hpp>
17using namespace std::chrono_literals;
27 socklen_t len =
sizeof(type);
28 return getsockopt(
s, SOL_SOCKET, SO_TYPE,
reinterpret_cast<char*
>(&type), &len) ==
SOCKET_ERROR;
33 const SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
52 Sock* sock2 =
new Sock(std::move(*sock1));
70 *sock2 = std::move(*sock1);
104 addr.sin_family = AF_INET;
105 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
108 BOOST_REQUIRE_EQUAL(
receiver.
Bind(
reinterpret_cast<sockaddr*
>(&addr),
sizeof(addr)), 0);
113 socklen_t blen =
sizeof(bound);
115 BOOST_REQUIRE_EQUAL(blen,
sizeof(bound));
117 BOOST_REQUIRE_EQUAL(
sender.
Connect(
reinterpret_cast<sockaddr*
>(&bound),
sizeof(bound)), 0);
119 std::unique_ptr<Sock> accepted =
receiver.
Accept(
nullptr,
nullptr);
120 BOOST_REQUIRE(accepted !=
nullptr);
127 const char*
msg =
"abcd";
128 constexpr ssize_t msg_len = 4;
153 BOOST_REQUIRE_EQUAL(socks.
sender.
Send(
"a", 1, 0), 1);
160 constexpr auto timeout = 1min;
165 std::thread receiver([&socks, &timeout, &interrupt]() {
166 constexpr size_t max_data{10};
167 bool threw_as_expected{
false};
172 }
catch (
const std::runtime_error& e) {
173 threw_as_expected =
HasReason(
"too many bytes without a terminator")(e);
175 assert(threw_as_expected);
A helper class for interruptible sleeps.
BOOST_CHECK_EXCEPTION predicates to check the specific validation error.
RAII helper class that manages a socket and closes it automatically when it goes out of scope.
virtual std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const
accept(2) wrapper.
virtual ssize_t Send(const void *data, size_t len, int flags) const
send(2) wrapper.
virtual int Bind(const sockaddr *addr, socklen_t addr_len) const
bind(2) wrapper.
virtual bool Wait(std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const
Wait for readiness for input (recv) or output (send).
virtual void SendComplete(std::span< const unsigned char > data, std::chrono::milliseconds timeout, CThreadInterrupt &interrupt) const
Send the given data, retrying on transient errors.
virtual int GetSockName(sockaddr *name, socklen_t *name_len) const
getsockname(2) wrapper.
static constexpr Event RECV
If passed to Wait(), then it will wait for readiness to read from the socket.
virtual int Connect(const sockaddr *addr, socklen_t addr_len) const
connect(2) wrapper.
virtual ssize_t Recv(void *buf, size_t len, int flags) const
recv(2) wrapper.
virtual std::string RecvUntilTerminator(uint8_t terminator, std::chrono::milliseconds timeout, CThreadInterrupt &interrupt, size_t max_data) const
Read from socket until a terminator character is encountered.
virtual int Listen(int backlog) const
listen(2) wrapper.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
static bool SocketIsClosed(const SOCKET &s)
BOOST_AUTO_TEST_CASE(constructor_and_destructor)
static SOCKET CreateSocket()
TcpSocketPair(TcpSocketPair &&)=default
TcpSocketPair(const TcpSocketPair &)=delete
TcpSocketPair & operator=(const TcpSocketPair &)=delete