Sfoglia il codice sorgente

Z991239-632 #comment feature: 修改框架内部逻辑,支持TEST附带参数返回(通过 UserCode)以统计测试案例数量和失败案例数量

gifur 5 anni fa
parent
commit
ca01af8498

+ 1 - 1
CMakeLists.txt

@@ -60,7 +60,7 @@ set(RVC_COPYRIGHT "Copyright (C) ${BUILD_YEAR}")
 set(RVC_DESCRIPTION "${BUILD_YEAR}.${BUILD_MONTH}")
 
 #Set the project version
-set(RAW_VERSION_STRING "1.0.1-dev1")
+set(RAW_VERSION_STRING "1.0.2-dev1")
 
 string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
 

+ 8 - 0
ChangeLog

@@ -1,9 +1,17 @@
 ## 更新记录
 
+
+
+## V1.0.2-dev1
+
+支持实体测试案例数量,测试通过率的统计打印
+
 * 2020年7月11日 进一步优化测试框架
   * 添加 --benchmark 启动参数,以分离出普通测试和基准(压力)测试模式
   * 将 OnExam 的默认返回改为 Error_NotImpl 以让实体必须实现测试类
   * IAsynWaitSp 添加 ErrorCodeEnum AsyncGetAnswer(DWORD& dwUserError) 接口
+  * **!!important!!** 修改框架内部逻辑,支持TEST附带参数返回(通过 UserCode)以统计测试案例数量和失败案例数量
+  * **risk**: mod_blackSheep 类库无法在 Linux 下加载,在加载时候堵住了,怀疑时敏感词???
 * 2020-07-09:框架支持单元测试,实体类测试 状态机类测试 普通类测试,方法测试
   * Debug 模式下激活测试框架相关的宏,定义在 SpTest.h 中
   * 每个实体工程下添加 test 文件夹,里面存放测试单元测试的 .cpp 类型的实现文件

+ 2 - 1
addin/cfg/shell.ini.in

@@ -117,13 +117,14 @@ Number=4
 4=CenterSetting
 
 [Test]
-Number=7
+Number=6
 1=TestDeamon TestMode=ON Level=3 Entity=BlackSheep -D
 2=TestSubscribe
 3=SampleEntity
 4=TestLogSender
 5=TestNormalEntity
 6=TestPrivilegeEntity
+;illegal name
 7=BlackSheep
 
 [SysEvent]

+ 7 - 4
spbase/SpAsyncWait.cpp

@@ -243,7 +243,7 @@ ErrorCodeEnum SpAsyncWait::AsyncGetAnswer(DWORD& dwUserError)
 
 void SpAsyncWait::ReceiveAnsPkt(int error, int end, iobuffer_t **ans_pkt, bool bReadUserCode)
 {
-	Dbg("==> %s: error:%d, end:%d", __FUNCTION__, error, end);
+	//Dbg("==> %s: error:%d, end:%d", __FUNCTION__, error, end);
 	pending_pkt *p = new pending_pkt();
 	ZeroMemory(p, sizeof(pending_pkt));
 
@@ -262,10 +262,12 @@ void SpAsyncWait::ReceiveAnsPkt(int error, int end, iobuffer_t **ans_pkt, bool b
 			iobuffer_read(p->pkt, IOBUF_T_I4, &p->dwSysError, 0);			// sys error
 
 			if (bReadUserCode)
+			{
 				iobuffer_read(p->pkt, IOBUF_T_I4, &p->dwUserError, 0);		// user error
+			}
 		}
 	}
