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 "wukong_shell_command.h"
17a69a01cdSopenharmony_ci
18a69a01cdSopenharmony_ci#include <cstdlib>
19a69a01cdSopenharmony_ci
20a69a01cdSopenharmony_ci#include "ability_manager_client.h"
21a69a01cdSopenharmony_ci#include "accessibility_element_info.h"
22a69a01cdSopenharmony_ci#include "accessibility_ui_test_ability.h"
23a69a01cdSopenharmony_ci#include "appexecfwk_errors.h"
24a69a01cdSopenharmony_ci#include "bundle_mgr_proxy.h"
25a69a01cdSopenharmony_ci#include "component_manager.h"
26a69a01cdSopenharmony_ci#include "iservice_registry.h"
27a69a01cdSopenharmony_ci#include "launcher_service.h"
28a69a01cdSopenharmony_ci#include "random_test_flow.h"
29a69a01cdSopenharmony_ci#include "special_test_flow.h"
30a69a01cdSopenharmony_ci#include "focus_test_flow.h"
31a69a01cdSopenharmony_ci#include "system_ability_definition.h"
32a69a01cdSopenharmony_ci#include "test_flow_factory.h"
33a69a01cdSopenharmony_ci
34a69a01cdSopenharmony_cinamespace OHOS {
35a69a01cdSopenharmony_cinamespace WuKong {
36a69a01cdSopenharmony_cinamespace {
37a69a01cdSopenharmony_ciconst std::string WUKONG_TOOL_NAME = "wukong";
38a69a01cdSopenharmony_ci
39a69a01cdSopenharmony_ciconst std::string WUKONG_TOOL_VERSION = "version: 3.2.0.0\n";
40a69a01cdSopenharmony_ci
41a69a01cdSopenharmony_ciconst std::string ACE_ENABLE = "param set persist.ace.testmode.enabled 1";
42a69a01cdSopenharmony_ci
43a69a01cdSopenharmony_ciconst std::string WUKONG_HELP_MSG =
44a69a01cdSopenharmony_ci    "usage: wukong <command> [<arguments>]\n"
45a69a01cdSopenharmony_ci    "These are common wukong command list:\n"
46a69a01cdSopenharmony_ci    "   help                       wukong help information\n"
47a69a01cdSopenharmony_ci    "   -v/--version               wukong version\n"
48a69a01cdSopenharmony_ci    "   exec                       run random test\n"
49a69a01cdSopenharmony_ci    "   special                    run special test\n"
50a69a01cdSopenharmony_ci    "   focus                      run focus test\n"
51a69a01cdSopenharmony_ci    "   appinfo                    show all app information\n";
52a69a01cdSopenharmony_ci}  // namespace
53a69a01cdSopenharmony_ci
54a69a01cdSopenharmony_ciWuKongShellCommand::WuKongShellCommand(int argc, char *argv[]) : ShellCommand(argc, argv, WUKONG_TOOL_NAME)
55a69a01cdSopenharmony_ci{
56a69a01cdSopenharmony_ci}
57a69a01cdSopenharmony_ci
58a69a01cdSopenharmony_ciErrCode WuKongShellCommand::init()
59a69a01cdSopenharmony_ci{
60a69a01cdSopenharmony_ci    return OHOS::ERR_OK;
61a69a01cdSopenharmony_ci}
62a69a01cdSopenharmony_ci
63a69a01cdSopenharmony_ciErrCode WuKongShellCommand::CreateCommandMap()
64a69a01cdSopenharmony_ci{
65a69a01cdSopenharmony_ci    TRACK_LOG_STD();
66a69a01cdSopenharmony_ci    commandMap_ = {
67a69a01cdSopenharmony_ci        {"--version", [this] () { return WuKongShellCommand::GetWuKongVersion(); }},
68a69a01cdSopenharmony_ci        {"-v", [this] () { return WuKongShellCommand::GetWuKongVersion(); }},
69a69a01cdSopenharmony_ci        {"help", [this] () { return WuKongShellCommand::RunAsHelpCommand(); }},
70a69a01cdSopenharmony_ci        {"stop", [this] () { return WuKongShellCommand::RunStopCommand(); }},
71a69a01cdSopenharmony_ci        {"exec", [this] () { return WuKongShellCommand::RunTestCommand(); }},
72a69a01cdSopenharmony_ci        {"special", [this] () { return WuKongShellCommand::RunTestCommand(); }},
73a69a01cdSopenharmony_ci        {"focus", [this] () { return WuKongShellCommand::RunTestCommand(); }},
74a69a01cdSopenharmony_ci        {"appinfo", [this] () { return WuKongShellCommand::ShowAllAppInfo(); }},
75a69a01cdSopenharmony_ci    };
76a69a01cdSopenharmony_ci    TRACK_LOG_END();
77a69a01cdSopenharmony_ci    return OHOS::ERR_OK;
78a69a01cdSopenharmony_ci}
79a69a01cdSopenharmony_ci
80a69a01cdSopenharmony_ciErrCode WuKongShellCommand::CreateMessageMap()
81a69a01cdSopenharmony_ci{
82a69a01cdSopenharmony_ci    TRACK_LOG_STD();
83a69a01cdSopenharmony_ci    messageMap_ = {
84a69a01cdSopenharmony_ci        {
85a69a01cdSopenharmony_ci            ERR_APPEXECFWK_INSTALL_INTERNAL_ERROR,
86a69a01cdSopenharmony_ci            "error: wukong internal error.",
87a69a01cdSopenharmony_ci        },
88a69a01cdSopenharmony_ci    };
89a69a01cdSopenharmony_ci    TRACK_LOG_END();
90a69a01cdSopenharmony_ci    return OHOS::ERR_OK;
91a69a01cdSopenharmony_ci}
92a69a01cdSopenharmony_ci
93a69a01cdSopenharmony_ciErrCode WuKongShellCommand::GetWuKongVersion()
94a69a01cdSopenharmony_ci{
95a69a01cdSopenharmony_ci    resultReceiver_ = WUKONG_TOOL_VERSION;
96a69a01cdSopenharmony_ci    return OHOS::ERR_OK;
97a69a01cdSopenharmony_ci}
98a69a01cdSopenharmony_ci
99a69a01cdSopenharmony_ciErrCode WuKongShellCommand::RunStopCommand()
100a69a01cdSopenharmony_ci{
101a69a01cdSopenharmony_ci    WukongSemaphore sem(SEMPHORE_STOP_NAME, 1);
102a69a01cdSopenharmony_ci    sem.Open();
103a69a01cdSopenharmony_ci    if (sem.GetValue() == 0) {
104a69a01cdSopenharmony_ci        sem.Post();
105a69a01cdSopenharmony_ci    }
106a69a01cdSopenharmony_ci    sem.Close();
107a69a01cdSopenharmony_ci    return OHOS::ERR_OK;
108a69a01cdSopenharmony_ci}
109a69a01cdSopenharmony_ci
110a69a01cdSopenharmony_ciErrCode WuKongShellCommand::RunTestCommand()
111a69a01cdSopenharmony_ci{
112a69a01cdSopenharmony_ci    TRACK_LOG_STD();
113a69a01cdSopenharmony_ci    // get testFlow by cmd_ of ShellCommand
114a69a01cdSopenharmony_ci    std::shared_ptr<TestFlow> testFlow = TestFlowFactory::GetTestFlow(*this, cmd_);
115a69a01cdSopenharmony_ci    if (testFlow == nullptr) {
116a69a01cdSopenharmony_ci        ERROR_LOG_STR("GetTestFlow TestFlow is null command (%s)", cmd_.c_str());
117a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_VALUE;
118a69a01cdSopenharmony_ci    }
119a69a01cdSopenharmony_ci
120a69a01cdSopenharmony_ci    auto cm = ComponentManager::GetInstance();
121a69a01cdSopenharmony_ci    if (cm == nullptr) {
122a69a01cdSopenharmony_ci        ERROR_LOG("cm is nullptr");
123a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_VALUE;
124a69a01cdSopenharmony_ci    }
125a69a01cdSopenharmony_ci    uint32_t handle = cm->AddRegisterListener(testFlow);
126a69a01cdSopenharmony_ci
127a69a01cdSopenharmony_ci    // check the command arguments
128a69a01cdSopenharmony_ci    // if argument is not ok, exit wukong command.
129a69a01cdSopenharmony_ci    ErrCode res = testFlow->CheckVaildityCmd();
130a69a01cdSopenharmony_ci    if (res != OHOS::ERR_OK) {
131a69a01cdSopenharmony_ci        DEBUG_LOG("Command arguments is invalid and exit");
132a69a01cdSopenharmony_ci        return res;
133a69a01cdSopenharmony_ci    }
134a69a01cdSopenharmony_ci
135a69a01cdSopenharmony_ci    // connect to accessibility
136a69a01cdSopenharmony_ci    if (!cm->Connect()) {
137a69a01cdSopenharmony_ci        ERROR_LOG("ComponentManager Connect failed");
138a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_OPERATION;
139a69a01cdSopenharmony_ci    }
140a69a01cdSopenharmony_ci    DEBUG_LOG("connected successfully");
141a69a01cdSopenharmony_ci
142a69a01cdSopenharmony_ci    auto aacPtr = OHOS::Accessibility::AccessibilityUITestAbility::GetInstance();
143a69a01cdSopenharmony_ci    OHOS::Accessibility::AccessibilityElementInfo root;
144a69a01cdSopenharmony_ci    if (aacPtr->GetRoot(root) != Accessibility::RET_OK) {
145a69a01cdSopenharmony_ci        system(ACE_ENABLE.c_str());
146a69a01cdSopenharmony_ci    }
147a69a01cdSopenharmony_ci    // run test flow.
148a69a01cdSopenharmony_ci    res = testFlow->Run();
149a69a01cdSopenharmony_ci    if (res != OHOS::ERR_OK) {
150a69a01cdSopenharmony_ci        DEBUG_LOG("Test flow run failed");
151a69a01cdSopenharmony_ci    }
152a69a01cdSopenharmony_ci    cm->Disconnect();
153a69a01cdSopenharmony_ci    cm->DeleteRegisterListener(handle);
154a69a01cdSopenharmony_ci
155a69a01cdSopenharmony_ci    TRACK_LOG_END();
156a69a01cdSopenharmony_ci    return res;
157a69a01cdSopenharmony_ci}
158a69a01cdSopenharmony_ci
159a69a01cdSopenharmony_ciErrCode WuKongShellCommand::RunAsHelpCommand()
160a69a01cdSopenharmony_ci{
161a69a01cdSopenharmony_ci    TRACK_LOG_STD();
162a69a01cdSopenharmony_ci    resultReceiver_.append(WUKONG_HELP_MSG);
163a69a01cdSopenharmony_ci    TRACK_LOG_END();
164a69a01cdSopenharmony_ci    return OHOS::ERR_OK;
165a69a01cdSopenharmony_ci}
166a69a01cdSopenharmony_ci
167a69a01cdSopenharmony_cichar **WuKongShellCommand::GetArgv()
168a69a01cdSopenharmony_ci{
169a69a01cdSopenharmony_ci    return argv_;
170a69a01cdSopenharmony_ci}
171a69a01cdSopenharmony_ci
172a69a01cdSopenharmony_ciint WuKongShellCommand::GetArgc()
173a69a01cdSopenharmony_ci{
174a69a01cdSopenharmony_ci    return argc_;
175a69a01cdSopenharmony_ci}
176a69a01cdSopenharmony_ci
177a69a01cdSopenharmony_civoid WuKongShellCommand::ResultReceiverAppend(const std::string receiver)
178a69a01cdSopenharmony_ci{
179a69a01cdSopenharmony_ci    resultReceiver_.append(receiver);
180a69a01cdSopenharmony_ci}
181a69a01cdSopenharmony_ci
182a69a01cdSopenharmony_ciErrCode WuKongShellCommand::ShowAllAppInfo()
183a69a01cdSopenharmony_ci{
184a69a01cdSopenharmony_ci    TRACK_LOG_STD();
185a69a01cdSopenharmony_ci    ErrCode result = WuKongUtil::GetInstance()->GetAllAppInfo();
186a69a01cdSopenharmony_ci    if (result != OHOS::ERR_OK) {
187a69a01cdSopenharmony_ci        return result;
188a69a01cdSopenharmony_ci    }
189a69a01cdSopenharmony_ci    DEBUG_LOG_STR("GetAllAppInfo result: (%u)", result);
190a69a01cdSopenharmony_ci    std::vector<std::string> bundleList;
191a69a01cdSopenharmony_ci    std::vector<std::string> abilityList;
192a69a01cdSopenharmony_ci    std::string iconpath;
193a69a01cdSopenharmony_ci    WuKongUtil::GetInstance()->GetIconPath(iconpath);
194a69a01cdSopenharmony_ci    WuKongUtil::GetInstance()->GetBundleList(bundleList, abilityList);
195a69a01cdSopenharmony_ci
196a69a01cdSopenharmony_ci    std::stringstream appInfo;
197a69a01cdSopenharmony_ci    DEBUG_LOG_STR("bundleList size: (%u)", bundleList.size());
198a69a01cdSopenharmony_ci    for (unsigned index = 0; index < bundleList.size(); index++) {
199a69a01cdSopenharmony_ci        DEBUG_LOG_STR("Bundle Name: (%s), Ability Name: (%s)", bundleList[index].c_str(), abilityList[index].c_str());
200a69a01cdSopenharmony_ci        appInfo << "BundleName:  " << bundleList[index] << std::endl;
201a69a01cdSopenharmony_ci        appInfo << "AbilityName:  " << abilityList[index] << std::endl;
202a69a01cdSopenharmony_ci        DEBUG_LOG_STR("IconPath: %s", iconpath.c_str());
203a69a01cdSopenharmony_ci    }
204a69a01cdSopenharmony_ci    resultReceiver_.append(appInfo.str());
205a69a01cdSopenharmony_ci    TRACK_LOG_END();
206a69a01cdSopenharmony_ci    return result;
207a69a01cdSopenharmony_ci}
208a69a01cdSopenharmony_ci}  // namespace WuKong
209a69a01cdSopenharmony_ci}  // namespace OHOS
210