1886da342Sopenharmony_ci/* 2886da342Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3886da342Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4886da342Sopenharmony_ci * you may not use this file except in compliance with the License. 5886da342Sopenharmony_ci * You may obtain a copy of the License at 6886da342Sopenharmony_ci * 7886da342Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8886da342Sopenharmony_ci * 9886da342Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10886da342Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11886da342Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12886da342Sopenharmony_ci * See the License for the specific language governing permissions and 13886da342Sopenharmony_ci * limitations under the License. 14886da342Sopenharmony_ci */ 15886da342Sopenharmony_ci 16886da342Sopenharmony_ci#include "test_server_client.h" 17886da342Sopenharmony_ci 18886da342Sopenharmony_ci#include "hilog/log.h" 19886da342Sopenharmony_ci#include "iremote_broker.h" 20886da342Sopenharmony_ci#include "iservice_registry.h" 21886da342Sopenharmony_ci#include "test_server_interface_proxy.h" 22886da342Sopenharmony_ci#include "system_ability_definition.h" 23886da342Sopenharmony_ci#include "session_token.h" 24886da342Sopenharmony_ci#include "test_server_error_code.h" 25886da342Sopenharmony_ci 26886da342Sopenharmony_cinamespace OHOS::testserver { 27886da342Sopenharmony_ci using namespace OHOS::HiviewDFX; 28886da342Sopenharmony_ci static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD003110, "TestServerClient"}; 29886da342Sopenharmony_ci static constexpr int32_t TESTSERVER_LOAD_TIMEOUT_MS = 1000; // ms 30886da342Sopenharmony_ci 31886da342Sopenharmony_ci TestServerClient &TestServerClient::GetInstance() 32886da342Sopenharmony_ci { 33886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s called. ", __func__); 34886da342Sopenharmony_ci static TestServerClient testServerClient; 35886da342Sopenharmony_ci return testServerClient; 36886da342Sopenharmony_ci } 37886da342Sopenharmony_ci 38886da342Sopenharmony_ci class TestServerLoadCallback : public SystemAbilityLoadCallbackStub { 39886da342Sopenharmony_ci public: 40886da342Sopenharmony_ci explicit TestServerLoadCallback(int32_t systemAbilityId) : systemAbilityId_(systemAbilityId){}; 41886da342Sopenharmony_ci 42886da342Sopenharmony_ci void InitLoadState() 43886da342Sopenharmony_ci { 44886da342Sopenharmony_ci std::unique_lock<std::mutex> lock(locatorMutex_); 45886da342Sopenharmony_ci loadState_ = false; 46886da342Sopenharmony_ci } 47886da342Sopenharmony_ci 48886da342Sopenharmony_ci bool WaitLoadStateChange(int32_t systemAbilityId) 49886da342Sopenharmony_ci { 50886da342Sopenharmony_ci std::unique_lock<std::mutex> lock(locatorMutex_); 51886da342Sopenharmony_ci auto wait = locatorCond_.wait_for(lock, std::chrono::milliseconds(TESTSERVER_LOAD_TIMEOUT_MS), [this] { 52886da342Sopenharmony_ci return loadState_ == true; 53886da342Sopenharmony_ci }); 54886da342Sopenharmony_ci if (!wait) { 55886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. Locator SystemAbility [%{public}d] time out.", 56886da342Sopenharmony_ci __func__, systemAbilityId); 57886da342Sopenharmony_ci return false; 58886da342Sopenharmony_ci } 59886da342Sopenharmony_ci return true; 60886da342Sopenharmony_ci } 61886da342Sopenharmony_ci 62886da342Sopenharmony_ci sptr<IRemoteObject> GetTestServerObject() 63886da342Sopenharmony_ci { 64886da342Sopenharmony_ci return remoteObject_; 65886da342Sopenharmony_ci } 66886da342Sopenharmony_ci 67886da342Sopenharmony_ci private: 68886da342Sopenharmony_ci void OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr<IRemoteObject> &remoteObject) override 69886da342Sopenharmony_ci { 70886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s. Load SystemAbility success, systemAbilityId = [%{public}d]", 71886da342Sopenharmony_ci __func__, systemAbilityId); 72886da342Sopenharmony_ci if (systemAbilityId == systemAbilityId_) { 73886da342Sopenharmony_ci std::unique_lock<std::mutex> lock(locatorMutex_); 74886da342Sopenharmony_ci loadState_ = true; 75886da342Sopenharmony_ci remoteObject_ = remoteObject; 76886da342Sopenharmony_ci locatorCond_.notify_one(); 77886da342Sopenharmony_ci } 78886da342Sopenharmony_ci } 79886da342Sopenharmony_ci 80886da342Sopenharmony_ci void OnLoadSystemAbilityFail(int32_t systemAbilityId) override 81886da342Sopenharmony_ci { 82886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s. Load SystemAbility failed, systemAbilityId = [%{public}d]", 83886da342Sopenharmony_ci __func__, systemAbilityId); 84886da342Sopenharmony_ci std::unique_lock<std::mutex> lock(locatorMutex_); 85886da342Sopenharmony_ci loadState_ = false; 86886da342Sopenharmony_ci locatorCond_.notify_one(); 87886da342Sopenharmony_ci } 88886da342Sopenharmony_ci 89886da342Sopenharmony_ci int32_t systemAbilityId_; 90886da342Sopenharmony_ci std::condition_variable locatorCond_; 91886da342Sopenharmony_ci std::mutex locatorMutex_; 92886da342Sopenharmony_ci bool loadState_ = false; 93886da342Sopenharmony_ci sptr<IRemoteObject> remoteObject_ = nullptr; 94886da342Sopenharmony_ci }; 95886da342Sopenharmony_ci 96886da342Sopenharmony_ci sptr<ITestServerInterface> TestServerClient::LoadTestServer() 97886da342Sopenharmony_ci { 98886da342Sopenharmony_ci const int32_t systemAbilityId = TEST_SERVER_SA_ID; 99886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s called. SystemAbility [%{public}d] loading", __func__, systemAbilityId); 100886da342Sopenharmony_ci sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 101886da342Sopenharmony_ci if (samgr == nullptr) { 102886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. Get SystemAbility Manager failed!", __func__); 103886da342Sopenharmony_ci return nullptr; 104886da342Sopenharmony_ci } 105886da342Sopenharmony_ci auto object = samgr->CheckSystemAbility(systemAbilityId); 106886da342Sopenharmony_ci if (object != nullptr) { 107886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s. CheckSystemAbility [%{public}d] SUCCESS", __func__, systemAbilityId); 108886da342Sopenharmony_ci remoteObject_ = object; 109886da342Sopenharmony_ci } else { 110886da342Sopenharmony_ci auto testServerLoadCallback = sptr<TestServerLoadCallback>(new TestServerLoadCallback(systemAbilityId)); 111886da342Sopenharmony_ci testServerLoadCallback->InitLoadState(); 112886da342Sopenharmony_ci int32_t ret = samgr->LoadSystemAbility(systemAbilityId, testServerLoadCallback); 113886da342Sopenharmony_ci if (ret != ERR_NONE) { 114886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. LoadSystemAbility [%{public}d] FAILED, ret %{public}d", 115886da342Sopenharmony_ci __func__, systemAbilityId, ret); 116886da342Sopenharmony_ci return nullptr; 117886da342Sopenharmony_ci } 118886da342Sopenharmony_ci if (testServerLoadCallback->WaitLoadStateChange(systemAbilityId)) { 119886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s. LoadSystemAbility [%{public}d] SUCCESS", __func__, systemAbilityId); 120886da342Sopenharmony_ci remoteObject_ = testServerLoadCallback->GetTestServerObject(); 121886da342Sopenharmony_ci } 122886da342Sopenharmony_ci } 123886da342Sopenharmony_ci if (remoteObject_ == nullptr) { 124886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. Get SystemAbility [%{public}d] remoteObject FAILED", 125886da342Sopenharmony_ci __func__, systemAbilityId); 126886da342Sopenharmony_ci return nullptr; 127886da342Sopenharmony_ci } 128886da342Sopenharmony_ci sptr<ITestServerInterface> iTestServerInterface = iface_cast<TestServerInterfaceProxy>(remoteObject_); 129886da342Sopenharmony_ci if (iTestServerInterface == nullptr) { 130886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. Get SystemAbility [%{public}d] proxy FAILED", __func__, systemAbilityId); 131886da342Sopenharmony_ci return nullptr; 132886da342Sopenharmony_ci } 133886da342Sopenharmony_ci sptr<SessionToken> sessionToken = new (std::nothrow) SessionToken(); 134886da342Sopenharmony_ci if (iTestServerInterface->CreateSession(*sessionToken) != TEST_SERVER_OK) { 135886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. Create session FAILED", __func__); 136886da342Sopenharmony_ci return nullptr; 137886da342Sopenharmony_ci } 138886da342Sopenharmony_ci return iTestServerInterface; 139886da342Sopenharmony_ci } 140886da342Sopenharmony_ci 141886da342Sopenharmony_ci int32_t TestServerClient::SetPasteData(std::string text) 142886da342Sopenharmony_ci { 143886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s called.", __func__); 144886da342Sopenharmony_ci auto iTestServerInterface = LoadTestServer(); 145886da342Sopenharmony_ci if (iTestServerInterface == nullptr) { 146886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. Get iTestServerInterface FAILED", __func__); 147886da342Sopenharmony_ci return TEST_SERVER_GET_INTERFACE_FAILED; 148886da342Sopenharmony_ci } 149886da342Sopenharmony_ci return iTestServerInterface->SetPasteData(text); 150886da342Sopenharmony_ci } 151886da342Sopenharmony_ci 152886da342Sopenharmony_ci bool TestServerClient::PublishCommonEvent(const EventFwk::CommonEventData &event) 153886da342Sopenharmony_ci { 154886da342Sopenharmony_ci HiLog::Info(LABEL, "%{public}s called.", __func__); 155886da342Sopenharmony_ci auto iTestServerInterface = LoadTestServer(); 156886da342Sopenharmony_ci if (iTestServerInterface == nullptr) { 157886da342Sopenharmony_ci HiLog::Error(LABEL, "%{public}s. Get iTestServerInterface FAILED", __func__); 158886da342Sopenharmony_ci return TEST_SERVER_GET_INTERFACE_FAILED; 159886da342Sopenharmony_ci } 160886da342Sopenharmony_ci bool result = false; 161886da342Sopenharmony_ci iTestServerInterface->PublishCommonEvent(event, result); 162886da342Sopenharmony_ci return result; 163886da342Sopenharmony_ci } 164886da342Sopenharmony_ci} // namespace OHOS::testserver