73 lines
2.6 KiB
C++
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
|