123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999 |
- #include "StdAfx.h"
- #include "SATExecutor.h"
- #include "ScriptExecutor.h"
- #include "CharEncoding.h"
- CSATExecutor::CSATExecutor(void)
- {
- m_bLogin = FALSE;
- m_hEventHearbeat = NULL;
- m_hThreadHearbeat = NULL;
- m_hEventExcuteScript = NULL;
- m_hThreadExcuteScript = NULL;
- }
- CSATExecutor::~CSATExecutor(void)
- {
- }
- bool CSATExecutor::IsTaskExist(SATHTTP::STTask &task)
- {
- bool found = false;
- std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
- for ( ; it != m_vtTask.end(); it++ ) {
- // 不要使用nTaskId,这个值没啥用;
- if ( it->Id == task.Id ) {
- found = true;
- break;
- }
- }
- return found;
- }
- SATHTTP::STTask* CSATExecutor::IsThereATaskInProcess()
- {
- std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
- for ( ; it != m_vtTask.end(); it++ ) {
- if ( it->_nExecutionState == 1 ) {
- return &(*it);
- }
- }
- return NULL;
- }
- SATHTTP::STTask* CSATExecutor::GetFreeTask()
- {
- std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
- for ( ; it != m_vtTask.end(); it++ ) {
- if ( it->_nExecutionState == 0 ) {
- return &(*it);
- }
- }
- return NULL;
- }
- SATHTTP::STCase* CSATExecutor::IsCaseScriptProcess(std::vector<SATHTTP::STCase> &vtCases)
- {
- std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
- for ( ; it != vtCases.end(); it++) {
- if ( it->_nExecutionState == 1 ) {
- return &(*it);
- }
- }
- return NULL;
- }
- SATHTTP::STCase* CSATExecutor::GetFreeCaseScript(std::vector<SATHTTP::STCase> &vtCases)
- {
- std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
- for ( ; it != vtCases.end(); it++) {
- if ( it->_nExecutionState == 0 ) {
- return &(*it);
- }
- }
- return NULL;
- }
- SATHTTP::STCase* CSATExecutor::ExecuteFreeCaseScript(SATHTTP::STTask* pTask)
- {
- SATHTTP::STCase* pCase = GetFreeCaseScript(pTask->Job.vtCases);
- if (pCase) {
- if ( !pCase->_pExcutor ) {
- CScriptExecutor *pExcutor = new CScriptExecutor();
- if ( pExcutor ) {
- pCase->_pExcutor = pExcutor;
- // 用例的日志文件路径;
- pCase->_strCaseLog = pCase->_strFileDir + "\\" + pCase->_strFileName + ".txt";
- if ( pExcutor->InitScript(pCase->_strScriptPath, pCase->_strCaseLog, "", SUBPROCESS) ) {
- pExcutor->StartScript();
- // 标记用例执行中;
- pCase->_nExecutionState = 1;
- }
- else { // 初始化失败;
- pCase->_nExecutionState = 4;
- }
- // 标记任务为执行中;
- pTask->_nExecutionState = 1;
- // 记录开始时间;
- pCase->_ulStartTickCount = GetTickCount64();
- pCase->_strStartTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
- }
- }
- else {
- //CScriptExecutor *pExcutor = (CScriptExecutor *)pCase->_pExcutor;
- }
- }
- return pCase;
- }
- void CSATExecutor::AddDevices(SATDEV::STDevice &stDevice)
- {
-
- }
- bool CSATExecutor::Login(std::string user, std::string password, std::string actuator, bool bLogin /*= true*/)
- {
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!executeLogin.action");
- // 填充数据;
- m_stLoginReq.strUserName = user;
- m_stLoginReq.strPassword = password;
- m_stLoginReq.strStatus = bLogin ? "0" : "1"; // 0表示登录;
- m_stLoginReq.strDeleteStatus = "";
- m_stLoginReq.strIP = GLOBAL::g_szIPAddress;
- m_stLoginReq.strStorage = "";
- if ( bLogin ) {
- m_stLoginReq.strDisconnectTime = "";
- m_stLoginReq.strConnectTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
- } else {
- m_stLoginReq.strConnectTime = "";
- m_stLoginReq.strDisconnectTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
- }
- // 执行器名称;
- m_stLoginReq.strExecuteName = m_strActuatorName = actuator;
- // 执行器PC物理地址;
- m_stLoginReq.strMAC = GLOBAL::g_strMacs;
- m_stLoginReq.strCPU = "";
- if ( ::Login(url, m_stLoginReq, m_stLoginResp) ) {
- #ifdef _DEBUG
- OutputDebugString("登录成功\n");
- #endif
- GLOBAL::WriteTextLog("登录成功");
- m_bLogin = TRUE;
- return true;
- }
- #ifdef _DEBUG
- OutputDebugString("登录失败\n");
- #endif
- GLOBAL::WriteTextLog("登录失败");
- return false;
- }
- bool CSATExecutor::Logout(std::string user, std::string password)
- {
- return Login(user, password, false);
- }
- bool CSATExecutor::UpdateDevice()
- {
- SATHTTP::STDevice stDevice;
- stDevice.strStatus = "0"; // 0表示设备空闲; 1表示设备忙碌
- stDevice.strDeviceSerial = "192.168.1.119:5555";
- stDevice.strHardwareVersion = "SATHardwareVersion";
- stDevice.strManu = "SATManu";
- stDevice.strDeviceMac = "";
- stDevice.strLastJobStartTime = "";
- stDevice.strLastTimeBreak = "";
- stDevice.strComments = "";
- stDevice.strCPU = "";
- stDevice.strSoftwareVersion = "0123456789";
- stDevice.strPhoneNumber = "";
- stDevice.strLastJobFinishTime = "";
- stDevice.strMemory = "";
- stDevice.strModel = "SATModel";
- stDevice.strLastJob = "";
- stDevice.strLastTimeConnected = "2019-12-16 10:16:01";
- stDevice.strElectric = "";
- SATHTTP::STUpdateDeviceReq stUpdateDeviceReq;
- SATHTTP::STUpdateDeviceResp stUpdateDeviceResp;
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!updateDeviceMessage.action");
-
- stUpdateDeviceReq.strStatus = "0";
- stUpdateDeviceReq.strUserName = m_stLoginReq.strUserName;
- stUpdateDeviceReq.strIP = "10.118.158.175";
- stUpdateDeviceReq.strStorage = "228092536KB";
- stUpdateDeviceReq.strRunnerName = "SAT-Admin";
- //stUpdateDeviceReq.strMAC = "40:16:7e:23:10:53";
- if ( GLOBAL::g_vtMac.size() )
- stUpdateDeviceReq.strMAC = GLOBAL::g_vtMac[0].szMacAddress; // 取第一个MAC地址;
- else
- stUpdateDeviceReq.strMAC = "";
- stUpdateDeviceReq.strReportType = "1";
- stUpdateDeviceReq.strStartTime = "2019-12-16 19:15:30";
- stUpdateDeviceReq.strMemory = "8938544KB";
- stUpdateDeviceReq.strEndTime = "";
- stUpdateDeviceReq.strCPU = "24.7%";
- stUpdateDeviceReq.devicelist.push_back(stDevice);
- m_vtDevice.push_back(stDevice);
- if ( !::UpdateDeviceMessage(url, stUpdateDeviceReq, stUpdateDeviceResp) )
- {
- return false;
- }
-
- return true;
- }
- bool CSATExecutor::NotifyTaskStart(SATHTTP::STTask* pTask)
- {
- if ( !pTask )
- return false;
- SATHTTP::STNotifyJobStartReq stNotifyJobStartReq;
- SATHTTP::STNotifyJobStartResp stNotifyJobStartResp;
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!setResult.action");
- TCHAR szValue[36] = {0};
- _itoa_s(pTask->nDeviceId, szValue, 10);
- stNotifyJobStartReq.strDeviceId = szValue;
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stNotifyJobStartReq.strExecuteId = szValue;
- // _itoa_s(stTask.nInstanceId, szValue, 10); // 误导:应该使用id而不是nInstanceId
- _itoa_s(pTask->Id, szValue, 10);
- stNotifyJobStartReq.strInstanceId = szValue;
- //_itoa_s(pTask->nTaskId, szValue, 10);
- stNotifyJobStartReq.strTaskId = pTask->Job.strTaskId;
- stNotifyJobStartReq.strSignalImageUrl = "D:\\\\SAT\\\\Runner\\\\btc_runner_se\\\\runner\\\\output\\\\";//ODF_NPI_RT2841\\\\20191216101613370\\\\192.168.1.119_5555";
- stNotifyJobStartReq.strSignalImageUrl.append(pTask->strTaskName+"\\\\");
- stNotifyJobStartReq.strSignalImageUrl.append(pTask->Job.strUniqueId+"\\\\");
- stNotifyJobStartReq.strSignalImageUrl.append(pTask->Job.strDeviceId);
- if ( SetResult(url, stNotifyJobStartReq, stNotifyJobStartResp) )
- {
- // 此处可能需要设置设备为忙碌状态;
- // SetDeviceStatus(BUSY);
- return true;
- }
- #ifdef _DEBUG
- OutputDebugString("通知SAT失败\n");
- #endif
- return false;
- }
- bool CSATExecutor::UploadCaseImg(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase, std::string img)
- {
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!saveResultImg.action");
- SATHTTP::STSaveImgReq stSaveImgReq;
- SATHTTP::STSaveImgResp stSaveImgResp;
- stSaveImgReq.strCaseId = pCase->strId;
- stSaveImgReq.strCaseRepeat = "0";
- _itoa_s(pCase->_nCaseStep, szValue, 10);
- stSaveImgReq.strCaseStep = szValue;
- // 实例Id;
- _itoa_s(pTask->nDeviceId, szValue, 10);
- stSaveImgReq.strDeviceId = szValue;//pTask->Job.strDeviceId;
- // 就是Task中的ExecuteId
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stSaveImgReq.strExecuteId = szValue;
- // 实例Id;
- _itoa_s(pTask->nInstanceId, szValue, 10);
- stSaveImgReq.strInstanceId = szValue;
- stSaveImgReq.strJobRepeat = "0";
- // 注意避坑:roundnum必须赋值0或1;
- stSaveImgReq.strRoundNum = "0";
- stSaveImgReq.strTaskType = pTask->strTaskType;
- stSaveImgReq.strUploads = img;
- // 上传用例图片;
- if ( SaveResultImg(url, stSaveImgReq, stSaveImgResp) )
- {
- return true;
- }
- return false;
- }
- bool CSATExecutor::UploadCaseLog(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase)
- {
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!saveCaseOrTaskLog.action");
- SATHTTP::STSaveLogReq stSaveLogReq;
- SATHTTP::STSaveLogResp stSaveLogResp;
- stSaveLogReq.strCaseId = pCase->strId;
- // 执行ID;
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stSaveLogReq.strExecuteId = szValue;
- stSaveLogReq.strFileType = "caseLogFile";
- // 任务Id;
- //_itoa_s(pTask->nTaskId, szValue, 10);
- stSaveLogReq.strTaskId = pTask->Job.strTaskInstanceId;
- stSaveLogReq.strUserId = pTask->Job.strUserId;
- // 要上传的日志文件;
- stSaveLogReq.strUploads = pCase->_strCaseLog;
- if ( SaveCaseOrTaskLog(url, stSaveLogReq, stSaveLogResp) )
- {
- return true;
- }
- return false;
- }
- bool CSATExecutor::ReportCaseItemFinish(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase, STCaseItem &caseItem)
- {
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!setResultList.action");
- SATHTTP::STJobProcessReq stJobProcessReq;
- SATHTTP::STJobProcessResp stJobProcessResp;
- stJobProcessReq.strResultState = caseItem.result ? "1" : "0";
- stJobProcessReq.strCaseScene = "";
- // 索引;
- _itoa_s(pCase->_nCaseStep, szValue, 10);
- stJobProcessReq.strCaseStep = szValue;
- stJobProcessReq.strApkMD5 = "";
- stJobProcessReq.strCrashTime = "";
- // 就是Task中的ExecuteId
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stJobProcessReq.strRunnerId = szValue;
- stJobProcessReq.strCPUInfo = "0";
- stJobProcessReq.strRunnedActionNameList = "";
- stJobProcessReq.strArtificialResult = "";
- stJobProcessReq.strArtificialModify = "";
- stJobProcessReq.strRunnerName = "";
- stJobProcessReq.strTaskType = "FUNCTIONALITY";
- stJobProcessReq.strCaseRepeat = "0";
- stJobProcessReq.strApplicationGroup = "";
- // 实例Id;
- _itoa_s(pTask->Id, szValue, 10);
- stJobProcessReq.strInstanceId = szValue;
- stJobProcessReq.strCaseId = pCase->strId;
- // 进度;
- _itoa_s(100*(atoi(pCase->strIndex.c_str()))/pTask->Job.vtCases.size(), szValue, 10);
- stJobProcessReq.strProgress = szValue;
- // 需要将utf-8转gbk;
- stJobProcessReq.strReusltMessage = caseItem.name;//CharEncoding::UTF82ASCII(caseItem.name.c_str());
- stJobProcessReq.strJobRepeat = "0";
- stJobProcessReq.strScreenShot = "";
- stJobProcessReq.strStartTime = pCase->_strStartTime;
- stJobProcessReq.strCrashNumber = "";
- stJobProcessReq.strCaseName = pCase->strCaseName;
- //stJobProcessReq.strFailedReason = CharEncoding::UTF82ASCII(caseItem.remark.c_str());
- //stJobProcessReq.strFailedReason = (char*)CharEncoding::UTF82UNICODE(caseItem.remark.c_str());
- stJobProcessReq.strFailedReason = caseItem.remark;
- for (std::vector<std::string>::iterator it = caseItem.imgs.begin(); it != caseItem.imgs.end(); it++ )
- {
- int npos = it->find_last_of('/');
- if ( std::string::npos != npos )
- {
- stJobProcessReq.strImgName.append(it->substr(npos+1));
- stJobProcessReq.strImgName.append("&");
- }
- }
- if ( stJobProcessReq.strImgName.size() && stJobProcessReq.strImgName.at(stJobProcessReq.strImgName.size()-1) == '&')
- stJobProcessReq.strImgName.erase(stJobProcessReq.strImgName.size()-1);
- stJobProcessReq.strCaseIndex = pCase->strIndex;
- // 实例Id;
- _itoa_s(pTask->nDeviceId, szValue, 10);
- stJobProcessReq.strDeviceId = szValue;
- stJobProcessReq.strSceneIndex = "0";
- // 实例Id;
- //_itoa_s(pTask->nTaskId, szValue, 10);
- stJobProcessReq.strTaskId = pTask->Job.strTaskId;
- //stJobProcessReq.strAnalysis = CharEncoding::UTF82ASCII(caseItem.data.c_str());
- stJobProcessReq.strAnalysis = caseItem.data.c_str();
- // 设备名称:即DeviceSerial;
- stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
- // 固定为:TOTAL
- stJobProcessReq.strInfoType = "";
- // 如果是Android设备,需要通过adb获取;
- //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
- stJobProcessReq.strEndTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
- stJobProcessReq.strRoundNumber = "1";
- stJobProcessReq.strResultType = "4"; // reportActionFinish;
- stJobProcessReq.strOperationStep = "";
- if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
- {
- // 再上传图片;
- std::string img;
- for (std::vector<std::string>::iterator it = caseItem.imgs.begin(); it != caseItem.imgs.end(); it++ )
- {
- img = "D:/SAT/results/";
- img.append(it->substr(3));
- UploadCaseImg(pTask, pCase, img);
- }
- return true;
- }
- return false;
- }
- bool CSATExecutor::ReportCaseFinish(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase)
- {
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!setResultList.action");
- SATHTTP::STJobProcessReq stJobProcessReq;
- SATHTTP::STJobProcessResp stJobProcessResp;
- // 上报用例结果:0表示脚本成功执行, 1表示脚本出错或超时;
- if ( pCase->_nExecutionState == 2 )
- stJobProcessReq.strResultState = "0"; // 脚本未执行完成;
- else if ( pCase->_nExecutionState == 1 )
- stJobProcessReq.strResultState = "1"; // 脚本执行中,认为fail;
-
- stJobProcessReq.strCaseScene = "";
- // 索引;
- _itoa_s(pCase->_nCaseStep, szValue, 10);
- stJobProcessReq.strCaseStep = szValue;
- stJobProcessReq.strApkMD5 = "";
- stJobProcessReq.strCrashTime = "";
- // 就是Task中的ExecuteId
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stJobProcessReq.strRunnerId = szValue;
- stJobProcessReq.strCPUInfo = "0";
- stJobProcessReq.strRunnedActionNameList = "";
- stJobProcessReq.strArtificialResult = "";
- stJobProcessReq.strArtificialModify = "";
- stJobProcessReq.strRunnerName = "";
- stJobProcessReq.strTaskType = "FUNCTIONALITY";
- stJobProcessReq.strCaseRepeat = "";
- stJobProcessReq.strApplicationGroup = "";
- // 实例Id;注意避坑;
- _itoa_s(pTask->Id, szValue, 10);
- stJobProcessReq.strInstanceId = szValue;
- stJobProcessReq.strCaseId = pCase->strId;
- // 进度(###需要修改此处###);
- _itoa_s(100*(atoi(pCase->strIndex.c_str()))/pTask->Job.vtCases.size(), szValue, 10);
- stJobProcessReq.strProgress = szValue;
- // 需要将utf-8转gbk;
- stJobProcessReq.strReusltMessage = CharEncoding::ASCII2UTF8("测试用例结果:");
- stJobProcessReq.strJobRepeat = "";
- stJobProcessReq.strScreenShot = "";
- stJobProcessReq.strStartTime = pCase->_strStartTime;
- stJobProcessReq.strCrashNumber = "";
- stJobProcessReq.strCaseName = pCase->strCaseName;
- stJobProcessReq.strFailedReason = "";
- stJobProcessReq.strImgName = "";
- stJobProcessReq.strCaseIndex = pCase->strIndex;
- // 实例Id;
- _itoa_s(pTask->nDeviceId, szValue, 10);
- stJobProcessReq.strDeviceId = szValue;
- stJobProcessReq.strSceneIndex = "0";
- // 实例Id;
- //_itoa_s(pTask->nTaskId, szValue, 10);
- stJobProcessReq.strTaskId = pTask->Job.strTaskId;
- stJobProcessReq.strAnalysis = "";
- // 设备名称:即DeviceSerial;
- stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
- // 固定为:TOTAL
- stJobProcessReq.strInfoType = "TOTAL";
- // 如果是Android设备,需要通过adb获取;
- //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
- stJobProcessReq.strEndTime = pCase->_strEndTime;//CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
- stJobProcessReq.strRoundNumber = "1";
- stJobProcessReq.strResultType = "5"; // reportCaseFinish;
- stJobProcessReq.strOperationStep = "";
- if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
- {
- return true;
- }
- return false;
- }
- bool CSATExecutor::ReportCaseResult(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase)
- {
- // 获取xml文件内容;
- std::string xmlpath = "D:\\SAT\\results\\detail\\";
- xmlpath.append(pCase->_strFileName);
- xmlpath.append("_result.xml");
- std::vector<STCaseItem> vtCaseItem;
- GetCaseXMLResult(xmlpath, vtCaseItem);
- if ( vtCaseItem.size() == 0 )
- return false;
-
- int nIndex = 1;
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!setResultList.action");
- SATHTTP::STJobProcessReq stJobProcessReq;
- SATHTTP::STJobProcessResp stJobProcessResp;
- // 遍历所有用例测试项;
- std::vector<STCaseItem>::iterator it = vtCaseItem.begin();
- for (; it != vtCaseItem.end(); it++ )
- {
- // 上报测试项结果(包含相片);
- ReportCaseItemFinish(pTask, pCase, *it);
- }
- // 上报用例完成;
- ReportCaseFinish(pTask, pCase);
- // 上传用例日志;
- UploadCaseLog(pTask, pCase);
- return true;
- }
- bool CSATExecutor::UploadTaskLog(SATHTTP::STTask* pTask)
- {
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!saveCaseOrTaskLog.action");
- SATHTTP::STSaveLogReq stSaveLogReq;
- SATHTTP::STSaveLogResp stSaveLogResp;
- stSaveLogReq.strCaseId = "";
- // 执行ID;
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stSaveLogReq.strExecuteId = szValue;
- stSaveLogReq.strFileType = "taskLogFile";
- // 任务Id;
- //_itoa_s(pTask->nTaskId, szValue, 10);
- stSaveLogReq.strTaskId = pTask->Job.strTaskInstanceId;
- stSaveLogReq.strUserId = pTask->Job.strUserId;
- // 要上传的日志文件;
- stSaveLogReq.strUploads = "D:\\sat\\log.txt";//pTask->_strTaskLog;
- if ( SaveCaseOrTaskLog(url, stSaveLogReq, stSaveLogResp) )
- {
- return true;
- }
- return false;
- }
- bool CSATExecutor::ReportTaskStart(SATHTTP::STTask* pTask)
- {
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!setResultList.action");
- SATHTTP::STJobProcessReq stJobProcessReq;
- SATHTTP::STJobProcessResp stJobProcessResp;
- // 需要处理###
- stJobProcessReq.strResultState = ""; // 脚本执行中,认为fail;
- stJobProcessReq.strCaseScene = "";
- // 索引;
- stJobProcessReq.strCaseStep = "0";
- stJobProcessReq.strApkMD5 = "";
- stJobProcessReq.strCrashTime = "";
- // 就是Task中的ExecuteId
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stJobProcessReq.strRunnerId = szValue;
- stJobProcessReq.strCPUInfo = "0";
- stJobProcessReq.strRunnedActionNameList = "";
- stJobProcessReq.strArtificialResult = "";
- stJobProcessReq.strArtificialModify = "";
- stJobProcessReq.strRunnerName = "";
- stJobProcessReq.strTaskType = "FUNCTIONALITY";
- stJobProcessReq.strCaseRepeat = "";
- stJobProcessReq.strApplicationGroup = "";
- // 实例Id;注意避坑;
- _itoa_s(pTask->Id, szValue, 10);
- stJobProcessReq.strInstanceId = szValue;
- stJobProcessReq.strCaseId = "";
- // 进度(###需要修改此处###);
- stJobProcessReq.strProgress = "0";
- // 需要将utf-8转gbk;
- stJobProcessReq.strReusltMessage = "任务开始";
- stJobProcessReq.strJobRepeat = "";
- stJobProcessReq.strScreenShot = "";
- stJobProcessReq.strStartTime = pTask->strStartTime;
- stJobProcessReq.strCrashNumber = "";
- stJobProcessReq.strCaseName = "";
- stJobProcessReq.strFailedReason = "";
- stJobProcessReq.strImgName = "";
- stJobProcessReq.strCaseIndex = "";
- // 实例Id;
- _itoa_s(pTask->nDeviceId, szValue, 10);
- stJobProcessReq.strDeviceId = szValue;
- stJobProcessReq.strSceneIndex = "";
- // 实例Id;
- //_itoa_s(pTask->nTaskId, szValue, 10);
- stJobProcessReq.strTaskId = pTask->Job.strTaskId;
- stJobProcessReq.strAnalysis = "";
- // 设备名称:即DeviceSerial;
- stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
- // 固定为:TOTAL
- stJobProcessReq.strInfoType = "TOTAL";
- // 如果是Android设备,需要通过adb获取;
- //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
- stJobProcessReq.strEndTime = "";// CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
- stJobProcessReq.strRoundNumber = "1";
- stJobProcessReq.strResultType = "0"; // reportJobStart;
- stJobProcessReq.strOperationStep = "";
- if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
- {
- return true;
- }
- return false;
- }
- bool CSATExecutor::ReportTaskFinish(SATHTTP::STTask* pTask)
- {
- TCHAR szValue[MAX_PATH] = {0};
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!setResultList.action");
- SATHTTP::STJobProcessReq stJobProcessReq;
- SATHTTP::STJobProcessResp stJobProcessResp;
- // 需要处理###
- stJobProcessReq.strResultState = "0"; // 脚本执行中,认为fail;
- stJobProcessReq.strCaseScene = "";
- // 索引;
- stJobProcessReq.strCaseStep = "0";
- stJobProcessReq.strApkMD5 = "";
- stJobProcessReq.strCrashTime = "";
- // 就是Task中的ExecuteId
- _itoa_s(pTask->nExecuteId, szValue, 10);
- stJobProcessReq.strRunnerId = szValue;
- stJobProcessReq.strCPUInfo = "0";
- stJobProcessReq.strRunnedActionNameList = "";
- stJobProcessReq.strArtificialResult = "";
- stJobProcessReq.strArtificialModify = "";
- stJobProcessReq.strRunnerName = "";
- stJobProcessReq.strTaskType = "FUNCTIONALITY";
- stJobProcessReq.strCaseRepeat = "0";
- stJobProcessReq.strApplicationGroup = "";
- // 实例Id;注意避坑;
- _itoa_s(pTask->Id, szValue, 10);
- stJobProcessReq.strInstanceId = szValue;
- stJobProcessReq.strCaseId = "";
- // 进度(###需要修改此处###);
- stJobProcessReq.strProgress = "100";
- // 需要将utf-8转gbk;
- stJobProcessReq.strReusltMessage = "任务结束";
- stJobProcessReq.strJobRepeat = "0";
- stJobProcessReq.strScreenShot = "";
- stJobProcessReq.strStartTime = pTask->strStartTime;
- stJobProcessReq.strCrashNumber = "";
- stJobProcessReq.strCaseName = "";
- stJobProcessReq.strFailedReason = "";
- stJobProcessReq.strImgName = "";
- stJobProcessReq.strCaseIndex = "";
- // 实例Id;
- _itoa_s(pTask->nDeviceId, szValue, 10);
- stJobProcessReq.strDeviceId = szValue;
- stJobProcessReq.strSceneIndex = "0";
- // 实例Id;
- //_itoa_s(pTask->nTaskId, szValue, 10);
- stJobProcessReq.strTaskId = pTask->Job.strTaskId;
- stJobProcessReq.strAnalysis = "";
- // 设备名称:即DeviceSerial;
- stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
- // 固定为:TOTAL
- stJobProcessReq.strInfoType = "";
- // 如果是Android设备,需要通过adb获取;
- //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
- stJobProcessReq.strEndTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
- stJobProcessReq.strRoundNumber = "1";
- stJobProcessReq.strResultType = "1"; // reportJobFinish;
- stJobProcessReq.strOperationStep = "";
- if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
- {
- return true;
- }
- return false;
- }
- bool CSATExecutor::GetCaseXMLResult(std::string xmlpath, std::vector<STCaseItem> &vtCaseItem)
- {
- // 解析xml;
- tinyxml2::XMLDocument doc;
- if (tinyxml2::XML_SUCCESS != doc.LoadFile(xmlpath.c_str()) ) {
- return false;
- }
- tinyxml2::XMLElement *pXmlRoot = NULL;
- if ((pXmlRoot = doc.RootElement()) == NULL)
- return false;
-
- if (_tcsicmp(pXmlRoot->Value(), "results") != 0)
- return false;
-
- tinyxml2::XMLElement *pXmlElent = pXmlRoot->FirstChildElement();
- while (pXmlElent) {
- if (_tcsicmp(pXmlElent->Value(), _T("item")) == 0) {
- STCaseItem cItem;
- tinyxml2::XMLElement *pItem = pXmlElent->FirstChildElement();
- while (pItem) {
- if (_tcsicmp(pItem->Value(), _T("name")) == 0)
- {
- cItem.name = pItem->GetText();
- }
- else if (_tcsicmp(pItem->Value(), _T("result")) == 0)
- {
- cItem.result = pItem->BoolText();
- }
- else if (_tcsicmp(pItem->Value(), _T("data")) == 0)
- {
- cItem.data = pItem->GetText();
- }
- else if (_tcsicmp(pItem->Value(), _T("log")) == 0)
- {
- cItem.log = pItem->GetText();
- }
- else if (_tcsicmp(pItem->Value(), _T("remark")) == 0)
- {
- cItem.remark = pItem->GetText();
- }
- else if (_tcsicmp(pItem->Value(), _T("screen")) == 0)
- {
- cItem.imgs.push_back(pItem->GetText());
- }
- pItem = pItem->NextSiblingElement();
- }
- // 压入容器;
- if ( cItem.name.size() )
- vtCaseItem.push_back(cItem);
- }
- pXmlElent = pXmlElent->NextSiblingElement();
- }
-
- return true;
- }
- void CSATExecutor::StartWork()
- {
- m_hEventHearbeat = CreateEvent(NULL, TRUE, FALSE, NULL);
- if ( m_hEventHearbeat == NULL ) {
- _tprintf_s(_T("创建事件失败\n"));
- return;
- }
- m_hEventExcuteScript = CreateEvent(NULL, TRUE, FALSE, NULL);
- if ( m_hEventExcuteScript == NULL ) {
- _tprintf_s(_T("创建事件失败2\n"));
- return;
- }
- m_hThreadHearbeat = CreateThread(NULL, 0, HearbeatThread, this, 0, NULL);
- if ( m_hThreadHearbeat == NULL) {
- SetEvent(m_hEventHearbeat);
- SetEvent(m_hEventExcuteScript);
- CloseHandle(m_hEventHearbeat);
- CloseHandle(m_hEventExcuteScript);
- m_hEventHearbeat = NULL;
- m_hEventExcuteScript = NULL;
- _tprintf_s(_T("创建线程失败\n"));
- return;
- }
- m_hThreadExcuteScript = CreateThread(NULL, 0, ExecuteScriptThread, this, 0, NULL);
- if ( m_hThreadExcuteScript == NULL ) {
- SetEvent(m_hEventHearbeat);
- SetEvent(m_hEventExcuteScript);
- CloseHandle(m_hEventHearbeat);
- CloseHandle(m_hEventExcuteScript);
- m_hEventHearbeat = NULL;
- m_hEventExcuteScript = NULL;
- WaitForSingleObject(m_hThreadHearbeat,INFINITE);
- if (m_hThreadHearbeat)
- CloseHandle(m_hThreadHearbeat);
- m_hThreadHearbeat = NULL;
- _tprintf_s(_T("创建线程失败2\n"));
- return;
- }
- }
- void CSATExecutor::EndofWork()
- {
- //////////////////////////////////////////////////////////////////////////
- // 设置事件有信号;
- if ( m_hEventHearbeat )
- SetEvent(m_hEventHearbeat);
- // 等待线程结束;
- if ( m_hThreadHearbeat ) {
- WaitForSingleObject(m_hThreadHearbeat, INFINITE);
- CloseHandle(m_hThreadHearbeat);
- m_hThreadHearbeat = NULL;
- }
- // 关闭事件句柄;
- if ( m_hEventHearbeat ) {
- CloseHandle(m_hEventHearbeat);
- m_hEventHearbeat = NULL;
- }
- //////////////////////////////////////////////////////////////////////////
- // 设置事件有信号;
- if ( m_hEventExcuteScript )
- SetEvent(m_hEventExcuteScript);
- // 等待线程结束;
- if ( m_hThreadExcuteScript ) {
- WaitForSingleObject(m_hThreadExcuteScript, INFINITE);
- CloseHandle(m_hThreadExcuteScript);
- m_hThreadExcuteScript = NULL;
- }
- // 关闭事件句柄;
- if ( m_hEventExcuteScript ) {
- CloseHandle(m_hEventExcuteScript);
- m_hEventExcuteScript = NULL;
- }
- }
- DWORD CSATExecutor::HearbeatThread(LPVOID lpVoid)
- {
- CSATExecutor *that = (CSATExecutor*)lpVoid;
- if ( !that ) return 0;
-
- do {
- // 没有登录成功,不查询;
- if ( !that->m_bLogin ) continue;
-
- SATHTTP::STHeartbeatReq stHeartbeatReq;
- SATHTTP::STHeartbeatResp stHeartbeatResp;
- std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
- url.append("/ajaxInteractiveManage!executeHeartbeat.action");
- stHeartbeatReq.strUserName = that->m_stLoginReq.strUserName;
- stHeartbeatReq.strRunnerMac = that->m_stLoginReq.strMAC;
- stHeartbeatReq.devicelist.assign(that->m_vtDevice.begin(), that->m_vtDevice.end());
- if ( Heartbeat(url, stHeartbeatReq, stHeartbeatResp) ) {
- #ifdef _DEBUG
- OutputDebugString("心跳查询成功\n");
- #endif
- GLOBAL::WriteTextLog("心跳查询成功");
- std::vector<SATHTTP::STTask>::iterator it = stHeartbeatResp.vtTask.begin();
- for ( ; it != stHeartbeatResp.vtTask.end(); it++ ) {
- if (!that->IsTaskExist(*it)) {
- // 将任务压入队列中;
- AutoThreadSection ats(&that->m_csTask);
- // 同时下载任务;
- std::string host = GLOBAL::g_stSATConfig.szCaseServer;
- std::string url = host + "/ajaxInteractiveManage!getCaseFileListUrl.action";
- std::vector<SATHTTP::STCase>::iterator _case = it->Job.vtCases.begin();
- for ( int i = 1; _case != it->Job.vtCases.end(); _case++) {
- _case->_nCaseStep = i++;
- SATHTTP::STScriptUrlResp stScriptUrlResp;
- if ( DownloadScript(url, _case->strId, GLOBAL::g_stSATConfig.szScriptDir, stScriptUrlResp) ) {
- _case->_strFileDir = stScriptUrlResp._strFileDir;
- _case->_strFileName = stScriptUrlResp._strFileName;
- _case->_strScriptPath = stScriptUrlResp._strScripFile;
- }
- #ifdef _DEBUG
- else
- {
- OutputDebugString("下载脚本失败\n");
- }
- #endif
- }
- that->m_vtTask.push_back(*it);
- // 通知SAT服务器,脚本开始执行;
- // 待开发:同时将任务存储到数据库中;
- /*
- db process
- */
- }
- }
- }
- } while ( WaitForSingleObject(that->m_hEventHearbeat, 5000) == WAIT_TIMEOUT );
- return 0;
- }
- DWORD CSATExecutor::ExecuteScriptThread(LPVOID lpVoid)
- {
- CSATExecutor *that = (CSATExecutor*)lpVoid;
- if ( !that ) return 0;
- do {
- // 是否有任务在执行;
- SATHTTP::STTask *pTask = that->IsThereATaskInProcess();
- if ( pTask ) {// 有任务在执行中;
- if ( pTask->_bConcurrent ) {// 并发;
- }
- else {// 串行;
- // 是否有脚本用例在执行;
- SATHTTP::STCase* pCase = that->IsCaseScriptProcess(pTask->Job.vtCases);
- if ( pCase ) {
- CScriptExecutor *pExcutor = (CScriptExecutor*)pCase->_pExcutor;
- if ( pExcutor ) {
- if ( pExcutor->IsScriptOver() ) {
- pCase->_nExecutionState = 2;
- // 上报服务器,完成脚本用例,并上传用例结果;
- that->ReportCaseResult(pTask, pCase);
- }
- else {
- // 判断是否超时;
- ULONGLONG ulCurTickCount = GetTickCount64();
- if ( ulCurTickCount - pExcutor->GetActiveTickCount() > 1800000) {
- // 超时中断;
- pCase->_nExecutionState = 3;
- // 上报用例结果;
- that->ReportCaseResult(pTask, pCase);
- }
- }
- }
- }
- else {
- // 没有在执行的用例,开始执行新的用例;
- pCase = that->ExecuteFreeCaseScript(pTask);
- if ( NULL == pCase ) {
- // 没有空闲的用例可执行,说明所有用例已执行完成;
- pTask->_nExecutionState = 2;
- // 上报任务完成;
- that->ReportTaskFinish(pTask);
- // 上报任务结果;
- that->UploadTaskLog(pTask);
- }
- }
- }
- }
- else {
- // 获取空闲的任务;
- pTask = that->GetFreeTask();
- if ( pTask ) {
- // 是否支持并发;
- if ( pTask->_bConcurrent ) {
- // 暂时全部一起并发;
- std::vector<SATHTTP::STCase>::iterator _case = pTask->Job.vtCases.begin();
- for ( ; _case != pTask->Job.vtCases.end(); _case++) {
- if (!_case->_pExcutor) {
- CScriptExecutor *pExcutor = new CScriptExecutor();
- if ( pExcutor ) {
- _case->_pExcutor = pExcutor;
- pExcutor->InitScript(_case->_strScriptPath, _case->_strFileDir + "\\" + _case->_strFileName + ".txt", "", SUBPROCESS);
- pExcutor->StartScript();
- // 标记用例执行中;
- _case->_nExecutionState = 1;
- }
- }
- }
- // 标记任务为执行中;
- pTask->_nExecutionState = 1;
- }
- else {
- // 是否有用例脚本在执行;
- SATHTTP::STCase* pCase = that->IsCaseScriptProcess(pTask->Job.vtCases);
- if ( !pCase ) {
- // 执行空闲用例脚本;
- that->ExecuteFreeCaseScript(pTask);
- }
- }
- // 通知SAT服务器,脚本开始执行;
- that->NotifyTaskStart(pTask);
- // 通知SAT服务器,脚本开始;
- that->ReportTaskStart(pTask);
- }
- }
- } while ( WaitForSingleObject(that->m_hEventExcuteScript, 10000) == WAIT_TIMEOUT );
- return 0;
- }
|