#ifndef ASAPO_CONSUMER_MOCKING_H
#define ASAPO_CONSUMER_MOCKING_H

#include <gtest/gtest.h>
#include <gmock/gmock.h>

#include "../src/net_client.h"
#include "../src/tcp_connection_pool.h"

namespace asapo {

class MockNetClient : public asapo::NetClient {
  public:

    Error GetData(const MessageMeta* info, const std::string& request_sender_details, MessageData* data) override {
        return Error(GetData_t(info, request_sender_details, data));
    }

    MOCK_CONST_METHOD3(GetData_t, ErrorInterface * (const MessageMeta* info, const std::string& request_sender_details, MessageData* data));

};


class MockTCPConnectionPool : public asapo::TcpConnectionPool {
  public:

    SocketDescriptor GetFreeConnection(const std::string& source, const std::string& optional_source, bool* reused, Error* err) override {
        ErrorInterface* error = nullptr;
        auto data = GetFreeConnection_t(source, optional_source, reused, &error);
        err->reset(error);
        return data;
    }
    MOCK_METHOD4(GetFreeConnection_t, SocketDescriptor (const std::string&, const std::string&, bool* reused, ErrorInterface**));

    SocketDescriptor Reconnect(SocketDescriptor sd, Error* err) override {
        ErrorInterface* error = nullptr;
        auto data = Reconnect_t(sd, &error);
        err->reset(error);
        return data;
    }
    MOCK_METHOD2(Reconnect_t, SocketDescriptor (SocketDescriptor, ErrorInterface**));

    MOCK_METHOD1(ReleaseConnection, void (SocketDescriptor));
};

}



#endif //ASAPO_CONSUMER_MOCKING_H