通用服務器樁-Receiver使用說明文檔
1 背景
“驅動+樁”是一種比較成熟的服務器端模塊測試模式,易于實施自動化。
Receiver應用于樁構建的場景,提高構建服務器端測試樁的效率,在大多數應用場景下用戶可以通過配置xml文件實習樁功能,支持功能和性能測試使用
Receiver只支持linux環境使用
2 名詞解釋
A模式: 普通xml解析模式
B模式: 邏輯xml解析模式
C模式: so加載模式
3 功能
※能夠模擬提供二進制socket接口的服務器程序
※能夠支持功能與性能的要求
※提供三種使用模式:
(1) 普通xml解析模式(模擬單個接口,指定接口格式及回報數據)
(2) 邏輯xml解析模式(模擬多個接口,除指定接口格式及回報數據外,定制部分邏輯)
(3) so加載模式(特殊場景使用,用戶可以自己實現包處理函數)
※ 提供各類輔助函數, 幫助更快速的開發樁程序
4 使用說明
4.1 普通xml模式
假設一個服務器模塊提供的某個socket接口請求格式為header+req1,回包格式為header+resp1,struct描述如下:
struct header{
int cmd;
char provider[200];
int len;
};
struct req1{
int id;
};
Struct item{
Int a;
Int b;
};
struct resp1{
int result;
char name[50];
int count;
struct item items[];
};
那么我們需要先構造三個xml描述
※header1.xml
※req1.xml
※ resp1.xml
注:endian用來描述字節序,0為主機序(默認)
Repeat用于指定該數據段重復數字,用于數組定義,也可以用在struct的描述上
Type為該字段類型,工具內置類型見附錄
#flowlen()為內置函數,指定此處自動計算,根據后面所有結構體的長度計算,其他關鍵字見附錄
$TEMPRESULT表示從環境變量TEMPRESULT中讀取數據
@count 表示該字段值由值反填,也就是5
回包值可以指定固定值、從環境變量中讀取或者利用random內置函數隨機生成
運行receiver:./receiver –p 3306 –r ./header.xml –r req1.xml –s header.xml –s resp1.xml -l 1 -u 0 -n -1 即可模擬這個服務器的接口
那么當receiver收到一個header+req1的請求,它會回一個header+resp1的應答(result為對應系統變量實際值,name 為hello world),-l 1表示長連接, -u 0 表示tcp請求, -n -1 表示receiver不會退出,一直處理請求
4.2 邏輯xml模式
上個例子給出了模擬一個服務器程序單一接口的使用方法,邏輯xml主要用于模擬一個程序多個接口的場景。
假設說某模塊提供的接口格式如下:
header1+header2+reqX
回包格式為:
header1+header2+respX
(X為未知數,具體請求與回應的結構體由header2中的cmd域來定義,例如如果cmd取值為5,則請求為header1+header2+req5,回應為header1+header2+resp5)
我們想啟動一個樁實例來模擬這些接口,那么可以使用邏輯xml模式,邏輯xmll的使用方法如下:
首先構造邏輯xml:
[gaowei@db-testing-cs33.db01.baidu.com receiver]$ cat xml/config.xml
運行receiver:./receiver –p 3306 –b config.xml -l 1 -u 0 -n -1 –t 5即可模擬這個服務器的多個接口
4.3 so模式
如果以上兩種方式不能滿足用戶需求,用戶可以繼承receiver提供的plugin基類,實現自己的包處理函數
class IPlugin
{
public:
IPlugin( const std::string& name) ;
virtual ~IPlugin();
virtual const std::string& GetPluginName();
virtual void Process( void *);
protected:
std::string m_strPluginName;
};
Receiver使用了Epool和線程池模型,當有socket可讀,會立刻回調用戶的Process( void *)函數,傳給用戶socket句柄,用戶可自行執行收包及處理函數
一個簡單示例如下:
testplugin.h:
#include “plugin.h”
class TestPlugin: public IPlugin{
public:
TestPlugin():IPlugin(“testplugin”){
printf(“create TestPlugin\n”);
}
void Process( void *);
};
testplugin.cpp:
#include “testplugin.h”
#include “mysocket.h”
#include
using namespace std;
extern “C”
TestPlugin* create_testplugin()
{
return new TestPlugin();
}
void TestPlugin::Process(void * p){
int sock = (int)p;
cout << ” handle epool event , socket= ” << sock << endl;
SocketLayer::close_delepoll(sock);
}
5 工具參數
receiver三種模式: xml模式(A),邏輯xml模式(B),so模式(C),參數含義如下:
原文轉自:http://www.anti-gravitydesign.com