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