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.
static constexpr Event RecvEvent
If passed to Wait(), then it will wait for readiness to read from the socket.
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.
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()
BOOST_CHECK_EQUAL(headers.FindFirst("key"), "value")
std::thread thread
Thread variable should be after other struct members so the thread does not start until the other mem...
#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