-	Dbg("dwSysError: %d", p->dwSysError);
+	//Dbg("dwSysError: %d, dwUserCode: %d", p->dwSysError, p->dwUserError);
 	if (end || error) 
 	{
 		m_bEnd = TRUE;
@@ -398,7 +400,8 @@ void SpAsyncWait::__threadpool_on_callback(threadpool_t *threadpool, void *arg,
 // SpAsyncWaitRPC
 // 
 
-SpAsyncWaitRPC::SpAsyncWaitRPC( SpEntity *pEntity, iobuffer_t **req_pkt, int call_type ) : SpAsyncWait(pEntity), m_req_pkt(*req_pkt), m_call_type(call_type), m_rpc(NULL)
+SpAsyncWaitRPC::SpAsyncWaitRPC( SpEntity *pEntity, iobuffer_t **req_pkt, int call_type, bool fetch_user)
+	: SpAsyncWait(pEntity), m_req_pkt(*req_pkt), m_call_type(call_type), m_rpc(NULL),m_user(fetch_user)
 {
 	//Dbg("SpAsyncWaitRPC()");
 	//LOG_FUNCTION();
@@ -472,7 +475,7 @@ void SpAsyncWaitRPC::__on_ans( sp_rpc_client_t *client, int error, iobuffer_t **
 
 void SpAsyncWaitRPC::on_ans( int error, iobuffer_t **ans_pkt )
 {
-	ReceiveAnsPkt(error, 1, ans_pkt);
+	ReceiveAnsPkt(error, 1, ans_pkt, m_user);
 	DecrementRef();							// xkm@20150115
 }
 

+ 2 - 1
spbase/SpAsyncWait.h

@@ -110,7 +110,7 @@ protected:
 class SpAsyncWaitRPC : public SpAsyncWait
 {
 public:
-	SpAsyncWaitRPC(SpEntity *pEntity, iobuffer_t **req_pkt, int call_type);
+	SpAsyncWaitRPC(SpEntity *pEntity, iobuffer_t **req_pkt, int call_type, bool fetch_user = false);
 	virtual ~SpAsyncWaitRPC();
 
 	virtual ErrorCodeEnum Begin(const void *arg = NULL);
@@ -121,6 +121,7 @@ public:
 
 private:
 	int m_call_type;
+	bool m_user;
 	iobuffer_t *m_req_pkt;
 	sp_rpc_client_t *m_rpc;
 };

+ 2 - 1
spbase/SpBase.cpp

@@ -265,6 +265,7 @@ static HMODULE LoadModuleLibrary(sp_mod_t *mod)
 	sp_env_t *env = sp_get_env();
 	char tmp[MAX_PATH];
 	sp_dir_get_path(env->dir, SP_DIR_MODULE_BIN, mod->cfg->name, tmp, sizeof(tmp));
+	Dbg("load module library: %s", tmp);
 	return LoadLibraryA(tmp);
 }
 
@@ -368,7 +369,7 @@ extern "C" SPBASE_API int __stdcall SpRun(const char *mod_name, int epid, int ra
 		return Error_NotExist;
 	}
 	sp_dbg_info("find module %s id %d ok!", mod->cfg->name, mod->cfg->idx);
-	sp_dbg_info("module %s file version: %d.%d.%d.%d", mod->cfg->name,
+	sp_dbg_info("module %s static file version: %d.%d.%d.%d", mod->cfg->name,
 		mod->cfg->version.major,
 		mod->cfg->version.minor,
 		mod->cfg->version.revision,

+ 3 - 2
spbase/SpEntity.cpp

@@ -2043,9 +2043,10 @@ void SpEntity::FinishContinue(ErrorCodeEnum Error)
 	}
 }
 
-void SpEntity::FinishSelfTest(ErrorCodeEnum Error)
+void SpEntity::FinishSelfTest(ErrorCodeEnum Error, DWORD dwResult)
 {
-	sp_mod_entity_stub_finish_test(m_stub, Error);
+	//sp_mod_entity_stub_finish_test(m_stub, Error);
+	sp_mod_entity_stub_finish_exam(m_stub, Error, dwResult);
 }
 
 

+ 1 - 1
spbase/SpEntity.h

@@ -47,7 +47,7 @@ public:
 	void FinishClose(ErrorCodeEnum Error);
 	void FinishPause(ErrorCodeEnum Error);
 	void FinishContinue(ErrorCodeEnum Error);
-	void FinishSelfTest(ErrorCodeEnum Error);
+	void FinishSelfTest(ErrorCodeEnum Error, DWORD dwResult);
 
 	//
 	// IEntityFunction

+ 3 - 2
spbase/SpEntityPrivilege.cpp

@@ -58,6 +58,7 @@ static ErrorCodeEnum ControlEntity(
 
 	iobuffer_t *req_pkt = iobuffer_create(-1, -1);
 	int v 	= ent->cfg->idx;
+	bool fetch_user_code = false;
 	iobuffer_write(req_pkt, IOBUF_T_I4, &v, 0);
 	if (call_type == SHELL_CMD_REQ_ENTITY_START)
 		iobuffer_write(req_pkt, IOBUF_T_STR, cmd_line, -1);
@@ -67,11 +68,11 @@ static ErrorCodeEnum ControlEntity(
 			iobuffer_destroy(req_pkt);
 			return Error_NoPrivilege;
 		}
+		fetch_user_code = true;
 		iobuffer_write(req_pkt, IOBUF_T_I4, &param1, 0);
 	}
-		
 
-	SpAsyncWaitRPC *pAsyncWait	= new SpAsyncWaitRPC(pEntity, &req_pkt, call_type);
+	SpAsyncWaitRPC *pAsyncWait	= new SpAsyncWaitRPC(pEntity, &req_pkt, call_type, fetch_user_code);
 	ErrorCodeEnum Error = pAsyncWait->Begin();
 
 	if (Error == Error_Succeed) {

+ 1 - 1
spbase/SpTransactionContext.cpp

@@ -171,7 +171,7 @@ ErrorCodeEnum SpMUITransactionContext::SendAnswer( ErrorCodeEnum eErrorCode, DWO
 	} else if (m_op == OP_PAUSE) {
 		m_pEntity->FinishPause(eErrorCode);
 	} else if (m_op == OP_SELFTEST) {
-		m_pEntity->FinishSelfTest(eErrorCode);
+		m_pEntity->FinishSelfTest(eErrorCode, dwUserError);
 	} else if (m_op == OP_CONTINUE) {
 		m_pEntity->FinishContinue(eErrorCode);
 	} else if (m_op == OP_CLOSE) {

+ 30 - 6
spbase/sp_mod.c

@@ -61,6 +61,8 @@
 #define MOD_CMD_SWITCH_RUNNING_MODE		     23
 #define MOD_CMD_USER_STATE_EVENT                        24
 
+#define MOD_CMD_ENT_RESULT_EX	                             25
+
 #define MOD_CMD_NOTIFY_REDIRECT_SUBSCRIBE	     31 // shell -> entity
 #define MOD_CMD_REPORT_REDIRECT_SUBSCRIBE	     32 // entity -> shell
 
@@ -385,6 +387,16 @@ int sp_mod_entity_stub_finish_test(sp_mod_entity_stub_t *stub, int result)
 	return 0;
 }
 
+int sp_mod_entity_stub_finish_exam(sp_mod_entity_stub_t* stub, int result,  int statistic)
+{
+	iobuffer_t* pkt = iobuffer_create(-1, -1);
+	iobuffer_write(pkt, IOBUF_T_I4, &statistic, 0);
+	sp_svc_post(stub->svc, SP_SHELL_MOD_ID, SP_SHELL_SVC_ID, SP_PKT_MOD | MOD_CMD_ENT_RESULT_EX, result, &pkt);
+	if (pkt)
+		iobuffer_dec_ref(pkt);
+	return 0;
+}
+
 int sp_mod_entity_stub_finish_redirect_subscribe(sp_mod_entity_stub_t *stub, sp_uid_t *uid, int suggest_entity_id)
 {
 	iobuffer_t *pkt = iobuffer_create(-1, -1);
@@ -1240,7 +1252,17 @@ static int mgr_on_pkt(sp_svc_t *svc,int epid, int svc_id, int pkt_type, int pkt_
 				ent->wait_result = result;
 				SetEvent(ent->evt_wait_handle);
 			}
-		} else if (cmd_type == MOD_CMD_MOD_RESULT) {
+		} else if (cmd_type == MOD_CMD_ENT_RESULT_EX) {
+			sp_entity_t* ent = sp_mod_mgr_find_entity_by_idx(mgr, svc_id);
+			if (ent->mod->doing) {
+				unsigned int statistic = 0;
+				iobuffer_read(*p_pkt, IOBUF_T_I4, &statistic, NULL);
+				ent->wait_result = result;
+				ent->result_param1 = statistic;
+				SetEvent(ent->evt_wait_handle);
+			}
+		}
+		else if (cmd_type == MOD_CMD_MOD_RESULT) {
 			mod = sp_mod_mgr_find_module_by_idx(mgr, epid);
 			if (mod->doing) {
 				mod->wait_result = result;
@@ -1362,6 +1384,7 @@ int sp_mod_mgr_add_entity(sp_mod_mgr_t *mgr, sp_cfg_shell_entity_t *cfg_ent)
 			ent->state = EntityState_NoStart;
 			ent->mod = mod;
 			ent->wait_result = 0;
+			ent->result_param1 = ent->result_param2 = 0;
 			ent->first_start_time = 0;
 			ent->last_start_time = 0;
 			ent->state_start_time = 0;
@@ -2237,7 +2260,7 @@ static int continue_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_enti
 	return rc;
 }
 
-static int test_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int test_type, int trigger_entity_id)
+static int test_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int test_type, int trigger_entity_id, int* result)
 {
 	int rc = 0;
 	sp_mod_t *mod;
@@ -2285,6 +2308,7 @@ static int test_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int test_type, int t
 		} else if (dwRet == WAIT_OBJECT_0+1) {
 			sp_dbg_debug("wait for test entity %s result ok, result = %d!", ent->cfg->name, ent->wait_result);
 			rc = ent->wait_result;
+			if (result) *result = ent->result_param1;
 		} else {
 			sp_dbg_debug("wait for test entity %s timeout!", ent->cfg->name);
 			rc = Error_TimeOut;
@@ -2339,13 +2363,13 @@ int sp_mod_mgr_continue_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_ent
 	return sp_mod_mgr_continue_entity2(mgr, ent, trigger_entity_id);
 }
 
-int sp_mod_mgr_test_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int test_type)
+int sp_mod_mgr_test_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int test_type, int* cause)
 {
 	sp_entity_t *ent;
 	ent = sp_mod_mgr_find_entity_by_idx(mgr, entity_id);
 	if (!ent) 
 		return Error_NotExist;
-	return sp_mod_mgr_test_entity2(mgr, ent, trigger_entity_id, test_type);
+	return sp_mod_mgr_test_entity2(mgr, ent, trigger_entity_id, test_type, cause);
 }
 
 int sp_mod_mgr_lost_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id)
