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