Newer
Older
#pragma once
#include <vector>
#include "net/connection_client.hpp"
namespace rmrf::test {
/**
* Use this class to mock a connection client.
*/
class loopback_connection_client : public rmrf::net::connection_client {
private:
const incomming_data_cb send_data_cb;
std::vector<std::string> data_archive;
public:
/**
* This constructor uses the given callback to notify the test suite that the module under test
* send data.
*/
loopback_connection_client(
const incomming_data_cb& send_data_cb_,
) :
rmrf::net::connection_client(rmrf::net::null_fd{}, rmrf::net::socketaddr{}, nullptr),
send_data_cb(send_data_cb_),
data_archive{},
echo_data_transfer(echo_data)
{
// Does nothing special
}
/**
* Just the mandatory virtual destructor.
*/
virtual ~loopback_connection_client() {
// Also doesn't do anything fancy.
}
/**
* This method gets called by the module under test as it simulates the behavior of a normal connection client.
* @param data The data the module wants to send.
*/
virtual void write_data(const rmrf::net::iorecord& data) {
// TODO fixme
if (this->echo_data_transfer) {
std::cout << "<-- " << data << std::endl;
}
this->data_archive.push_back(data.str());
if (this->send_data_cb) {
this->send_data_cb(data);
}
}
/**
* This method sends data to the connections incoming data callback.
* Use it to mimic a remote client sending data.
*
* @param data The data to send.
*/
void send_data_to_incomming_data_cb(const rmrf::net::iorecord& data) {
if (this->echo_data_transfer) {
std::cout << "--> " << data << std::endl;
}
if (this->in_data_cb) {
this->in_data_cb(data);
}
}
/**
* Use this method in order to get all data the module under test has send.
*/
std::vector<std::string> get_send_data() {
return this->data_archive;
}
void clear_sent_data() {
this->data_archive.clear();
}
virtual void read_from_socket(::ev::io& w) {
// Does nothing as libev is disabled here
MARK_UNUSED(w);
}
virtual ssize_t push_write_queue(::ev::io& w, rmrf::net::iorecord& buffer) {
MARK_UNUSED(w);
MARK_UNUSED(buffer);
throw rmrf::net::netio_exception("Error: push_write_queue was called");
return 0;
}