SATExecutor.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. #include "StdAfx.h"
  2. #include "SATExecutor.h"
  3. #include "ScriptExecutor.h"
  4. #include "CharEncoding.h"
  5. CSATExecutor::CSATExecutor(void)
  6. {
  7. m_bLogin = FALSE;
  8. m_hEventHearbeat = NULL;
  9. m_hThreadHearbeat = NULL;
  10. m_hEventExcuteScript = NULL;
  11. m_hThreadExcuteScript = NULL;
  12. }
  13. CSATExecutor::~CSATExecutor(void)
  14. {
  15. }
  16. bool CSATExecutor::IsTaskExist(SATHTTP::STTask &task)
  17. {
  18. bool found = false;
  19. std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
  20. for ( ; it != m_vtTask.end(); it++ ) {
  21. // 不要使用nTaskId,这个值没啥用;
  22. if ( it->Id == task.Id ) {
  23. found = true;
  24. break;
  25. }
  26. }
  27. return found;
  28. }
  29. SATHTTP::STTask* CSATExecutor::IsThereATaskInProcess()
  30. {
  31. std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
  32. for ( ; it != m_vtTask.end(); it++ ) {
  33. if ( it->_nExecutionState == 1 ) {
  34. return &(*it);
  35. }
  36. }
  37. return NULL;
  38. }
  39. SATHTTP::STTask* CSATExecutor::GetFreeTask()
  40. {
  41. std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
  42. for ( ; it != m_vtTask.end(); it++ ) {
  43. if ( it->_nExecutionState == 0 ) {
  44. return &(*it);
  45. }
  46. }
  47. return NULL;
  48. }
  49. SATHTTP::STCase* CSATExecutor::IsCaseScriptProcess(std::vector<SATHTTP::STCase> &vtCases)
  50. {
  51. std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
  52. for ( ; it != vtCases.end(); it++) {
  53. if ( it->_nExecutionState == 1 ) {
  54. return &(*it);
  55. }
  56. }
  57. return NULL;
  58. }
  59. SATHTTP::STCase* CSATExecutor::GetFreeCaseScript(std::vector<SATHTTP::STCase> &vtCases)
  60. {
  61. std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
  62. for ( ; it != vtCases.end(); it++) {
  63. if ( it->_nExecutionState == 0 ) {
  64. return &(*it);
  65. }
  66. }
  67. return NULL;
  68. }
  69. SATHTTP::STCase* CSATExecutor::ExecuteFreeCaseScript(SATHTTP::STTask* pTask)
  70. {
  71. SATHTTP::STCase* pCase = GetFreeCaseScript(pTask->Job.vtCases);
  72. if (pCase) {
  73. if ( !pCase->_pExcutor ) {
  74. CScriptExecutor *pExcutor = new CScriptExecutor();
  75. if ( pExcutor ) {
  76. pCase->_pExcutor = pExcutor;
  77. // 用例的日志文件路径;
  78. pCase->_strCaseLog = pCase->_strFileDir + "\\" + pCase->_strFileName + ".txt";
  79. if ( pExcutor->InitScript(pCase->_strScriptPath, pCase->_strCaseLog, "", SUBPROCESS) ) {
  80. pExcutor->StartScript();
  81. // 标记用例执行中;
  82. pCase->_nExecutionState = 1;
  83. }
  84. else { // 初始化失败;
  85. pCase->_nExecutionState = 4;
  86. }
  87. // 标记任务为执行中;
  88. pTask->_nExecutionState = 1;
  89. // 记录开始时间;
  90. pCase->_ulStartTickCount = GetTickCount64();
  91. pCase->_strStartTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
  92. }
  93. }
  94. else {
  95. //CScriptExecutor *pExcutor = (CScriptExecutor *)pCase->_pExcutor;
  96. }
  97. }
  98. return pCase;
  99. }
  100. void CSATExecutor::AddDevices(SATDEV::STDevice &stDevice)
  101. {
  102. }
  103. bool CSATExecutor::Login(std::string user, std::string password, std::string actuator, bool bLogin /*= true*/)
  104. {
  105. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  106. url.append("/ajaxInteractiveManage!executeLogin.action");
  107. // 填充数据;
  108. m_stLoginReq.strUserName = user;
  109. m_stLoginReq.strPassword = password;
  110. m_stLoginReq.strStatus = bLogin ? "0" : "1"; // 0表示登录;
  111. m_stLoginReq.strDeleteStatus = "";
  112. m_stLoginReq.strIP = GLOBAL::g_szIPAddress;
  113. m_stLoginReq.strStorage = "";
  114. if ( bLogin ) {
  115. m_stLoginReq.strDisconnectTime = "";
  116. m_stLoginReq.strConnectTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
  117. } else {
  118. m_stLoginReq.strConnectTime = "";
  119. m_stLoginReq.strDisconnectTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
  120. }
  121. // 执行器名称;
  122. m_stLoginReq.strExecuteName = m_strActuatorName = actuator;
  123. // 执行器PC物理地址;
  124. m_stLoginReq.strMAC = GLOBAL::g_strMacs;
  125. m_stLoginReq.strCPU = "";
  126. if ( ::Login(url, m_stLoginReq, m_stLoginResp) ) {
  127. #ifdef _DEBUG
  128. OutputDebugString("登录成功\n");
  129. #endif
  130. GLOBAL::WriteTextLog("登录成功");
  131. m_bLogin = TRUE;
  132. return true;
  133. }
  134. #ifdef _DEBUG
  135. OutputDebugString("登录失败\n");
  136. #endif
  137. GLOBAL::WriteTextLog("登录失败");
  138. return false;
  139. }
  140. bool CSATExecutor::Logout(std::string user, std::string password)
  141. {
  142. return Login(user, password, false);
  143. }
  144. bool CSATExecutor::UpdateDevice()
  145. {
  146. SATHTTP::STDevice stDevice;
  147. stDevice.strStatus = "0"; // 0表示设备空闲; 1表示设备忙碌
  148. stDevice.strDeviceSerial = "192.168.1.119:5555";
  149. stDevice.strHardwareVersion = "SATHardwareVersion";
  150. stDevice.strManu = "SATManu";
  151. stDevice.strDeviceMac = "";
  152. stDevice.strLastJobStartTime = "";
  153. stDevice.strLastTimeBreak = "";
  154. stDevice.strComments = "";
  155. stDevice.strCPU = "";
  156. stDevice.strSoftwareVersion = "0123456789";
  157. stDevice.strPhoneNumber = "";
  158. stDevice.strLastJobFinishTime = "";
  159. stDevice.strMemory = "";
  160. stDevice.strModel = "SATModel";
  161. stDevice.strLastJob = "";
  162. stDevice.strLastTimeConnected = "2019-12-16 10:16:01";
  163. stDevice.strElectric = "";
  164. SATHTTP::STUpdateDeviceReq stUpdateDeviceReq;
  165. SATHTTP::STUpdateDeviceResp stUpdateDeviceResp;
  166. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  167. url.append("/ajaxInteractiveManage!updateDeviceMessage.action");
  168. stUpdateDeviceReq.strStatus = "0";
  169. stUpdateDeviceReq.strUserName = m_stLoginReq.strUserName;
  170. stUpdateDeviceReq.strIP = "10.118.158.175";
  171. stUpdateDeviceReq.strStorage = "228092536KB";
  172. stUpdateDeviceReq.strRunnerName = "SAT-Admin";
  173. //stUpdateDeviceReq.strMAC = "40:16:7e:23:10:53";
  174. if ( GLOBAL::g_vtMac.size() )
  175. stUpdateDeviceReq.strMAC = GLOBAL::g_vtMac[0].szMacAddress; // 取第一个MAC地址;
  176. else
  177. stUpdateDeviceReq.strMAC = "";
  178. stUpdateDeviceReq.strReportType = "1";
  179. stUpdateDeviceReq.strStartTime = "2019-12-16 19:15:30";
  180. stUpdateDeviceReq.strMemory = "8938544KB";
  181. stUpdateDeviceReq.strEndTime = "";
  182. stUpdateDeviceReq.strCPU = "24.7%";
  183. stUpdateDeviceReq.devicelist.push_back(stDevice);
  184. m_vtDevice.push_back(stDevice);
  185. if ( !::UpdateDeviceMessage(url, stUpdateDeviceReq, stUpdateDeviceResp) )
  186. {
  187. return false;
  188. }
  189. return true;
  190. }
  191. bool CSATExecutor::NotifyTaskStart(SATHTTP::STTask* pTask)
  192. {
  193. if ( !pTask )
  194. return false;
  195. SATHTTP::STNotifyJobStartReq stNotifyJobStartReq;
  196. SATHTTP::STNotifyJobStartResp stNotifyJobStartResp;
  197. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  198. url.append("/ajaxInteractiveManage!setResult.action");
  199. TCHAR szValue[36] = {0};
  200. _itoa_s(pTask->nDeviceId, szValue, 10);
  201. stNotifyJobStartReq.strDeviceId = szValue;
  202. _itoa_s(pTask->nExecuteId, szValue, 10);
  203. stNotifyJobStartReq.strExecuteId = szValue;
  204. // _itoa_s(stTask.nInstanceId, szValue, 10); // 误导:应该使用id而不是nInstanceId
  205. _itoa_s(pTask->Id, szValue, 10);
  206. stNotifyJobStartReq.strInstanceId = szValue;
  207. //_itoa_s(pTask->nTaskId, szValue, 10);
  208. stNotifyJobStartReq.strTaskId = pTask->Job.strTaskId;
  209. stNotifyJobStartReq.strSignalImageUrl = "D:\\\\SAT\\\\Runner\\\\btc_runner_se\\\\runner\\\\output\\\\";//ODF_NPI_RT2841\\\\20191216101613370\\\\192.168.1.119_5555";
  210. stNotifyJobStartReq.strSignalImageUrl.append(pTask->strTaskName+"\\\\");
  211. stNotifyJobStartReq.strSignalImageUrl.append(pTask->Job.strUniqueId+"\\\\");
  212. stNotifyJobStartReq.strSignalImageUrl.append(pTask->Job.strDeviceId);
  213. if ( SetResult(url, stNotifyJobStartReq, stNotifyJobStartResp) )
  214. {
  215. // 此处可能需要设置设备为忙碌状态;
  216. // SetDeviceStatus(BUSY);
  217. return true;
  218. }
  219. #ifdef _DEBUG
  220. OutputDebugString("通知SAT失败\n");
  221. #endif
  222. return false;
  223. }
  224. bool CSATExecutor::UploadCaseImg(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase, std::string img)
  225. {
  226. TCHAR szValue[MAX_PATH] = {0};
  227. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  228. url.append("/ajaxInteractiveManage!saveResultImg.action");
  229. SATHTTP::STSaveImgReq stSaveImgReq;
  230. SATHTTP::STSaveImgResp stSaveImgResp;
  231. stSaveImgReq.strCaseId = pCase->strId;
  232. stSaveImgReq.strCaseRepeat = "0";
  233. _itoa_s(pCase->_nCaseStep, szValue, 10);
  234. stSaveImgReq.strCaseStep = szValue;
  235. // 实例Id;
  236. _itoa_s(pTask->nDeviceId, szValue, 10);
  237. stSaveImgReq.strDeviceId = szValue;//pTask->Job.strDeviceId;
  238. // 就是Task中的ExecuteId
  239. _itoa_s(pTask->nExecuteId, szValue, 10);
  240. stSaveImgReq.strExecuteId = szValue;
  241. // 实例Id;
  242. _itoa_s(pTask->nInstanceId, szValue, 10);
  243. stSaveImgReq.strInstanceId = szValue;
  244. stSaveImgReq.strJobRepeat = "0";
  245. // 注意避坑:roundnum必须赋值0或1;
  246. stSaveImgReq.strRoundNum = "0";
  247. stSaveImgReq.strTaskType = pTask->strTaskType;
  248. stSaveImgReq.strUploads = img;
  249. // 上传用例图片;
  250. if ( SaveResultImg(url, stSaveImgReq, stSaveImgResp) )
  251. {
  252. return true;
  253. }
  254. return false;
  255. }
  256. bool CSATExecutor::UploadCaseLog(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase)
  257. {
  258. TCHAR szValue[MAX_PATH] = {0};
  259. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  260. url.append("/ajaxInteractiveManage!saveCaseOrTaskLog.action");
  261. SATHTTP::STSaveLogReq stSaveLogReq;
  262. SATHTTP::STSaveLogResp stSaveLogResp;
  263. stSaveLogReq.strCaseId = pCase->strId;
  264. // 执行ID;
  265. _itoa_s(pTask->nExecuteId, szValue, 10);
  266. stSaveLogReq.strExecuteId = szValue;
  267. stSaveLogReq.strFileType = "caseLogFile";
  268. // 任务Id;
  269. //_itoa_s(pTask->nTaskId, szValue, 10);
  270. stSaveLogReq.strTaskId = pTask->Job.strTaskInstanceId;
  271. stSaveLogReq.strUserId = pTask->Job.strUserId;
  272. // 要上传的日志文件;
  273. stSaveLogReq.strUploads = pCase->_strCaseLog;
  274. if ( SaveCaseOrTaskLog(url, stSaveLogReq, stSaveLogResp) )
  275. {
  276. return true;
  277. }
  278. return false;
  279. }
  280. bool CSATExecutor::ReportCaseItemFinish(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase, STCaseItem &caseItem)
  281. {
  282. TCHAR szValue[MAX_PATH] = {0};
  283. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  284. url.append("/ajaxInteractiveManage!setResultList.action");
  285. SATHTTP::STJobProcessReq stJobProcessReq;
  286. SATHTTP::STJobProcessResp stJobProcessResp;
  287. stJobProcessReq.strResultState = caseItem.result ? "1" : "0";
  288. stJobProcessReq.strCaseScene = "";
  289. // 索引;
  290. _itoa_s(pCase->_nCaseStep, szValue, 10);
  291. stJobProcessReq.strCaseStep = szValue;
  292. stJobProcessReq.strApkMD5 = "";
  293. stJobProcessReq.strCrashTime = "";
  294. // 就是Task中的ExecuteId
  295. _itoa_s(pTask->nExecuteId, szValue, 10);
  296. stJobProcessReq.strRunnerId = szValue;
  297. stJobProcessReq.strCPUInfo = "0";
  298. stJobProcessReq.strRunnedActionNameList = "";
  299. stJobProcessReq.strArtificialResult = "";
  300. stJobProcessReq.strArtificialModify = "";
  301. stJobProcessReq.strRunnerName = "";
  302. stJobProcessReq.strTaskType = "FUNCTIONALITY";
  303. stJobProcessReq.strCaseRepeat = "0";
  304. stJobProcessReq.strApplicationGroup = "";
  305. // 实例Id;
  306. _itoa_s(pTask->Id, szValue, 10);
  307. stJobProcessReq.strInstanceId = szValue;
  308. stJobProcessReq.strCaseId = pCase->strId;
  309. // 进度;
  310. _itoa_s(100*(atoi(pCase->strIndex.c_str()))/pTask->Job.vtCases.size(), szValue, 10);
  311. stJobProcessReq.strProgress = szValue;
  312. // 需要将utf-8转gbk;
  313. stJobProcessReq.strReusltMessage = caseItem.name;//CharEncoding::UTF82ASCII(caseItem.name.c_str());
  314. stJobProcessReq.strJobRepeat = "0";
  315. stJobProcessReq.strScreenShot = "";
  316. stJobProcessReq.strStartTime = pCase->_strStartTime;
  317. stJobProcessReq.strCrashNumber = "";
  318. stJobProcessReq.strCaseName = pCase->strCaseName;
  319. //stJobProcessReq.strFailedReason = CharEncoding::UTF82ASCII(caseItem.remark.c_str());
  320. //stJobProcessReq.strFailedReason = (char*)CharEncoding::UTF82UNICODE(caseItem.remark.c_str());
  321. stJobProcessReq.strFailedReason = caseItem.remark;
  322. for (std::vector<std::string>::iterator it = caseItem.imgs.begin(); it != caseItem.imgs.end(); it++ )
  323. {
  324. int npos = it->find_last_of('/');
  325. if ( std::string::npos != npos )
  326. {
  327. stJobProcessReq.strImgName.append(it->substr(npos+1));
  328. stJobProcessReq.strImgName.append("&");
  329. }
  330. }
  331. if ( stJobProcessReq.strImgName.size() && stJobProcessReq.strImgName.at(stJobProcessReq.strImgName.size()-1) == '&')
  332. stJobProcessReq.strImgName.erase(stJobProcessReq.strImgName.size()-1);
  333. stJobProcessReq.strCaseIndex = pCase->strIndex;
  334. // 实例Id;
  335. _itoa_s(pTask->nDeviceId, szValue, 10);
  336. stJobProcessReq.strDeviceId = szValue;
  337. stJobProcessReq.strSceneIndex = "0";
  338. // 实例Id;
  339. //_itoa_s(pTask->nTaskId, szValue, 10);
  340. stJobProcessReq.strTaskId = pTask->Job.strTaskId;
  341. //stJobProcessReq.strAnalysis = CharEncoding::UTF82ASCII(caseItem.data.c_str());
  342. stJobProcessReq.strAnalysis = caseItem.data.c_str();
  343. // 设备名称:即DeviceSerial;
  344. stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
  345. // 固定为:TOTAL
  346. stJobProcessReq.strInfoType = "";
  347. // 如果是Android设备,需要通过adb获取;
  348. //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
  349. stJobProcessReq.strEndTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
  350. stJobProcessReq.strRoundNumber = "1";
  351. stJobProcessReq.strResultType = "4"; // reportActionFinish;
  352. stJobProcessReq.strOperationStep = "";
  353. if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
  354. {
  355. // 再上传图片;
  356. std::string img;
  357. for (std::vector<std::string>::iterator it = caseItem.imgs.begin(); it != caseItem.imgs.end(); it++ )
  358. {
  359. img = "D:/SAT/results/";
  360. img.append(it->substr(3));
  361. UploadCaseImg(pTask, pCase, img);
  362. }
  363. return true;
  364. }
  365. return false;
  366. }
  367. bool CSATExecutor::ReportCaseFinish(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase)
  368. {
  369. TCHAR szValue[MAX_PATH] = {0};
  370. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  371. url.append("/ajaxInteractiveManage!setResultList.action");
  372. SATHTTP::STJobProcessReq stJobProcessReq;
  373. SATHTTP::STJobProcessResp stJobProcessResp;
  374. // 上报用例结果:0表示脚本成功执行, 1表示脚本出错或超时;
  375. if ( pCase->_nExecutionState == 2 )
  376. stJobProcessReq.strResultState = "0"; // 脚本未执行完成;
  377. else if ( pCase->_nExecutionState == 1 )
  378. stJobProcessReq.strResultState = "1"; // 脚本执行中,认为fail;
  379. stJobProcessReq.strCaseScene = "";
  380. // 索引;
  381. _itoa_s(pCase->_nCaseStep, szValue, 10);
  382. stJobProcessReq.strCaseStep = szValue;
  383. stJobProcessReq.strApkMD5 = "";
  384. stJobProcessReq.strCrashTime = "";
  385. // 就是Task中的ExecuteId
  386. _itoa_s(pTask->nExecuteId, szValue, 10);
  387. stJobProcessReq.strRunnerId = szValue;
  388. stJobProcessReq.strCPUInfo = "0";
  389. stJobProcessReq.strRunnedActionNameList = "";
  390. stJobProcessReq.strArtificialResult = "";
  391. stJobProcessReq.strArtificialModify = "";
  392. stJobProcessReq.strRunnerName = "";
  393. stJobProcessReq.strTaskType = "FUNCTIONALITY";
  394. stJobProcessReq.strCaseRepeat = "";
  395. stJobProcessReq.strApplicationGroup = "";
  396. // 实例Id;注意避坑;
  397. _itoa_s(pTask->Id, szValue, 10);
  398. stJobProcessReq.strInstanceId = szValue;
  399. stJobProcessReq.strCaseId = pCase->strId;
  400. // 进度(###需要修改此处###);
  401. _itoa_s(100*(atoi(pCase->strIndex.c_str()))/pTask->Job.vtCases.size(), szValue, 10);
  402. stJobProcessReq.strProgress = szValue;
  403. // 需要将utf-8转gbk;
  404. stJobProcessReq.strReusltMessage = CharEncoding::ASCII2UTF8("测试用例结果:");
  405. stJobProcessReq.strJobRepeat = "";
  406. stJobProcessReq.strScreenShot = "";
  407. stJobProcessReq.strStartTime = pCase->_strStartTime;
  408. stJobProcessReq.strCrashNumber = "";
  409. stJobProcessReq.strCaseName = pCase->strCaseName;
  410. stJobProcessReq.strFailedReason = "";
  411. stJobProcessReq.strImgName = "";
  412. stJobProcessReq.strCaseIndex = pCase->strIndex;
  413. // 实例Id;
  414. _itoa_s(pTask->nDeviceId, szValue, 10);
  415. stJobProcessReq.strDeviceId = szValue;
  416. stJobProcessReq.strSceneIndex = "0";
  417. // 实例Id;
  418. //_itoa_s(pTask->nTaskId, szValue, 10);
  419. stJobProcessReq.strTaskId = pTask->Job.strTaskId;
  420. stJobProcessReq.strAnalysis = "";
  421. // 设备名称:即DeviceSerial;
  422. stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
  423. // 固定为:TOTAL
  424. stJobProcessReq.strInfoType = "TOTAL";
  425. // 如果是Android设备,需要通过adb获取;
  426. //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
  427. stJobProcessReq.strEndTime = pCase->_strEndTime;//CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
  428. stJobProcessReq.strRoundNumber = "1";
  429. stJobProcessReq.strResultType = "5"; // reportCaseFinish;
  430. stJobProcessReq.strOperationStep = "";
  431. if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
  432. {
  433. return true;
  434. }
  435. return false;
  436. }
  437. bool CSATExecutor::ReportCaseResult(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase)
  438. {
  439. // 获取xml文件内容;
  440. std::string xmlpath = "D:\\SAT\\results\\detail\\";
  441. xmlpath.append(pCase->_strFileName);
  442. xmlpath.append("_result.xml");
  443. std::vector<STCaseItem> vtCaseItem;
  444. GetCaseXMLResult(xmlpath, vtCaseItem);
  445. if ( vtCaseItem.size() == 0 )
  446. return false;
  447. int nIndex = 1;
  448. TCHAR szValue[MAX_PATH] = {0};
  449. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  450. url.append("/ajaxInteractiveManage!setResultList.action");
  451. SATHTTP::STJobProcessReq stJobProcessReq;
  452. SATHTTP::STJobProcessResp stJobProcessResp;
  453. // 遍历所有用例测试项;
  454. std::vector<STCaseItem>::iterator it = vtCaseItem.begin();
  455. for (; it != vtCaseItem.end(); it++ )
  456. {
  457. // 上报测试项结果(包含相片);
  458. ReportCaseItemFinish(pTask, pCase, *it);
  459. }
  460. // 上报用例完成;
  461. ReportCaseFinish(pTask, pCase);
  462. // 上传用例日志;
  463. UploadCaseLog(pTask, pCase);
  464. return true;
  465. }
  466. bool CSATExecutor::UploadTaskLog(SATHTTP::STTask* pTask)
  467. {
  468. TCHAR szValue[MAX_PATH] = {0};
  469. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  470. url.append("/ajaxInteractiveManage!saveCaseOrTaskLog.action");
  471. SATHTTP::STSaveLogReq stSaveLogReq;
  472. SATHTTP::STSaveLogResp stSaveLogResp;
  473. stSaveLogReq.strCaseId = "";
  474. // 执行ID;
  475. _itoa_s(pTask->nExecuteId, szValue, 10);
  476. stSaveLogReq.strExecuteId = szValue;
  477. stSaveLogReq.strFileType = "taskLogFile";
  478. // 任务Id;
  479. //_itoa_s(pTask->nTaskId, szValue, 10);
  480. stSaveLogReq.strTaskId = pTask->Job.strTaskInstanceId;
  481. stSaveLogReq.strUserId = pTask->Job.strUserId;
  482. // 要上传的日志文件;
  483. stSaveLogReq.strUploads = "D:\\sat\\log.txt";//pTask->_strTaskLog;
  484. if ( SaveCaseOrTaskLog(url, stSaveLogReq, stSaveLogResp) )
  485. {
  486. return true;
  487. }
  488. return false;
  489. }
  490. bool CSATExecutor::ReportTaskStart(SATHTTP::STTask* pTask)
  491. {
  492. TCHAR szValue[MAX_PATH] = {0};
  493. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  494. url.append("/ajaxInteractiveManage!setResultList.action");
  495. SATHTTP::STJobProcessReq stJobProcessReq;
  496. SATHTTP::STJobProcessResp stJobProcessResp;
  497. // 需要处理###
  498. stJobProcessReq.strResultState = ""; // 脚本执行中,认为fail;
  499. stJobProcessReq.strCaseScene = "";
  500. // 索引;
  501. stJobProcessReq.strCaseStep = "0";
  502. stJobProcessReq.strApkMD5 = "";
  503. stJobProcessReq.strCrashTime = "";
  504. // 就是Task中的ExecuteId
  505. _itoa_s(pTask->nExecuteId, szValue, 10);
  506. stJobProcessReq.strRunnerId = szValue;
  507. stJobProcessReq.strCPUInfo = "0";
  508. stJobProcessReq.strRunnedActionNameList = "";
  509. stJobProcessReq.strArtificialResult = "";
  510. stJobProcessReq.strArtificialModify = "";
  511. stJobProcessReq.strRunnerName = "";
  512. stJobProcessReq.strTaskType = "FUNCTIONALITY";
  513. stJobProcessReq.strCaseRepeat = "";
  514. stJobProcessReq.strApplicationGroup = "";
  515. // 实例Id;注意避坑;
  516. _itoa_s(pTask->Id, szValue, 10);
  517. stJobProcessReq.strInstanceId = szValue;
  518. stJobProcessReq.strCaseId = "";
  519. // 进度(###需要修改此处###);
  520. stJobProcessReq.strProgress = "0";
  521. // 需要将utf-8转gbk;
  522. stJobProcessReq.strReusltMessage = "任务开始";
  523. stJobProcessReq.strJobRepeat = "";
  524. stJobProcessReq.strScreenShot = "";
  525. stJobProcessReq.strStartTime = pTask->strStartTime;
  526. stJobProcessReq.strCrashNumber = "";
  527. stJobProcessReq.strCaseName = "";
  528. stJobProcessReq.strFailedReason = "";
  529. stJobProcessReq.strImgName = "";
  530. stJobProcessReq.strCaseIndex = "";
  531. // 实例Id;
  532. _itoa_s(pTask->nDeviceId, szValue, 10);
  533. stJobProcessReq.strDeviceId = szValue;
  534. stJobProcessReq.strSceneIndex = "";
  535. // 实例Id;
  536. //_itoa_s(pTask->nTaskId, szValue, 10);
  537. stJobProcessReq.strTaskId = pTask->Job.strTaskId;
  538. stJobProcessReq.strAnalysis = "";
  539. // 设备名称:即DeviceSerial;
  540. stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
  541. // 固定为:TOTAL
  542. stJobProcessReq.strInfoType = "TOTAL";
  543. // 如果是Android设备,需要通过adb获取;
  544. //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
  545. stJobProcessReq.strEndTime = "";// CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
  546. stJobProcessReq.strRoundNumber = "1";
  547. stJobProcessReq.strResultType = "0"; // reportJobStart;
  548. stJobProcessReq.strOperationStep = "";
  549. if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
  550. {
  551. return true;
  552. }
  553. return false;
  554. }
  555. bool CSATExecutor::ReportTaskFinish(SATHTTP::STTask* pTask)
  556. {
  557. TCHAR szValue[MAX_PATH] = {0};
  558. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  559. url.append("/ajaxInteractiveManage!setResultList.action");
  560. SATHTTP::STJobProcessReq stJobProcessReq;
  561. SATHTTP::STJobProcessResp stJobProcessResp;
  562. // 需要处理###
  563. stJobProcessReq.strResultState = "0"; // 脚本执行中,认为fail;
  564. stJobProcessReq.strCaseScene = "";
  565. // 索引;
  566. stJobProcessReq.strCaseStep = "0";
  567. stJobProcessReq.strApkMD5 = "";
  568. stJobProcessReq.strCrashTime = "";
  569. // 就是Task中的ExecuteId
  570. _itoa_s(pTask->nExecuteId, szValue, 10);
  571. stJobProcessReq.strRunnerId = szValue;
  572. stJobProcessReq.strCPUInfo = "0";
  573. stJobProcessReq.strRunnedActionNameList = "";
  574. stJobProcessReq.strArtificialResult = "";
  575. stJobProcessReq.strArtificialModify = "";
  576. stJobProcessReq.strRunnerName = "";
  577. stJobProcessReq.strTaskType = "FUNCTIONALITY";
  578. stJobProcessReq.strCaseRepeat = "0";
  579. stJobProcessReq.strApplicationGroup = "";
  580. // 实例Id;注意避坑;
  581. _itoa_s(pTask->Id, szValue, 10);
  582. stJobProcessReq.strInstanceId = szValue;
  583. stJobProcessReq.strCaseId = "";
  584. // 进度(###需要修改此处###);
  585. stJobProcessReq.strProgress = "100";
  586. // 需要将utf-8转gbk;
  587. stJobProcessReq.strReusltMessage = "任务结束";
  588. stJobProcessReq.strJobRepeat = "0";
  589. stJobProcessReq.strScreenShot = "";
  590. stJobProcessReq.strStartTime = pTask->strStartTime;
  591. stJobProcessReq.strCrashNumber = "";
  592. stJobProcessReq.strCaseName = "";
  593. stJobProcessReq.strFailedReason = "";
  594. stJobProcessReq.strImgName = "";
  595. stJobProcessReq.strCaseIndex = "";
  596. // 实例Id;
  597. _itoa_s(pTask->nDeviceId, szValue, 10);
  598. stJobProcessReq.strDeviceId = szValue;
  599. stJobProcessReq.strSceneIndex = "0";
  600. // 实例Id;
  601. //_itoa_s(pTask->nTaskId, szValue, 10);
  602. stJobProcessReq.strTaskId = pTask->Job.strTaskId;
  603. stJobProcessReq.strAnalysis = "";
  604. // 设备名称:即DeviceSerial;
  605. stJobProcessReq.strDevnceName = pTask->Job.strDeviceId; // 命名及其不范围,一会deviceid是deviceserial,一会是id;
  606. // 固定为:TOTAL
  607. stJobProcessReq.strInfoType = "";
  608. // 如果是Android设备,需要通过adb获取;
  609. //stJobProcessReq.strMemoryInfo = stDevice.strMemory;
  610. stJobProcessReq.strEndTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));//"2019-12-16 10:18:20";
  611. stJobProcessReq.strRoundNumber = "1";
  612. stJobProcessReq.strResultType = "1"; // reportJobFinish;
  613. stJobProcessReq.strOperationStep = "";
  614. if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
  615. {
  616. return true;
  617. }
  618. return false;
  619. }
  620. bool CSATExecutor::GetCaseXMLResult(std::string xmlpath, std::vector<STCaseItem> &vtCaseItem)
  621. {
  622. // 解析xml;
  623. tinyxml2::XMLDocument doc;
  624. if (tinyxml2::XML_SUCCESS != doc.LoadFile(xmlpath.c_str()) ) {
  625. return false;
  626. }
  627. tinyxml2::XMLElement *pXmlRoot = NULL;
  628. if ((pXmlRoot = doc.RootElement()) == NULL)
  629. return false;
  630. if (_tcsicmp(pXmlRoot->Value(), "results") != 0)
  631. return false;
  632. tinyxml2::XMLElement *pXmlElent = pXmlRoot->FirstChildElement();
  633. while (pXmlElent) {
  634. if (_tcsicmp(pXmlElent->Value(), _T("item")) == 0) {
  635. STCaseItem cItem;
  636. tinyxml2::XMLElement *pItem = pXmlElent->FirstChildElement();
  637. while (pItem) {
  638. if (_tcsicmp(pItem->Value(), _T("name")) == 0)
  639. {
  640. cItem.name = pItem->GetText();
  641. }
  642. else if (_tcsicmp(pItem->Value(), _T("result")) == 0)
  643. {
  644. cItem.result = pItem->BoolText();
  645. }
  646. else if (_tcsicmp(pItem->Value(), _T("data")) == 0)
  647. {
  648. cItem.data = pItem->GetText();
  649. }
  650. else if (_tcsicmp(pItem->Value(), _T("log")) == 0)
  651. {
  652. cItem.log = pItem->GetText();
  653. }
  654. else if (_tcsicmp(pItem->Value(), _T("remark")) == 0)
  655. {
  656. cItem.remark = pItem->GetText();
  657. }
  658. else if (_tcsicmp(pItem->Value(), _T("screen")) == 0)
  659. {
  660. cItem.imgs.push_back(pItem->GetText());
  661. }
  662. pItem = pItem->NextSiblingElement();
  663. }
  664. // 压入容器;
  665. if ( cItem.name.size() )
  666. vtCaseItem.push_back(cItem);
  667. }
  668. pXmlElent = pXmlElent->NextSiblingElement();
  669. }
  670. return true;
  671. }
  672. void CSATExecutor::StartWork()
  673. {
  674. m_hEventHearbeat = CreateEvent(NULL, TRUE, FALSE, NULL);
  675. if ( m_hEventHearbeat == NULL ) {
  676. _tprintf_s(_T("创建事件失败\n"));
  677. return;
  678. }
  679. m_hEventExcuteScript = CreateEvent(NULL, TRUE, FALSE, NULL);
  680. if ( m_hEventExcuteScript == NULL ) {
  681. _tprintf_s(_T("创建事件失败2\n"));
  682. return;
  683. }
  684. m_hThreadHearbeat = CreateThread(NULL, 0, HearbeatThread, this, 0, NULL);
  685. if ( m_hThreadHearbeat == NULL) {
  686. SetEvent(m_hEventHearbeat);
  687. SetEvent(m_hEventExcuteScript);
  688. CloseHandle(m_hEventHearbeat);
  689. CloseHandle(m_hEventExcuteScript);
  690. m_hEventHearbeat = NULL;
  691. m_hEventExcuteScript = NULL;
  692. _tprintf_s(_T("创建线程失败\n"));
  693. return;
  694. }
  695. m_hThreadExcuteScript = CreateThread(NULL, 0, ExecuteScriptThread, this, 0, NULL);
  696. if ( m_hThreadExcuteScript == NULL ) {
  697. SetEvent(m_hEventHearbeat);
  698. SetEvent(m_hEventExcuteScript);
  699. CloseHandle(m_hEventHearbeat);
  700. CloseHandle(m_hEventExcuteScript);
  701. m_hEventHearbeat = NULL;
  702. m_hEventExcuteScript = NULL;
  703. WaitForSingleObject(m_hThreadHearbeat,INFINITE);
  704. if (m_hThreadHearbeat)
  705. CloseHandle(m_hThreadHearbeat);
  706. m_hThreadHearbeat = NULL;
  707. _tprintf_s(_T("创建线程失败2\n"));
  708. return;
  709. }
  710. }
  711. void CSATExecutor::EndofWork()
  712. {
  713. //////////////////////////////////////////////////////////////////////////
  714. // 设置事件有信号;
  715. if ( m_hEventHearbeat )
  716. SetEvent(m_hEventHearbeat);
  717. // 等待线程结束;
  718. if ( m_hThreadHearbeat ) {
  719. WaitForSingleObject(m_hThreadHearbeat, INFINITE);
  720. CloseHandle(m_hThreadHearbeat);
  721. m_hThreadHearbeat = NULL;
  722. }
  723. // 关闭事件句柄;
  724. if ( m_hEventHearbeat ) {
  725. CloseHandle(m_hEventHearbeat);
  726. m_hEventHearbeat = NULL;
  727. }
  728. //////////////////////////////////////////////////////////////////////////
  729. // 设置事件有信号;
  730. if ( m_hEventExcuteScript )
  731. SetEvent(m_hEventExcuteScript);
  732. // 等待线程结束;
  733. if ( m_hThreadExcuteScript ) {
  734. WaitForSingleObject(m_hThreadExcuteScript, INFINITE);
  735. CloseHandle(m_hThreadExcuteScript);
  736. m_hThreadExcuteScript = NULL;
  737. }
  738. // 关闭事件句柄;
  739. if ( m_hEventExcuteScript ) {
  740. CloseHandle(m_hEventExcuteScript);
  741. m_hEventExcuteScript = NULL;
  742. }
  743. }
  744. DWORD CSATExecutor::HearbeatThread(LPVOID lpVoid)
  745. {
  746. CSATExecutor *that = (CSATExecutor*)lpVoid;
  747. if ( !that ) return 0;
  748. do {
  749. // 没有登录成功,不查询;
  750. if ( !that->m_bLogin ) continue;
  751. SATHTTP::STHeartbeatReq stHeartbeatReq;
  752. SATHTTP::STHeartbeatResp stHeartbeatResp;
  753. std::string url = GLOBAL::g_stSATConfig.szExecuteServer;
  754. url.append("/ajaxInteractiveManage!executeHeartbeat.action");
  755. stHeartbeatReq.strUserName = that->m_stLoginReq.strUserName;
  756. stHeartbeatReq.strRunnerMac = that->m_stLoginReq.strMAC;
  757. stHeartbeatReq.devicelist.assign(that->m_vtDevice.begin(), that->m_vtDevice.end());
  758. if ( Heartbeat(url, stHeartbeatReq, stHeartbeatResp) ) {
  759. #ifdef _DEBUG
  760. OutputDebugString("心跳查询成功\n");
  761. #endif
  762. GLOBAL::WriteTextLog("心跳查询成功");
  763. std::vector<SATHTTP::STTask>::iterator it = stHeartbeatResp.vtTask.begin();
  764. for ( ; it != stHeartbeatResp.vtTask.end(); it++ ) {
  765. if (!that->IsTaskExist(*it)) {
  766. // 将任务压入队列中;
  767. AutoThreadSection ats(&that->m_csTask);
  768. // 同时下载任务;
  769. std::string host = GLOBAL::g_stSATConfig.szCaseServer;
  770. std::string url = host + "/ajaxInteractiveManage!getCaseFileListUrl.action";
  771. std::vector<SATHTTP::STCase>::iterator _case = it->Job.vtCases.begin();
  772. for ( int i = 1; _case != it->Job.vtCases.end(); _case++) {
  773. _case->_nCaseStep = i++;
  774. SATHTTP::STScriptUrlResp stScriptUrlResp;
  775. if ( DownloadScript(url, _case->strId, GLOBAL::g_stSATConfig.szScriptDir, stScriptUrlResp) ) {
  776. _case->_strFileDir = stScriptUrlResp._strFileDir;
  777. _case->_strFileName = stScriptUrlResp._strFileName;
  778. _case->_strScriptPath = stScriptUrlResp._strScripFile;
  779. }
  780. #ifdef _DEBUG
  781. else
  782. {
  783. OutputDebugString("下载脚本失败\n");
  784. }
  785. #endif
  786. }
  787. that->m_vtTask.push_back(*it);
  788. // 通知SAT服务器,脚本开始执行;
  789. // 待开发:同时将任务存储到数据库中;
  790. /*
  791. db process
  792. */
  793. }
  794. }
  795. }
  796. } while ( WaitForSingleObject(that->m_hEventHearbeat, 5000) == WAIT_TIMEOUT );
  797. return 0;
  798. }
  799. DWORD CSATExecutor::ExecuteScriptThread(LPVOID lpVoid)
  800. {
  801. CSATExecutor *that = (CSATExecutor*)lpVoid;
  802. if ( !that ) return 0;
  803. do {
  804. // 是否有任务在执行;
  805. SATHTTP::STTask *pTask = that->IsThereATaskInProcess();
  806. if ( pTask ) {// 有任务在执行中;
  807. if ( pTask->_bConcurrent ) {// 并发;
  808. }
  809. else {// 串行;
  810. // 是否有脚本用例在执行;
  811. SATHTTP::STCase* pCase = that->IsCaseScriptProcess(pTask->Job.vtCases);
  812. if ( pCase ) {
  813. CScriptExecutor *pExcutor = (CScriptExecutor*)pCase->_pExcutor;
  814. if ( pExcutor ) {
  815. if ( pExcutor->IsScriptOver() ) {
  816. pCase->_nExecutionState = 2;
  817. // 上报服务器,完成脚本用例,并上传用例结果;
  818. that->ReportCaseResult(pTask, pCase);
  819. }
  820. else {
  821. // 判断是否超时;
  822. ULONGLONG ulCurTickCount = GetTickCount64();
  823. if ( ulCurTickCount - pExcutor->GetActiveTickCount() > 1800000) {
  824. // 超时中断;
  825. pCase->_nExecutionState = 3;
  826. // 上报用例结果;
  827. that->ReportCaseResult(pTask, pCase);
  828. }
  829. }
  830. }
  831. }
  832. else {
  833. // 没有在执行的用例,开始执行新的用例;
  834. pCase = that->ExecuteFreeCaseScript(pTask);
  835. if ( NULL == pCase ) {
  836. // 没有空闲的用例可执行,说明所有用例已执行完成;
  837. pTask->_nExecutionState = 2;
  838. // 上报任务完成;
  839. that->ReportTaskFinish(pTask);
  840. // 上报任务结果;
  841. that->UploadTaskLog(pTask);
  842. }
  843. }
  844. }
  845. }
  846. else {
  847. // 获取空闲的任务;
  848. pTask = that->GetFreeTask();
  849. if ( pTask ) {
  850. // 是否支持并发;
  851. if ( pTask->_bConcurrent ) {
  852. // 暂时全部一起并发;
  853. std::vector<SATHTTP::STCase>::iterator _case = pTask->Job.vtCases.begin();
  854. for ( ; _case != pTask->Job.vtCases.end(); _case++) {
  855. if (!_case->_pExcutor) {
  856. CScriptExecutor *pExcutor = new CScriptExecutor();
  857. if ( pExcutor ) {
  858. _case->_pExcutor = pExcutor;
  859. pExcutor->InitScript(_case->_strScriptPath, _case->_strFileDir + "\\" + _case->_strFileName + ".txt", "", SUBPROCESS);
  860. pExcutor->StartScript();
  861. // 标记用例执行中;
  862. _case->_nExecutionState = 1;
  863. }
  864. }
  865. }
  866. // 标记任务为执行中;
  867. pTask->_nExecutionState = 1;
  868. }
  869. else {
  870. // 是否有用例脚本在执行;
  871. SATHTTP::STCase* pCase = that->IsCaseScriptProcess(pTask->Job.vtCases);
  872. if ( !pCase ) {
  873. // 执行空闲用例脚本;
  874. that->ExecuteFreeCaseScript(pTask);
  875. }
  876. }
  877. // 通知SAT服务器,脚本开始执行;
  878. that->NotifyTaskStart(pTask);
  879. // 通知SAT服务器,脚本开始;
  880. that->ReportTaskStart(pTask);
  881. }
  882. }
  883. } while ( WaitForSingleObject(that->m_hEventExcuteScript, 10000) == WAIT_TIMEOUT );
  884. return 0;
  885. }