larra/library/include/larra/impl/mock_socket.hpp
2024-10-03 02:13:42 +00:00

73 lines
2.6 KiB
C++

#include <boost/asio/any_io_executor.hpp>
#include <boost/asio/associated_executor.hpp>
#include <boost/asio/buffer.hpp>
namespace larra::xmpp::impl {
class MockSocket {
public:
using executor_type = boost::asio::any_io_executor;
MockSocket(boost::asio::any_io_executor executor, std::size_t writeWithMaxBlocksBy = 5) : // NOLINT
executor(std::move(executor)), writeWithMaxBlocksBy(writeWithMaxBlocksBy) {
}
auto get_executor() -> executor_type {
return executor;
}
auto lowest_layer() -> MockSocket& {
return *this;
}
template <typename EndpointType, typename CompletionToken>
auto async_connect(const EndpointType&, CompletionToken&& token) {
return boost::asio::async_initiate<CompletionToken, void(boost::system::error_code)>(
[](auto&& handler) {
handler(boost::system::error_code{});
},
token);
}
template <typename ConstBufferSequence, typename CompletionToken>
auto async_write_some(const ConstBufferSequence& buffers, CompletionToken&& token) {
sentData.append(boost::asio::buffer_cast<const char*>(*buffers.begin()), boost::asio::buffer_size(*buffers.begin()));
return boost::asio::async_initiate<CompletionToken, void(boost::system::error_code, std::size_t)>(
[](auto&& handler, std::size_t bytes_transferred) {
handler(boost::system::error_code{}, bytes_transferred);
},
token,
boost::asio::buffer_size(*buffers.begin()));
}
template <typename MutableBufferSequence, typename CompletionToken>
auto async_read_some(const MutableBufferSequence& buffers, CompletionToken&& token) {
std::size_t bytesToRead =
std::min({boost::asio::buffer_size(buffers), this->writeWithMaxBlocksBy, this->receivedData.size() - this->readPosition});
std::memcpy(boost::asio::buffer_cast<void*>(buffers), receivedData.data() + readPosition, bytesToRead); // NOLINT
readPosition += bytesToRead;
return boost::asio::async_initiate<CompletionToken, void(boost::system::error_code, std::size_t)>(
[](auto&& handler, std::size_t bytes_transferred) {
handler(bytes_transferred == 0 ? boost::asio::error::eof : boost::system::error_code{}, bytes_transferred);
},
token,
bytesToRead);
}
auto AddReceivedData(std::string_view data) -> void {
receivedData += data;
}
auto GetSentData() -> std::string {
auto sentData = std::move(this->sentData);
this->sentData = std::string{};
return sentData;
}
boost::asio::any_io_executor executor;
std::string sentData;
std::string receivedData;
std::size_t writeWithMaxBlocksBy;
std::size_t readPosition = 0;
};
} // namespace larra::xmpp::impl