diff --git a/test/systemtest/common/bms/bms_app_control_host_test/BUILD.gn b/test/systemtest/common/bms/bms_app_control_host_test/BUILD.gn index e47c8077c3a232a24ee84429b23264a56c999ecd..c4edc4baacf20e249cc2d2468c2cb6f3dc86b49d 100644 --- a/test/systemtest/common/bms/bms_app_control_host_test/BUILD.gn +++ b/test/systemtest/common/bms/bms_app_control_host_test/BUILD.gn @@ -44,8 +44,42 @@ ohos_systemtest("BmsAppControlHostTest") { ] } +ohos_systemtest("BmsAppControlSystemTest") { + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + module_out_path = module_output_path + + sources = [ "bms_app_control_system_test.cpp" ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + deps = [ + "${base_path}:appexecfwk_base", + "${bundle_framework_path}/test/sceneProject/systemtest/stMatchShareBundle/matchShareBundle1:matchShareBundle1", + "${common_path}:libappexecfwk_common", + "${core_path}:appexecfwk_core", + ] + + defines = [ "APP_LOG_TAG = \"BundleMgrTool\"" ] + + external_deps = [ + "c_utils:utils", + "googletest:gtest_main", + "hilog:libhilog", + "ipc:ipc_core", + "samgr:samgr_proxy", + ] +} + group("systemtest") { testonly = true - deps = [ ":BmsAppControlHostTest" ] + deps = [ + ":BmsAppControlHostTest", + ":BmsAppControlSystemTest", + ] } diff --git a/test/systemtest/common/bms/bms_app_control_host_test/bms_app_control_system_test.cpp b/test/systemtest/common/bms/bms_app_control_host_test/bms_app_control_system_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c0384bea60399468d0d1cae3647159ef66f783a2 --- /dev/null +++ b/test/systemtest/common/bms/bms_app_control_host_test/bms_app_control_system_test.cpp @@ -0,0 +1,452 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#define private public + +#include +#include +#include + +#include "app_control_host.h" +#include "app_log_wrapper.h" +#include "bundle_framework_core_ipc_interface_code.h" +#include "bundle_installer_proxy.h" +#include "bundle_mgr_interface.h" +#include "bundle_mgr_proxy.h" +#include "iservice_registry.h" +#include "status_receiver_host.h" +#include "system_ability_definition.h" + +using namespace testing::ext; +using OHOS::AAFwk::Want; + +namespace OHOS { +namespace AppExecFwk { +namespace { +const std::string THIRD_BUNDLE_PATH = "/data/test/bms_bundle/"; +const int32_t USER_ID_800 = 800; +const int32_t USER_ID_900 = 900; +const int32_t USER_ID_WRONG = 800; +const std::string APP_ID_1 = "appId_1"; +const std::string APP_ID_2 = "appId_2"; +const std::string APP_ID_WRONG = "appId_wrong"; +const std::string APP_ID = "com.example.matchshare.test_" + "BBsrVP/RIb8GjxPpn5QWCxSP6oLNCgL+YircZceAWzh0HsCrMhBIlB7SmqwDT10D/m6dQ8iKTJcAhuIzPCC1VXk="; +const std::string APP_IDENTIFIER = "5765880207856196881"; + +const std::string MSG_SUCCESS = "[SUCCESS]"; +const std::string OPERATION_FAILED = "Failure"; +const std::string OPERATION_SUCCESS = "Success"; +} // namespace + +class StatusReceiverImpl : public StatusReceiverHost { +public: + StatusReceiverImpl(); + virtual ~StatusReceiverImpl(); + void OnStatusNotify(const int progress) override; + void OnFinished(const int32_t resultCode, const std::string &resultMsg) override; + std::string GetResultMsg() const; + +private: + mutable std::promise resultMsgSignal_; + int iProgress_ = 0; + + DISALLOW_COPY_AND_MOVE(StatusReceiverImpl); +}; + +StatusReceiverImpl::StatusReceiverImpl() +{ + APP_LOGI("create status receiver instance"); +} + +StatusReceiverImpl::~StatusReceiverImpl() +{ + APP_LOGI("destroy status receiver instance"); +} + +void StatusReceiverImpl::OnFinished(const int32_t resultCode, const std::string &resultMsg) +{ + APP_LOGD("OnFinished result is %{public}d, %{public}s", resultCode, resultMsg.c_str()); + resultMsgSignal_.set_value(resultMsg); +} +void StatusReceiverImpl::OnStatusNotify(const int progress) +{ + EXPECT_GT(progress, iProgress_); + iProgress_ = progress; + APP_LOGI("OnStatusNotify progress:%{public}d", progress); +} + +std::string StatusReceiverImpl::GetResultMsg() const +{ + auto future = resultMsgSignal_.get_future(); + future.wait(); + std::string resultMsg = future.get(); + if (resultMsg == MSG_SUCCESS) { + return OPERATION_SUCCESS; + } else { + return OPERATION_FAILED + resultMsg; + } +} + +class BmsAppControlSystemTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); + + static sptr GetBundleMgrProxy(); + static sptr GetAppControlProxy(); + static sptr GetInstallerProxy(); + static void Install( + const std::string &bundleFilePath, const InstallFlag installFlag); + static void Uninstall(const std::string &bundleName); +}; + +void BmsAppControlSystemTest::SetUpTestCase() +{ + std::string bundleFilePath = THIRD_BUNDLE_PATH + "matchShareBundle1.hap"; + Install(bundleFilePath, InstallFlag::REPLACE_EXISTING); +} + +void BmsAppControlSystemTest::TearDownTestCase() +{ + Uninstall("com.example.matchshare.test"); +} + +void BmsAppControlSystemTest::SetUp() +{} + +void BmsAppControlSystemTest::TearDown() +{} + +sptr BmsAppControlSystemTest::GetBundleMgrProxy() +{ + sptr systemAbilityManager = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (!systemAbilityManager) { + APP_LOGE("fail to get system ability mgr."); + return nullptr; + } + + sptr remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); + if (!remoteObject) { + APP_LOGE("fail to get bundle manager proxy."); + return nullptr; + } + + APP_LOGI("get bundle manager proxy success."); + return iface_cast(remoteObject); +} + +sptr BmsAppControlSystemTest::GetAppControlProxy() +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + if (!bundleMgrProxy) { + APP_LOGE("bundle mgr proxy is nullptr."); + return nullptr; + } + + sptr appControlProxy = bundleMgrProxy->GetAppControlProxy(); + if (!appControlProxy) { + APP_LOGE("fail to get bundle installer proxy"); + return nullptr; + } + + APP_LOGI("get bundle installer proxy success."); + return appControlProxy; +} + +sptr BmsAppControlSystemTest::GetInstallerProxy() +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + if (!bundleMgrProxy) { + APP_LOGE("bundle mgr proxy is nullptr."); + return nullptr; + } + + sptr installerProxy = bundleMgrProxy->GetBundleInstaller(); + if (!installerProxy) { + APP_LOGE("fail to get bundle installer proxy."); + return nullptr; + } + + APP_LOGI("get bundle installer proxy success."); + return installerProxy; +} + +void BmsAppControlSystemTest::Install( + const std::string &bundleFilePath, const InstallFlag installFlag) +{ + sptr installerProxy = GetInstallerProxy(); + if (!installerProxy) { + APP_LOGE("get bundle installer failed."); + return; + } + InstallParam installParam; + installParam.installFlag = installFlag; + installParam.userId = USER_ID_900; + sptr statusReceiver = (new (std::nothrow) StatusReceiverImpl()); + EXPECT_NE(statusReceiver, nullptr); + installerProxy->Install(bundleFilePath, installParam, statusReceiver); +} + +void BmsAppControlSystemTest::Uninstall(const std::string &bundleName) +{ + sptr installerProxy = GetInstallerProxy(); + if (!installerProxy) { + APP_LOGE("get bundle installer failed."); + return; + } + + if (bundleName.empty()) { + APP_LOGE("bundelname is null."); + return; + } + InstallParam installParam; + installParam.userId = USER_ID_900; + sptr statusReceiver = (new (std::nothrow) StatusReceiverImpl()); + EXPECT_NE(statusReceiver, nullptr); + installerProxy->Uninstall(bundleName, installParam, statusReceiver); +} + +/** + * @tc.number: GetDisposedRule_0100 + * @tc.name: test the GetDisposedRule_0100 + * @tc.desc: GetDisposedRule_0100 + */ +HWTEST_F(BmsAppControlSystemTest, GetDisposedRule_0100, Function | MediumTest | Level1) +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + ASSERT_NE(bundleMgrProxy, nullptr); + sptr appControlProxy = bundleMgrProxy->GetAppControlProxy(); + ASSERT_NE(appControlProxy, nullptr); + + DisposedRule rule; + ErrCode result = appControlProxy->GetDisposedRule(APP_ID_1, rule, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule.setTime, 0); + + DisposedRule rule2; + result = appControlProxy->SetDisposedRule(APP_ID_1, rule2, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule3; + result = appControlProxy->GetDisposedRule(APP_ID_1, rule3, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule3.setTime, 0); + + DisposedRule rule4; + result = appControlProxy->GetDisposedRule(APP_ID_1, rule4, USER_ID_WRONG); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule3.setTime, 0); + + DisposedRule rule5; + result = appControlProxy->GetDisposedRule(APP_ID_WRONG, rule5, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule5.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_ID_1, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule6; + result = appControlProxy->SetDisposedRule(APP_ID, rule6, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule7; + result = appControlProxy->GetDisposedRule(APP_IDENTIFIER, rule7, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule7.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_ID, USER_ID_900); + EXPECT_EQ(result, ERR_OK); +} + +/** + * @tc.number: SetDisposedRule_0100 + * @tc.name: test the SetDisposedRule_0100 + * @tc.desc: SetDisposedRule_0100 + */ +HWTEST_F(BmsAppControlSystemTest, SetDisposedRule_0100, Function | MediumTest | Level1) +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + ASSERT_NE(bundleMgrProxy, nullptr); + sptr appControlProxy = bundleMgrProxy->GetAppControlProxy(); + ASSERT_NE(appControlProxy, nullptr); + + DisposedRule rule1; + ErrCode result = appControlProxy->SetDisposedRule(APP_ID_1, rule1, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule2; + result = appControlProxy->GetDisposedRule(APP_ID_1, rule2, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule2.setTime, 0); + + DisposedRule rule3; + result = appControlProxy->SetDisposedRule(APP_ID_2, rule3, USER_ID_800); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule4; + result = appControlProxy->GetDisposedRule(APP_ID_2, rule4, USER_ID_800); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule4.setTime, 0); + + DisposedRule rule5; + result = appControlProxy->GetDisposedRule(APP_ID_2, rule5, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule5.setTime, 0); + + DisposedRule rule6; + result = appControlProxy->SetDisposedRule(APP_ID_1, rule6, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule7; + result = appControlProxy->GetDisposedRule(APP_ID_1, rule7, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule7.setTime, 0); + EXPECT_TRUE(rule7.setTime > rule2.setTime); + + result = appControlProxy->DeleteDisposedStatus(APP_ID_1, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + result = appControlProxy->DeleteDisposedStatus(APP_ID_2, USER_ID_800); + EXPECT_EQ(result, ERR_OK); +} + +/** + * @tc.number: SetDisposedRule_0200 + * @tc.name: test the SetDisposedRule_0200 + * @tc.desc: SetDisposedRule_0200 + */ +HWTEST_F(BmsAppControlSystemTest, SetDisposedRule_0200, Function | MediumTest | Level1) +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + ASSERT_NE(bundleMgrProxy, nullptr); + sptr appControlProxy = bundleMgrProxy->GetAppControlProxy(); + ASSERT_NE(appControlProxy, nullptr); + + DisposedRule rule1; + ErrCode result = appControlProxy->SetDisposedRule(APP_ID, rule1, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule2; + result = appControlProxy->GetDisposedRule(APP_ID, rule2, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule2.setTime, 0); + + DisposedRule rule3; + result = appControlProxy->SetDisposedRule(APP_IDENTIFIER, rule3, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule4; + result = appControlProxy->GetDisposedRule(APP_ID, rule4, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule4.setTime, 0); + + DisposedRule rule5; + result = appControlProxy->GetDisposedRule(APP_IDENTIFIER, rule5, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule5.setTime, 0); + + DisposedRule rule6; + result = appControlProxy->SetDisposedRule(APP_ID, rule6, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule7; + result = appControlProxy->GetDisposedRule(APP_ID, rule7, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule7.setTime, 0); + + DisposedRule rule8; + result = appControlProxy->GetDisposedRule(APP_IDENTIFIER, rule8, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule8.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_ID, USER_ID_900); + EXPECT_EQ(result, ERR_OK); +} + +/** + * @tc.number: DeleteDisposedRule_0100 + * @tc.name: test the DeleteDisposedRule_0100 + * @tc.desc: DeleteDisposedRule_0100 + */ +HWTEST_F(BmsAppControlSystemTest, DeleteDisposedRule_0100, Function | MediumTest | Level1) +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + ASSERT_NE(bundleMgrProxy, nullptr); + sptr appControlProxy = bundleMgrProxy->GetAppControlProxy(); + ASSERT_NE(appControlProxy, nullptr); + + DisposedRule rule1; + ErrCode result = appControlProxy->SetDisposedRule(APP_ID, rule1, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule2; + result = appControlProxy->GetDisposedRule(APP_ID, rule2, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule2.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_IDENTIFIER, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule3; + result = appControlProxy->GetDisposedRule(APP_ID, rule3, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule3.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_ID, USER_ID_WRONG); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule4; + result = appControlProxy->GetDisposedRule(APP_ID, rule4, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule4.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_ID, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule5; + result = appControlProxy->GetDisposedRule(APP_ID, rule5, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule5.setTime, 0); + + DisposedRule rule6; + result = appControlProxy->SetDisposedRule(APP_IDENTIFIER, rule6, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule7; + result = appControlProxy->GetDisposedRule(APP_IDENTIFIER, rule7, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule7.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_ID, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule8; + result = appControlProxy->GetDisposedRule(APP_IDENTIFIER, rule8, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_NE(rule8.setTime, 0); + + result = appControlProxy->DeleteDisposedStatus(APP_IDENTIFIER, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + + DisposedRule rule9; + result = appControlProxy->GetDisposedRule(APP_IDENTIFIER, rule9, USER_ID_900); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(rule9.setTime, 0); +} +} // AppExecFwk +} // OHOS \ No newline at end of file