1a69a01cdSopenharmony_ci/* 2a69a01cdSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3a69a01cdSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4a69a01cdSopenharmony_ci * you may not use this file except in compliance with the License. 5a69a01cdSopenharmony_ci * You may obtain a copy of the License at 6a69a01cdSopenharmony_ci * 7a69a01cdSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8a69a01cdSopenharmony_ci * 9a69a01cdSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10a69a01cdSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11a69a01cdSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12a69a01cdSopenharmony_ci * See the License for the specific language governing permissions and 13a69a01cdSopenharmony_ci * limitations under the License. 14a69a01cdSopenharmony_ci */ 15a69a01cdSopenharmony_ci 16a69a01cdSopenharmony_ci#include "special_test_flow.h" 17a69a01cdSopenharmony_ci 18a69a01cdSopenharmony_ci#include <string> 19a69a01cdSopenharmony_ci#include "ability_manager_client.h" 20a69a01cdSopenharmony_ci#include "report.h" 21a69a01cdSopenharmony_ci#include "string_ex.h" 22a69a01cdSopenharmony_ci#include "wukong_define.h" 23a69a01cdSopenharmony_ci 24a69a01cdSopenharmony_cinamespace OHOS { 25a69a01cdSopenharmony_cinamespace WuKong { 26a69a01cdSopenharmony_cinamespace { 27a69a01cdSopenharmony_ciconst std::string SPECIAL_TEST_HELP_MSG = 28a69a01cdSopenharmony_ci "usage: wukong special [<arguments>]\n" 29a69a01cdSopenharmony_ci "These are wukong special arguments list:\n" 30a69a01cdSopenharmony_ci " -h, --help special test help\n" 31a69a01cdSopenharmony_ci " -t, --touch[x,y] touch event \n" 32a69a01cdSopenharmony_ci " -c, --count total count of test\n" 33a69a01cdSopenharmony_ci " -i, --interval interval\n" 34a69a01cdSopenharmony_ci " -S, --swap[option] swap event\n" 35a69a01cdSopenharmony_ci " option is -s| -e| -b\n" 36a69a01cdSopenharmony_ci " -s, --start: the start point of swap\n" 37a69a01cdSopenharmony_ci " -e, --end: the end point of swap\n" 38a69a01cdSopenharmony_ci " -b, --bilateral: swap go and back\n" 39a69a01cdSopenharmony_ci " -k, --spec_insomnia power on/off event\n" 40a69a01cdSopenharmony_ci " -T, --time total time of test\n" 41a69a01cdSopenharmony_ci " -C, --component component event\n" 42a69a01cdSopenharmony_ci " -p, --screenshot get screenshot(only in componment input)\n" 43a69a01cdSopenharmony_ci " -r, --record record user operation\n" 44a69a01cdSopenharmony_ci " -R, --replay replay user operation\n" 45a69a01cdSopenharmony_ci " -u, --uitest uitest dumpLayout\n"; 46a69a01cdSopenharmony_ci 47a69a01cdSopenharmony_ciconst std::string SHORT_OPTIONS = "c:hi:T:t:kSbs:e:C:pr:R:u:"; 48a69a01cdSopenharmony_ciconst struct option LONG_OPTIONS[] = { 49a69a01cdSopenharmony_ci {"count", required_argument, nullptr, 'c'}, // test count 50a69a01cdSopenharmony_ci {"help", no_argument, nullptr, 'h'}, // help information 51a69a01cdSopenharmony_ci {"interval", required_argument, nullptr, 'i'}, // test interval 52a69a01cdSopenharmony_ci {"touch", required_argument, nullptr, 't'}, // touch 53a69a01cdSopenharmony_ci {"spec_insomnia", no_argument, nullptr, 'k'}, // sleep and awake 54a69a01cdSopenharmony_ci {"time", required_argument, nullptr, 'T'}, // test time 55a69a01cdSopenharmony_ci {"swap", required_argument, nullptr, 'S'}, // swap 56a69a01cdSopenharmony_ci {"bilateral", no_argument, nullptr, 'b'}, // swap go and back 57a69a01cdSopenharmony_ci {"start", no_argument, nullptr, 's'}, // the start point of swap 58a69a01cdSopenharmony_ci {"end", no_argument, nullptr, 'e'}, // the end point of swap 59a69a01cdSopenharmony_ci {"component", required_argument, nullptr, 'C'}, // the end point of swap 60a69a01cdSopenharmony_ci {"screenshot", no_argument, nullptr, 'p'}, // get photo of screenshot 61a69a01cdSopenharmony_ci {"record", required_argument, nullptr, 'r'}, // record user operation 62a69a01cdSopenharmony_ci {"replay", required_argument, nullptr, 'R'}, // replay user operation 63a69a01cdSopenharmony_ci {"uitest", no_argument, nullptr, 'u'} // uitest dumpLayout 64a69a01cdSopenharmony_ci}; 65a69a01cdSopenharmony_ciconst int ONE_MINUTE = 60000; 66a69a01cdSopenharmony_cibool g_commandSWAPENABLE = false; 67a69a01cdSopenharmony_cibool g_commandHELPENABLE = false; 68a69a01cdSopenharmony_cibool g_commandTIMEENABLE = false; 69a69a01cdSopenharmony_cibool g_commandTOUCHENABLE = false; 70a69a01cdSopenharmony_cibool g_commandPOWERENABLE = false; 71a69a01cdSopenharmony_cibool g_commandGOBACKENABLE = false; 72a69a01cdSopenharmony_cibool g_commandCOUNTENABLE = false; 73a69a01cdSopenharmony_cibool g_commandCOMPONENTENABLE = false; 74a69a01cdSopenharmony_cibool g_commandSCREENSHOTENABLE = false; 75a69a01cdSopenharmony_cibool g_commandRECORDABLE = false; 76a69a01cdSopenharmony_cibool g_commandREPLAYABLE = false; 77a69a01cdSopenharmony_cibool g_commandUITEST = false; 78a69a01cdSopenharmony_ci 79a69a01cdSopenharmony_ciconst int NUMBER_TWO = 2; 80a69a01cdSopenharmony_ci} // namespace 81a69a01cdSopenharmony_ciusing namespace std; 82a69a01cdSopenharmony_ci 83a69a01cdSopenharmony_ciSpecialTestFlow::SpecialTestFlow(WuKongShellCommand &shellcommand) : TestFlow(shellcommand) 84a69a01cdSopenharmony_ci{ 85a69a01cdSopenharmony_ci} 86a69a01cdSopenharmony_ci 87a69a01cdSopenharmony_ciSpecialTestFlow::~SpecialTestFlow() 88a69a01cdSopenharmony_ci{ 89a69a01cdSopenharmony_ci if (timer_ != nullptr) { 90a69a01cdSopenharmony_ci timer_->Shutdown(); 91a69a01cdSopenharmony_ci timer_->Unregister(timerId_); 92a69a01cdSopenharmony_ci timer_ = nullptr; 93a69a01cdSopenharmony_ci } 94a69a01cdSopenharmony_ci} 95a69a01cdSopenharmony_ci 96a69a01cdSopenharmony_ciErrCode SpecialTestFlow::EnvInit() 97a69a01cdSopenharmony_ci{ 98a69a01cdSopenharmony_ci ErrCode result = OHOS::ERR_OK; 99a69a01cdSopenharmony_ci const std::string paramError = "param is incorrect"; 100a69a01cdSopenharmony_ci if (g_commandSWAPENABLE == true) { 101a69a01cdSopenharmony_ci if (swapStartPoint_.size() == NUMBER_TWO && swapEndPoint_.size() == NUMBER_TWO) { 102a69a01cdSopenharmony_ci // set the params of touch special test 103a69a01cdSopenharmony_ci std::shared_ptr<SwapParam> swapParam = std::make_shared<SwapParam>(); 104a69a01cdSopenharmony_ci swapParam->startX_ = stoi(swapStartPoint_[0]); 105a69a01cdSopenharmony_ci swapParam->startY_ = stoi(swapStartPoint_[1]); 106a69a01cdSopenharmony_ci swapParam->endX_ = stoi(swapEndPoint_[0]); 107a69a01cdSopenharmony_ci swapParam->endY_ = stoi(swapEndPoint_[1]); 108a69a01cdSopenharmony_ci swapParam->isGoBack_ = g_commandGOBACKENABLE; 109a69a01cdSopenharmony_ci if (specialTestObject_ == nullptr) { 110a69a01cdSopenharmony_ci specialTestObject_ = swapParam; 111a69a01cdSopenharmony_ci } 112a69a01cdSopenharmony_ci } else { 113a69a01cdSopenharmony_ci DEBUG_LOG(paramError.c_str()); 114a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(paramError + "\n"); 115a69a01cdSopenharmony_ci result = OHOS::ERR_INVALID_VALUE; 116a69a01cdSopenharmony_ci } 117a69a01cdSopenharmony_ci } else if (g_commandTOUCHENABLE == true) { 118a69a01cdSopenharmony_ci if (touchParam_.size() == NUMBER_TWO) { 119a69a01cdSopenharmony_ci // set the params of swap special test 120a69a01cdSopenharmony_ci std::shared_ptr<TouchParam> touchParam = std::make_shared<TouchParam>(); 121a69a01cdSopenharmony_ci touchParam->x_ = stoi(touchParam_[0]); 122a69a01cdSopenharmony_ci touchParam->y_ = stoi(touchParam_[1]); 123a69a01cdSopenharmony_ci if (specialTestObject_ == nullptr) { 124a69a01cdSopenharmony_ci specialTestObject_ = touchParam; 125a69a01cdSopenharmony_ci } 126a69a01cdSopenharmony_ci } else { 127a69a01cdSopenharmony_ci DEBUG_LOG(paramError.c_str()); 128a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(paramError + "\n"); 129a69a01cdSopenharmony_ci result = OHOS::ERR_INVALID_VALUE; 130a69a01cdSopenharmony_ci } 131a69a01cdSopenharmony_ci } else if (g_commandCOMPONENTENABLE == true) { 132a69a01cdSopenharmony_ci std::shared_ptr<ComponentParam> componentParam = std::make_shared<ComponentParam>(); 133a69a01cdSopenharmony_ci for (auto name : bundleName_) { 134a69a01cdSopenharmony_ci componentParam->PushBundleName(name); 135a69a01cdSopenharmony_ci } 136a69a01cdSopenharmony_ci componentParam->isAllFinished_ = false; 137a69a01cdSopenharmony_ci specialTestObject_ = componentParam; 138a69a01cdSopenharmony_ci } else if (g_commandRECORDABLE == true) { 139a69a01cdSopenharmony_ci std::shared_ptr<RecordParam> recordParam = std::make_shared<RecordParam>(); 140a69a01cdSopenharmony_ci recordParam->recordName_ = specialRecordName_; 141a69a01cdSopenharmony_ci recordParam->recordStatus_ = true; 142a69a01cdSopenharmony_ci if (specialTestObject_ == nullptr) { 143a69a01cdSopenharmony_ci specialTestObject_ = recordParam; 144a69a01cdSopenharmony_ci } 145a69a01cdSopenharmony_ci } else if (g_commandREPLAYABLE == true) { 146a69a01cdSopenharmony_ci std::shared_ptr<RecordParam> replayParam = std::make_shared<RecordParam>(); 147a69a01cdSopenharmony_ci replayParam->recordName_ = specialRecordName_; 148a69a01cdSopenharmony_ci replayParam->recordStatus_ = false; 149a69a01cdSopenharmony_ci if (specialTestObject_ == nullptr) { 150a69a01cdSopenharmony_ci specialTestObject_ = replayParam; 151a69a01cdSopenharmony_ci } 152a69a01cdSopenharmony_ci } 153a69a01cdSopenharmony_ci 154a69a01cdSopenharmony_ci // if time test flow, register timer. 155a69a01cdSopenharmony_ci if (g_commandTIMEENABLE) { 156a69a01cdSopenharmony_ci RegisterTimer(); 157a69a01cdSopenharmony_ci } 158a69a01cdSopenharmony_ci return result; 159a69a01cdSopenharmony_ci} 160a69a01cdSopenharmony_ci 161a69a01cdSopenharmony_ciErrCode SpecialTestFlow::RunStep() 162a69a01cdSopenharmony_ci{ 163a69a01cdSopenharmony_ci // control the count test flow 164a69a01cdSopenharmony_ci if (g_commandCOUNTENABLE == true) { 165a69a01cdSopenharmony_ci totalCount_--; 166a69a01cdSopenharmony_ci if (totalCount_ < 0) { 167a69a01cdSopenharmony_ci isFinished_ = true; 168a69a01cdSopenharmony_ci return OHOS::ERR_OK; 169a69a01cdSopenharmony_ci } 170a69a01cdSopenharmony_ci } 171a69a01cdSopenharmony_ci // order test 172a69a01cdSopenharmony_ci ErrCode result; 173a69a01cdSopenharmony_ci if (g_commandSCREENSHOTENABLE) { 174a69a01cdSopenharmony_ci std::string screenStorePath; 175a69a01cdSopenharmony_ci result = WuKongUtil::GetInstance()->WukongScreenCap(screenStorePath, g_commandUITEST); 176a69a01cdSopenharmony_ci if (result == OHOS::ERR_OK) { 177a69a01cdSopenharmony_ci Report::GetInstance()->RecordScreenPath(screenStorePath); 178a69a01cdSopenharmony_ci } 179a69a01cdSopenharmony_ci } 180a69a01cdSopenharmony_ci InputType inputTypeId = DistrbuteInputType(); 181a69a01cdSopenharmony_ci std::shared_ptr<InputAction> inputaction = InputFactory::GetInputAction(inputTypeId); 182a69a01cdSopenharmony_ci if (!inputaction) { 183a69a01cdSopenharmony_ci WARN_LOG("This test failed, the inputaction is nullptr."); 184a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 185a69a01cdSopenharmony_ci } 186a69a01cdSopenharmony_ci result = inputaction->OrderInput(specialTestObject_); 187a69a01cdSopenharmony_ci if (result != OHOS::ERR_OK) { 188a69a01cdSopenharmony_ci WARN_LOG("This test failed"); 189a69a01cdSopenharmony_ci } 190a69a01cdSopenharmony_ci if (!g_commandPOWERENABLE) { 191a69a01cdSopenharmony_ci if (ProtectRightAbility() == OHOS::ERR_INVALID_VALUE) { 192a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 193a69a01cdSopenharmony_ci } 194a69a01cdSopenharmony_ci } 195a69a01cdSopenharmony_ci if (g_commandCOMPONENTENABLE) { 196a69a01cdSopenharmony_ci if (specialTestObject_->isAllFinished_) { 197a69a01cdSopenharmony_ci isFinished_ = true; 198a69a01cdSopenharmony_ci } 199a69a01cdSopenharmony_ci } 200a69a01cdSopenharmony_ci if (g_commandRECORDABLE) { 201a69a01cdSopenharmony_ci isFinished_ = true; 202a69a01cdSopenharmony_ci } 203a69a01cdSopenharmony_ci usleep(intervalArgs_ * oneSecond_); 204a69a01cdSopenharmony_ci return result; 205a69a01cdSopenharmony_ci} 206a69a01cdSopenharmony_ciErrCode SpecialTestFlow::ProtectRightAbility() 207a69a01cdSopenharmony_ci{ 208a69a01cdSopenharmony_ci ErrCode result = OHOS::ERR_OK; 209a69a01cdSopenharmony_ci auto elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility(); 210a69a01cdSopenharmony_ci auto curBundleName = elementName.GetBundleName(); 211a69a01cdSopenharmony_ci auto static lastBundleName = elementName.GetBundleName(); 212a69a01cdSopenharmony_ci if (curBundleName != lastBundleName) { 213a69a01cdSopenharmony_ci auto it = find(bundleName_.begin(), bundleName_.end(), curBundleName); 214a69a01cdSopenharmony_ci if (it == bundleName_.end()) { 215a69a01cdSopenharmony_ci std::vector<std::string> bundleList(0); 216a69a01cdSopenharmony_ci std::vector<std::string> abilityList(0); 217a69a01cdSopenharmony_ci auto util = WuKongUtil::GetInstance(); 218a69a01cdSopenharmony_ci util->GetBundleList(bundleList, abilityList); 219a69a01cdSopenharmony_ci if (bundleList.size() == 0 || abilityList.size() == 0) { 220a69a01cdSopenharmony_ci ERROR_LOG_STR("bundleList (%u) or abilityList (%u) is 0", bundleList.size(), abilityList.size()); 221a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 222a69a01cdSopenharmony_ci } 223a69a01cdSopenharmony_ci uint32_t index = util->FindElement(bundleList, lastBundleName); 224a69a01cdSopenharmony_ci if (index == INVALIDVALUE) { 225a69a01cdSopenharmony_ci ERROR_LOG("not found bundle"); 226a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 227a69a01cdSopenharmony_ci } 228a69a01cdSopenharmony_ci // start ability through bundle information 229a69a01cdSopenharmony_ci result = AppManager::GetInstance()->StartAbilityByBundleInfo(abilityList[index], bundleList[index]); 230a69a01cdSopenharmony_ci if (result == OHOS::ERR_OK) { 231a69a01cdSopenharmony_ci INFO_LOG_STR("Bundle Name: (%s) startup successful", bundleList[index].c_str()); 232a69a01cdSopenharmony_ci WuKongUtil::GetInstance()->SetIsFirstStartAppFlag(true); 233a69a01cdSopenharmony_ci } else { 234a69a01cdSopenharmony_ci INFO_LOG_STR("Bundle Name: (%s) startup failed", bundleList[index].c_str()); 235a69a01cdSopenharmony_ci } 236a69a01cdSopenharmony_ci } else { 237a69a01cdSopenharmony_ci lastBundleName = curBundleName; 238a69a01cdSopenharmony_ci DEBUG_LOG_STR("lastBundleName change to : %s", curBundleName.c_str()); 239a69a01cdSopenharmony_ci } 240a69a01cdSopenharmony_ci } 241a69a01cdSopenharmony_ci return result; 242a69a01cdSopenharmony_ci} 243a69a01cdSopenharmony_ci 244a69a01cdSopenharmony_ciInputType SpecialTestFlow::DistrbuteInputType() 245a69a01cdSopenharmony_ci{ 246a69a01cdSopenharmony_ci InputType iputType = INPUTTYPE_INVALIDINPUT; 247a69a01cdSopenharmony_ci 248a69a01cdSopenharmony_ci if (g_commandTOUCHENABLE == true) { 249a69a01cdSopenharmony_ci iputType = INPUTTYPE_TOUCHINPUT; 250a69a01cdSopenharmony_ci } else if (g_commandSWAPENABLE) { 251a69a01cdSopenharmony_ci iputType = INPUTTYPE_SWAPINPUT; 252a69a01cdSopenharmony_ci } else if (g_commandPOWERENABLE) { 253a69a01cdSopenharmony_ci iputType = INPUTTYPE_HARDKEYINPUT; 254a69a01cdSopenharmony_ci } else if (g_commandCOMPONENTENABLE) { 255a69a01cdSopenharmony_ci iputType = INPUTTYPE_ELEMENTINPUT; 256a69a01cdSopenharmony_ci } else if (g_commandRECORDABLE) { 257a69a01cdSopenharmony_ci iputType = INPUTTYPE_RECORDINPUT; 258a69a01cdSopenharmony_ci } else if (g_commandREPLAYABLE) { 259a69a01cdSopenharmony_ci iputType = INPUTTYPE_REPPLAYINPUT; 260a69a01cdSopenharmony_ci } 261a69a01cdSopenharmony_ci return iputType; 262a69a01cdSopenharmony_ci} 263a69a01cdSopenharmony_ci 264a69a01cdSopenharmony_ciconst struct option *SpecialTestFlow::GetOptionArguments(std::string &shortOpts) 265a69a01cdSopenharmony_ci{ 266a69a01cdSopenharmony_ci shortOpts = SHORT_OPTIONS; 267a69a01cdSopenharmony_ci return LONG_OPTIONS; 268a69a01cdSopenharmony_ci} 269a69a01cdSopenharmony_ci 270a69a01cdSopenharmony_ciErrCode SpecialTestFlow::HandleUnknownOption(const char optopt) 271a69a01cdSopenharmony_ci{ 272a69a01cdSopenharmony_ci ErrCode result = OHOS::ERR_OK; 273a69a01cdSopenharmony_ci switch (optopt) { 274a69a01cdSopenharmony_ci case 'T': 275a69a01cdSopenharmony_ci case 'i': 276a69a01cdSopenharmony_ci case 'c': 277a69a01cdSopenharmony_ci case 's': 278a69a01cdSopenharmony_ci case 'e': 279a69a01cdSopenharmony_ci case 'C': 280a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend("error: option '-"); 281a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(string(1, optopt)); 282a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend("' requires a value.\n"); 283a69a01cdSopenharmony_ci result = OHOS::ERR_INVALID_VALUE; 284a69a01cdSopenharmony_ci break; 285a69a01cdSopenharmony_ci case 'h': { 286a69a01cdSopenharmony_ci result = OHOS::ERR_INVALID_VALUE; 287a69a01cdSopenharmony_ci break; 288a69a01cdSopenharmony_ci } 289a69a01cdSopenharmony_ci default: { 290a69a01cdSopenharmony_ci // 'wukong special' with a unknown option: wukong special -x 291a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend( 292a69a01cdSopenharmony_ci "'wukong special' with an unknown option, please reference help information:\n"); 293a69a01cdSopenharmony_ci result = OHOS::ERR_INVALID_VALUE; 294a69a01cdSopenharmony_ci break; 295a69a01cdSopenharmony_ci } 296a69a01cdSopenharmony_ci } 297a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(SPECIAL_TEST_HELP_MSG); 298a69a01cdSopenharmony_ci return result; 299a69a01cdSopenharmony_ci} 300a69a01cdSopenharmony_ci 301a69a01cdSopenharmony_ciErrCode SpecialTestFlow::HandleNormalOption(const int option) 302a69a01cdSopenharmony_ci{ 303a69a01cdSopenharmony_ci ErrCode result = OHOS::ERR_OK; 304a69a01cdSopenharmony_ci if (option == 'c' || option == 'T') { 305a69a01cdSopenharmony_ci result = CheckArgument(option); 306a69a01cdSopenharmony_ci } else if (option == 'i' || option == 't' || option == 's' || option == 'e' || option == 'C') { 307a69a01cdSopenharmony_ci result = SetRunningParam(option); 308a69a01cdSopenharmony_ci } else if (option == 'S' || option == 'k' || option == 'h' || option == 'b' || option == 'p' || 309a69a01cdSopenharmony_ci option == 'r' || option == 'R' || option == 'u') { 310a69a01cdSopenharmony_ci result = SetRunningIndicator(option); 311a69a01cdSopenharmony_ci } 312a69a01cdSopenharmony_ci WuKongUtil::GetInstance()->SetOrderFlag(true); 313a69a01cdSopenharmony_ci return result; 314a69a01cdSopenharmony_ci} 315a69a01cdSopenharmony_ci 316a69a01cdSopenharmony_ciErrCode SpecialTestFlow::CheckArgument(const int option) 317a69a01cdSopenharmony_ci{ 318a69a01cdSopenharmony_ci ErrCode result = OHOS::ERR_OK; 319a69a01cdSopenharmony_ci switch (option) { 320a69a01cdSopenharmony_ci case 'c': { 321a69a01cdSopenharmony_ci result = CheckArgumentOptionOfc(); 322a69a01cdSopenharmony_ci break; 323a69a01cdSopenharmony_ci } 324a69a01cdSopenharmony_ci case 'T': { 325a69a01cdSopenharmony_ci result = CheckArgumentOptionOfT(); 326a69a01cdSopenharmony_ci break; 327a69a01cdSopenharmony_ci } 328a69a01cdSopenharmony_ci default: { 329a69a01cdSopenharmony_ci result = OHOS::ERR_INVALID_VALUE; 330a69a01cdSopenharmony_ci break; 331a69a01cdSopenharmony_ci } 332a69a01cdSopenharmony_ci } 333a69a01cdSopenharmony_ci return result; 334a69a01cdSopenharmony_ci} 335a69a01cdSopenharmony_ci 336a69a01cdSopenharmony_ciErrCode SpecialTestFlow::SetRunningParam(const int option) 337a69a01cdSopenharmony_ci{ 338a69a01cdSopenharmony_ci ErrCode result = OHOS::ERR_OK; 339a69a01cdSopenharmony_ci if (option == 'i') { 340a69a01cdSopenharmony_ci intervalArgs_ = std::stoi(optarg); 341a69a01cdSopenharmony_ci TEST_RUN_LOG(("Interval: " + std::to_string(intervalArgs_)).c_str()); 342a69a01cdSopenharmony_ci } else if (option == 't') { 343a69a01cdSopenharmony_ci SplitStr(optarg, ",", touchParam_); 344a69a01cdSopenharmony_ci // check if param is valid 345a69a01cdSopenharmony_ci result = CheckPosition(touchParam_); 346a69a01cdSopenharmony_ci g_commandTOUCHENABLE = true; 347a69a01cdSopenharmony_ci } else if (option == 's') { 348a69a01cdSopenharmony_ci SplitStr(optarg, ",", swapStartPoint_); 349a69a01cdSopenharmony_ci // check if param is valid 350a69a01cdSopenharmony_ci result = CheckPosition(swapStartPoint_); 351a69a01cdSopenharmony_ci } else if (option == 'e') { 352a69a01cdSopenharmony_ci SplitStr(optarg, ",", swapEndPoint_); 353a69a01cdSopenharmony_ci // check if param is valid 354a69a01cdSopenharmony_ci result = CheckPosition(swapEndPoint_); 355a69a01cdSopenharmony_ci } else if (option == 'C') { 356a69a01cdSopenharmony_ci SplitStr(optarg, ",", bundleName_); 357a69a01cdSopenharmony_ci result = WuKongUtil::GetInstance()->CheckArgumentList(bundleName_, true); 358a69a01cdSopenharmony_ci g_commandCOMPONENTENABLE = true; 359a69a01cdSopenharmony_ci } 360a69a01cdSopenharmony_ci return OHOS::ERR_OK; 361a69a01cdSopenharmony_ci} 362a69a01cdSopenharmony_ci 363a69a01cdSopenharmony_ciErrCode SpecialTestFlow::SetRunningIndicator(const int option) 364a69a01cdSopenharmony_ci{ 365a69a01cdSopenharmony_ci ErrCode result = OHOS::ERR_OK; 366a69a01cdSopenharmony_ci if (option == 'S') { 367a69a01cdSopenharmony_ci g_commandSWAPENABLE = true; 368a69a01cdSopenharmony_ci } else if (option == 'k') { 369a69a01cdSopenharmony_ci g_commandPOWERENABLE = true; 370a69a01cdSopenharmony_ci } else if (option == 'h') { 371a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(SPECIAL_TEST_HELP_MSG); 372a69a01cdSopenharmony_ci result = ERR_NO_INIT; 373a69a01cdSopenharmony_ci g_commandHELPENABLE = true; 374a69a01cdSopenharmony_ci } else if (option == 'b') { 375a69a01cdSopenharmony_ci g_commandGOBACKENABLE = true; 376a69a01cdSopenharmony_ci } else if (option == 'p') { 377a69a01cdSopenharmony_ci g_commandSCREENSHOTENABLE = true; 378a69a01cdSopenharmony_ci } else if (option == 'r') { 379a69a01cdSopenharmony_ci g_commandRECORDABLE = true; 380a69a01cdSopenharmony_ci specialRecordName_ = optarg; 381a69a01cdSopenharmony_ci } else if (option == 'R') { 382a69a01cdSopenharmony_ci g_commandREPLAYABLE = true; 383a69a01cdSopenharmony_ci specialRecordName_ = optarg; 384a69a01cdSopenharmony_ci } else if (option == 'u') { 385a69a01cdSopenharmony_ci g_commandUITEST = true; 386a69a01cdSopenharmony_ci } 387a69a01cdSopenharmony_ci return OHOS::ERR_OK; 388a69a01cdSopenharmony_ci} 389a69a01cdSopenharmony_ci 390a69a01cdSopenharmony_civoid SpecialTestFlow::RegisterTimer() 391a69a01cdSopenharmony_ci{ 392a69a01cdSopenharmony_ci if (timer_ == nullptr) { 393a69a01cdSopenharmony_ci timer_ = std::make_shared<Utils::Timer>("wukong"); 394a69a01cdSopenharmony_ci timerId_ = timer_->Register([this] () { SpecialTestFlow::TestTimeout(); }, totalTime_ * ONE_MINUTE, true); 395a69a01cdSopenharmony_ci timer_->Setup(); 396a69a01cdSopenharmony_ci } 397a69a01cdSopenharmony_ci} 398a69a01cdSopenharmony_ci 399a69a01cdSopenharmony_civoid SpecialTestFlow::TestTimeout() 400a69a01cdSopenharmony_ci{ 401a69a01cdSopenharmony_ci g_commandTIMEENABLE = false; 402a69a01cdSopenharmony_ci isFinished_ = true; 403a69a01cdSopenharmony_ci} 404a69a01cdSopenharmony_ci 405a69a01cdSopenharmony_ciErrCode SpecialTestFlow::CheckPosition(std::vector<std::string> argumentlist) 406a69a01cdSopenharmony_ci{ 407a69a01cdSopenharmony_ci int32_t screenWidth = -1; 408a69a01cdSopenharmony_ci int32_t screenHeight = -1; 409a69a01cdSopenharmony_ci 410a69a01cdSopenharmony_ci // get the size of screen 411a69a01cdSopenharmony_ci ErrCode result = WuKongUtil::GetInstance()->GetScreenSize(screenWidth, screenHeight); 412a69a01cdSopenharmony_ci if (result != OHOS::ERR_OK) { 413a69a01cdSopenharmony_ci return result; 414a69a01cdSopenharmony_ci } 415a69a01cdSopenharmony_ci if (argumentlist.size() > 0) { 416a69a01cdSopenharmony_ci if (stoi(argumentlist[0]) > screenWidth || stoi(argumentlist[1]) > screenHeight || stoi(argumentlist[0]) < 0 || 417a69a01cdSopenharmony_ci stoi(argumentlist[1]) < 0) { 418a69a01cdSopenharmony_ci std::string paramError = "the param of position is incorrect"; 419a69a01cdSopenharmony_ci DEBUG_LOG(paramError.c_str()); 420a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(paramError + "\n"); 421a69a01cdSopenharmony_ci result = OHOS::ERR_NO_INIT; 422a69a01cdSopenharmony_ci } 423a69a01cdSopenharmony_ci } 424a69a01cdSopenharmony_ci return result; 425a69a01cdSopenharmony_ci} 426a69a01cdSopenharmony_ci 427a69a01cdSopenharmony_ciErrCode SpecialTestFlow::LauncherApp() 428a69a01cdSopenharmony_ci{ 429a69a01cdSopenharmony_ci std::shared_ptr<InputAction> inputaction = InputFactory::GetInputAction(INPUTTYPE_APPSWITCHINPUT); 430a69a01cdSopenharmony_ci if (!inputaction) { 431a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 432a69a01cdSopenharmony_ci } 433a69a01cdSopenharmony_ci ErrCode result = inputaction->OrderInput(specialTestObject_); 434a69a01cdSopenharmony_ci if (result != OHOS::ERR_OK) { 435a69a01cdSopenharmony_ci ERROR_LOG("launcher app failed"); 436a69a01cdSopenharmony_ci } 437a69a01cdSopenharmony_ci return result; 438a69a01cdSopenharmony_ci} 439a69a01cdSopenharmony_ci 440a69a01cdSopenharmony_ciErrCode SpecialTestFlow::CheckArgumentOptionOfc() 441a69a01cdSopenharmony_ci{ 442a69a01cdSopenharmony_ci // check if the '-c' and 'T' is exist at the same time 443a69a01cdSopenharmony_ci if (g_commandTIMEENABLE == false) { 444a69a01cdSopenharmony_ci std::stringstream ss(optarg); 445a69a01cdSopenharmony_ci if (ss >> countArgs_) { 446a69a01cdSopenharmony_ci g_commandCOUNTENABLE = true; 447a69a01cdSopenharmony_ci TEST_RUN_LOG(("Count: " + std::to_string(countArgs_)).c_str()); 448a69a01cdSopenharmony_ci totalCount_ = countArgs_; 449a69a01cdSopenharmony_ci return OHOS::ERR_OK; 450a69a01cdSopenharmony_ci } else { 451a69a01cdSopenharmony_ci ERROR_LOG("Setting -c must follow an interger"); 452a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 453a69a01cdSopenharmony_ci } 454a69a01cdSopenharmony_ci } else { 455a69a01cdSopenharmony_ci DEBUG_LOG(PARAM_COUNT_TIME_ERROR); 456a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(std::string(PARAM_COUNT_TIME_ERROR) + "\n"); 457a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 458a69a01cdSopenharmony_ci } 459a69a01cdSopenharmony_ci} 460a69a01cdSopenharmony_ci 461a69a01cdSopenharmony_ciErrCode SpecialTestFlow::CheckArgumentOptionOfT() 462a69a01cdSopenharmony_ci{ 463a69a01cdSopenharmony_ci // check if the '-c' and 'T' is exist at the same time 464a69a01cdSopenharmony_ci if (g_commandCOUNTENABLE == false) { 465a69a01cdSopenharmony_ci std::stringstream ss(optarg); 466a69a01cdSopenharmony_ci if (ss >> totalTime_) { 467a69a01cdSopenharmony_ci TEST_RUN_LOG(("Time: " + std::to_string(totalTime_)).c_str()); 468a69a01cdSopenharmony_ci g_commandTIMEENABLE = true; 469a69a01cdSopenharmony_ci return OHOS::ERR_OK; 470a69a01cdSopenharmony_ci } else { 471a69a01cdSopenharmony_ci ERROR_LOG("Setting -T must follow a float"); 472a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 473a69a01cdSopenharmony_ci } 474a69a01cdSopenharmony_ci } else { 475a69a01cdSopenharmony_ci DEBUG_LOG(PARAM_TIME_COUNT_ERROR); 476a69a01cdSopenharmony_ci shellcommand_.ResultReceiverAppend(std::string(PARAM_TIME_COUNT_ERROR) + "\n"); 477a69a01cdSopenharmony_ci return OHOS::ERR_INVALID_VALUE; 478a69a01cdSopenharmony_ci } 479a69a01cdSopenharmony_ci} 480a69a01cdSopenharmony_ci 481a69a01cdSopenharmony_ci} // namespace WuKong 482a69a01cdSopenharmony_ci} // namespace OHOS 483