@@ -2505,7 +2529,7 @@ int sp_mod_mgr_continue_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger
 	return rc;
 }
 
-int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_entity_id, int test_type)
+int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_entity_id, int test_type, int* result)
 {
 	int rc;
 
@@ -2513,7 +2537,7 @@ int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_ent
 		return Error_NotExist;
 
 	if (try_lock_doing(mgr, ent->mod)) {
-		rc = test_entity(mgr, ent, test_type, trigger_entity_id);
+		rc = test_entity(mgr, ent, test_type, trigger_entity_id, result);
 		unlock_doing(mgr, ent->mod);
 	} else {
 		sp_dbg_warn("mod %s is busy doing now! line: %d", ent->mod->cfg->name, __LINE__);

+ 5 - 2
spbase/sp_mod.h

@@ -58,6 +58,7 @@ int sp_mod_entity_stub_finish_start(sp_mod_entity_stub_t *stub, int result);
 int sp_mod_entity_stub_finish_stop(sp_mod_entity_stub_t *stub, int result);
 int sp_mod_entity_stub_finish_pause(sp_mod_entity_stub_t *stub, int result);
 int sp_mod_entity_stub_finish_continue(sp_mod_entity_stub_t *stub, int result);
+int sp_mod_entity_stub_finish_exam(sp_mod_entity_stub_t* stub, int result, int statistic);
 int sp_mod_entity_stub_finish_test(sp_mod_entity_stub_t *stub, int result);
 int sp_mod_entity_stub_finish_redirect_subscribe(sp_mod_entity_stub_t *stub, sp_uid_t *uid, int suggest_entity_id);
 int sp_mod_entity_stub_report_user_state_change(sp_mod_entity_stub_t *stub, int last_state, int curr_state);
@@ -138,6 +139,8 @@ struct sp_entity_t
 	sp_cfg_shell_entity_t *cfg;
 	int instance_id;
 	int wait_result;
+	param_size_t result_param1;
+	param_size_t result_param2;
 	HANDLE evt_wait_handle; //manually
 	sp_mod_t *mod;
 	int user_state;
@@ -179,7 +182,7 @@ SPBASE_API int sp_mod_mgr_start_entity(sp_mod_mgr_t *mgr, int entity_id, const c
 SPBASE_API int sp_mod_mgr_stop_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int cause_code);
 SPBASE_API int sp_mod_mgr_pause_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id);
 SPBASE_API int sp_mod_mgr_continue_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id);
