MXS-1461 Add mock Backend class
This commit is contained in:
117
server/modules/filter/dbfwfilter/test/maxscale/mock/backend.hh
Normal file
117
server/modules/filter/dbfwfilter/test/maxscale/mock/backend.hh
Normal file
@ -0,0 +1,117 @@
|
||||
#pragma once
|
||||
/*
|
||||
* Copyright (c) 2016 MariaDB Corporation Ab
|
||||
*
|
||||
* Use of this software is governed by the Business Source License included
|
||||
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
|
||||
*
|
||||
* Change Date: 2020-01-01
|
||||
*
|
||||
* On the date above, in accordance with the Business Source License, use
|
||||
* of this software will be governed by version 2 or later of the General
|
||||
* Public License.
|
||||
*/
|
||||
|
||||
#include <maxscale/cppdefs.hh>
|
||||
#include <map>
|
||||
#include "routersession.hh"
|
||||
|
||||
namespace maxscale
|
||||
{
|
||||
|
||||
namespace mock
|
||||
{
|
||||
|
||||
/**
|
||||
* The abstract class Backend represents a backend.
|
||||
*/
|
||||
class Backend
|
||||
{
|
||||
Backend(const Backend&);
|
||||
Backend& operator = (const Backend&);
|
||||
|
||||
public:
|
||||
virtual ~Backend();
|
||||
|
||||
/**
|
||||
* Called to handle a statement from a "client".
|
||||
*
|
||||
* @param pSession The originating router session.
|
||||
* @param pStatement A buffer containing a statement.
|
||||
*/
|
||||
virtual void handle_statement(RouterSession* pSession, GWBUF* pStatement) = 0;
|
||||
|
||||
/**
|
||||
* Called when the backend should respond to the client.
|
||||
*
|
||||
* @param pSession The router session to respond to.
|
||||
*
|
||||
* @return True, if the backend has additional responses to the router session.
|
||||
*/
|
||||
virtual bool respond(RouterSession* pSession) = 0;
|
||||
|
||||
/**
|
||||
* Whether the backend has a response for some router.
|
||||
*
|
||||
* @param pSession A router session.
|
||||
*
|
||||
* @return True if there are responses for the router session.
|
||||
*/
|
||||
virtual bool idle(const RouterSession* pSession) const = 0;
|
||||
|
||||
protected:
|
||||
Backend();
|
||||
};
|
||||
|
||||
/**
|
||||
* The abstract class BufferBackend is a helper class for concrete
|
||||
* backend classes.
|
||||
*/
|
||||
class BufferBackend : public Backend
|
||||
{
|
||||
BufferBackend(const BufferBackend&);
|
||||
BufferBackend& operator = (const BufferBackend&);
|
||||
|
||||
public:
|
||||
~BufferBackend();
|
||||
|
||||
bool respond(RouterSession* pSession);
|
||||
|
||||
bool idle(const RouterSession* pSession) const;
|
||||
|
||||
protected:
|
||||
BufferBackend();
|
||||
|
||||
/**
|
||||
* Enqueues a response for a particular router session.
|
||||
*
|
||||
* @param pSession The session to enqueue the response for.
|
||||
* @param pResponse The response.
|
||||
*/
|
||||
void enqueue_response(RouterSession* pSession, GWBUF* pResponse);
|
||||
|
||||
private:
|
||||
typedef std::deque<GWBUF*> Responses;
|
||||
typedef std::map<const RouterSession*, Responses> SessionResponses;
|
||||
|
||||
SessionResponses m_session_responses;
|
||||
};
|
||||
|
||||
/**
|
||||
* The OkBackend is a concrete backend class that response with an
|
||||
* OK packet to all statements.
|
||||
*/
|
||||
class OkBackend : public BufferBackend
|
||||
{
|
||||
OkBackend(const OkBackend&);
|
||||
OkBackend& operator = (const OkBackend&);
|
||||
|
||||
public:
|
||||
OkBackend();
|
||||
|
||||
void handle_statement(RouterSession* pSession, GWBUF* pStatement);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
118
server/modules/filter/dbfwfilter/test/mock_backend.cc
Normal file
118
server/modules/filter/dbfwfilter/test/mock_backend.cc
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2016 MariaDB Corporation Ab
|
||||
*
|
||||
* Use of this software is governed by the Business Source License included
|
||||
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
|
||||
*
|
||||
* Change Date: 2020-01-01
|
||||
*
|
||||
* On the date above, in accordance with the Business Source License, use
|
||||
* of this software will be governed by version 2 or later of the General
|
||||
* Public License.
|
||||
*/
|
||||
|
||||
#include "maxscale/mock/backend.hh"
|
||||
#include <maxscale/protocol/mysql.h>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace maxscale
|
||||
{
|
||||
|
||||
namespace mock
|
||||
{
|
||||
|
||||
//
|
||||
// Backend
|
||||
//
|
||||
|
||||
Backend::Backend()
|
||||
{
|
||||
}
|
||||
|
||||
Backend::~Backend()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// BufferBackend
|
||||
//
|
||||
BufferBackend::BufferBackend()
|
||||
{
|
||||
}
|
||||
|
||||
BufferBackend::~BufferBackend()
|
||||
{
|
||||
}
|
||||
|
||||
bool BufferBackend::respond(RouterSession* pSession)
|
||||
{
|
||||
ss_dassert(!idle(pSession));
|
||||
|
||||
bool rv = false;
|
||||
|
||||
if (!idle(pSession))
|
||||
{
|
||||
Responses& responses = m_session_responses[pSession];
|
||||
ss_dassert(!responses.empty());
|
||||
|
||||
GWBUF* pResponse = responses.front();
|
||||
responses.pop_front();
|
||||
|
||||
pSession->clientReply(pResponse);
|
||||
|
||||
rv = !responses.empty();
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
bool BufferBackend::idle(const RouterSession* pSession) const
|
||||
{
|
||||
bool rv = true;
|
||||
|
||||
SessionResponses::const_iterator i = m_session_responses.find(pSession);
|
||||
ss_dassert(i != m_session_responses.end());
|
||||
|
||||
if (i != m_session_responses.end())
|
||||
{
|
||||
const Responses& responses = i->second;
|
||||
rv = responses.empty();
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void BufferBackend::enqueue_response(RouterSession* pSession, GWBUF* pResponse)
|
||||
{
|
||||
Responses& responses = m_session_responses[pSession];
|
||||
|
||||
responses.push_back(pResponse);
|
||||
}
|
||||
|
||||
//
|
||||
// OkBackend
|
||||
//
|
||||
|
||||
OkBackend::OkBackend()
|
||||
{
|
||||
}
|
||||
|
||||
void OkBackend::handle_statement(RouterSession* pSession, GWBUF* pStatement)
|
||||
{
|
||||
/* Note: sequence id is always 01 (4th byte) */
|
||||
const static uint8_t ok[MYSQL_OK_PACKET_MIN_LEN] =
|
||||
{ 07, 00, 00, 01, 00, 00, 00, 02, 00, 00, 00 };
|
||||
|
||||
GWBUF* pResponse = gwbuf_alloc_and_load(sizeof(ok), &ok);
|
||||
ss_dassert(pResponse);
|
||||
|
||||
enqueue_response(pSession, pResponse);
|
||||
|
||||
gwbuf_free(pStatement);
|
||||
}
|
||||
|
||||
} // mock
|
||||
|
||||
} // maxscale
|
Reference in New Issue
Block a user