-SPBASE_API int sp_mod_mgr_test_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int test_type);
+SPBASE_API int sp_mod_mgr_test_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int test_type, int* cause);
 SPBASE_API int sp_mod_mgr_lost_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id);
 
 SPBASE_API int sp_mod_mgr_terminate_all_entity(sp_mod_mgr_t* mgr, int trigger_entity_id);
@@ -190,7 +193,7 @@ int sp_mod_mgr_start_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, const char
 int sp_mod_mgr_stop_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id, int cause_code);
 int sp_mod_mgr_pause_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id);
 int sp_mod_mgr_continue_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id);
-int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id, int test_type);
+int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id, int test_type, int* result);
 
 int sp_mod_mgr_notify_redirect_subscribe(sp_mod_mgr_t *mgr, sp_entity_t *entity, sp_uid_t *uid, int from_entity_id, const char *param);
 

+ 4 - 1
spshell/svc.cpp

@@ -318,14 +318,17 @@ iobuffer_t *on_entity_test(sp_rpc_server_t *server, int epid, int svc_id, int rp
 	int entity_id;
 	int test_type;
 	int result;
+	int statistic;
 	iobuffer_t *ans_pkt = NULL;
 	iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
 	iobuffer_read(*req_pkt, IOBUF_T_I4, &test_type, NULL);
 
+	statistic = 0;
 	//sp_dbg_debug("handle test entity req: %d", entity_id);
-	result = sp_mod_mgr_test_entity(env->mod_mgr, entity_id, svc_id, test_type);
+	result = sp_mod_mgr_test_entity(env->mod_mgr, entity_id, svc_id, test_type, &statistic);
 	ans_pkt = iobuffer_create(-1, -1);
 	iobuffer_write(ans_pkt, IOBUF_T_I4, &result, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &statistic, 0);
 	return ans_pkt;
 }
 

+ 1 - 1
test/module/mod_validityVertifier/mod_validityVertifier.cpp

@@ -171,7 +171,7 @@ public:
 			{
 				if (IS_SUCCEED(StartTestEntity())) 
 				{
-					//TestAllRegistedEntity();
+
 				}
 			}
 		}