From 3231599407a79e7d65d1c2afe67d62afb49a8d4b Mon Sep 17 00:00:00 2001 From: "zhaoyuan17@huawei.com" Date: Mon, 18 Oct 2021 14:49:07 +0800 Subject: [PATCH 1/7] fms st Signed-off-by: zhaoyuan17@huawei.com --- .../appexecfwk_base/include/form_constants.h | 2 + .../appexecfwk_base/include/form_js_info.h | 100 +- .../appexecfwk_base/src/form_info.cpp | 7 +- .../appexecfwk_base/src/form_js_info.cpp | 7 +- .../src/form_provider_data.cpp | 9 +- .../src/form_provider_info.cpp | 5 +- .../include/formmgr/form_mgr_interface.h | 22 + .../include/formmgr/form_mgr_proxy.h | 19 + .../include/formmgr/form_mgr_stub.h | 22 + .../src/formmgr/form_mgr_proxy.cpp | 45 + .../src/formmgr/form_mgr_stub.cpp | 63 + .../fmskit/native/include/form_mgr.h | 14 + .../innerkits/fmskit/native/src/form_mgr.cpp | 18 +- ohos.build | 1 + services/formmgr/include/form_data_mgr.h | 5 + services/formmgr/include/form_db_info.h | 14 +- services/formmgr/include/form_mgr_adapter.h | 53 +- services/formmgr/include/form_mgr_service.h | 24 +- services/formmgr/include/form_record.h | 1 + services/formmgr/include/form_timer_mgr.h | 24 +- services/formmgr/src/form_ams_helper.cpp | 2 +- services/formmgr/src/form_data_mgr.cpp | 16 + services/formmgr/src/form_mgr_adapter.cpp | 265 +++- services/formmgr/src/form_mgr_service.cpp | 67 +- .../formmgr/src/form_sys_event_receiver.cpp | 5 +- services/formmgr/src/form_timer_mgr.cpp | 62 + .../test/mock/include/mock_bundle_manager.h | 123 +- .../BUILD.gn | 1 + .../BUILD.gn | 1 + .../BUILD.gn | 1 + .../fmsSystemTestHostCommonA-signed.hap | Bin 0 -> 143428 bytes .../fmsSystemTestHostCommonB-signed.hap | Bin 0 -> 143349 bytes .../native/fmsSystemTestHostNoPerm-signed.hap | Bin 0 -> 114615 bytes .../native/fmsSystemTestHostNormal-signed.hap | Bin 0 -> 205485 bytes .../fmsSystemTestHostNormalB-signed.hap | Bin 0 -> 146540 bytes .../fmsSystemTestHostNormalC-signed.hap | Bin 0 -> 144224 bytes .../native/fmsSystemTestHostNotSys-signed.hap | Bin 0 -> 114356 bytes .../native/formSystemTestServiceA-signed.hap | Bin 0 -> 119413 bytes .../native/formSystemTestServiceB-signed.hap | Bin 0 -> 119484 bytes .../fmsSystemTestSelfStartingA-signed.hap | Bin 0 -> 113144 bytes .../fmsSystemTestSelfStartingB-signed.hap | Bin 0 -> 113353 bytes test/resource/formsystemtestability/BUILD.gn | 20 +- .../fmsSystemPerformance/BUILD.gn | 70 + .../fmsSystemPerformance/config.json | 80 ++ .../include/form_ability_performance.h | 98 ++ .../src/form_ability_performance.cpp | 373 +++++ .../fmsSystemStress/BUILD.gn | 70 + .../fmsSystemStress/config.json | 80 ++ .../include/form_ability_stress.h | 119 ++ .../src/form_ability_stress.cpp | 630 +++++++++ .../fmsSystemTestHostCommonA/BUILD.gn | 80 ++ .../fmsSystemTestHostCommonA/config.json | 80 ++ .../include/form_ability_commona.h | 78 ++ .../src/form_ability_commona.cpp | 219 +++ .../fmsSystemTestHostCommonB/BUILD.gn | 80 ++ .../fmsSystemTestHostCommonB/config.json | 80 ++ .../include/form_ability_commonb.h | 78 ++ .../src/form_ability_commonb.cpp | 216 +++ .../fmsSystemTestHostNoPerm/BUILD.gn | 70 + .../fmsSystemTestHostNoPerm/config.json | 60 + .../include/form_ability_no_perm.h | 81 ++ .../src/form_ability_no_perm.cpp | 182 +++ .../fmsSystemTestHostNormal/BUILD.gn | 82 ++ .../fmsSystemTestHostNormal/config.json | 122 ++ .../include/form_ability_a.h | 121 ++ .../include/form_ability_deleteform.h | 119 ++ .../include/form_ability_releaseform.h | 104 ++ .../src/form_ability_a.cpp | 904 ++++++++++++ .../src/form_ability_deleteform.cpp | 905 ++++++++++++ .../src/form_ability_releaseform.cpp | 636 +++++++++ .../fmsSystemTestHostNormalB/BUILD.gn | 80 ++ .../fmsSystemTestHostNormalB/config.json | 80 ++ .../include/form_ability_b.h | 94 ++ .../src/form_ability_b.cpp | 392 ++++++ .../fmsSystemTestHostNormalC/BUILD.gn | 80 ++ .../fmsSystemTestHostNormalC/config.json | 80 ++ .../include/form_ability_c.h | 90 ++ .../src/form_ability_c.cpp | 267 ++++ .../fmsSystemTestHostNotSys/BUILD.gn | 70 + .../fmsSystemTestHostNotSys/config.json | 80 ++ .../include/form_ability_not_sys.h | 81 ++ .../src/form_ability_not_sys.cpp | 180 +++ .../selfStartingTestHostA/BUILD.gn | 70 + .../selfStartingTestHostA/config.json | 80 ++ .../include/form_ability_self_starting_a.h | 82 ++ .../src/form_ability_self_starting_a.cpp | 173 +++ .../selfStartingTestHostB/BUILD.gn | 70 + .../selfStartingTestHostB/config.json | 80 ++ .../include/form_ability_self_starting_b.h | 83 ++ .../src/form_ability_self_starting_b.cpp | 193 +++ .../fmsSystemTestUninstallApp/BUILD.gn | 70 + .../fmsSystemTestUninstallApp/config.json | 80 ++ .../include/form_ability_uninstall_app.h | 105 ++ .../src/form_ability_uninstall_app.cpp | 388 ++++++ .../formSystemTestServiceA/config.json | 75 +- .../include/form_st_service_ability_A.h | 1 + .../src/form_st_service_ability_A.cpp | 2 +- .../formSystemTestServiceB/BUILD.gn | 58 + .../formSystemTestServiceB/config.json | 107 ++ .../include/form_st_service_ability_B.h} | 36 +- .../src/form_st_service_ability_B.cpp | 373 +++++ .../formSystemTestServiceC/BUILD.gn | 58 + .../formSystemTestServiceC/config.json | 87 ++ .../include/form_st_service_ability_C.h | 142 ++ .../src/form_st_service_ability_C.cpp} | 196 ++- .../formSystemTestServiceD/BUILD.gn | 58 + .../formSystemTestServiceD/config.json | 87 ++ .../include/form_st_service_ability_D.h | 142 ++ .../src/form_st_service_ability_D.cpp | 370 +++++ .../formSystemTestServiceE/BUILD.gn | 58 + .../formSystemTestServiceE/config.json | 87 ++ .../include/form_st_service_ability_E.h | 142 ++ .../src/form_st_service_ability_E.cpp | 370 +++++ .../tool/include/form_test_utils.h | 40 + .../tool/src/form_test_utils.cpp | 45 + test/systemtest/BUILD.gn | 1 + test/systemtest/common/fms/BUILD.gn | 45 + .../common/fms/common/include/form_event.h | 47 + .../fms/common/include/form_st_common_info.h | 428 ++++++ .../include/install_tool_status_receiver.h | 74 + .../common/include/system_test_form_util.h | 350 +++++ .../common/fms/common/src/form_event.cpp | 124 ++ .../fms/common/src/system_test_form_util.cpp | 686 ++++++++++ .../common/fms/fms_acquire_form_test/BUILD.gn | 73 + .../fms_acquire_form_test.cpp | 1202 ++++++++++++++++ .../fms/fms_acquire_form_test_max/BUILD.gn | 73 + .../fms_acquire_form_test_batch.cpp | 846 ++++++++++++ .../fms_acquire_form_test_max.cpp | 766 +++++++++++ .../common/fms/fms_delete_form_test/BUILD.gn | 73 + .../fms_delete_form_test.cpp | 1210 +++++++++++++++++ .../common/fms/fms_fuzz_test/BUILD.gn | 73 + .../fms_fuzz_test_config/config.json | 29 + .../include/fuzz_test_config_parser.h | 79 ++ .../fms_fuzz_test/include/fuzz_test_manager.h | 58 + .../fms/fms_fuzz_test/include/get_param.h | 394 ++++++ .../fms/fms_fuzz_test/src/fms_fuzz_test.cpp | 73 + .../fms_fuzz_test/src/fuzz_test_manager.cpp | 217 +++ .../fms/fms_fuzz_test/src/get_param.cpp | 477 +++++++ .../test_lib/formManagerFuzzTest | Bin 0 -> 246288 bytes .../common/fms/fms_performance_test/BUILD.gn | 73 + .../fms_performance_config.json | 3 + .../fms_performance_test.cpp | 816 +++++++++++ .../performance_config_parser.h | 57 + .../common/fms/fms_release_form_test/BUILD.gn | 73 + .../fms_release_form_test.cpp | 800 +++++++++++ .../fms/fms_self_starting_test/BUILD.gn | 73 + .../fms_acquire_forms_and_self_starting.sh | 56 + .../fms_check_self_starting.sh | 47 + .../fms_self_starting_test.cpp | 215 +++ .../common/fms/fms_stress_test/BUILD.gn | 73 + .../fms/fms_stress_test/fms_stress_test.cpp | 627 +++++++++ .../fms_stress_test_config.json | 4 + .../stress_test_config_parser.h | 63 + .../fms/fms_uninstall_app_test/BUILD.gn | 73 + .../fms_uninstall_app_test.cpp | 331 +++++ .../fms_uninstall_app_test_config.json | 4 + .../uninstall_app_test_config_parser.h | 63 + tools/fm/src/fms_command.cpp | 2 +- 158 files changed, 22872 insertions(+), 396 deletions(-) create mode 100644 test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostCommonA-signed.hap create mode 100644 test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostCommonB-signed.hap create mode 100644 test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNoPerm-signed.hap create mode 100644 test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNormal-signed.hap create mode 100644 test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNormalB-signed.hap create mode 100644 test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNormalC-signed.hap create mode 100644 test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNotSys-signed.hap create mode 100644 test/resource/fms/fms_provider_ability_bundle/native/formSystemTestServiceA-signed.hap create mode 100644 test/resource/fms/fms_provider_ability_bundle/native/formSystemTestServiceB-signed.hap create mode 100644 test/resource/fms/fms_self_starting_host_bundle/fmsSystemTestSelfStartingA-signed.hap create mode 100644 test/resource/fms/fms_self_starting_host_bundle/fmsSystemTestSelfStartingB-signed.hap create mode 100755 test/resource/formsystemtestability/fmsSystemPerformance/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemPerformance/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemPerformance/include/form_ability_performance.h create mode 100644 test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemStress/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemStress/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h create mode 100644 test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonA/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonA/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonA/include/form_ability_commona.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonB/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonB/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonB/include/form_ability_commonb.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestHostNoPerm/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNoPerm/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNoPerm/include/form_ability_no_perm.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNoPerm/src/form_ability_no_perm.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestHostNormal/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormal/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_deleteform.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_releaseform.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_releaseform.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestHostNormalB/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormalB/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormalB/include/form_ability_b.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestHostNormalC/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormalC/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestHostNotSys/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNotSys/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNotSys/include/form_ability_not_sys.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestHostNotSys/src/form_ability_not_sys.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/include/form_ability_self_starting_a.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/src/form_ability_self_starting_a.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/include/form_ability_self_starting_b.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/src/form_ability_self_starting_b.cpp create mode 100755 test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn create mode 100644 test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json create mode 100644 test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h create mode 100644 test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp create mode 100644 test/resource/formsystemtestability/formSystemTestServiceB/BUILD.gn create mode 100644 test/resource/formsystemtestability/formSystemTestServiceB/config.json rename test/resource/formsystemtestability/{formSystemTestServiceA/include/form_st_service_ability_a1.h => formSystemTestServiceB/include/form_st_service_ability_B.h} (76%) mode change 100755 => 100644 create mode 100644 test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp create mode 100644 test/resource/formsystemtestability/formSystemTestServiceC/BUILD.gn create mode 100644 test/resource/formsystemtestability/formSystemTestServiceC/config.json create mode 100644 test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h rename test/resource/formsystemtestability/{formSystemTestServiceA/src/form_st_service_ability_a1.cpp => formSystemTestServiceC/src/form_st_service_ability_C.cpp} (48%) mode change 100755 => 100644 create mode 100644 test/resource/formsystemtestability/formSystemTestServiceD/BUILD.gn create mode 100644 test/resource/formsystemtestability/formSystemTestServiceD/config.json create mode 100644 test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h create mode 100644 test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp create mode 100644 test/resource/formsystemtestability/formSystemTestServiceE/BUILD.gn create mode 100644 test/resource/formsystemtestability/formSystemTestServiceE/config.json create mode 100644 test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h create mode 100644 test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp create mode 100644 test/resource/formsystemtestability/tool/include/form_test_utils.h create mode 100644 test/resource/formsystemtestability/tool/src/form_test_utils.cpp create mode 100755 test/systemtest/common/fms/BUILD.gn create mode 100644 test/systemtest/common/fms/common/include/form_event.h create mode 100644 test/systemtest/common/fms/common/include/form_st_common_info.h create mode 100644 test/systemtest/common/fms/common/include/install_tool_status_receiver.h create mode 100644 test/systemtest/common/fms/common/include/system_test_form_util.h create mode 100644 test/systemtest/common/fms/common/src/form_event.cpp create mode 100644 test/systemtest/common/fms/common/src/system_test_form_util.cpp create mode 100644 test/systemtest/common/fms/fms_acquire_form_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp create mode 100644 test/systemtest/common/fms/fms_acquire_form_test_max/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp create mode 100644 test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp create mode 100644 test/systemtest/common/fms/fms_delete_form_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp create mode 100644 test/systemtest/common/fms/fms_fuzz_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json create mode 100644 test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h create mode 100644 test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h create mode 100644 test/systemtest/common/fms/fms_fuzz_test/include/get_param.h create mode 100644 test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp create mode 100644 test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp create mode 100644 test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp create mode 100644 test/systemtest/common/fms/fms_fuzz_test/test_lib/formManagerFuzzTest create mode 100644 test/systemtest/common/fms/fms_performance_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_performance_test/fms_performance_config/fms_performance_config.json create mode 100644 test/systemtest/common/fms/fms_performance_test/fms_performance_test.cpp create mode 100644 test/systemtest/common/fms/fms_performance_test/performance_config_parser.h create mode 100644 test/systemtest/common/fms/fms_release_form_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_release_form_test/fms_release_form_test.cpp create mode 100644 test/systemtest/common/fms/fms_self_starting_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh create mode 100644 test/systemtest/common/fms/fms_self_starting_test/fms_check_self_starting.sh create mode 100644 test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp create mode 100644 test/systemtest/common/fms/fms_stress_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp create mode 100644 test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json create mode 100644 test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h create mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn create mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp create mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json create mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h diff --git a/interfaces/innerkits/appexecfwk_base/include/form_constants.h b/interfaces/innerkits/appexecfwk_base/include/form_constants.h index 0819e3111d..cfd1fc11dc 100644 --- a/interfaces/innerkits/appexecfwk_base/include/form_constants.h +++ b/interfaces/innerkits/appexecfwk_base/include/form_constants.h @@ -101,6 +101,8 @@ namespace Constants { // the delimiter between bundleName and abilityName const std::string NAME_DELIMITER = "::"; + const std::string PARAM_FORM_ADD_COUNT = "form.add.count"; + const size_t MAX_LAYOUT = 8; const std::map DIMENSION_MAP = { {1, "1*2"}, diff --git a/interfaces/innerkits/appexecfwk_base/include/form_js_info.h b/interfaces/innerkits/appexecfwk_base/include/form_js_info.h index 69fe4a0217..ac079d6bde 100644 --- a/interfaces/innerkits/appexecfwk_base/include/form_js_info.h +++ b/interfaces/innerkits/appexecfwk_base/include/form_js_info.h @@ -1,51 +1,51 @@ -/* - * Copyright (c) 2021 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. - */ - -#ifndef FOUNDATION_APPEXECFWK_OHOS_FORM_JS_INFO_H -#define FOUNDATION_APPEXECFWK_OHOS_FORM_JS_INFO_H - - -#include -#include "parcel.h" -#include "form_provider_data.h" - -namespace OHOS { -namespace AppExecFwk { -/** - * @struct FormJsInfo - * Defines form js info. - */ -struct FormJsInfo : public Parcelable { - int64_t formId; - std::string formName; - std::string bundleName; - std::string abilityName; - bool formTempFlg = false; - std::string jsFormCodePath; - std::string formData; - FormProviderData formProviderData; - - std::string htmlPath; - std::string cssPath; - std::string jsPath; - std::string fileReousePath; - - bool ReadFromParcel(Parcel &parcel); - virtual bool Marshalling(Parcel &parcel) const override; - static FormJsInfo *Unmarshalling(Parcel &parcel); -}; -} // namespace AppExecFwk -} // namespace OHOS +/* + * Copyright (c) 2021 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. + */ + +#ifndef FOUNDATION_APPEXECFWK_OHOS_FORM_JS_INFO_H +#define FOUNDATION_APPEXECFWK_OHOS_FORM_JS_INFO_H + + +#include +#include "form_provider_data.h" +#include "parcel.h" + +namespace OHOS { +namespace AppExecFwk { +/** + * @struct FormJsInfo + * Defines form js info. + */ +struct FormJsInfo : public Parcelable { + int64_t formId; + std::string formName; + std::string bundleName; + std::string abilityName; + bool formTempFlg = false; + std::string jsFormCodePath; + std::string formData; + FormProviderData formProviderData; + + std::string htmlPath; + std::string cssPath; + std::string jsPath; + std::string fileReousePath; + + bool ReadFromParcel(Parcel &parcel); + virtual bool Marshalling(Parcel &parcel) const override; + static FormJsInfo *Unmarshalling(Parcel &parcel); +}; +} // namespace AppExecFwk +} // namespace OHOS #endif // FOUNDATION_APPEXECFWK_OHOS_FORM_JS_INFO_H \ No newline at end of file diff --git a/interfaces/innerkits/appexecfwk_base/src/form_info.cpp b/interfaces/innerkits/appexecfwk_base/src/form_info.cpp index 9e589c283d..50e7730463 100644 --- a/interfaces/innerkits/appexecfwk_base/src/form_info.cpp +++ b/interfaces/innerkits/appexecfwk_base/src/form_info.cpp @@ -120,13 +120,12 @@ bool FormInfo::ReadFromParcel(Parcel &parcel) FormInfo *FormInfo::Unmarshalling(Parcel &parcel) { - FormInfo *info = new FormInfo(); - if (!info->ReadFromParcel(parcel)) { + std::unique_ptr info = std::make_unique(); + if (info && !info->ReadFromParcel(parcel)) { APP_LOGW("read from parcel failed"); - delete info; info = nullptr; } - return info; + return info.release(); } bool FormInfo::Marshalling(Parcel &parcel) const diff --git a/interfaces/innerkits/appexecfwk_base/src/form_js_info.cpp b/interfaces/innerkits/appexecfwk_base/src/form_js_info.cpp index 46df890569..823e1f1725 100644 --- a/interfaces/innerkits/appexecfwk_base/src/form_js_info.cpp +++ b/interfaces/innerkits/appexecfwk_base/src/form_js_info.cpp @@ -30,21 +30,20 @@ bool FormJsInfo::ReadFromParcel(Parcel &parcel) formData = Str16ToStr8(parcel.ReadString16()); auto bindingData = parcel.ReadParcelable(); + formProviderData = *bindingData; if (nullptr == bindingData){ return false; } - formProviderData = *bindingData; return true; } FormJsInfo *FormJsInfo::Unmarshalling(Parcel &parcel) { - FormJsInfo *formJsInfo = new (std::nothrow) FormJsInfo(); + std::unique_ptr formJsInfo = std::make_unique(); if (formJsInfo && !formJsInfo->ReadFromParcel(parcel)) { - delete formJsInfo; formJsInfo = nullptr; } - return formJsInfo; + return formJsInfo.release(); } bool FormJsInfo::Marshalling(Parcel &parcel) const diff --git a/interfaces/innerkits/appexecfwk_base/src/form_provider_data.cpp b/interfaces/innerkits/appexecfwk_base/src/form_provider_data.cpp index 918a832f40..c929b6ec8e 100644 --- a/interfaces/innerkits/appexecfwk_base/src/form_provider_data.cpp +++ b/interfaces/innerkits/appexecfwk_base/src/form_provider_data.cpp @@ -13,9 +13,9 @@ * limitations under the License. */ +#include #include #include -#include #include "app_log_wrapper.h" #include "form_provider_data.h" @@ -269,14 +269,11 @@ bool FormProviderData::Marshalling(Parcel &parcel) const */ FormProviderData* FormProviderData::Unmarshalling(Parcel &parcel) { - FormProviderData *formProviderData = new (std::nothrow) FormProviderData(); + std::unique_ptr formProviderData = std::make_unique(); if (formProviderData && !formProviderData->ReadFromParcel(parcel)) { - delete formProviderData; formProviderData = nullptr; } - std::string str = formProviderData->GetDataString(); - APP_LOGI("%{public}s, , provider data length: %{public}zu, provider data: %{public}s", __func__, str.length(), str.c_str()); - return formProviderData; + return formProviderData.release(); } /** diff --git a/interfaces/innerkits/appexecfwk_base/src/form_provider_info.cpp b/interfaces/innerkits/appexecfwk_base/src/form_provider_info.cpp index d6b83c82a9..e7824e24f3 100644 --- a/interfaces/innerkits/appexecfwk_base/src/form_provider_info.cpp +++ b/interfaces/innerkits/appexecfwk_base/src/form_provider_info.cpp @@ -27,12 +27,11 @@ bool FormProviderInfo::ReadFromParcel(Parcel &parcel) FormProviderInfo *FormProviderInfo::Unmarshalling(Parcel &parcel) { - FormProviderInfo *formProviderInfo = new (std::nothrow) FormProviderInfo(); + std::unique_ptr formProviderInfo = std::make_unique(); if (formProviderInfo && !formProviderInfo->ReadFromParcel(parcel)) { - delete formProviderInfo; formProviderInfo = nullptr; } - return formProviderInfo; + return formProviderInfo.release(); } bool FormProviderInfo::Marshalling(Parcel &parcel) const diff --git a/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_interface.h b/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_interface.h index 19b3d58e7d..59e40281fe 100644 --- a/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_interface.h +++ b/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_interface.h @@ -139,6 +139,13 @@ public: * @return Returns ERR_OK on success, others on failure. */ virtual int DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo) = 0; + /** + * @brief Dump form timer by form id. + * @param formId The id of the form. + * @param formInfo Form timer. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) = 0; /** * @brief Process js message event. * @param formId Indicates the unique id of form. @@ -148,6 +155,18 @@ public: */ virtual int MessageEvent(const int64_t formId, const Want &want, const sptr &callerToken) = 0; + /** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int BatchAddFormRecords(const Want &want) = 0; + /** + * @brief Clear form records for st limit value test. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int ClearFormRecords() = 0; + enum class Message { // ipc id 1-1000 for kit // ipc id 1001-2000 for DMS @@ -170,7 +189,10 @@ public: FORM_MGR_STORAGE_FORM_INFOS, FORM_MGR_FORM_INFOS_BY_NAME, FORM_MGR_FORM_INFOS_BY_ID, + FORM_MGR_FORM_TIMER_INFO_BY_ID, FORM_MGR_MESSAGE_EVENT, + FORM_MGR_BATCH_ADD_FORM_RECORDS_ST, + FORM_MGR_CLEAR_FORM_RECORDS_ST, }; }; } // namespace AppExecFwk diff --git a/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_proxy.h b/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_proxy.h index 576f077c00..934b53dd48 100644 --- a/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_proxy.h +++ b/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_proxy.h @@ -132,6 +132,13 @@ public: * @return Returns ERR_OK on success, others on failure. */ virtual int DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo) override; + /** + * @brief Dump timer info by form id. + * @param formId The id of the form. + * @param formInfo Form timer info. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) override; /** * @brief Process js message event. * @param formId Indicates the unique id of form. @@ -140,6 +147,18 @@ public: * @return Returns true if execute success, false otherwise. */ virtual int MessageEvent(const int64_t formId, const Want &want, const sptr &callerToken) override; + + /** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int BatchAddFormRecords(const Want &want) override; + /** + * @brief Clear form records for st limit value test. + * @return Returns ERR_OK on success, others on failure. + */ + virtual int ClearFormRecords() override; private: template int GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos); diff --git a/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_stub.h b/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_stub.h index 95467215c8..c0bf23d71f 100644 --- a/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_stub.h +++ b/interfaces/innerkits/appexecfwk_core/include/formmgr/form_mgr_stub.h @@ -128,6 +128,13 @@ private: * @return Returns ERR_OK on success, others on failure. */ int32_t HandleDumpFormInfoByFormId(MessageParcel &data, MessageParcel &reply); + /** + * @brief Handle DumpFormTimerByFormId message. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ + int32_t HandleDumpFormTimerByFormId(MessageParcel &data, MessageParcel &reply); /** * @brief Handle DumpFormInfoByFormId message. * @param data input param. @@ -136,6 +143,21 @@ private: */ int32_t HandleMessageEvent(MessageParcel &data, MessageParcel &reply); + /** + * @brief Handle BatchAddFormRecords message. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ + int32_t HandleBatchAddFormRecords(MessageParcel &data, MessageParcel &reply); + /** + * @brief Handle ClearFormRecords message. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ + int32_t HandleClearFormRecords(MessageParcel &data, MessageParcel &reply); + private: using FormMgrFunc = int32_t (FormMgrStub::*)(MessageParcel &data, MessageParcel &reply); std::map memberFuncMap_; diff --git a/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_proxy.cpp b/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_proxy.cpp index ea52dc1d75..2eb8efd1c2 100644 --- a/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_proxy.cpp +++ b/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_proxy.cpp @@ -460,6 +460,31 @@ int FormMgrProxy::DumpFormInfoByFormId(const std::int64_t formId, std::string &f return error; } +/** + * @brief Dump timer info by form id. + * @param formId The id of the form. + * @param formInfo Form timer info. + * @return Returns ERR_OK on success, others on failure. + */ +int FormMgrProxy::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) +{ + MessageParcel data; + if (!WriteInterfaceToken(data)) { + APP_LOGE("%{public}s, failed to write interface token", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteInt64(formId)) { + APP_LOGE("%{public}s, failed to write formId", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + int error = GetStringInfo(IFormMgr::Message::FORM_MGR_FORM_TIMER_INFO_BY_ID, data, isTimingService); + if (error != ERR_OK) { + APP_LOGE("%{public}s, failed to GetStringInfo: %{public}d", __func__, error); + } + + return error; +} /** * @brief Process js message event. * @param formId Indicates the unique id of form. @@ -502,6 +527,26 @@ int FormMgrProxy::MessageEvent(const int64_t formId, const Want &want, const spt return reply.ReadInt32(); } +/** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns ERR_OK on success, others on failure. + */ +int FormMgrProxy::BatchAddFormRecords(const Want &want) +{ + // must not implement, just for st + return ERR_OK; +} +/** + * @brief Clear form records for st limit value test. + * @return Returns ERR_OK on success, others on failure. + */ +int FormMgrProxy::ClearFormRecords() +{ + // must not implement, just for st + return ERR_OK; +} + template int FormMgrProxy::GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos) { diff --git a/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp b/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp index 42c11f8916..3066329901 100644 --- a/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp +++ b/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp @@ -59,12 +59,18 @@ FormMgrStub::FormMgrStub() &FormMgrStub::HandleDumpFormInfoByBundleName; memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_FORM_INFOS_BY_ID)] = &FormMgrStub::HandleDumpFormInfoByFormId; + memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_FORM_TIMER_INFO_BY_ID)] = + &FormMgrStub::HandleDumpFormTimerByFormId; memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_SET_NEXT_REFRESH_TIME)] = &FormMgrStub::HandleSetNextRefreshTime; memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_LIFECYCLE_UPDATE)] = &FormMgrStub::HandleLifecycleUpdate; memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_MESSAGE_EVENT)] = &FormMgrStub::HandleMessageEvent; + memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_BATCH_ADD_FORM_RECORDS_ST)] = + &FormMgrStub::HandleBatchAddFormRecords; + memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_CLEAR_FORM_RECORDS_ST)] = + &FormMgrStub::HandleClearFormRecords; } FormMgrStub::~FormMgrStub() @@ -353,6 +359,29 @@ int32_t FormMgrStub::HandleDumpFormInfoByFormId(MessageParcel &data, MessageParc } return result; } +/** + * @brief Handle DumpFormTimerByFormId message. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ +int32_t FormMgrStub::HandleDumpFormTimerByFormId(MessageParcel &data, MessageParcel &reply) +{ + int64_t formId = data.ReadInt64(); + std::string isTimingService; + int32_t result = DumpFormTimerByFormId(formId, isTimingService); + reply.WriteInt32(result); + if (result == ERR_OK) { + std::vector dumpInfos; + SplitString(isTimingService, dumpInfos); + if (!reply.WriteStringVector(dumpInfos)) { + APP_LOGE("%{public}s, failed to WriteStringVector", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + } + return result; +} + /** * @brief Handle DumpFormInfoByFormId message. * @param data input param. @@ -381,5 +410,39 @@ int32_t FormMgrStub::HandleMessageEvent(MessageParcel &data, MessageParcel &repl reply.WriteInt32(result); return result; } + +/** + * @brief Handle BatchAddFormRecords message. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ +int32_t FormMgrStub::HandleBatchAddFormRecords(MessageParcel &data, MessageParcel &reply) +{ + APP_LOGI("%{public}s called.", __func__); + + std::unique_ptr want(data.ReadParcelable()); + if (!want) { + APP_LOGE("%{public}s, failed to ReadParcelable", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + int32_t result = BatchAddFormRecords(*want); + reply.WriteInt32(result); + return result; +} +/** + * @brief Handle BatchDeleteFormRecords message. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ +int32_t FormMgrStub::HandleClearFormRecords(MessageParcel &data, MessageParcel &reply) +{ + APP_LOGI("%{public}s called.", __func__); + int32_t result = ClearFormRecords(); + reply.WriteInt32(result); + return result; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/innerkits/fmskit/native/include/form_mgr.h b/interfaces/innerkits/fmskit/native/include/form_mgr.h index ec455552e4..b712589dc5 100644 --- a/interfaces/innerkits/fmskit/native/include/form_mgr.h +++ b/interfaces/innerkits/fmskit/native/include/form_mgr.h @@ -130,6 +130,13 @@ public: * @return Returns ERR_OK on success, others on failure. */ int DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo); + /** + * @brief Dump form timer by form id. + * @param formId The id of the form. + * @param formInfo Form timer. + * @return Returns ERR_OK on success, others on failure. + */ + int DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService); /** * @brief Process js message event. * @param formId Indicates the unique id of form. @@ -160,6 +167,13 @@ public: */ void UnRegisterDeathCallback(const std::shared_ptr &formDeathCallback); + /** + * @brief Set the next refresh time + * + * @param formId The id of the form. + * @param nextTime Next refresh time + * @return Returns ERR_OK on success, others on failure. + */ int SetNextRefreshTime(const int64_t formId, const int64_t nextTime); /** diff --git a/interfaces/innerkits/fmskit/native/src/form_mgr.cpp b/interfaces/innerkits/fmskit/native/src/form_mgr.cpp index b728408bb4..6504649191 100644 --- a/interfaces/innerkits/fmskit/native/src/form_mgr.cpp +++ b/interfaces/innerkits/fmskit/native/src/form_mgr.cpp @@ -221,6 +221,21 @@ int FormMgr::DumpFormInfoByFormId(const std::int64_t formId, std::string &formIn return remoteProxy_->DumpFormInfoByFormId(formId, formInfo); } +/** + * @brief Dump form timer by form id. + * @param formId The id of the form. + * @param formInfo Form timer. + * @return Returns ERR_OK on success, others on failure. + */ +int FormMgr::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) +{ + int errCode = Connect(); + if (errCode != ERR_OK) { + return errCode; + } + + return remoteProxy_->DumpFormTimerByFormId(formId, isTimingService); +} /** * @brief Process js message event. * @param formId Indicates the unique id of form. @@ -239,9 +254,8 @@ int FormMgr::MessageEvent(const int64_t formId, const Want &want, const sptr &remoteObject); + + /** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns forms count to add. + */ + int BatchAddFormRecords(const Want &want); + /** + * @brief Clear form records for st limit value test. + * @return Returns forms count to delete. + */ + int ClearFormRecords(); private: /** * @brief Get form configure info. @@ -302,10 +321,11 @@ private: * @param record Form data. * @param formId The form id. * @param wantParams WantParams of the request. + * @param formInfo Form info for form host. * @return Returns ERR_OK on success, others on failure. */ ErrCode AddExistFormRecord(const FormItemInfo &info, const sptr &callerToken, - const FormRecord &record, const int64_t formId, const WantParams &wantParams); + const FormRecord &record, const int64_t formId, const WantParams &wantParams, FormJsInfo &formInfo); /** * @brief Add new form record. @@ -393,6 +413,37 @@ private: * @return Returns true on success, others on failure. */ bool GetBundleName(std::string &bundleName); + + /** + * @brief Update provider info to host + * + * @param matchedFormId The Id of the form + * @param callerToken Caller ability token. + * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE. + * @param formRecord Form storage information + * @return Returns true on success, false on failure. + */ + bool UpdateProviderInfoToHost(const int64_t matchedFormId, const sptr &callerToken, + const int32_t formVisibleType, FormRecord &formRecord); + + /** + * @brief If the form provider is system app and the config item 'formVisibleNotify' is true, + * notify the form provider that the current form is visible. + * + * @param bundleName BundleName + * @return Returns true if the form provider is system app, false if not. + */ + bool CheckIsSystemAppByBundleName(const sptr &iBundleMgr, const std::string &bundleName); + /** + * @brief Create eventMaps for event notify. + * + * @param matchedFormId The Id of the form + * @param formRecord Form storage information + * @param eventMaps eventMaps for event notify + * @return Returns true on success, false on failure. + */ + bool CreateHandleEventMap(const int64_t matchedFormId, const FormRecord &formRecord, + std::map> &eventMaps); }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/formmgr/include/form_mgr_service.h b/services/formmgr/include/form_mgr_service.h index ac10b21ae6..c0cef5623d 100644 --- a/services/formmgr/include/form_mgr_service.h +++ b/services/formmgr/include/form_mgr_service.h @@ -26,6 +26,7 @@ #include "event_handler.h" #include "form_mgr_stub.h" #include "form_provider_data.h" +#include "form_sys_event_receiver.h" #include "iremote_object.h" namespace OHOS { @@ -153,7 +154,13 @@ public: * @return Returns ERR_OK on success, others on failure. */ int DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo) override; - + /** + * @brief Dump form timer by form id. + * @param formId The id of the form. + * @param formInfo Form info. + * @return Returns ERR_OK on success, others on failure. + */ + int DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) override; /** * @brief Process js message event. * @param formId Indicates the unique id of form. @@ -163,6 +170,18 @@ public: */ int MessageEvent(const int64_t formId, const Want &want, const sptr &callerToken) override; + /** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns ERR_OK on success, others on failure. + */ + int BatchAddFormRecords(const Want &want) override; + /** + * @brief Clear form records for st limit value test. + * @return Returns ERR_OK on success, others on failure. + */ + int ClearFormRecords() override; + /** * @brief Check whether if the form manager service is ready. * @return Returns true if the form manager service is ready; returns false otherwise. @@ -193,7 +212,8 @@ private: std::shared_ptr runner_ = nullptr; std::shared_ptr handler_ = nullptr; - + std::shared_ptr formSysEventReceiver_ = nullptr; + bool resetFlag = false; mutable std::mutex instanceMutex_; diff --git a/services/formmgr/include/form_record.h b/services/formmgr/include/form_record.h index 2bc6bc1f64..78a00aea70 100644 --- a/services/formmgr/include/form_record.h +++ b/services/formmgr/include/form_record.h @@ -50,6 +50,7 @@ public: std::vector formUserUids; bool formVisibleNotify = false; int formVisibleNotifyState = 0; + int userId = 0; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/formmgr/include/form_timer_mgr.h b/services/formmgr/include/form_timer_mgr.h index 1ff6938007..8668c09f4d 100644 --- a/services/formmgr/include/form_timer_mgr.h +++ b/services/formmgr/include/form_timer_mgr.h @@ -134,7 +134,24 @@ public: * @return Returns true on success, false on failure. */ bool OnDynamicTimeTrigger(long updateTime); - + /** + * @brief Get interval timer task. + * @param formId The Id of the form. + * @return Returns true on success, false on failure. + */ + bool GetIntervalTimer(const int64_t formId, FormTimer &formTimer); + /** + * @brief Get update at timer. + * @param formId The Id of the form. + * @return Returns true on success, false on failure. + */ + bool GetUpdateAtTimer(const int64_t formId, UpdateAtItem &updateAtItem); + /** + * @brief Get dynamic refresh item. + * @param formId The Id of the form. + * @return Returns true on success, false on failure. + */ + bool GetDynamicItem(const int64_t formId, DynamicRefreshItem &dynamicItem); private: /** * @brief Add update at timer. @@ -157,7 +174,6 @@ private: * @brief interval timer task timeout. */ void OnIntervalTimeOut(); - /** * @brief Get remind tasks. * @param remindTasks Remind tasks. @@ -312,7 +328,6 @@ private: std::map intervalTimerTasks_; std::list updateAtTimerTasks_; std::vector dynamicRefreshTasks_; - std::shared_ptr timerReceiver_ = nullptr; OHOS::ThreadPool* taskExecutor_ = nullptr; @@ -320,9 +335,6 @@ private: uint64_t updateAtTimerId_ = 0L; uint64_t dynamicAlarmTimerId_ = 0L; uint64_t limiterTimerId_= 0L; - - - }; } // namespace AppExecFwk diff --git a/services/formmgr/src/form_ams_helper.cpp b/services/formmgr/src/form_ams_helper.cpp index 7588442f14..f519ea91ea 100644 --- a/services/formmgr/src/form_ams_helper.cpp +++ b/services/formmgr/src/form_ams_helper.cpp @@ -24,7 +24,7 @@ namespace OHOS { namespace AppExecFwk { -const int FORM_DISCONNECT_DELAY_TIME = 100; // ms +const int FORM_DISCONNECT_DELAY_TIME = 5000; // ms FormAmsHelper::FormAmsHelper(){} FormAmsHelper::~FormAmsHelper(){} diff --git a/services/formmgr/src/form_data_mgr.cpp b/services/formmgr/src/form_data_mgr.cpp index 94b4e638b6..5e6210a7b8 100644 --- a/services/formmgr/src/form_data_mgr.cpp +++ b/services/formmgr/src/form_data_mgr.cpp @@ -1084,6 +1084,7 @@ void FormDataMgr::ParseIntervalConfig(FormRecord &record, const int configDurati } APP_LOGI("%{public}s end", __func__); } + /** * @brief Parse at time config. * @param record The form record. @@ -1131,5 +1132,20 @@ bool FormDataMgr::IsFormCached(const FormRecord record) } return FormCacheMgr::GetInstance().IsExist(record.formId); } + +/** + * @brief Clear form records for st limit value test. + */ +void FormDataMgr::ClearFormRecords() +{ + { + std::lock_guard lock(formRecordMutex_); + formRecords_.clear(); + } + { + std::lock_guard lock(formTempMutex_); + tempForms_.clear(); + } +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/formmgr/src/form_mgr_adapter.cpp b/services/formmgr/src/form_mgr_adapter.cpp index db4a108f3a..80c8c1cb17 100644 --- a/services/formmgr/src/form_mgr_adapter.cpp +++ b/services/formmgr/src/form_mgr_adapter.cpp @@ -480,63 +480,20 @@ ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &fo } matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId); FormRecord formRecord; - if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) { - APP_LOGW("%{public}s fail, not exist such form, formId:%{public}" PRId64 ".", __func__, matchedFormId); + // Update provider info to host + if(!UpdateProviderInfoToHost(matchedFormId, callerToken, formVisibleType, formRecord)) { continue; } - FormHostRecord formHostRecord; - bool hasFormHostRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord); - if (!(hasFormHostRecord && formHostRecord.Contains(matchedFormId))) { - APP_LOGW("%{public}s fail, form is not belong to self, formId:%{public}" PRId64 ".", __func__, matchedFormId); + // Check if the form provider is system app + if(!CheckIsSystemAppByBundleName(iBundleMgr, formRecord.bundleName)) { continue; } - formRecord.formVisibleNotifyState = formVisibleType; - if (!FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, formRecord)) { - APP_LOGW("%{public}s fail, set formVisibleNotifyState error, formId:%{public}" PRId64 ".", - __func__, matchedFormId); + // Create eventMaps + if(!CreateHandleEventMap(matchedFormId, formRecord, eventMaps)) { continue; } - - // If the form need refrsh flag is true and form visibleType is FORM_VISIBLE, refresh the form host. - if (formRecord.needRefresh && formVisibleType == Constants::FORM_VISIBLE) { - std::string cacheData; - // If the form has business cache, refresh the form host. - if (FormCacheMgr::GetInstance().GetData(matchedFormId, cacheData)) { - formRecord.formProviderInfo.SetFormDataString(cacheData); - formHostRecord.OnUpdate(matchedFormId, formRecord); - } - } - - // If the form provider is system app and the config item 'formVisibleNotify' is true, - // notify the form provider that the current form is visible. - BundleInfo bundleInfo; - if (iBundleMgr->GetBundleInfo(formRecord.bundleName, BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo)) { - APP_LOGD("%{public}s, get bundle uid success", __func__); - if (!iBundleMgr->CheckIsSystemAppByUid(bundleInfo.uid)) { - APP_LOGW("%{public}s fail, form provider is not system app, formId:%{public}" PRId64 ".", - __func__, matchedFormId); - continue; - } - } else { - APP_LOGW("%{public}s fail, can not get bundleInfo's uid", __func__); - continue; - } - if (!formRecord.formVisibleNotify) { - APP_LOGW("%{public}s fail, the config item 'formVisibleNotify' is false, formId:%{public}" PRId64 ".", - __func__, matchedFormId); - continue; - } - - std::string providerKey = formRecord.bundleName + Constants::NAME_DELIMITER + formRecord.abilityName; - auto iter = eventMaps.find(providerKey); - if (iter == eventMaps.end()) { - std::vector formEventsByProvider {matchedFormId}; - eventMaps.insert(std::make_pair(providerKey, formEventsByProvider)); - } else { - iter->second.emplace_back(matchedFormId); - } } for (auto iter = eventMaps.begin(); iter != eventMaps.end(); iter++) { @@ -568,7 +525,7 @@ int FormMgrAdapter::CastTempForm(const int64_t formId, const sptr } FormHostRecord record; - bool hasHostRec = FormDataMgr::GetInstance().GetFormHostRecord(matchedFormId, record); + bool hasHostRec = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, record); if (!hasHostRec || !record.Contains(matchedFormId)) { APP_LOGE("%{public}s, not self form:%{public}" PRId64 "", __func__, matchedFormId); return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF; @@ -701,6 +658,30 @@ int FormMgrAdapter::DumpFormInfoByFormId(const std::int64_t formId, std::string return reply; } +/** + * @brief Dump form timer by form id. + * @param formId The id of the form. + * @param formInfo Form timer. + * @return Returns ERR_OK on success, others on failure. + */ +int FormMgrAdapter::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) const +{ + APP_LOGI("%{public}s called.", __func__); + FormTimer formTimer; + UpdateAtItem updateAtItem; + DynamicRefreshItem dynamicItem; + bool result_inter = FormTimerMgr::GetInstance().GetIntervalTimer(formId, formTimer); + bool result_update = FormTimerMgr::GetInstance().GetUpdateAtTimer(formId, updateAtItem); + bool result_dynamic = FormTimerMgr::GetInstance().GetDynamicItem(formId, dynamicItem); + APP_LOGI("%{public}s result_inter:%{public}d,result_update:%{public}d,result_dynamic:%{public}d", + __func__, result_inter, result_update, result_dynamic); + if (result_inter || result_update || result_dynamic) { + isTimingService = "true"; + } else { + isTimingService = "false"; + } + return ERR_OK; +} /** * @brief Get form configure info. * @param want The want of the request. @@ -755,18 +736,20 @@ ErrCode FormMgrAdapter::AllotFormById(const FormItemInfo &info, return ERR_APPEXECFWK_FORM_COMMON_CODE; } - if (hasRecord && FormDataMgr::GetInstance().IsCallingUidValid(record.formUserUids)) { + if (hasRecord && (record.userId == DEFAULT_USER_ID + || FormDataMgr::GetInstance().IsCallingUidValid(record.formUserUids))) { if (!info.IsMatch(record)) { APP_LOGE("%{public}s, formId and item info not match:%{public}" PRId64 "", __func__, formId); return ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID; } - return AddExistFormRecord(info, callerToken, record, formId, wantParams); + return AddExistFormRecord(info, callerToken, record, formId, wantParams, formInfo); } // find in db but not in cache FormRecord dbRecord; ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord); - if (getDbRet == ERR_OK && FormDataMgr::GetInstance().IsCallingUidValid(dbRecord.formUserUids)) { + if (getDbRet == ERR_OK && (record.userId == DEFAULT_USER_ID + || FormDataMgr::GetInstance().IsCallingUidValid(dbRecord.formUserUids))) { return AddNewFormRecord(info, formId, callerToken, wantParams, formInfo); } @@ -794,7 +777,8 @@ int64_t FormMgrAdapter::PaddingUDIDHash(const int64_t formId) const return formId; } ErrCode FormMgrAdapter::AddExistFormRecord(const FormItemInfo &info, const sptr &callerToken, - const FormRecord &record, const int64_t formId, const WantParams &wantParams) + const FormRecord &record, const int64_t formId, const WantParams &wantParams, + FormJsInfo &formInfo) { APP_LOGI("%{public}s call, formId:%{public}" PRId64 "", __func__, formId); // allot form host record @@ -820,11 +804,18 @@ ErrCode FormMgrAdapter::AddExistFormRecord(const FormItemInfo &info, const sptr< // Add new form user uid. FormDataMgr::GetInstance().AddFormUserUid(formId, callingUid); - if (std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(), callingUid) == + if(std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(), callingUid) == newRecord.formUserUids.end()) { newRecord.formUserUids.emplace_back(callingUid); } + // create form info for js + std::string cacheData; + if (FormCacheMgr::GetInstance().GetData(formId, cacheData)) { + formInfo.formData = cacheData; + } + FormDataMgr::GetInstance().CreateFormInfo(formId, record, formInfo); + // start update timer if (ErrCode errorCode = AddFormTimer(newRecord); errorCode != ERR_OK) { return errorCode; @@ -1030,7 +1021,8 @@ ErrCode FormMgrAdapter::GetBundleInfo(const AAFwk::Want &want, BundleInfo &bundl } for (const auto &abilityInfo : bundleInfo.abilityInfos) { - if (abilityInfo.bundleName == bundleName && abilityInfo.moduleName == moduleName ) { + if (abilityInfo.bundleName == bundleName && abilityInfo.moduleName == moduleName + && abilityInfo.name == abilityName) { packageName = bundleName + moduleName; break; } @@ -1451,5 +1443,166 @@ void FormMgrAdapter::NotifyFormDelete(const int64_t formId, const Want &want, co APP_LOGE("%{public}s fail, Failed to get acquire provider form info", __func__); } } + +/** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns forms count to add. + */ +int FormMgrAdapter::BatchAddFormRecords(const Want &want) +{ + APP_LOGI("%{public}s called.", __func__); + ElementName elementName = want.GetElement(); + std::string bundleName = elementName.GetBundleName(); + std::string abilityName = elementName.GetAbilityName(); + int formCount = want.GetIntParam(Constants::PARAM_FORM_ADD_COUNT, 0); + APP_LOGI("%{public}s, batch add form, bundleName: %{public}s, abilityName: %{public}s, count: %{public}d.", + __func__, + bundleName.c_str(), + abilityName.c_str(), + formCount); + + for (int count = 0; count < formCount; count++) + { + // get from comfig info + FormItemInfo formItemInfo; + int32_t errCode = GetFormConfigInfo(want, formItemInfo); + if (errCode != ERR_OK) { + APP_LOGE("%{public}s fail, get form config info failed.", __func__); + return errCode; + } + if (!formItemInfo.IsValidItem()) { + APP_LOGE("%{public}s fail, input param itemInfo is invalid", __func__); + return ERR_APPEXECFWK_FORM_GET_INFO_FAILED; + } + if (!FormDataMgr::GetInstance().GenerateUdidHash()) { + APP_LOGE("%{public}s fail, generate udid hash failed", __func__); + return ERR_APPEXECFWK_FORM_COMMON_CODE; + } + + // generate formId + int64_t newFormId = FormDataMgr::GetInstance().GenerateFormId(); + if (newFormId < 0) { + APP_LOGE("%{public}s fail, generateFormId no invalid formId", __func__); + return ERR_APPEXECFWK_FORM_COMMON_CODE; + } + + formItemInfo.SetFormId(newFormId); + // allot form host record + int callingUid = IPCSkeleton::GetCallingUid(); + // allot form record + FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(formItemInfo, callingUid); + APP_LOGI("%{public}s, batch add form, formId:" "%{public}" PRId64 ".", __func__, formRecord.formId); + + APP_LOGI("%{public}s, count: %{public}d", __func__, count + 1); + } + APP_LOGI("%{public}s end.", __func__); + return ERR_OK; +} +/** + * @brief Clear form records for st limit value test. + * @return Returns forms count to delete. + */ +int FormMgrAdapter::ClearFormRecords() +{ + APP_LOGI("%{public}s called.", __func__); + FormDataMgr::GetInstance().ClearFormRecords(); + APP_LOGI("%{public}s end.", __func__); + return ERR_OK; +} +/** + * @brief Create eventMaps for event notify. + * + * @param matchedFormId The Id of the form + * @param formRecord Form storage information + * @param eventMaps eventMaps for event notify + * @return Returns true on success, false on failure. + */ +bool FormMgrAdapter::CreateHandleEventMap(const int64_t matchedFormId, const FormRecord &formRecord, + std::map> &eventMaps) +{ + if (!formRecord.formVisibleNotify) { + APP_LOGW("%{public}s fail, the config item 'formVisibleNotify' is false, formId:%{public}" PRId64 ".", + __func__, matchedFormId); + return false; + } + + std::string providerKey = formRecord.bundleName + Constants::NAME_DELIMITER + formRecord.abilityName; + auto iter = eventMaps.find(providerKey); + if (iter == eventMaps.end()) { + std::vector formEventsByProvider {matchedFormId}; + eventMaps.insert(std::make_pair(providerKey, formEventsByProvider)); + } else { + iter->second.emplace_back(matchedFormId); + } + return true; +} +/** + * @brief Update provider info to host + * + * @param matchedFormId The Id of the form + * @param callerToken Caller ability token. + * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE. + * @param formRecord Form storage information + * @return Returns true on success, false on failure. + */ +bool FormMgrAdapter::UpdateProviderInfoToHost(const int64_t matchedFormId, const sptr &callerToken, + const int32_t formVisibleType, FormRecord &formRecord) +{ + if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) { + APP_LOGW("%{public}s fail, not exist such form, formId:%{public}" PRId64 ".", __func__, matchedFormId); + return false; + } + + FormHostRecord formHostRecord; + bool hasFormHostRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord); + if (!(hasFormHostRecord && formHostRecord.Contains(matchedFormId))) { + APP_LOGW("%{public}s fail, form is not belong to self, formId:%{public}" PRId64 ".", __func__, matchedFormId); + return false; + } + + formRecord.formVisibleNotifyState = formVisibleType; + if (!FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, formRecord)) { + APP_LOGW("%{public}s fail, set formVisibleNotifyState error, formId:%{public}" PRId64 ".", + __func__, matchedFormId); + return false; + } + + // If the form need refrsh flag is true and form visibleType is FORM_VISIBLE, refresh the form host. + if (formRecord.needRefresh && formVisibleType == Constants::FORM_VISIBLE) { + std::string cacheData; + // If the form has business cache, refresh the form host. + if (FormCacheMgr::GetInstance().GetData(matchedFormId, cacheData)) { + formRecord.formProviderInfo.SetFormDataString(cacheData); + formHostRecord.OnUpdate(matchedFormId, formRecord); + } + } + return true; +} +/** + * @brief If the form provider is system app and the config item 'formVisibleNotify' is true, + * notify the form provider that the current form is visible. + * + * @param bundleName BundleName + * @return Returns true if the form provider is system app, false if not. + */ +bool FormMgrAdapter::CheckIsSystemAppByBundleName(const sptr &iBundleMgr, const std::string &bundleName) +{ + BundleInfo bundleInfo; + if (iBundleMgr->GetBundleInfo(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo)) { + APP_LOGD("%{public}s, get bundle uid success", __func__); + if (!iBundleMgr->CheckIsSystemAppByUid(bundleInfo.uid)) { + APP_LOGW("%{public}s fail, form provider is not system app, bundleName: %{public}s", + __func__, bundleName.c_str()); + return false; + } + } else { + APP_LOGW("%{public}s fail, can not get bundleInfo's uid", __func__); + return false; + } + + return true; +} + } // namespace AppExecFwk } // namespace OHOS diff --git a/services/formmgr/src/form_mgr_service.cpp b/services/formmgr/src/form_mgr_service.cpp index 8f25249579..948c33d0d8 100644 --- a/services/formmgr/src/form_mgr_service.cpp +++ b/services/formmgr/src/form_mgr_service.cpp @@ -19,6 +19,8 @@ #include "appexecfwk_errors.h" #include "app_log_wrapper.h" +#include "common_event_manager.h" +#include "common_event_support.h" #include "form_ams_helper.h" #include "form_bms_helper.h" #include "form_constants.h" @@ -55,7 +57,10 @@ FormMgrService::FormMgrService() } FormMgrService::~FormMgrService() -{} +{ + EventFwk::CommonEventManager::UnSubscribeCommonEvent(formSysEventReceiver_); + formSysEventReceiver_ = nullptr; +} bool FormMgrService::IsReady() const { @@ -258,6 +263,16 @@ int FormMgrService::DumpFormInfoByFormId(const std::int64_t formId, std::string { return FormMgrAdapter::GetInstance().DumpFormInfoByFormId(formId, formInfo); } +/** + * @brief Dump form timer by form id. + * @param formId The id of the form. + * @param formInfo Form info. + * @return Returns ERR_OK on success, others on failure. + */ +int FormMgrService::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) +{ + return FormMgrAdapter::GetInstance().DumpFormTimerByFormId(formId, isTimingService); +} /** * @brief Process js message event. * @param formId Indicates the unique id of form. @@ -276,6 +291,24 @@ int FormMgrService::MessageEvent(const int64_t formId, const Want &want, const s return FormMgrAdapter::GetInstance().MessageEvent(formId, want, callerToken); } + +/** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns forms count to add. + */ +int FormMgrService::BatchAddFormRecords(const Want &want) +{ + return FormMgrAdapter::GetInstance().BatchAddFormRecords(want); +} +/** + * @brief Clear form records for st limit value test. + * @return Returns forms count to delete. + */ +int FormMgrService::ClearFormRecords() +{ + return FormMgrAdapter::GetInstance().ClearFormRecords(); +} /** * @brief Start envent for the form manager service. */ @@ -339,6 +372,17 @@ ErrCode FormMgrService::Init() return ERR_INVALID_OPERATION; } + if (formSysEventReceiver_ == nullptr) { + EventFwk::MatchingSkills matchingSkills; + matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED); + matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_ABILITY_UPDATED); + matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_DATA_CLEARED); + + // init TimerReceiver + EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills); + formSysEventReceiver_ = std::make_shared(subscribeInfo); + EventFwk::CommonEventManager::SubscribeCommonEvent(formSysEventReceiver_); + } FormDbCache::GetInstance().Start(); APP_LOGI("init success"); @@ -351,7 +395,26 @@ ErrCode FormMgrService::Init() */ bool FormMgrService::CheckFormPermission() { - return true; + sptr iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr(); + if (iBundleMgr == nullptr) { + APP_LOGE("%{public}s, failed to get IBundleMgr.", __func__); + return false; + } + + int32_t uid = IPCSkeleton::GetCallingUid(); + if (!iBundleMgr->CheckIsSystemAppByUid(uid)) { + APP_LOGE("%{public}s fail, form is not system app. uid:%{public}d", __func__, uid); + return false; + } + + std::string bundleName; + bool result = iBundleMgr->GetBundleNameForUid(uid, bundleName); + if (!result || bundleName.empty()) { + APP_LOGE("%{public}s failed, cannot get bundle name by uid:%{public}d", __func__, uid); + return false; + } + + return CheckFormPermission(bundleName); } bool FormMgrService::CheckFormPermission(const std::string &bundleName) const diff --git a/services/formmgr/src/form_sys_event_receiver.cpp b/services/formmgr/src/form_sys_event_receiver.cpp index 3279d6019e..0311b31535 100644 --- a/services/formmgr/src/form_sys_event_receiver.cpp +++ b/services/formmgr/src/form_sys_event_receiver.cpp @@ -35,7 +35,6 @@ namespace OHOS { namespace AppExecFwk { const std::string KEY_UID = "uid"; -const std::string KEY_BUNDLE_NAME = "bundleName"; /** * @brief Receiver Constructor. * @param subscriberInfo Subscriber info. @@ -51,14 +50,14 @@ void FormSysEventReceiver::OnReceiveEvent(const EventFwk::CommonEventData &event { AAFwk::Want want = eventData.GetWant(); std::string action = want.GetAction(); - std::string bundleName = want.GetStringParam(KEY_BUNDLE_NAME); + std::string bundleName = want.GetElement().GetBundleName(); if (action.empty() || bundleName.empty()) { APP_LOGE("%{public}s failed, invalid param, action: %{public}s, bundleName: %{public}s", __func__, action.c_str(), bundleName.c_str()); return; } APP_LOGI("%{public}s, action:%{public}s.", __func__, action.c_str()); - if (action == EventFwk::CommonEventSupport::COMMON_EVENT_ABILITY_REMOVED) { + if (action == EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED) { APP_LOGI("%{public}s, bundle removed, bundleName: %{public}s", __func__, bundleName.c_str()); HandleProviderRemoved(bundleName); } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_ABILITY_UPDATED) { diff --git a/services/formmgr/src/form_timer_mgr.cpp b/services/formmgr/src/form_timer_mgr.cpp index 886cef74cc..bad116ded6 100644 --- a/services/formmgr/src/form_timer_mgr.cpp +++ b/services/formmgr/src/form_timer_mgr.cpp @@ -616,6 +616,68 @@ void FormTimerMgr::SetIntervalEnableFlag(int64_t formId, bool flag) return; } } +/** + * @brief Get interval timer task. + * @param formId The Id of the form. + * @return Returns true on success, false on failure. + */ +bool FormTimerMgr::GetIntervalTimer(const int64_t formId, FormTimer &formTimer) +{ + APP_LOGI("%{public}s start", __func__); + std::lock_guard lock(intervalMutex_); + auto intervalTask = intervalTimerTasks_.find(formId); + if (intervalTask == intervalTimerTasks_.end()) { + APP_LOGI("%{public}s, interval timer not find", __func__); + return false; + } + formTimer = intervalTask->second; + APP_LOGI("%{public}s, get interval timer successfully", __func__); + return true; +} +/** + * @brief Get update at timer. + * @param formId The Id of the form. + * @return Returns true on success, false on failure. + */ +bool FormTimerMgr::GetUpdateAtTimer(const int64_t formId, UpdateAtItem &updateAtItem) +{ + APP_LOGI("%{public}s start", __func__); + { + std::lock_guard lock(updateAtMutex_); + std::list::iterator itItem; + for (itItem = updateAtTimerTasks_.begin(); itItem != updateAtTimerTasks_.end(); itItem++) { + if (itItem->refreshTask.formId == formId) { + updateAtItem.refreshTask = itItem->refreshTask; + updateAtItem.updateAtTime = itItem->updateAtTime; + APP_LOGI("%{public}s, get update at timer successfully", __func__); + return true; + } + } + } + APP_LOGI("%{public}s, update at timer not find", __func__); + return false; +} +/** + * @brief Get dynamic refresh item. + * @param formId The Id of the form. + * @return Returns true on success, false on failure. + */ +bool FormTimerMgr::GetDynamicItem(const int64_t formId, DynamicRefreshItem &dynamicItem) +{ + APP_LOGI("%{public}s start", __func__); + std::lock_guard lock(dynamicMutex_); + std::vector::iterator itItem; + for (itItem = dynamicRefreshTasks_.begin(); itItem != dynamicRefreshTasks_.end();) { + if (itItem->formId == formId) { + dynamicItem.formId = itItem->formId; + dynamicItem.settedTime = itItem->settedTime; + APP_LOGI("%{public}s, get dynamic item successfully", __func__); + return true; + } + } + APP_LOGI("%{public}s, dynamic item not find", __func__); + return false; +} /** * @brief Delete interval timer task. * @param formId The Id of the form. diff --git a/services/formmgr/test/mock/include/mock_bundle_manager.h b/services/formmgr/test/mock/include/mock_bundle_manager.h index 5a3ec17f10..e64a1dbfc2 100644 --- a/services/formmgr/test/mock/include/mock_bundle_manager.h +++ b/services/formmgr/test/mock/include/mock_bundle_manager.h @@ -195,67 +195,7 @@ public: virtual bool GetShortcutInfos(const std::string &bundleName,std::vector &shortcut) override{ return true; } - // /** - // * @brief Starts a shortcut based on the given shortcut ID and bundle name. - // * @param bundleName BundleName Indicates the bundle name of the application to which the shortcut belongs. - // * @param shortcutId Starts a shortcut based on the given shortcut ID and bundle name. - // * @return Returns true if StartShortcut get success - // */ - // virtual bool StartShortcut(const std::string &shortcutId, const std::string &bundleName) override{ - // return true; - // } - /** - * @brief Disables specified home-screen shortcuts that are no longer used. - * @param shortcutIds Indicates the list of shortcut IDs to be disabled. - * @return Returns true if disableHomeShortcuts get success - */ - // virtual bool DisableHomeShortcuts(std::vector &shortcutIds) override{ - // return true; - // } - // /** - // * @brief Enables specified home-screen shortcuts. - // * @param shortcutIds Indicates the list of shortcut IDs to be enabled. - // * @return Returns true if enableHomeShortcuts? get success - // */ - // virtual bool EnableHomeShortcuts(std::vector &shortcutIds) override{ - // return true; - // } - // /** - // * @brief Checks whether a shortcut can be added to the home screen where the application is located. - // * @return Returns true if a shortcut can be added to the home screen; returns false otherwise. - // */ - // virtual bool IsHomeShortcutSupportes() override{ - // return true; - // } - // /** - // * @brief Adds a home-screen shortcut that will be fixed on the home screen. - // * @param shortcutInfo Indicates the ShortcutInfo object containing information about the home-screen - // * shortcut to add. The id, label, and intent attributes of this parameter must be specified. - // * @return Returns true if the shortcut is successfully added; returns false otherwise. - // */ - // virtual bool AddHomeShortcut(ShortcutInfo &shortcutInfo) override{ - // return true; - // } - // /** - // * @brief Updates information about specified home-screen shortcuts that have been added. - // * @param shortcutInfos Updates information about specified home-screen shortcuts that have been added. - // * @return Returns true if the operation is successful; returns false otherwise. - // */ - // virtual bool UpdateShortcuts(std::vector &shortcutInfos) override{ - // return true; - // } - // /** - // * @brief Checks whether a specified shortcut is available. - // * @param shortcutId Indicates the ID of the shortcut to check. - // * @param flag Indicates the type of the shortcut to check. Currently, only the home-screen shortcut - // * IBundleManager#QUERY_SHORTCUT_HOME is available. - // * @return Returns IBundleManager#SHORTCUT_EXISTENCE_EXISTS if the specified shortcut is available; returns - // * IBundleManager#SHORTCUT_EXISTENCE_NOT_EXISTS if it is not available; - // * returns IBundleManager.SHORTCUT_EXISTENCE_UNKNOW if an error occurs. - // */ - // virtual int IsShortcutExist(const std::string &shortcutId, const int &flag) override{ - // return 0; - // } + /** * @brief Obtain the HAP module info of a specific ability. * @param abilityInfo Indicates the ability. @@ -451,67 +391,6 @@ public: virtual bool GetShortcutInfos(const std::string &bundleName,std::vector &shortcut) override{ return true; } - // /** - // * @brief Starts a shortcut based on the given shortcut ID and bundle name. - // * @param bundleName BundleName Indicates the bundle name of the application to which the shortcut belongs. - // * @param shortcutId Starts a shortcut based on the given shortcut ID and bundle name. - // * @return Returns true if StartShortcut get success - // */ - // virtual bool StartShortcut(const std::string &shortcutId, const std::string &bundleName) override{ - // return true; - // } - // /** - // * @brief Disables specified home-screen shortcuts that are no longer used. - // * @param shortcutIds Indicates the list of shortcut IDs to be disabled. - // * @return Returns true if disableHomeShortcuts get success - // */ - // virtual bool DisableHomeShortcuts(std::vector &shortcutIds) override{ - // return true; - // } - // /** - // * @brief Enables specified home-screen shortcuts. - // * @param shortcutIds Indicates the list of shortcut IDs to be enabled. - // * @return Returns true if enableHomeShortcuts? get success - // */ - // virtual bool EnableHomeShortcuts(std::vector &shortcutIds) override{ - // return true; - // } - /** - * @brief Checks whether a shortcut can be added to the home screen where the application is located. - * @return Returns true if a shortcut can be added to the home screen; returns false otherwise. - */ - // virtual bool IsHomeShortcutSupportes() override{ - // return true; - // } - // /** - // * @brief Adds a home-screen shortcut that will be fixed on the home screen. - // * @param shortcutInfo Indicates the ShortcutInfo object containing information about the home-screen shortcut - // * to add. The id, label, and intent attributes of this parameter must be specified. - // * @return Returns true if the shortcut is successfully added; returns false otherwise. - // */ - // virtual bool AddHomeShortcut(ShortcutInfo &shortcutInfo) override{ - // return true; - // } - // /** - // * @brief Updates information about specified home-screen shortcuts that have been added. - // * @param shortcutInfos Updates information about specified home-screen shortcuts that have been added. - // * @return Returns true if the operation is successful; returns false otherwise. - // */ - // virtual bool UpdateShortcuts(std::vector &shortcutInfos) override{ - // return true; - // } - // /** - // * @brief Checks whether a specified shortcut is available. - // * @param shortcutId Indicates the ID of the shortcut to check. - // * @param flag Indicates the type of the shortcut to check. Currently, only the home-screen shortcut - // * IBundleManager#QUERY_SHORTCUT_HOME is available. - // * @return Returns IBundleManager#SHORTCUT_EXISTENCE_EXISTS if the specified shortcut is available; returns - // * IBundleManager#SHORTCUT_EXISTENCE_NOT_EXISTS if it is not available; returns - // * IBundleManager.SHORTCUT_EXISTENCE_UNKNOW if an error occurs. - // */ - // virtual int IsShortcutExist(const std::string &shortcutId, const int &flag) override{ - // return 0; - // } virtual bool GetAllFormsInfo(std::vector &formInfo) override; virtual bool GetFormsInfoByApp(const std::string &bundleName, std::vector &formInfo) override; diff --git a/services/formmgr/test/unittest/fms_form_mgr_lifecycle_update_test/BUILD.gn b/services/formmgr/test/unittest/fms_form_mgr_lifecycle_update_test/BUILD.gn index 3ea0a927c2..d6023948b1 100644 --- a/services/formmgr/test/unittest/fms_form_mgr_lifecycle_update_test/BUILD.gn +++ b/services/formmgr/test/unittest/fms_form_mgr_lifecycle_update_test/BUILD.gn @@ -74,6 +74,7 @@ ohos_unittest("FmsFormMgrLifecycleUpdateTest") { ] external_deps = [ + "ces_standard:cesfwk_innerkits", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", ] diff --git a/services/formmgr/test/unittest/fms_form_mgr_notify_invisible_forms_test/BUILD.gn b/services/formmgr/test/unittest/fms_form_mgr_notify_invisible_forms_test/BUILD.gn index f35b3b3e96..a0ae851003 100644 --- a/services/formmgr/test/unittest/fms_form_mgr_notify_invisible_forms_test/BUILD.gn +++ b/services/formmgr/test/unittest/fms_form_mgr_notify_invisible_forms_test/BUILD.gn @@ -74,6 +74,7 @@ ohos_unittest("FmsFormMgrNotifyInvisibleFormsTest") { ] external_deps = [ + "ces_standard:cesfwk_innerkits", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", ] diff --git a/services/formmgr/test/unittest/fms_form_mgr_notify_visible_forms_test/BUILD.gn b/services/formmgr/test/unittest/fms_form_mgr_notify_visible_forms_test/BUILD.gn index 82f7bb2820..59395c434f 100644 --- a/services/formmgr/test/unittest/fms_form_mgr_notify_visible_forms_test/BUILD.gn +++ b/services/formmgr/test/unittest/fms_form_mgr_notify_visible_forms_test/BUILD.gn @@ -74,6 +74,7 @@ ohos_unittest("FmsFormMgrNotifyVisibleFormsTest") { ] external_deps = [ + "ces_standard:cesfwk_innerkits", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", ] diff --git a/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostCommonA-signed.hap b/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostCommonA-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..7366fbf7c2e442eb9a0e69c5f98fe1d2753df135 GIT binary patch literal 143428 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 xy(CK>1=iW`_q!j0YHRr7L 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

R~+=^9op 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 literal 0 HcmV?d00001 diff --git a/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostCommonB-signed.hap b/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostCommonB-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..dec57d49f67a8acce1f7b1b340e28c3b14a15238 GIT binary patch literal 143349 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 z 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 z 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�oMm?$)e0iOd642Mg5yegV)bF- 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 literal 0 HcmV?d00001 diff --git a/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNoPerm-signed.hap b/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNoPerm-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..af2b3aa0076b116cc8a6bddf80a8229f40cb69ba GIT binary patch literal 114615 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

x7m97j`-A&!VNN;=PG)7I}PJtndg^)?*UtD4TW zHvxxkh~*u?Bk2Jd$NrW5XiXGL??nfv)tvYt`(aIN41%A$_rZ2tF{*z}R0h&-k20It zw%1D0AJA<3_tu~RdP%m$*1_(u@kDw)l@-o$|7d(pUCsipD@U30`UK8-wMgLvcG z5DF1<^OA#CBe#GBBmo!j_wgZ0Os9MMc74>__rht}=b672IG&-5yAX)|s?c;bZby7~ zMetr-$YHZcpT+g4-%&H1e;i-SPjZuzMc^kL5t$-B#g4(XVsQV3E9LzWcy)h-sh-<} zcT=qYnU2bTn(s=;cO~SzQkFN~yHeg;fd8j^3s|6bMgE=x{u+csBB8T7xKYDaLYBQf z5}46N$rSkMx@7xa{}A}n_3mcAUbP4zh~TLgsM~ZKkLYzF#G+4N{l^ka##P~9ifyky zFWvtB`M%qKU9+a^0pX1vZFXi?ee^PdtLHtM;t115dKfY<_(l(xo!eCr&cKyoMzU;rv|aKWj80E=>6q{3QP36!S|uy9EBf4UrOCYNXjBEsj&3 zwlO==YhN$Y7ToX4o3=MxUTHFHl z1qqx7zj^D2KaBTE5%FGi_M2RY*u;My@z2Kx5I+eJZ+0&qZ~g(q3-KR9{Gs?z#4n94 z1wZ+#w<)>yQ?Qp^y?xJpD&zhCP5H2Djlz)6k`Nw{s{G)RD$1J#m zU*Haq?bf5%Ch>sW(pMlyrsy%TG6t@UID~-|Dj>~sF{Z`gvFxD&u9fjep@eUN8rJ>; zR-2(nfsKp?RGsK3sk^1DWI@TGdH%p{Y(zNEeO*~zT^^t#Z^*OdvBGf~VRPM0W#$Dr zL!OvoWE?Bky%-BBR@)gRfyIBMKDPQl5PmEgY8_&UZgBF2Ak-o)!#wx+_Y?F@wsDfpS{_{zw06Tda)xlcMJX zN{qmN733%Ur{2E5273GAZ&7j-^6(B^e+1WM@ce^lZ(lE5XLt6hYe4Aua(6zTIb;n8 z%-yY!yEaI-oFB_)H{zPXm_s}6E;3=_0%gtOd*l_g&qfR>gY|L_ z3*ApoD6A`lr-ehloc#kiJQ>vtYMo_OpXmmX1Rgv>i5>E_65@b=eAwH^K)#G{y#w+U zhU>51>g{vE^-i(3Zv^CXbl``}j;Lj~pmA{7?f!wXi;7rwJAbh3tZLb{|6tjDC|;Pe zo1??a?z_nIhbdWfkdphMejW#TD1}}-zv)9{> zrL=_D9!+Hu?6YSHezRtXmzO27AgK=`IjW7#mHB-xa`b(rPJJA(bBjB($7EDmPHaN1 zAM_meJ|K&M+M=X=kUcXjeGhU^e^bn6Qev8D!R>@-@EBTU97HLIdr5jhT z!Zn=-BBKnyT`)sDl(`wo?3P(jX2u>%#&V$fW%LT!k6Fx5gs zX5sB3O8_K8?SMd0z&K<9P}FVvUmg1GuQ<8jl_^^$mG^ks>r91oEhKE`^-qAdM=+OC z+$Ln~%^89M2Q&0ov3P+`4nQMCMU z&A%0D#~-fuAi9X#yw3@^|IlhHw()+`F|H1Gm>hT6xP|IEMyuDzEvH4&bKRrE1@8KD zYwsFjb7UzLNhi7s$7h9e>u|rzoXc`A`1<~CGQM9*c2!CTAQo+c7~#!*l*|eB_H8_( zU?Kw7#;>8?fb%A}H#^eXcO9I+a%8}#TI?Rf7lM=?hUl93iJ_OZRur0+S11@9OoWix5hPIZcDE}_tYH& zZRthQmZZ{_j^56NZRtf)V|RaB`h_j&7HMZ}piR0+${$n%6iKEer^fk8D|(UiJjBsw z!N1=1esAB=*D3i1{EhOHN=&KnUC56CzMFrL?=3_4o|onu_Yc01?<|>bcIR-uas4$w z#}K~vB?j}|o*2$I#{aW{?{n|<_T>ZLPXNy!oW%B$b?sW-=r)4JY`fD4`eYnbhZjll zgkA0(Zm%kmLT`}3&3h@?3wFZ!o?^qd~evOhZz#nXWx3}-E zBmI7%k6)(DNPzl^LTYbC>E_K~>4K>fHUW4dEyTVoxY#|mbg>#!S)_$>k35rZWy3oQ z)K)g|2Zr>><2ANCTcpcH^jfYINy}keHO5B#KMv1yTT5rA>Dn%!YZEKdbW4ZPEmi53 z$#ly_VnezWVY|Du)Sjk!J~Eu<`ABJ+W-2n2W-6l4?2Xvv`VMkm0#wZdHogJMdd;vH zt4O*tp;3Ev6fd?&V&ZpzAO0)A;?e&EdkV*o;rBV5zX`{3_!(d8?K8ivv`b?-T$L^d zi^N7T&a>c-Npfjao!yXoU!wqV6_&@+;1%wY(ks$=y#Inc-XHliqi- zyyo`&xX!^>l-}(slA>~N|ENLfMUzT8$>h*Mbhu zt;48qRjIei)L%?i*??P7-(#ct9y5dE@ursC_$`&k)vx~cPYY(^IKTx2p5sc=)v|>n zJyYpnk=ky=@rmCu(ir7pY(w5K|yZlB@TA!bc2=MG0 zu}E4io`ZOXf!`|!D4F?}-o8x-l)7X)#OsZ2&8xTqyeYj$)+j%sHv$ML;b+5{5l0f) ztEAmN4V18{yK)c9uXL}hn^fA*{fflUad$=1^2AlDt;VN=Z8ct_tuB&QCNMA8B_0S9 zTLTZ}DH4Jye3@+Db6O<)YtG7`&3hv41+D@w5Wg@+P19d<_JnHOx#`~XB6&R|B3O4R zJfK_(6Z2F*3!e@ilY`fGS%TIC88<0>k$Yz8MQYFHMefn+IZ}vV80SYQdff5 ze-fl^Xo1)y_Idx-r&!m+jw0!U1h?ltu#A_;mT|6}`lvz3pAAyPROiJ9k4nO8n~WQ$ zoT@wiGoUeArZM6I8Wxp?H9k~xtZ_wiY%-0q_zzpxC&E{Qb)8dMFU>J17B&(aov@^4Hkq&U$-$O? z$`H#x%;c4ZJcmG#^E=~+XJTIoc)gsz44&?eBVwOd5qks>dqaYVin*y9oF|2VRSI!H#a;jYM!?@yAt`^8#Es8pTtF4LACCC$SW2{JP z56+rXv}ZKE?%VnWDn^YmpDIS5j19(UTjD~D&P$MhZVx5v0jHmThI2qDalY8w=Y}8i zNpIgnrxc7n+fE-}E2C7wC^HD7wvD4@j0Q!-sAdpGKNN>z^h0qdMn4o4jCP5L(UYPE zttxj+v^F10d3{CF=osQxM(WcVz$( zgHZN}sFuGtto%g#i2;ORaB6AhfKpOo=#XZMzkA#;39x4G3l|}^*vqfDx1qBbY)fDCp<8q#;;K3=Pgn1EBx+y*wrH=ms zrAI_Eg7i2ja&$tTHDl~YsjoUb6}XxTTutQ^uB6Ctu96XjtFw`zT%C<5T%C^~SG^HL zsXIPq5K19s%TSb#0hDGhI3lBzOQRI)e%GMgzYC?Maa#+cqO?RsX*9OFoszG2Q!?_? z-oAI>xcs-heRsg`&5wHf-ad)#)%)97{zi55TBUym&|Msz(L(GCgQMX5JMaog6vsl2 zYAccT3(whIvVS8&{8_@5qV~<$JeD^KR|=zc5%ORTZknbeGTcH=iCmJV=@>@S zq0*c#)0`dA+B(nr$f41*!V|&Io~ZhE6W!(NIS~q_f5;=`*>nnc$Cgfk3`>EiDX?-1 zTto|8`&eC=1$nLm9l_%bB1(6)IAc(|!;Bq;P`^~B`ypnvO9u-jE_Uc;O18dA$>dOP z-#R$*@Y{U6x6cO0+3@>W5XupbAHnhCR|ndDW~bYJiX@$gu{n6eBHi2|xBWb>w*6e< z&M&#U2mY726u4wWlO2{jeL_h{#gS-~QdGthY-;7tV zFKU0gX9&VSk08QpWP~?I!1_T{FQ};YMfy?wS!6h>kIAV1RdA`>Ub-}$M=3cJ)8Kz6 zf25)VpAJR`UL!gRrE_pZ|3|^}^6)Ic^sF?^_mV>~T__z&PD|5#Zy3$@RGJ^iG=oV- zM%?u91VHqJG|jEa;V9mcw54fo9Y%AjO0!j_`C^h$^u(&*cyvU;F%ucphT1S3$Az)s zIDTIIawjE+cYzK1u($6OINk}r_o2L2z|jh2cJdh1oi9^$?{pnsJ#1`&){j?9I}IOXiZK{<8X9xC=N#_6&#i( zQ4;o~Jv;_VXH1&f`NYsU5_qRLEy+}3s3cPfMUuS@0f81o(U?IjbbhYR=) zGCU{X>@wwa?LHkeBa|TK;BakYO{H8f71J* zJiYL9!|%}d-}e3MZ$C|cyBNN4!Osl8X82Z_vy#Ox8R6r#f={TAt}5QhSC8BuTQw&8 z6LQhdaUJ=pUCtYWOXWUm?8$qG?tMk*)X`uEK*V>xAPjH3xr8UMN*Tb<`zO#8EnZL8mw9PnBb3Sw!o+`6m z6ux!C_=e|;mFIRI&kLnHu_an01pU$dJ><6XuKh9Fn3h0&)K*-TbDOlLy4h(D+$MSJ z@af2|`e>aQ_>Z`FJ&)g!Se@CG;9iOyeY{0i!nK$kjX@1*W$|kzjG4l8{btaAMlPNF5gsT9+PFhj3*;?F_N)A76z&R zgnvJ0uX9n*CJgkW+GHu;m1u9)^_Xa@uU%;MustRM_AG|GnCW^fv`~5r&d0&|I5^)I zbKIosnNDrjvOUw`z4jRH1gGn%f@eG7d?B1Kg!AX&d^wyihx6^RrdxGA0`=U$_6YFJ zld;!RcakSlcbR=No`5j+cy5h$v9bscSdCsN7l@TM9>+u5ZaKe?+wPwV0T0P`w1w6I6s!}?CTl2F^^gWdj z*?7%bc+v*)X%nzCImmAT)Q%kFR}1+qfclby{AwY;1yH}*Z_+}352qaP=5%<|2T!Zu zX%#%Z2hJD5`9e6q6V8{*vtSFPTf2o@wUFb(sq5e?0lvDfdvEGa$nO)WyGR?HF`Jv= zOxxol&CZt4X~^evmk~>C@e6>)Wpau3kNg01R4M4NAsVX+q$%A)(0H#;deXN))+*z% zwYU@Tc(01bU)3qkAN18nkC+QUU-bNyH6(V#4B!6(zyDcKmh$*{ZdJnVjDM~=X1M9< zHN_}l&_)X@%h!>pO=;Uhye_6S{urJxPglA=1)V&QVr}!6pe()cUrAbTL>xWqF@mh0 z^A$*6$-CkiW%+)dL_8T~`JPOE3X(OZ5mf;7BO=Nu%lCsMBFZSs_fQfMWt8Rn7JPLb zocCj@Kzc2?1?1_w1ds&xedGYh_ygWu1NbsOEz5VRYp9m(iju(A-%;`;{ARyM$+Q=h zcDDQ4&4P(9l-odaEXZ}C^m_a%_f_iJb-5@bbBPD_$FrCLOtm*ZyNZ$Zhm@9hY836lp2$aQZP=swE?c)a?6H&hOQ-;P?Wl;h@foy>C7wYLS8LN)pJh>yesjDgrEAy6bV@mFw!79Y0hv=M39AB$qA^CdsACqc_2&%j0~azdQyIA5X|7G6PGZSuGWJ4PyVP5Z!u- zYy2vW8V7wXmcBsAIQX?cPf6SJ{rzz)KgqqGF99E;fbZXnRQBeKsrs(W9@gju=}{ey9;}Ak>d< zJD|1$k0nNI(lVQ{4K!1;S#wiRKbyDlTmasqEs*blQ56M}F7cK#JG3K~p`%muz{%D8 z057;BzX6Epaj)$C|)9w$q}v82cwq ziS$l3P|fLjs3BM0N%JZ$qldCPoO6!v=KDGfF)cB~DAxvc&VFabsqx+;BNtdN>Y4~L z|1#>{gMBSJpnW24?`X0rZzVn*73OP3249RBw1TxLsM&fYe?p|15^s(~8Qi6b_;FvK z*-$>$S^;5En|GBuD=pLY@)^4Mbb`&$wKRL)#x)4#mIO_>K$;!r)L6@)mPcpIza7W% z7w|0bP#!P!-e9c~o=xxS!UZaLM+YhW^))X!*$|!PcYYhfv6D8QloU!EqovqSLv!VR zn#EiNU)f=_(8}BtoxIbT3RYVI1tm5fzkp~s+H_Ev&-_w5-Kga?8!~$=#%ed%oQ&!^ zGQsPr0`F1--X$k!A1@ZlH((nMcy01nvMN%z;c8yjV`I5Z`lncbp|m23V@$yl;f{&+ zCh#%{<1h3t=Z}F_bDIjK%cB>mW6dU0OR3lOF4SN++KdR?X41nMUiB1gH1=@hSZbUf ztuuX^x|XEasq;IW=X_41hubXQmG3zvjwzL#jM1anTqw&kw!58>R4;XcOqn!QY+;(u%h| zZ#h2-0gn@C7_452O(0Vh>)Dwy`TH#?)4&DTik$fn;fc(kh)SbM&J$%yzBrS78tP*i z$ADsYVcmEhcgvn^yW3U9D|3QPnz0^0lV-Z3CRLRk)YBf0{?@~%Ok=D8&rJo=)+pNf z1tO=GmrcIHcyF<2<8l4l-B3R5@bhg`%H^qc?c;j>Rd+LgI_2{h%DYnP{18w23xvf2 z?m5Wf?s@56zXGW-`hwHOp9|%-O$U!2_l^CzM-#M_0-i(~#^){A%U-%I^R^s;_|3^3aCV+O=-UGL(Z-kzJ0Aio^*qRl;Hkn?ce#NIzyF#o6m0M=6C9=q~G{#Ex9`^d-N}p z()m2ufU@g~7(q`khle8DQk8Q3VFvB^TErb|PbZ8Srp@LJq@+{-a>{N#mdMH|4jSP3 z$6`U)*rw1alwKL~?O{>=uEi|R&9xK!3ZG|h?w^&*2DB~2o*6{T)a=v-vvw3nZ;B>| z$D;{n?XdBwzs>4H8Rzb}*n5YN_sqL`vVjZKawqjT($ncOw!JX|BRG5qQ_Y7|A5l`> zb}W&bf%hxC`A^^uV9e7Wi}W5YFba1x(`cS%LE`lsmJ*p-A6=5eZdeDUa__mhui9Gd z9mclY9Vm@?5ltA+3#2A-aNbrZscad@lX>HRm8;8#IybsKO?jZTMK*6Jn|Iiwx5#BKlJwb_A=gTwQgF%HFT^K zaJMn1mDuvGam+DJGIdeMTBzBn&3Dk?Hp(qL1=1psz_rHBs@J@H{pN2dnFlnF!tu6u za2^HYtwGw93oPSq>9}7YWn>~3a9LY_QXt*m?dhO1_R6%I4&om63N0JZYC6ceOZk54 z7WobdtOUBnK)(r&;@kg<{x$!Ez7!cwKN3;s|Kl-A>VR)E(EsVbq(A+i(C@r}{yvrd zcA&o-=(fZ0qt5=hqDJpRRsKsk>mHrgDHKW+%KQ%Q%Z^8(G=eG42cEQ*OyvTkhjLtu zF+AtY{j{F{eat|97vrcUKy4j8eHCyl;i}YGnl|M)#aqSafL%J%RRIXPJW1?d1}E~R zydJJxV52?@daXOaCOzkjefrTE#g}-v{XTw)dtguCOfS}jA(6s2R1fu_j}6?+Es`xH z7XZ(U%ijb3T`S6_KDyZWT+PobVb%%mG1hO{o}qMHk(&l1gh>cEfI^7+z--QEtts=S@}bV3;4{ZY->Al>pp zj3d?7BcV~@Wi`b?xYB#A1;IHZ*|w{J%VQAr6i9_hW~)u!U%pkymmJ-SFWBli1im1Z zX$|ZUUa9U7o-e(bB!R9?O5OIG_VqmF9d6yLR(X&0{%9)8k3D)uV)9o4m$}`>mzMBO zkW5xm$5Y4Dpz-BQ@T*F~I7%e-w+DOOa?2H@crkejqVvSIlts2kTuVMg_@@(0#uA=w zaq=9{o5UYW=rRD`38ZCE?c66&{`u19Nwjl+J~R0HL&n7#qH=*M*?Q(`sXj^#|ps;k3wVr&hR&!*EGOwT@#B3&0fCr7Xg$p#u8f4+ehF0wHa7OPa?-S^M zSI~=bPC*I8Rx>&n$aj^@J4)S0F8!Uu=sOc}|A5a}Ci{%zz-Jt<`iwU486l*>x$QmEAr5h+ zxXhrwCRHi>jQP^K1lDto_<+xdS9W>Vgna4UH%Q=DfWI~HTlhGpQzWlBR(Kh%I`&H! zt~)kTpgkttgNtd8jkJ2oc<@=tcwW=PG1DPk)6`B#tx8R8p`2POrXQ5rcd`D|9(!X1 zq)`aJ&o?T0Ds&h9xBcLJ$s(unUd%8kmG>Z(0_mu_Z&>9~7k(x=tzub*mj9s)cgiVVIV8p9a*EfaQ+yfMr~}+}!Eeh3 zWvx2Sy(wig<2Rhc<~fX(wGqlcuB;T7FMR~xtXAJO{NTGc$1$xDG3EVV!uvBeC~J{D z+5q-(?$O56sd3?5&bfhOt0(iLC5vu(@N~-7dZ349gB_T%BzUwVi!V&s?(Nf?0(8b> zjnBt)hWe=J#eHsbg9myT`JZOb4gEBlbyxO@MGdcx%noBThoedGt#}CHtTJ7=9-;$H zI3zMR21fp)C}6oVreR7>?2qX+-Wa2?p30Iq-BnRW!v(WC{wVymhsRHOz7SdexhJ9xvA|7lSu1lAKPF`2((OX5PE5J(MDyWE|Mj zv8Pj(@MkG=Cur)Ta4pkrKDe&o?Zyp|>vvY?@cxv;ma8{>#5AmjJ9L$i?-cwvD%aao zi;+I|josJq2>(vw7P$L|)g$>ESggdenCiq+;s7<2$JAlA-0@RxbFFsB1FuABoJv4}t$0ZJZfa{gdB3 zk#dku9eV=lDR;CzHXSMXD3#yt;6F-DZY_}9(I@0Jk7&qPq6s?$8~D-Hqa8dc{aq|W zzcZF$l;bNe)Hs1E?sn@(qJh$wk>Om~uITD_MQu@J)!o*cAoAIOJ4*LV){GD!T}O2F zNPXr2a=T+yc=y~Ug*UtK#ctQ27(=Gqe{ zNQ^PD<+|gH?bim+U!Tb_rRXRotSQeAW$;W%i(%DYpUH!J|G|u1Yq<8W&zRvn6Yb67 zR4L)+!{+P@*U%?&VcMoKzj=6Zdo>TKWb z&GXy8SzcucXyiAV$5evn*G!b2PEwAtv;@dR67n5nV%1s1cAG>N>cVvFeNhv504)KF ztMud@HQil#&6;y-syn_}UY`-#V7oPP``OY= zux4su2v=5k4eu4gy<48evwS%Fk!j%?*V5F4s*?F|Wj!@=an19`xiB-80U9PgdWK9b z;NzjQXNb+*gnCE^-?L4i!E z4dO_Bh0lxo`D9yVK4%T^DVJPEXsh)R;By?79NhVL`E&uFXsZuJd>uG`09#qd%GXu6 zkF?}SRLWOW=89FLN~jg13ZKudqh$Hs-aa}@Gx7dF{rSG8rrN(msKk`8xoF9#*Xi|n zsgz9_=~9MBmy(Ut8Ko7RtEtxMrCz*yA3WF7POtJr19x&XF+B%8>ExPkX{8#r!gM205#-7KUBOo3@`f?aT+Pnesio{sCDATIo`)B7@1Ucdfsp zljXY;=Kua1-=&`%|J^sfONw|y?1^y`Qp{z~IA7@!{`$=LWj=P=fiu3nbWXn1)lEvM z&vy{@C=;U6d@0z?^5_|7o%UFnl6J<@5nWBXx;Pp|G)6(152*)+ADf2H;CwNsSuH>b=j4H`e+>?;IV7%C6b;6?_eCxX<|OhlWy+5#_A!bQ;zmL zN!PuO$2oMIe-#h5l`+O@ z$RvKcGTUj6BAYV)CpCBS+TgSlGe^$hoNq&?#mx6>_hfHFYTQ(){{U^}d~x`7ega4i zG){w~1hg@pAu*n|0>$g)`BPOg#jIysJod4_<-ALwn?dK4!2h?Q`FvZ<#O;e^FeO3c zm@6l-g<4F7#A<2waSL!cKT99W&=|pH{H$hNSEZ{pW+KK|6=`#h`oyfvW}HMTf!?HV zL;HK!Y)#O?=SjPgS0-5YbYsbM?c}=c3hc*c|{p#$@v{X zZGA%fGPZr>NrlO6DbB3f!nP=FT?@D->skvf=T6P;xX(gogYP|e>ZDYNagnf*zhcC5 zF+#`_mcV=~whWQdeCbepU{%CC>GMJBkL5`pCpdMDL<3mGJn7cNJ!|{dAhEjX%L8jo zAuqv11+Exi`=4^+8?-uTp45_H)wH#8+K$9mzJH$fMkQ?r_R+9`%OLHyEp(FM)Chid z$Agf1VT#^7bxMEg<`I{Vz_gum+WC@mNXpj?OZi-!1O#9I_(?2{{xwLn{&H`f&?YFo zu1h$BM%`YMh`%sWKiUP$9gvz$f^x5(O5OfNE=DhKL&29@wMpw95?oX^E{ zniqPo?*i%H=VU{O@i*g24F?)RT0Mdl^{KQg!>$Ewn!xMR`jmtE#Gy2*|Qjy9`&)q@}1oNEPWnA78#*nIrNXi;_?iRoV7ZhY(fd+RiAGypVh`Vs9%pWK#bJE`g7W-L*sv_zS(`Ri+RfH z()q`PjXRd}M0)%01MQ!A(%d-qLMy$`dD4tH_OIcU0j{RRQG4Hvt>rP5qdr4V9ybe0 zJYPBh=}JM}W;}ll&ZEK2P;asJypVRYu?_0~7(V$`45j6h{@_FVGop*#inDC3B=e2& zVeMu;ytiF`uTgz(xBTAKT^e|gT=XdL#i`Ag$M9EY#TCVy_j~B(0WZyEMk8 zw5@W#pvWmRKc8j;#k`XxQ?u#pHew#KNOBgfy`8*}JWe3iczN++juJv@nTPDXJ zLI015#+}Dfj@Hp<<|%ynn>SPY=qMz0H7wQ=Munb6^QCsSDl%R%vREDX7ek~*O6SNpjf#W6V`A8X&$e)WY`NEj-S8$@6sQ|4X0GLk9@oVo z;FG=*CHD7%gYQSP%=4ISQIxY8!BYI{d7chgY%cH0d zZ}{$m^U3o0?*X~ywrVTm(EE*`c?LhVu^Y7h%vW0${mP|#(ik=a+OLdi{mZfcBdV1( zYP(O{lgCy-otrP2qo`4j%IoXqOGda7gWP89Eipy$`AJdH5oWCqbi~kgIyKH;A9a&` z@){6!k{QYga|#BHi$R*U=vu&Fh7U(;8T}|>Cs27yMEhU>WbNY-%csQ*8HolJiHP1i zWBnSV_ws`@ri$c)#w?XJCbtDs019S3Xv|WQpVpXa5AN8OyGhZItSGL}Ud!vYD{Hjp zNo=%j4Qs#j+%H}QissxFb}N>XO)l@(MPk4A+^y;p>6R;hHpdOMs3aSj8UXFQTmb zrF^qksIK;B=ZjR-G9p^GW|0Is@1f*|7kc|Hc>&iUqF$Ew3D;W(G$;%Bum-5D{b0XF zpdUFxRP;ev&))*^w@D}w*bSsav*DOXbLbAhTjVsce_H0RWXm- z(7@9k4>NYtF|owu#C@ZB7BkARNN_|eFDVS@YIxRnrSF*tR{9gVB!n-x18}%$umX!3&Ujm?>b6b_FXXJ z9=ZR$JmbCua$3okJ_R*)WSrVhMg!=NjaPl*O33GmU*H%;jn^Qo6He)|2Mq1S9T7z$ zO8jr)saFf-beolwVTn}AB~=+&yuaLA0^V7dd@o;GE`P-vlo(&>v)dwfY`B6UAChZp9dMzih1>vb8cO)+%E;pDTR;k>@cn)1Lv>%H&@RHRb}K zazi)PKl^xN%Fwi}Rnf2D0Ft*WsPHV6C`qioME#d%L<@Wqb8=uu5)o{vdk=wMRGFt6N^x zZiZ*J{1$^;cIegJ(~UOE^QzN5UyaP{5tQYOZenA$8vH*73#LeSa<_4q1=DQd0y(n% zGMv)zbB0;3e`dFgo3mxRl_yP4YQlJx3;aQT%-K702H7pJz};L2vo$Y_T+g-T4B~op zH?y^}qsVQMdCrwS1a1v}lu5rd%DM-}2Ia#07FFjBEd;Dwv234mrQJyrq+Z!g0+zcd zIndhM_YnLJ-%81>wY`1$aD2e0j0?fI7kf{p$#JhqjZ;1ZU!zf&h+|es9?wC1bXkY6 z|5o7MAxFP?k~1M#^TTCsW%Z|u@NS5M+2gq93SO6n2fsTx(I!;L{>9-AY~KR!CtBjY z-r8>uQ6~2!$)2&^=LF2VGR6pZzRi^ub!)?BcaAC#9^|3K#Kb&XSfa+n$_Nz5Z<5-& z&yaxYXOuMFLdjY1>sP?>-SxeFEF7=6tGBNZj^Ev-v~gwfEFTn!dBORYNshXdaOFTC9sHWaM}YpeqP6e z&ia$O7*Bj8R~nZjVPezAY8l)E^d*7B)-msjr1@Q_7f*>(nsAh2 zCSqX;Sjt?`^PoqN=uX2 z*8{(bER~CFwR~~?KMU|N`6f!{J+1i6ziF>tIC|R};ABMnv}kENks|)nqV>8@Qlu&C zDd4RJyz~G?K)S#8GJ8xWh*}zQy1#YccvKv}E}0EhhiOmP|jUwQx}0 z7hORAv4|m@=gwDYf1K#gJ2Mhcr(YG*YHTBZ9;0+$fKI@1B4)mr&)NdHbEG8$`hFn( zSQ90WG*YsCOK+b8j!rmUSk~twm_C1&FmIp#^X2)F{-VgxvVJm70(acjKXxNKz25Sg zj$7pRqmN}PdN$7ZnKq0W&c|i{$%dHMY@Q~sP>W+Ua;2vD^xLrgvc z+}$#jU>rS>V{LFx1B~D?X8n{ivE+ag2y|>ZFp~@+#;amEp2E= z-ilM6Tm+IL*bk`>jo3U}=3pe$*SV4-ZUXr~5-*nX-W)I9?6g|^mOxGqW%QwpG~%oY zV*BC@H{!Ch?^YZ+`&`bF?+JN3m&SrkHV?I(I1>eXc|f4#REr|hJU88uURBYSC*2=+ zoj<+=yfxd~XIEqCj$Qmcm7s(*Yjcpw+ePnuuc7tl?zw}E&5<^B50&_5G3%|^CUbv# z?l8K`<49Apd8}|XSa?hW=_75R8&D`?YM2rez%&$!uR&~i2<%+OWn?1uF#XasQqc5p z8mOD+c8W|c_WqhGmPE)@I;~n=)xW8h1a1ZlnH)p+VrZ&8aiV>%md}*Oowo^G#YB(4 z<86UX%sz#CW#euDNa>2vKxsOeoC?u$CPalg0rv)IKUfAd@$G$(CcJOL_pg!PUl<`3 zxX(oY`&?~*TG{`jv~YdTTrEhc(H( zSo?V)y%gmqlFLjs+Mvu;nMxX#Z~901#V+5}$@;od>) zsnBOB)=bN};O+aFFrF{j|5?gRe0tr9&mb}+_R#?)H)4Ky0{Sjx zF{-XJ&B$1K4C3>pHz7Xf3y`J>WR`V}EE|wnK9+$d9Qf;=X`BuHhXJW*DOo=oZs6GsjL;?cYuO$Py_v_| zGd}#DZMom63EDdV)eSUE1p{y}c%PnJh{jV5h;LHrYh1tDQnA*l4dNK@rds@ltHp1) zT4g+wynbDcipUve=`0X?;{Fxq*Q>v8F{Dz9V`l>aRR5?c(M!k74#DM;;T8Q6;ccb%gL^s7ohT?ENCbpEx9G}Y!`pq14P z#6~6_mbF=ZI&0vmS-w*ZXi)C`4em*MABD1+;+`Vgex1Mx5ZgOU8*Cnj4g5=SVjU@6 zw;Id(ZWorWK~TyU_08jv=OBS48frU7)zMOBBUg(1PwHMiouC;8;WnOqimM3s$=3t^s|VjXDXxbjgGL zRPy#8YMpKJuM+4UQrfJdWH@b)@J}r3Ofq$_WktChh}hHk_jrC-11^+{^}i{X`v0+9 zW=DKCQep$Y2X#ZcfQ-Gzl`C-5fUmI&1gGaR59+6{0sWdR@cOHTCSk2}eDHrHpG(L^ zgXPmCcsx+ccyO+fQhyb?8w6$71CH1|IsZi(g7ELvZp0>dur?(D(tvyG4o`#rA4o%~ zL31SITU!BRRl*NxPy1e{K*}3}T7EHTe&Gpr+U20L^Q}&m8tQb0yhG6Cs@}sB4Vk3q zeWNhDgTpT_r56wWLKCtJ?+A9@54=`4(22874cBG3FLWsOVxsZXK%G1IjkN;Wc{04F zl}iii#d3YHVLyd>amjwP@$NwTL0_Y-18qF!o2zX{)=335S5L*V= zY5n<}Ke|6R)Q)*!8kD@GI{yFj6il(5Z}yPv(%`@2OBgQjCESo7^d`(QRrIkim-zws zx1qn)w3ipixEDLjwoE=pdM|0HyW52}&lkCz;7SqidWPyW%PVv0=G}l8K}tTE67F%V zI{@MidmIWSTf8B%kl>S^TU+&)F?C;NY1?>$cz76W&l7>f|=HSFtwpFvkB@NFy zi=e*$K)`(@>st0{R%BHNsw>}UC zzfW39_%it79id8I!<{x%@y)g4Rt@bT&XL+7Ube1Q>UOg&M>?6%)tvw|D-wwiR|n0#T$a<0}WFrGRA z$8)b;OiI@Jnrbry4cxgRWt#go+^N2uxg9Zv>F2v?sn>OXs?r7#2}6WKVn!+2uGQDt zJcf>ES94(&ID9aXQP;X!K_K~Q7;vv?-F z*IB`51g}i7nV^|LMqp>5jLa@XvvelhF#g(HXnOQthcowI z&?!ecjo9)({@NUfUlpBns(kwzm;WE(HkIh-wmi*k(?Q?fTxmoC=lbVJ=MKCrR5etM zsFdR@uy*P54r~t$)Sp9d&-_W%`Mx{uYbc2_gnZ*$^4o8Gm;0R@-yE>;I7@}&LEpxX z;D1ckJHJ1^w!zG=cQ(Ua)JZds)^{EFHU3m3@pgoTYa2#j8l~%<^SYcCY~K$va$asf zk?-o<`nqcykdwcj5w500cVlng`Q?g^*9O|_j3qy&7EMvwqpt!r5C zoC5M&y9(`1)7}!Ob9{{^;Al*+0qPQKU}6Kda||Gc+IC@?blAYE*uWZ0YVdS43dOt* zcv&9z!u<-KX}~8qH_+f7p^jzDky_(;r>(I;P%zTgII-bYPs6I<88`5E`bwO$8H5;C z(_recFk77ZPqN(Es%%T+I1iI)T+q?k5EMzpeNmI9c)l^nIq2;3A)PuxGFQry-@`eb zCd~8F-oCG{qGZ6Fcn{Sotm8+k3xUgyXJV|Za|9x=r}B-I{!BX!tU)0y=( z7X?2OIfzHHLT#We-vnu_nnoIQ6$`m9$p6ROo4_|!Wsl?cCNIg$+O!lbX@R60Y1sm@ z6hUm$^b$a!tfJ%SD=zbjsC5~qs58?dyN(uFER3UtnNdJT8*pI}f{G5}Fq0Pa%OZZG zUw<~q>+-@l7=ao7=e(D+1<{%B|2Omb{QCK%$$Rg%{Nz3&=8cMcc z4iVQK>{yh{yR~#~>6mg`h>qk(-(T^!qks5LOZ#3B7)c#0NZR zi$=AS78d#3zJu@!@7UikU0)7-@|e%zo0D*POuktO?)tn^Z-Sc`ifZ#rzW%-gQLPJQ z>(D3FIdWwNNuLw!%SbWqIahX0vq+9p*792`G_C4h(lmy9EHdQb5-G&K5X2$u3$d!& z?px)!CJC1vdg-$k+mx-6jsR@qXyF2Jv2TcP1VA%0;k0WI&T#^z@HXYA=@9tzQR0?`!P~iwwGN?>b_B{`2rR+y+ z6q^*TRAAtMN()0Lp%lV#GGVdPLT}~CBrJ#F`<6>Gu9W_@sZJp2vJg2E)hIbvsFHK# zXe!5wmgMWD>ou4i;wNlOfBw2Vl^iRaj*Hv53MI$NrxnWX=0}y?&6ppeki+aMLM4v> z$ngL|Lkba=(gbZrSTOn$!lQiwA);Gbp#N4V{Wp!rJwn)beOh|5wjnd1yiVE6F3cqN>s6iR>FCr*mPbt(WXVAX$WFphvd!*hHA?}Y_(x>2g z^OMRbg|g1YzH;B>?tVXfNxz>=_B-6QzuHE(rpt~9ct??c%%h}adG}hWOO;O(BV<@< zh`6T%-~KEo#kn-jQ4;3}azLVq4`vHF%kUz&F ze@^g?`xp4r9Ip93zAQ}28bz)(sJ2EKT9D)Yq)43`qYX1d{9>^2K;|3+%c4!J_u5;~ z60ZoQH2;j)Onye}5KWig?h5TZn8>dSSD`<-MDZtA?sQh~@?LfHSW@>JLkrl046F-U zTgsQ472D#Q7PMoC3p9UCncxI##t8@>&=2|8EmkwKUX8bx4ifoT6wk}0w-Of>$fnW+ zH^g~6S#uShUQDj3X%wH%j`3*YLrFE$$kP*~v3KSw>@n*6s*MEin4|7J=Gf<8SJ)Qg zNCpb6NSANz^6abR;4nYNG}bfD1+zu0HM6GGkm)LK-%i0{3CGY&4kv}UqboR;&rPqaNzkl3EdvN17go(j@9T0H`5_a7=$A|r zH6T}43LCQ;=T8xTsEyDMLeQ`S=K=8fEX8-@iYEnM=rEYXREdsW6E^D=rmC!jy1y%}h_fH3bLdq$+ zVOKb(V<=&Exukt@_cHeLmr zC4h~y_74fJhCFKukMb=M9Dq$MP%kKV4;)F518O80yKDkKd|!gIlTFULg9(lE^E$v` zNLK3*}s6>U^qE0@rG zgf?n=%XKLm6Rh!z*Oi^d-IR9lc&C7U3AJP+SD=-NnL_f88l-8Y)W><6yt)&da&B+A z*U6MDe;PcsM+WO9uZ5Gmq!0UBe|`d5pqymT8RB+>YJsk;xQppRWAQ{Bp4=OPXA|=Q zYMP7>Y?u9#U7jxW@ZGIbdUM@!;JS@KW8&h9u09I#t6|iDCBjV!ecdjAzxcGq^@4*+ zei+|m@NTc`xCS&M`WeW54xp_+MOzc{pHb2nwo8=u=s;CVYQh@HMC*ldi7fl(z;dC7 z2SPF8bP9rSB~DuqOHsP6;zzB!fYN-c$gpS83jqE*U~ice=2d!|_5i%ofZkJq-Veus z|LUeH`QLT{wJGxgwe^6<6d#9c;U@_E_OhqF6sYZ%4K^NgD&`ra=@ueQrw_BgXYrF% zdta;5#_d{_+H%EDfZF5moFrz1o1kWd%d+?2BgQV}>9uVl^uh9&9XxgtTt4k`{{Cw= zYEtcx(IlD`}BLvKn(3t+7)38IW3 z>vdz0!=XpaFH3|ht+2NGtLvc`RtjdY6yHsdCY9bPJ~xBr9-DA{51(Us#V4zn(YgnE zK;KFlG1drhycxOObOmmIGn(Xf2Xgx!h1+K;+&;Azw@)QAliXemv^V`r-2TiJx!uu= z+e1;i{7Dq&4N*g+Rg=6)AX5i2?Qr*rX`+6>Q^IV(2V=?iNBywR+S)leYNii z&>JSt)tBmx6?@|5G%RUoMNU;INzIlPJ5aJmhxCgoI>eFEA+tb!z8)b?E@2{A3(wNz zXM;G?i@zFiHIk*nuZ_WD$27@xZM?s0YKq^k7s=47W9Xl4Wc}FVP~V~`&YqkC5AhWE zr@qQlNvrxJ_^uYIJjgUPHZxf^we0_y>a(o`f3pQVDx0J1 znCdJ1BNE>E-Pw}kQSy`h-o7CxqpmTv>2iC-52fhX&&9XA$yvWR$P0iKOG_J3d9zN z|Ck>jZiF65#}oJN($ERezk>Y)cxRGSe+B=X1ot0-|M{QxhChG*uF2npe@Zv}cKORL;x1F*4}UNGnceV@Ou}D()3GSY z!(0nlJNePStvK^<#DD}peW*7MhxR4d5A}gvUefjdlZO)j86I+60{^}HCIb9D*NgUf zF1cQ~FaMHjabMOI@SWBRUlZV4{!jX>-EZ>Nok{+Hd&}sTTJLHP{9=%;O4cH=( z!9Si)hTU|m&fyLk!2dCx80s%(L#Iq&xO$i-S9X%YQ^OwRv_BaP7FcJExYb*B^v63< zyU&oRjpSOx<3x=-NLy(%NOcC=IqhFd#Kv+uszg}ty(;vQm{)xY?6BLx4vU>A8PFsM zO6idzmOOCNjYcZ1Fc9~bp%O8x{D0b-L|3)Rp^IxN`m8wXFeQ7nR|noI9jyARnlSGJ z3u|ymGVaTZ6DZkPlA8P0Gx3tS@1KcJdk3{Pi$}8GkV*$V7kpnT?el^+>jcRQfSsaU z3%2alrGI_BZpPVvJUE%YclP3gFL*PK4;tx`2ho63H>fdKPc7m5g~qT)G{}Sa`-R0u zBGsEe-ura;KADu!t>hVyZyldR$xC#^=>*qokaR@T;5hY|aX#Auc9>oMw8JbdHD3j9 zr-g1#f@yNB zooph*=7zjGcPTOJpbi7t^sjmGyut)V&hhb;!6EFTqr;IX+dV*!-$gW~y=9SmZ$nv17Bw=GM~dzX+1L``*tHCK)*b8v+;i25lOQ!r0}dy6 z=j;S+AbIF3-K_AgmTjykKQY`tm8rW*)8sSlX~36gQO!$mX$P`LGk?X>pg}SckB~2h zv;8=ypEn`=k~ckMl0-equ$vVb<`F9sW+&#cXqZgg?IAkuZEw5^S)h#s z+e;|N@cEJ+iw9ZOsvUduqXJRHyV+xJRUX@(Qv%TPB!xV0VcbK%D; zCIY3V>F*Wf?7fnZra6J{dBSf2tw7%EfL7cr#YS}ltxP~GWq+4j3Teje2U?u~3{NPu zngMj8(lmuuNVCoGd$m{JdLl_LfZC4Z8FM;= zs4|px87)w%rT3x*DL_h0JoX+u8^Yd@p84g7mQCJa$NRGXijq4vXRoxsA#G06pD1#m zPcX3^?{eW~-iblIw2XU9XaafBl$L$`MXx=DvjK1(k-~YTg7f?UH}-Y!nHI%5U7_>q zl9Ya3!gV<{cHF&VDY<=gZ(QEp{mP{O8(d~xhRY$q<@0V_zLI+5@_rJR@V|fye??rT z_rhh%7)qYKx;HKhc7J*8zkBRvO8>8o-Rq_AAG;o)Nx>yF`E1v*iU01gyE^v6W7j18 zzcO}nMpKeLsy97u*>z~be{SqPAN%)?UC`v+{JvupB`baq?s*+&z!xd&Ku9H_v%k_b2pibR1QB*+6MuQ8S|2xDuGvU8DbbvQ+j6|T2dFry^NY4C)9jH>63hkJ`|fZ`97EOlJ3Ki}#40h(L0wdO zN&jZNZpN(E&B}Rt-f^ESl)VW$qA|$qb#^s}VJRCMz*64UW@3};l#}#(?ZqOI9@oAP zRLAr4L|SgiVz@`*X`lfqEKhLv+?e2o?e;o^Ny0amo|E_B?5sUxVVW?WjW>tpd}p7t zOW-+Anq8dJ}eJkQ5BG>HN5=7yahh3Lf@HXMoS?izmD zKM=93ylNLfp4+K=8Q{ox=RNQ?!5^yxKeLV;iE8`N2HjTeHo84cKHjx1Vj!oZx^cv9 zcphLKr+fKD!SG&I&?b-SWK!M#-G#vkQH{mkb8I^hd*FAun+2z@HDix70b@boA!~^`dJ8o-3abo7)%Xyjh~4 zhTxme-eiP#7l3ccX#wID-h!4F!QyGjrqTgD9e(|(8+ZOO?xZ(?2lfxW=nrE_U@qsf( z>&Wn%Lm$MQ+|el6w8eWEJkSEncu}$|*q6P^UIQy*KYK~C8ScpbG(isV=k#aY=M3lh zbEa?1F@p&s47ks6U(d=O95Wd{gsah|Gek>_vp{|9Maf{?pFI@bDG6H68P5(DCzTfp z@Z{l#eR_Ei_ps3*EjPRuB@g{xvT<~%{nWv@Q-7`KhBw|QzgCzo4iNRw_Hc3NIm0*O z%0~#d2x+1r&RO08SZ)!W#ZcbnIfZcubmzEl?~57v9PzqhfK(VP8e+U*Ft+xP9w00{ zXFGeXSP|oN*9wEgEr2o9qZ=UnT+C&r*x?HZ>c}V<wyVW3o-Ye-FNo664{>r4YUeR`P%oDH!!qwE|;#H;h}os2@u0DHzuW@cG!& zBFGQ|kXpiH0}l{{HBDX_(@9L%1M7@fHF*G|rvk(XZ*9yZRp<;7(_aen(ksGzRX5Bz z5u04xemUHm(+2i}dmF%AH^bMe!Yu%8QEpfC$ZZAkx*20zw*ut9lT^reBq1LPkT1Uk z@@-@XKwg)GJO?0O29Phm4087sA>XrGh1@0|=(5RwmM(|<^GhI)0_5bj6y!B!XahC| zm)Q>_Ar}BLF!|LVhL*`JbaY>4QrkkCHP0`GF+l`=ci5eSrLf%OF1-yAtF- z?uL8;KwcxI_6J*8sffCNvxwT?l+^y)y#=kgVjW1tCLS#a{=D%Gpk4)8h|bA*2%K-&THh>*cVT0);8+PFn; zxdz78&sGRo>}qzlrAl2peq0bz*`1)(Gf)eKceS7$EE>tHfwu{0WUNc~YhqxSW!W;} zk5O{heqjV)a~5^*xEH*=qT1x(TyZHzwJGU|YO`03YBQUJ2e6mDOCvhFIh4~K(`L3} z)4Uq{y*CeRnqh(DPUCW$yn9!2k2O$of2U3UQ%v0h@lvy<+)8uxkh|ye|yt0#u znYn5v%fkW{aXkvJ=H`^giGlh6@*6#a|8hr~+$zyVuqY%=BSQbFgwgC2IHTMuHL9IW z=3{8Vy&1_!W>De4qWH5^3HRQP6ehDualyfg7j2WDiIU)wVoEX}qa^VtC2tR-WCMH> zLn+x&cH!c0;B#oGdfp7<*A#T;km<=+6JM9$8b~~9JV8aOB)DsrdDG|&LB~;-PjA~K$ zMrpMho_!rlVS%T$Qg`Jm-tD~PE}kF8oz)ph+n6>8)r|odIb*9C*?`)WY(!W_GG}$Y zSAS9f_&-h7K$P9h#mU{xHDKk=kC32cFw$a4vtL zv}2THdw@2gebAF>3Tw3iOpht`La%ZdpWi0uw~Hc1?k7-BweV?B2lb%-bt)(5t@4Wf zNSA(7G-AJLi+$hCcZ8Xa@{^g4oS0=v$#hhb937)09%$o>PQKUZI2Tp3MOo#a?I*$c zMU;Huro>rvdEV52ZTxXc3(cLzUM(DsqGWor)0u3?0PS=_8@2G+?@r~wy6S(8k5&Ft z7q<4uC9OT9v{u*MT4>)&Xd?qYmG0Eub^h*m^@d}_kaa8-`x*VRmDPV(K%^P1BUMJF5@-$+uRMeS#1Ef7`O%t7#b<9uK^bo}fbr ze4g@t+cNBunsYC!ITLEm?5;WOduql^amKKd8NO3HW&~FKQmcG@7si>u+*Soic~_CJ zo1Fu!a$y(REt^4iJka4(WFt2i&(5QjG1k8>(QNOLPwxb{xLt?+@OF$imnNEFl(@lG z_&SF7T4Tqex%1xe>Ov@&Gosv>R{;txzD}oJABz_L1m{`ifk$YSPj=_hlC54th${i<6Itdx*8=wmo@YLo zc(T$e@95;>^8uDyV=7EH!?#_zPDxO!+yvaCuE8Elj!%1Xe9i%UmH|FG<=rP^cyD3s z<7jThD}WF3-}VSM`u6~FGsrd6e|VbND*x(j)sDbO1H=7W8EPGkXcsjN^Aju6jwd+4 zj)n@IrC~bs+Edi&V%SP4BhRGCTOxUW`fA=3obSe&olt@_tzvw*6zmBizjF>XUR{Jv z92nx9Rym{7fb$CxJN&kE)H({?=-wHjd zHAs(ZH+lQ8fyZf{R$5~ljyrGd@Ge11=p|{D<)yftZjn}L?IoChV>+w)_UU47QrWjF zOr_thDE_A9&lNvmh7fUrO*o(&K5u(Vgaqz3D1ARlMm2dcN+Jh*VUr_WOMx$L2{@B> zpH<$s7s}*f2{QDrEvgL&@};AuJKhqW?J+a}pObLl9;Qo1K*8�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

J+LF&WVYCTOdq1{yuByV^R)$ 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 V7-wb1z<5xJj`~ZY9-DtU_&+x-&#nLf literal 0 HcmV?d00001 diff --git a/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNotSys-signed.hap b/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNotSys-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..66631e8bdda3a03806b481fbde8aef285702125a GIT binary patch literal 114356 zcmZ^pWmFW-_y6fwx};ap%6?XXc!H?X2h-_-R;JSZHWyB(?u_|F5ypFwl4g z_& z3Tjh!Irkn_&!AH}xZyr!$z{(u`iC<9_ENPOGZoeTS_WgvSiLi8|&8WWf?!=AU`WoEH%5PCJtZ47tuGMQ!Fnm{<`P0Bo z0*d3>hof`Z#>=7)t?ne0$NJN!#I__~ti&%uQN$I|g=kQ}>GY?Y3(G$_;M< zrc$AF!8o0d{FvWckJ*o@rA1}hnm#hcz~EwEOwD#hFG1$>%ek4BtyEtvJ6L&?)j{;9 zz0{!Ai%3oI;rC-k-akt7V(DXFjtguRggXfk`qgrbV4G{#7Zg-bO)UjtXT{8Nc;#06 zYdRX5fPduL{eK|_{=?b#*?&*{f*iwxf}i*~JqZdn4+sjr6A=8*pcEf~X{282d(Tr;A+_W3~ z-0QbZoOJEh?M&?KGL0Eb4SrCscYOb|ytDZ{6@w#3Q^@L%;l*BcUM1n1;U%}uEuwFK zGAc75!2uzLS59;2esWeaDT;&a_%MpT zxSS$!#4O+|a?^=Cnix@z|5Wc(vwKY_7$TuLBlI&s_k)pWVbWJgA@nkjQ73QAx%l0( zF0IyXIlC7}t(bk^EdH1Tm>7TOI~bSai;8}Sn^~|C1-uG?k_HPZFkh`!2-9H%m!S`BJ~X_CfveC= zJPvq!KwT;N20w|75#oLOOpOs(h1NOD>=ohHO@u-0upEH8R!2a61v-`AHBiXZ77(hH z-|M4@mtq9Xz&?Q(p$0u)4)c1|?6EEU`~HfF(huxOrac9bl~^MHB^#Fe<>M)Tk!_Ef z9Tt1;5T?Xf{{cP1uiF^Uzhc`1b!_OU;CDCZLD^&1iWLY3J)g!LZkE8<6vB8Ifz@bD zoYm@kev$wqXu%XL3YVluQbOQ+4V?+PveG`}cjw1dEfbt4fsCy+bMvd5K+pgf(<5i$kqUDkuZoYz{O3_yQOPb05^cg0}2({>09eS(#0sRu-Zrrn_ zc(1zp)C2HuLoG*arM^R$5F^*FRZ|8GT82&{+OMU-7TI%l*SPGkmH>V8o*-aOuc%_{ zbA}s0`-bB{#ic@6wH-DFfLJyd_2Sn}hH2Sh;rzar6%(n(JuZqj$ISoG^Sj>Zv9-en z@prz3%{gMt_(@`n;7YVIKS_%*X~Sw2@@po_q$i90r!7B8jxnGDZOk8)2NPiYpH)Ti zW;V=9Vcw!=O%bmMXcn?uP2-Px1M3j7An1KCzXXE8iup;f#Hn#B1){?XTE={bhEdBS zW=601N~|w{QUb#?TCM8y>%M}`*<(Wh>4D~}_WYgMuyOkrE%tAz@vtpB>?MHyogSRF zVwBJgcZF6&;gr0RV&p2TqHozFc}CFz3y)Ko5A}{Ot^@o{d-N3X5{#(QX_x=u_%9Us z{I1YW{zJnaaX?HGOwH~^601WP3nNI+P%Z{>NQzg#eV=& z4SUYq%la{qP8Tf>1V?NkziWV~EKsqPo^in81qd)!fsO*GmOav9bg{>>0}$=TfR0eh z)wW0l@?T@i82c9s`ii=-Fq{7oyY)ZOubA{iD&Rkk{}UkT79+S69e~X2l~=&K01&r( zh+u`tbXav!#VIo&<~{76P8zp^Zn=>P3u!+1U0?mjd3UweEKW$Jfvh zz0=81*%YZGEv@)pl>37qU!AJ2yn5#7sxzJkDxWYG6Tl{)yDNC&G%VuZ>I1C|e~uuoTgeD#o14B3XTt2>ZY4ErVmb^-3w@ zHyq03DiOx9F>YqclP5BiZ5Ij8xRt1A+k|+|1&30zaq9$qg})0)(=COx+M#>`!?M_@ zQcQpp@eYY5nC1guRO;XWd&7vWos|G}jGG|bwG1uh>vP*eLUfjp_KqY9@{w{ zi_&Hx-=#bCx#^nB#2u!(P36c?p7g3D?O5ZyPsisDqgnbrjB~EEpa-)pJ{8G zvOawt@JLtg<=FsUfDG$xCZWwy<9&HzEmqRRAoIYmA z?j`n?Fb2+vUWi{kVJn5^D|W4QiDEAbMwK**x~FOV+wBvFS#$*#Q0(}^0L-_arP8h& z>mpUu@EUXKsAW9~G0*0E+>uBeSBgbxF;FP~-7*TGA!}t5sqKROTbzJEk{>#;(1;YgJo`3CbQ{VX2c{vM zi4Eox8T9ddM#{vR2@N_Sdc8}C3Zr_SuqRh1_Dt`TJPI3RzoM2vq_P}uFI=}gm5Q5w zRO+HCv>w3cZTr30C^90RM6GccO7~(PkBe&&SocvK0s-;WSFsuCKl1zVcan~xvw&*q zpv{zRy)Xr|kdnP%Spc{uV8u#3h7~02@z?dLVe+di{BIf%E7q9d@a(z~XgBdFa_*KQ zm5ae}k@_w>mrEG5%WuRA{dkY^gY<%B`)tuUx1}rGU_J}Nc09lid&DrK7GH^E-c%l! zlhw9f5ItdiGajn6F1IsMDw%9rMEZ&Mv@)pn|6rsk%bdY*;ksvE9$gu|S_%ipQ^bv? zko08oJt2QeFE$}Y9h#?fpAa{_SXu$~`~2SpTi<9YNq&KCZISUH{6x$Hak+sVztO!kJ+X$jn3U!sK zua1)-5E|7flb)rvuAA$ORk&q!efa>V2*RqPw|VW3rIQJo>rtnF!qGw&8jPYjb+33# zNc^oOK~YE^I6lN%PE5|eAomSN+A%afQ&OW?P6#1lY&UWtV37C%JHw}ZPGj2}rL@khsI4=29H0k?P~4w%Dr z#ZTYo$;4crp+>#~d9wP339XM>yt7S?3gcg>ctwdw`~hX*^NC3A20O+bo$mb$(xq(_ z`i(k54fdb9MwSn-AH{sSom*`b6dv&;UYCxtFtP_RsQK}`sI%|r`le(sDhQ@~lN0tq zd^@N!Du(Cu#^yDw+B5JKEO<>t>8;6MP&`4`RHH<*Cv33r!|Ve)_GBoG*8!*JS`^aDcI|Ge2M6Ljl4PrDdCbqgZ< zOa6-s3u#91w8iJlgOqc0lV$z483Bd}kpXK1BMsaGP|B47oCnIhM^u2Y!k)>=#qEiF zZ52Vhml*pG=W532aD8sd#|}nv2i6ficSot7@{RL!=t*Kx%Dl?V*KuzL z0e>Mqn_0;q*8Sh^^sPs)R`W|^q)pa3c!`lz8N-rGhM8yJ%G2HJ!&-4AW(*NaY-?wH z!WkrzPW}`;lpZOAko`4KYzQYE`ef;#AzTs?SSdOYUE)!Qx7>M()H?+J5jGHlq& z-s;B3xF>&Np)My-G?Gt~&nN7eO~`+E@PR!yJt%&h#F^wm7-ErkeX-+!k=WcBdnV=) zldAG|SJ};wTcb#JUYbw;_Tc>Op9_(n5rO>swT}%^jx=2tUbUUaPY>(wmDElc#!%u3 zXtv3)8o1;J3J8Z0RXcfNnbnp0{RDK1(%lA? zl$gaKR|f6N#2HFBPDD=9CcuD4Z~sU|M_gfiW9;#Tsa3`_Kw`BqcQDWVJ{h&W#U%^-5Ku#{>_#EH_lP$aes>oQ7p z8(ePlg$-Lzw2ZwZD!;0Z(?zhK3)ce?FhaXt%B4wW+NMsZ>d1~V{7$vbFx zMQ_wm3iIX&JzcarbL7|HPwFwk6V+a1*+I;!Zd8Tfr-{0%$E0{&V5^BRCdjZP20$F} zSV3G)ngB{gE75J@7%?oTGc-$4U8S}tn#k7mc6Dk5+T&!oH>z1&DfF;i0+Zu`xTvT# zz+~AWj~+4*To{jo-Akrw;dkRY&H0B?GXyO*AYPxSTs>jeIJr-UzT@H$SM8F6P4wN8 z2vaW|8-Sqrqe(r7jSpsgHQ>fUcfv{J4jv9jiAorBSNWVdEIr4@a-&@duhpooe%K|q zoq>Xp;JS9+82U$Q8^wbAed#)e`e6I=WfRm2{W*E=fRR!YX7n6bM`zd!O_{0%FLR|7 z-(Ls6r$0|OeT;F6qfl3!CCSke@Mc&{Sa!Gcqo^jji=9BahqLAfrh40`693*P5Cb3` zEb|8CAgner%St-CitS6DRSJ#iJ|Ju~Hd32oJ4J3fZ=9iuUJ)>ua5_El1pFZZru&1h zY#!Lcza9u}kPoAd>8O`v#FG0ju3w8qUTa}F4hgkQ_+)bau*-!Ocv|SR0%s-?zcs=1 zudy)T{If_G%nXx|ft%#?TxcdT@XG{9r&}DP*bC3$B)bd}bkr%HrS%%N>qO>0`Iw(R z+)9n_Dp9w%HYmt|& z-|pd9*S?FLR-c;+0DO$r*#<`lQsD&6H*-g~O5xe(V{{a8Jiiw55xzdZl)A-6%oV_Y z_0j4PU$7>a0cpuTRBb~jg8ew;mAC#1<8jp=Zdqb6&XyJ#!+h++2GU2+66jCXxE-i! zh@9d0gYKKkH2xOoj5zVDF1M(BRRa+<0e|Uwpw}W&XOLvAQ@25)ysBE0s*abg0OCZ2opdO?mzB5$C z1awy`k#Z4{GlQH3Djhd@Q=*EFy)aBwtLtO=+h^d&j&1j%rQ`z3H3z`iEypdk)T zj4P)I_Jclx83sF;_-+w?3`b6I31^XWx(s*W`UP~PY}xI2|85Mzp#fJwLz%8+h{%nN zMxI`iAHRwO#u3h2#u*|{^&3EU_PIAZ&L0}Om+;{0OKDGA2K9d_zFm0uv;oussxY}= zA?afKJ`##R@0zp>sDuZVRQ?`P=DRwhi(VEaU71(PaRy^}*VD3z75lfK3*JH8FF#mk zNi++d%Hx5!TV+9ju&TfMn~AOm)1QWWeJRDbG7x{YOW~Q%>7;{s3App_sHW2bbtIMk zxWz@jN8gq%W=~qV_4hzDecWHdZRHk1M6# zSw|Ii+7H7=Jpg@nAv-;z-GWcO&kfaLwmeBB}ZkXSmf@^&%4Z?|Bm~hO9)3Z9hXk;ORb>XnC#i$Yq=vvQ;3RrefXnI_IWr`v4J2){ox>SbTMi zY@#JB_%Qu)Nr-tE`?WEE?G$WGpeGj5kmW2IPz|n5q)IF?75s__{pPacmT`&c*n#}v z5m3;8EdEd$YsNVN?Wwm^)613Mn*FtT>NX4HAosl9UmWOm-}`Me5g=76X{*M&O~8wz z>o=7G!pVqNl*6%6Tj3ZQhSljdnEqt*ml=?Q17OWU2GbF*OF6YE)7#UsJXpLZ3|1C* zDC;v3_oE9B(YI-s`}Rmbl`i}X`V1*wxtD7{LkdE(8=09><~Y>F>*El^D5y0gBQSr|A`8WZ$IoCcZD27_Q^K zR>vJTXb4SL2Ypv9OD9*oP=LU;aYlhDf_6LaY4l`FLaIRqpC|)VZdWZAs5pVJ zNo9yWp!=nj=Azg|Z2x)1ZG4aQxMPxI3<}%ubk<977up%QP=xLr9B@x1pB6J4f(hD= z6E6PjOccHy>az|*_ZlZ}wKA%fIy|zS?SRU50?tF*7X5p*m8PKn%!a={^PZ*-7y!jv z4JWwF=%WDr7<&X+LTxUVw0fe`WZxd+&VI10T2SA7*ZizF74Lp+C54vB93(u?{nPRxuxsh4jRmFN@u|D$1c2tNY zFy0qNa+Bc-h$kGk&BBmAKWiPR6V~qnKmvrlfLO|us^Gq3c}BPb)md*#^a)6k zDX0N>0)ngOp6zIlCEwWf?4b~u`6sXAYCBI-d52NH{JY=vg)o6ac+8pZPE7Vj09`Z} z3vrBn!mQcdseFyWU0-ZBBq>F&FnzWEEpjJB7z+G+H)0?NlnDyYQgYV+O1v?lLsBzD zc{3Bw;-$zfJS>}$rdUC~Mz4<&7+2X+&^mxvExIo{?xuu^NduLZ(O>l8H|Of(pzU`A zXX^!FB*kU9UoO&R$b}D|CahQBSoT3GAPxbiFrUudw+sj`ER#3@8vtQQij^>UIe|Syu zpJYH_`=UOP5zG`LyHQcBpW;qP=OIg`3`VIzD;O!Bj7-Sclo`wGWNC`m zTUD8Ce8!r^`dVj3xXP|^cuKLN*W;Y=+nXQOM1%Fcj>%_dkIm289VU5Yudur`f-||3 z-=@?kDcsm73-zXRaQbqG#i}NwT|wG8!(=sc*>}m*e%elWK7`NCh#_VE1HhPANxbh3 zomq;wYf)o0aNnCb@{-U(i8^FT<|m$YIDNPQi~V$t=dj|9lC+qwi&)KKO-XqDT3w^o zEiA0UTyM9v+I=9)B1p%y{Pwb3#cQQ=BA-ACEW1y-H2JPN)a15I>A&PpKbGF(^-_VI z0MC)O<#xH9@{1UQ^4Cgtou>vZhDLa9<=={1Y-TfpJiRxc0C=05dfCEwv+9;ZpH#1W z)r?gQz>Guw?&`4VnVg$PlAlM*-TIFvrfBr2YJaf(>*Fw)}3kvkIjmB&CwH?k7b8UBEqA8tcS;LR9RjyC8<}Ai*i%Atv z)l6PqIVXlS(*L#{+Vr3Fj(cla3a2XwSJUW_#O7b4OS2V0UQ+aW@>M>BNXJo7_UR5i zJoQJ=Ws=qx#lsfH$dmai56WLxMzCgOf=%WfEyOx#Pzfq^1qlQ<9(REc`+E8uHa@Sj zA*FX%GYMDFu9emozGDT-;p_+^HM5bOY1C_euEUof;#KLykpJp06Ec z$L9$ae3{q3>3sq`TwrfvtAB9$k2phkFT>ADE_aJsqn0GL>cCpwP?O(Q2H#5!*N4kP zzYHipHI)gDqu7~@8FAeq1|ckK7?v~0`~AIb$(ib zz3`tcd_{CJEiqwDxy@7ayHV-aUX~gxkvVG^tGXlJ62FTpd=tq8RPdudtB zBuO-@G6`@=5@3~!#YK|DxC&(9D7%~Xbw6$b(A(8IEfEZx5a^BP7JpUxikq#BIl)Xq z#>hNzf~(hnbyq!4A&FrSblPU=Jw^j%&p6MD9T6GtkNP zXo~d1&=VQ)as0b7G<^T?%#+R4<^#0t%V|r~}2lkY>z##l57T@nJ^_rZIDYk`aZ-!l&90`A z9uKjA&Gq0~R9nI1Z8lBMBDq?k zjXbaG3k!x&-~BeN2DmHC#RP2(ykZ>zDUL;dfaJr@W#6AXrMx&;JvLR`otrBW4NSQY z3Cj3(cJjn;t{@HM2i_5eKzFX2_X z=ED7)&BwWTMSZKQkjw3X^HJmvofAtO2l6d>vj3A>2_bOn9E7>YyQ2B*AjO{TI?nXX z7l$jusd_~?H=`aQ=1sRYQg9e0FTCK&X2}P*m)7%JW@kaSPwp)GM}7Ny;Qz%zUg-0} z%D3HwF2lYgoL=GCqe5q~Mc`7NddEq=ndTGC$tEXGuoo$ONqK~` zAni_qF&Qj&TQt3KPp}!&HlG+^jab2s4jQAGx_nR3w z;uf`jK+gZ(EVf=UV?`I&Q!E`>$$7KM`)NmE#dT*C5P0&p(Ss^-a~GZcQSFYh&VTMN z0>PVgm7E)?P?0lBcuXxyIr6dV^A$CEqSDK6YM9qu6WH)k^o2jt(_%FtPwUR%9}UQ& z&_~A%*S3W{(!%il1qihvx+1-1*A42k4=Ti|VD|O3!^soGFUs0L_Q-I`VWM<@l*n0M zA-Fg=*zIN2T!<}U(~k#rIedT|nqSey22pDdt}M^G5&68jI>QZ0JRQ=>b1gbE47Utk z=aPR|*ltZK-yz;A+-!XRVX^ah+h4mYmzKZ$#9e4t-P+P8%q$?hoWUYD0@e#4FU>d! z9j9DdOX;&&p2S1pr~25C38)v0+u>*{`2cxqpg+q*{eS~g^{3j7}1mx?j# zJpNg(9KD;i>qa28;naMiG&lEzS~S{X7gi=!JohkPZXbRr`nq=VOthB&qln%DB7)H4 z1`5_|JkURTQ3c6(fAS#aE_QV$YfQNhDl+|dswcZYgM=VAkBi2%;US*&7D9Dp%Ag7IL2-%bKe)R3 zH@X&Fpc}Mv{8eofwem9j`&+?bzukt!j7qX2#rXVTwC#=ix|2MGkVW=2KcUS5#G>bz z?bz?dSHKuW-{l-)8Q)st_0Z3k3(KPMdu(UrDNc)rl<3X>7EkYUsXRmd=R3f5!pxUn}JIhtRGC73BDGoA<9>Kaq?pMdYRUmM;q(AKRWyt>#j7&le^dR8({ZP7k!# zbC6Ourqlb8o#)d)cw|&Ke4rW<8mdiShdjkibS#oWpB2Q6@5c-e#Y5p~bsVVqn_pIbZ`c-(YFHC?Hp~u%r=$1% z7T{hxyP$|D*jH>p$lV+vEzrz<^8bN__QH>+jWiSy6Vv?{dr z*ZwxJSd6){Pri#;Q)#v-*%2YVT$3H<+WYBB4oZ1CmGiv`Tqq<#*1PcEdwa1rj1}rX zZ~NBiMFt~wmoG-X(C<5zn9t)+Yaa&7T1m&e!;)i_$14%;U!SA$I9QiA&-ZnyxWb|2 zX`=sY>j>}D%*wrGRekNX3O1--n9^C=EcI67EhDi|?@gM$)*a@WRegFPzm zfV`W|baI=c0P+;GaHl?6zpJ|xg)I&@Oj7-mrQ*Ky;Zy5Y7iTRf1Jt;UZXNB2M0kp5 z$@veT2`=jr%Y1%Yt>Cu=ymsIJUIX}GW$KndEtKOjVI_Pr3>)`&Rk8b@u1Hn`-&w(GjGOOm6h2GeKb0a2&# zZ(rbAE^1xo4?5)8|Bx4v8MiO22V3E0{1A*Fu> z1WdN6n_K-c^$Vxzek=TR`x|76LfQ^<*izomQ;TkRY-wLRsIyR|e>&NN@kt-bJxZ%>rDkohP;2LF6f`wfjwt zz2x34Pt_9NsDN+?dQBP$y5YAE7yb50%4&IJcl=&aan>mrF2M(P&mygB_351ZYd4P~ zL^wiK$>{Nh_W^CMI7kPCu|IR5=;shz0`ZTiAn1HI@v4gZt#63&-#fRCIv}Po8a_X= zPkydBt~ra_IUT5^g+C@PboB459N?!mGW1)i2PttreB#=;VC#HP4*ZY3M$p8Ws4{bB zmZKo}$p60WgkB`C9zW*#y;w{dZI?KP)tAFVBf-1DPa`&mX51^e3oFsh6;~2@sn<{G z@Nnv>Nee|BDbRPjJTV%v8luJEj)*upy*$`Cai9JFRO=z*_Ya?kmi;SC(k zdG&nF9VUcj?%x87`i>S0{_`=iAv<*8Yti53=uq-XqEtQE;We}DnAh9Ofi0^=v zF9Q%WnojFr(18#`i-oY)+A64XeCrz8T1r!htd&;TqHqhj{LDcWI(~3DEFi&aKSTFl zL9=yCkcIfXb4cnjB1g$fs=NAiaS~OK_aQHpL+Ce^!@eCn6eNv5_=xr$cKx6Mjyn6y ziejY=95+B zv3Xx&!&FFUaQ{9L3nVKpaCTE@U^<+~t+4QTG+f{$RM-pm_d4H0Nq1BHUzv|VKCv08 z3&;F*LWmLjDv+{iSj0Y8Tq7RvwQybRylu(uW%IF-L%xykT+SB%e=Vt0RVOv3=!7Rs zifk7GnpwDw%yH}NIjFh*sCi@qX5Axf_P@m<{Ov>gmk0*Z+-;MQ)bdc@1iWsn$~%l{ z$o0%E5y047T(rVGF7WNTBPT|{Zq^}oZIuuR1Kv4ac@@qG1N6R(!m)H>n8(#J@oAZd zm(JA^0};9RmBw67^v~INfY$P_*^(M8op8BWiXNROaypb{Kw>;ER=)iXYjT~#f6w>E#)NoFOuhG04#od@)2AHkrd6COifx(#hsEQcjY^olA^yn zcR>A&)q1lFjuKn2Ps9XHFk>$a#Gkd=nw~YUooRlSM|(LujXqATZzwd(z0QO#TVIZ5 z2%za!HrI8>L;?d{&a@=-*K+atHl1~^ww!e_e=j^)C{Eb}SKXoA?HohUOQcZABWQP! z%*>)Sn(|{jI;%30<3#fr75q*<5X`f5n8{f$y#nkfR16sFLiIv|{<0wrqNY78$EwAZ z%b|Sx%maw%ZTi5whic`pj;y=k2k>@IvI3D zlEYqXiji0UEwpPRA;VXIohzgoptWe#_@+9oNPnd*+AkXR<8T}_{gH6Q4-JzdDxA{6 zHEt8;$FTdB;V3Ks8|Gfp-Em*PAGl)dkr*7n*UEr?3|r(}p(ZtM*y^S`EiEt_52F&N zrToRb#q*M6#8%9rOr6X+-GjwYsirGGGf{x!5pcjOmo03IC^iITn>wYHNVF{{Mo73< z*uC(Pvt84vHzx&!k>h68QXKHj#=tPGcj!)=S?A7B+8wjb+b<)9TdD$C_vB>6F?)K| zy|sxF5J@iPA*fD5hAAPK_xF(%Ns&7iEPcdezvNfhIj`;?%|u-dDdh}P;ixBfU+e%5 zAN)`cJEX(7R{q+2>xyIv#AThmzs(JC``m{rqI7k5*Snhw%`rqjnDWi`ChcN!M)Dt-*?9*u&aBsMwRR7knix zk})vYL&sjIn8}_F9+O~sFQCt5Ctzzsuw-p0Qm@{aC+t?YJT@w0k#@T(eBYV*h8eN$<(vEOWK<@ zVJLH_IR%IDWu;Dwc-_?96@wpM$p7?@D+VZFa;^Nyq5CP7N^YTKE4&kAe)*qe@Lly? zqn}Nu_G7=ech|8;2=&*E_)9~h`hQn?+U;Ub!@jdaZ)|#l!hF8I;VjoDHNC!jEl`ZE zasw17)vm<96OFE#%jOzmeocJ`mlvQMxyvHM;G35gsxo`1+JnRc0lfjHnm(^`uPD?* zGf*p@(kfH~!SCX4inw;pojJ1LIVCzfm{GDh43c7t<1xcwcALvwr+cG)qgn{VodIE61V9)x7x0ssaox? z^~L@3DSjfm8(%OVIdpwxe-QfANB^$#JL^AvrsMdM@2G#+Ht>+#0igjhk$2LmK0g;t z7{ouYEHUqW^*6_=rbZvEFRSSv-=tf$SGsfhQS?*@bJ5?)KpZ`omzT(ylfQ;3$bxWX zgDHIela_~~Fllu3BF(`A#+&(%j}d&w+bR*z65W=6S;l15^F$UeP|Go{0O>+7OS4pH<|jYj4@N>iG1qOVl9GC*+8t5 zB~o6EOZo#n7?MF(a$;C#kw+90`=!ElNE{cXD;_s`G1(PqA4s~}1u4C)xzTko|4}VQ= zo*zp>aY?YtK9j@xuwzwiXVSO+T|1B{qPrH210BUk9!D~*9L>Smx9y zZa%RTaycAS09*{iNL60Y8tH`LG)d`ks9Au&n&Lp^64%N&@iS}@^r?dXPcYru39Y=u z%1#BzjT?6z1B%_sU|qTTO)bw2#Q))EBZP&W>@@}EdDIZLKap0ND$qMatj z`YrhVwg@KhH}}1`4W7T}AC95;eS0;57ODUyHJZId`3Zkm)NK~bhv?gHTVObj|KQ9C ze*pfVy88(yD(;ZDR(Y)UdoJovTo}iXfq6U^A+2XGfut+hTPzu|VsNhTJ)!}&2#f^8 zbgYI53Ph3jE`%-q4rGj>e-fO%~r;`ctn``rzShsk&?5i_MPo zpDk72ORAW&V((-6@wn>AW=#dJ7-ux2r=^OTeeIcZ)!VOa%)(ahA2;cDpkgmW8hh+2 zXV*pD1ao>eLLc}h?o`p9_qII+;#Bzrb}>6tu+TTDejfR{*bTeD=Vlxm_yy`W!E(N z*d&)SMnipJ9sF@JOEvbYbN@!K`W+!3b1&4bH-cUfAWn;MO1Mw0jdemqKicwR#YlxaKBkw!MHB=@m0R$6{~kv11~wNk~ROh zKLF(Ryhxe!dlOHTT^wcKOqQ5D3UJfxhd#S<@-Y{)5sOJHkExvSMgIR+65p0K70nEujP}bl z@qhR%&u#?1Z@$uh|9N1WMD)w7N$0_L#&x%YeIqpK86a1`H4VLdV3{^H+&-*Y7b8TMUzsgu{9+kq#wG)+5c=cqXW^HPxrOd0`ep;=}NFaAt;kxG&Kw7Z) zQjJUP^ik`$hwmnhfINQkN{pSat%LV8--(KIYDYHk(6BOjZJJ@=sZ4IVEo1aE&-tOA zfNO?I9xLa=?@PA8wF5$PX!94Yey@Lmm-Ojc4G%;!P2Yx1~(xUN?wIr5l zO{RX&LB@ zIcI#Nkdxe3gKU}VL`Czadm_%tL%Uwtwj$CEuM0oY*vK>9PAcqS-Fta>29|RYDi2Z? z)7P<6Wew+)W!2$%SX3r6bgezk-uK_ALKmXGd^tG#av8tX3k&t}@6+xqX+6(gw6q&p z=lBQ7YZvzqm+s|xXyu-6J#Bh4GTE^FtV!p>Q{ZZXNo5f_`O6Sb{$p0nti|o%)Wk#+ zi_aCVH+jm_w@mf=UoG@raTQ)SNa3JPJ3r!*6%kLA zuru;-FJi9>;CuI?OoKyy#3Rw!{K{qNT}8GvUIq_e5$g(xrJA}56L9)0cPDoGe3iYz zE-C1WGTmoqZ_&ApG8yaZ+ObrHJkE8^ zLv=R8@3vN7MuCKmdMNi=Bfk@1H$?2$lRSx$bUr4gNi6JxV-W=Z->X=~GKIHqrTnxQ zG*dj81?hLS>4}aCLB_h3GcM@+Bi|kHbe_6a z)H2i@sJEB>?x`OAE~0l>u3P=#&Y$dJvvSEfiGf#gN`JgZp56`@&hNOR%=>s}Y4DfF zXGUt`)bACZywTQu@oL4l_Wf1;Wd9q^Php{cLErlW6+T{wsx)5;%(z`Ft)L_Ez4*iJ z`g$&FhGJ`{7lh~DJZuR^_u_v))3~>`?b);?`o-zH`A-deNZ#~+kpFhX9+zBB%^W&F zcFRirmSg+D@ESW|&0*vFEr&K`(?I7jtK$U^*m$bnSrlLARNbX9{*&de%S2$Q{*5nd zu|+qHBkt(dGBXZYYNvb8+xjet!E~t!mEWnz0>LafKmj_LSr0 zy9WF@uiQP>6c_teQhcqg?qp`X;I|`ppB@)h!?re`{q;Nx;Ut$Ka~0(#i zjgO1pNIfj!%bR3UwM;!pTKc*L|9#~&tPbr-xcavLI6r63+|$){mMJ7SLeud%+WSHlyVZ0`&&B3E70Y7LG*8x`Hk-jDkZ;P?tE4i99uues?y3h@7)D5)c$mMSghK3 zcl-_bDK-Lg)ys*&fa7M`Yx|%#PuN?;F=C4U$I(-U#nm(0mKIuEiWir~wYV(qQrw|< z@hcn)cdfcFj!j%{2doz; z)RxRgv#O`SO4ROuEu>AX{wk|iYXy+rELqoA4}$jw;hyCKsMDlmbtA#VNybRpFi

    YD*=yE@cQUou`VDK#6)@%qoVD4{A4{@`JdLp>gbvLnLRqSE>Qehg3k=nFG$AEaNA zK{esrc>5WcgkamVTy+5wIwc5EsJlma%TXm%6kIO_f9| z`BeO_LZOH~^tF@zXGzqu_XaHkBYHV~j`TCHiXxa0Wz|uQtxx-}!)@xO-xZlK|9YKu zgZpw^)0{aR%f&?iwW2gu>naTEeM?zOQLV(~vz&a8k_FO$G1`!6ETcEsK&4Bd=e=D7 z7DrP^hyw2rtPYnFb^6sl zwepflAKr~)ku`ez{@lamCf+$qpQ`@=x{PjqHKkWu6n<*+fxs|C!G^WwqpzS}82PeI z;5T_?S`=*>VNw^<2Ho?XSD%PNZ!7EB80i@({gi`_W-lrBqic4IT<*t;r!7!=dhW;Z z3qu9}`#Xisi$C@LN2ZsNBDGTgn?ls(${fuFE|t&3e#TPU-(Onf7)ofquENej?*qDdZ|$j&t)G9$^h*D5|i zZVq)H%y~Yl8+U2ia7PoYsz&n~5QKbMU=%uKh~^Cg+VsJGewUK3{s|j7;_3cq7ub`f zPTL|}<>*`+F}pjb;lmFw5WN^~X6EpGE#2F~%rVw#&%F=R^F{V=QRu=}M)MBpjvIsp z2^#O1q8ta^=BW=9QGJTyKUeVsI_<#|tPNVGzjNT|Pe1fjC%onl-1V+!$GCg#Y!-<1 z_5sr_)6@G1Ba4?2Uu}K!QI;tn+WPQFZ^e3! zk~S6)uNQ6HG3P_fRR7UH?O%31+40#L!5x89{4~AAw zqOeS+&2SCzK+X96diqH@rlq)LKN`0Dqe|htNVaEjx7CxBFg|^j#Ub(9J+bSaw!bJ{ zM6&Q%7VV28L6fEZ(I{EB?stpXck(HjOs0-@ll+>q$u54s^?(MwR-$Ex<*=_Scm|i4 z?+9q_M$k77#Vb}uoLAEhh2hpD0Uc@P5x9soq{PJ6cX8uoBcJ#=eK1i?EhBd+XCX8A z7i((JWTzpGydt`C%Eaoce$PPabGM>o>01(N&gUY;5b!sn1WeQ7m(FUj;msa*C1)IZF|>{#JE zCu9PD)1%`Ja76=~&Eok;d_F*Z*Dz73QHQA*CDEoR^@!-x8qQ9}6mBWnf9(<0ly% z?$R)fP1e{08)!G-4#3Ca`KV_X&Ic#~}P%#(;|33 zoj@xfta&#LM}A~S#QaRo8w}k|#r%fhN6cK>C2Q!Djrr5aUi|mLj<2!pkm4oq_uqTQ zVzViN5imsMbumtq)kRHB7R>GFpJW+z5q6%f?t#`I81n5IHJsxhSVP0<-GEskOP;q& zA&dV(_=-g1Z1|Ve;$2A5ANHs1%WtxXXNfEZgZ(wbq? z3d1Kf^k#z7hZ|38R&l{>WV<~#5MpIq`k&TT+@X!mq3Y)ZIty7>!6%)6G(J)J+9F&Y zQt4BWUY`j0*m%C-yv_tCunVhMzQ4Yb`D-QVvWN34CAV_JaYbLcGHwTT0&q~E7F>Vf zu|fS^DcAPZ8^-H)A9Bq>5-H)j56tf2D_PN4$&%|7)9BiXh^=giQu}}qfW+%y&+l%- z4mGIXnrybHjC{Cnf$dq+d-|b9&x!7Q9sD{ZSYOi7qcUHe%pV|RDH6S)A5=GlMAZhq z*nrw3Rpkf#+h=2x(lxb8L!Us}wDEs+2N*Y0ZGQ+G#oX&2dg6|0s~vENAPx}De*iDXHB@UvzHKr8;1~{{Ud>JLLCjkZbS>kDIsRmE-mLjs4L~ zmt8zV^;EWGwbT7iytgr0RS1ufmjuF^#N@0ex)!>BlSAS?`BIqYf-j&BblXt&gWh*P#o@;`%gAq~{lTP|8F+GrtdnMN$i&=@tN19DN# zU;gU9H?b&tuO?5Swv{Vii1i$-WI#?te)o-qdG zV|0pLiyKLkl@m=o^3Q|&$E^R^*8(kQ{RMFxS~|SKda#~)pBk|6iJUW zl8wOJmc-*o&8Y;gVB5VRyEz6;qW~nb{P~{F3vMoRFCEArV)++}HLDf9DtA(?>J9iEX-m%FQG^N~&z4P*KQS~Y3u z8Se;B4AFjX)1*BAJ8k}VUG?T4w&=)-Q({J4_@~LJmi0><*#he!G4KS{cPXl2=Z+VS z*j$mV&MY_P)=|E{SG+N*$SvOSUujtLrodEzZ*j4;Zxk}Oa zo=wJz2{0plw^#|v2ko*J=ap1$%jb!&G97bm?Z|lsbGo4GDw}lCO4?iL4YeCC@sty$ zv+=URd3AuLRy3OdBR#_OP)pmKap$k(4z-rVI?i=odd*xkA-FdJ>?7WM`Isk)R`zP+ z(4eF~2`{rL?!;CStEI65_woh42Pm=>2n&O41 zsb#nSld#OP#*E6zG}3b-DAAr>n12`Me#6siN(5at{7xz?S9YiJb5pm}4<@c`*_`oZTmrV#av zT$$-CGq1veUF6J8UgnFUrAhSoX$7>)`j>_MuMB(J=tV!=HB;5u2!j;@is3rz+R3YPT_`+HS!vF*E zcjcyc?{wqJ-xJngG{4jTp8rNyOyZsQtG+m|s_lJk&-72YSXuljY}SOr8L&UzE}vQF zFl{<;qJ?`0D|-nf$0~b`hKLIx5<7Jfe7w$d;MyAcaP~P#be`J!0%CV==d@7nEpnx> zYmN>f)O)G~hA8}|8cva9)@ zxlu#=w)y|Ql_L;GKkp?bTUCkXOdU=o%{C}WM8|O_1n39)7Z(x=#jUy=e0@B-9)UQb7rwj_7tSnzWzv4b+BZV zr_5l^!zhA7p|OGATH#~2p|ur=6b{AcUeiU18Vwctb%|q?usRXk>k}{P^;+T69TgO7 zBOptbA2$&~O&SU9#YG**-%bEJ6Xh3}Uzm-@EAqfMK8ELdP?C;y% zj=i-wn!nqFU|9WCZRs>2zlh<5v!y5FnH1Ff;p znG=rYNSFHJ9hj}dw??^S2W|B?EwD{R`P#iZ)wekab6;5kJyZG~d_Nd~Iu>0YO%FY6Ns2cL;>v zm3Lt~t3MU2tb(>q+C7^-te3g8O5bqe<|`Lwh(iL?%KJ~se~>sw zjAkV!=h^+9h7nlL^x5F6_>WeR%o0<62DW_KhU&GV^;&m#()L`3F^h{3GwB_my24_O zQ~$E+)qMXq?e2-I-2(SQ_t)H5Bo&93r2XBl?h*+tm-BB^j{MbkNBe^@vYg4Q`E8Y` zO(4}!Vt{4h`2y?VMcae-3+swZ9xKF4kqIdkdlrFyyiws^6^#o$4!{EgMwkqT)q`&GUA=70r;m$)v<2~fJRv|6}p2XHx`7W)t~Rz5;?`E zx4{Hn>~V{DuZ z%}PPjCl-yy%R>2~1kW4>ukODb(q-VX0;x)LPS+q{*Da5?$kvSUX4=J<%`pk({jRL8 z>>OQ$t!>85w0g~tx;us%AXeAPiWjF9->__SDSdt3D;K_G(hxGow9EV21^td!x`Q^y zLvdbpIGU)TR2TDTPVQ}3>RVUy$=zUW2FFu*Qv5;4 z)KI3eRN?tO1KzJ^mhDclp+)nKze7JwD*u!RG_j<*q)fV%IhV0DpKoXQJY$y;Y2AN( zoE+R&oL6GWRRY@5T_Uojv8uWiqLnLdHpHDR_ftPAOu|Db?JkUqAOVv?@lW> z6R(@ALgJ$)ikYpf=I*^1l*|~6A#^X^Pi7qVzxM!{aqe-)PX*a4kKuw^+hCb*vh&j& z1z#jaZ-W_5XOB$CIG6PEdDg`_*zz*|UIfeW{Wiq-tdUO<{>HRXlh3|$d>4ez@9OhT z%fLfs>s6X_O}~juYDW1cxCp+HV?BtWVjBLZYldxa{^+T6`ulaSL2YW2I;1qg*m1kt zhHN?;7bd5$Fz;h^NEnar2=@(aT!qzL2INLp16_n-8l;~@A0c5S zqr~_{ANM$8sm0^H8Lz@V%G=X>b+tTD7XLk;nThh0IKV``NN9k4MgQ=e-}zUGOKFx2 zWoz`)o12Z9WHX9&Hdz6*kuHfyGu-#x3Xx_X-*3|PH^1%WOob7n^?E77O@jZeYx;Xp zBhZ-xWvLNL%z@T?{?(jK87`V9F$~+1la&9_6gzaZdpi1@{NySb$2lTF^k(%XlTpZe z0tk{mSU*Ie1uUF$26BCG&-G^a^IgG_V)K$%p_0qNa&h<FSLzG|z%akgdPhzz)? z+5Q<|wK+^7qU~_!qE=H(GwM%`)g+=kMHj|7@(X@X;v7Rjl~`~yJQUy_@+mbnYZ?{%zgq&53xoR9&Y;f{ zx@&_n1xw^Y7!r+M$Gq^c;>JlW_hDNs*D-8;)iaBQzo=BtBVl(uPN_>hGo-nC{2Akp zT9}LwPZpu?pR^pCm;4VR--bn}f>Ov`k(`|6dBd-_7s;5wuJzv%#+TRM zSQ+yNxooCSveM&Z*#rQ8NKMwN0!nRYdZg@EL8Q_EiHcbA)xRHTcak3EY0IKr$T7!HTDrzjVN4aa| z&jDf}t*}YA0TO>E!92I`0>47596XF>o&qem<<7RFxeM`rKM++CFvQDT4LqxR4Xhw=g5X zF)+T~-?w3{$&S5|p;S{aMcxvO@l zqji=&*6n{?1R@SALQ%$I7w}DU+GT*m8C>%cH-hC%5$2MZLZZP;M7$u3U%7CUt@!(B zdDXPOunS+ceu6$q z0(adsEX}oV)dlhWsbW&$^R+O?>1)ahkLuqtsXH*EXT@oMblwjc*qd}|=FMomNd#V+ zZ&hEt6~Y6^zSowCRKWuo7c0oA3YWYkDwuEYAb({R3X~vMLU$%?C)*_2M^j_zq&9Ba zlwh@Z?4#}cIko>YBp{XHT>7n|V>4+DJ)OY}G3A1W|7^!LRM!PUXJGYd@>Iu!{pwM^1tAG#acAEnZsJiRNKoI z65dBfipb{tFReb;Fc)+WT?+2wEA}vELDw!QYyZIhZF+`aa z2Q=_!k)r5RlKW&KS<2>RQ|H;y!AG-`xgi6Mj3eD-|AmaUk+xjX=2}3)?1$zT6NE}u zig;u6I)_eW8eEd0k_IsSpIkZLNf4{WdHMIP^0~+vUN-yATVda6rsGkQ_`Ty6V`J6W z(Wg}%j&dg~MQf=l$jb$IHgKOMu1f3@JueT8mq|zWT%3nnB7D=LjVw19k;d|^?ueJY zvBId*=PcFT?o?jNKFmOFln{EKTEEFfMeo|@Z5od^4-bY<*q9ubh>yqv}rH|M#QE}H?K4CyL!ze%dMm#om&$Vuyu?xe`6(gh`*-14%^^TXK9Ra|4fn78I@J znZ9+8NU_pEQ@XOeXm_Cy+i<&SQFFV(uC8nU&S-gtk1;`N+{ss;(Ve{;evIVt% z;#$tr{57LdiUuCQ-XwB#)h07eK8P8o%nEkVj~=PtGFv7Tq?8}u8mcbBqc_PjhN0NJ zeu_V*3vXvoD3gyD6l3|G9^Lfjn|bH!Pq;h3*%MVs$=ce`Fag>*c|~r z=>&gGnqNkOT>%Y+>|gMHClg7R7A70cXy$oF6#iJEo%6j4AMH|1B+Qrl8ik&o}-lhE3b|AXWEzNo_a;7l5qUvJc?s?yG|nKhp<^PLT0x@x|yZ@}hbHxwlnYm0#w!CWutDC;7vv9wAMNuym;)F0`C+{aI zPixh)DHxOHi5nGV=G}AX5lk=Tu^nnKC8$VfHQ7^3m$%{{?V!HQA1miE;c*$ULdt&u z@G97pjD1f};32Rgvnm=LOKnxK308?3BTIL%p7=g|!BcNtmC~xQr<Z7~o^Z!}8Yw=GUZlPl_Jf}P!Nc_1`m3X`ObY{04l_-_+7jz=l zl!?pqmmy=LF9kxKM?8ls;_Xrl=-et*GRLrZ1V+}_>eXJFS+zb(HsExt9z#ukwB{cX zrLR}q!%H8u&OykHp1rqZLj$p|2YW`)aXZUs*WmYQ;K7+=!n2|8hh|@{n55#y_rxv0 zU4+*D}d$Slj{~7B84mi>D1H8-R?= za;rhLqjBJrP`q{ZP-H1W>@H0ZWm~p`cv~iGSf6CRJ+Ahnh42Z@M6W2L&DR_}Tg#5p zF1&4ttWY0?Mb!vimd&^h>0Om*s+92vI+!t3$OQcAK6K=g%TzlM*XPH`C0-hoZQv8s z@qmHj$CF;qd7l}y|5qCH=av}^hpS8b94{Izg{uFKno3D|TAc+L4x;Cf7qh?~Ncx2V z#=Yd?ED039c$I?j6G0*eiw69EdxIA{qWLDwK?j3dppvwCS@ud9Qfs)zDnz!U`bgt z?2i8V^(~~>907HN zp3YRF8v>U5gxCGQw`7*qQ`A4+6lCOm@U`{>8q9RBpFCuIuG-}QYD*caTnOCt-%H_RqX;z-Oq`=$ElB_@GKO=^x zj>9{d$viVgWWcUwyI zx4Dt^M8QK|EbNi~N(1ry`bNVzC#<_foU7I;es+2dZp`J5Yofv?+^opa|--Xn%LxDDMzvjY}se>N+*K-mnQg`lCHJ*BI;Sx zwRm&Y-jKtR4J(KfJ)`2uXKq;wTgWVZQ`(NLf+KsQUoJFb$gG~8NbbUozA61%sy@p+ zSivF<5~s)(HUJ{MN?0Fd(3M}|~6!6WL*j>D=wnR92pkau{wuS+*G|DxI7`m6!OJZh3wz#pFI z!H$w5(6lZ2#8sABn=)h>^h6un3`H-=7NFmw4|t^4RlnU#TS9FMe7h}y=!6>2O(u~5 z%Dm76w|y{gzC2Azu;eEF$~i(RT6lcsoOp4mnf`^Nc58w;lpNc~9LsQcV4Kt8jkkmd zwcFJ#oWx^j0F3bE=T!zJ8=k11#wi11ZBJ}tdg7<2nlLW^nq16%NjR>KKxoEiHl z<3?y;{Mzjlu*|DE^|Ux}a;^@)4X8Y-dHCSipq^D=Jy`l|%+8wkc-i2Ha&7ziYGjR> zHw$)ZeigctnoqfW|0|V!7gS}v4{0@Akb1ais7PO7pWz_}6{ZT6b`jnV<2X!%GthuD zbzfk-hN)7w0tF`a`##YaamwuFbOF`>RYNHZZT>v8H=HmwK4zo}m28-@W8@!q&(+P& zO}toNBkoW~w9i%9GrhF9lJ~XP>ouQHYUFJ`nV_A{Awx-s6CGq8q0Q!i;qG#4A)aQf zfPXy8ZVIC_rP;R)j;PoB0qmr1E|@my;4hpwQ&GBD}3qIG*}|J0K%^j)p$s9K`G2<*J*@B23FOqLQb$!H@F zfdZwd^6A!!XxY#GbQ#gqDUa+}YXY>xCA&J_FN4?#h_4iG8pv>%uvxB$BX6UC)S&as zwaAwuPr1Wi*@N}5e2Hr^6c~l~gw>YVEb3AsJTde*MYviXV{$69wJ}S|=iN^ft2#CC z@!w5kC#B@%x63oN#m<<^Uokidtad{@)7c3_R&#N$-B@IWs+79S7^++vB3*qOzwWX0 z_@=MwVel`!H!UHoFrsVOQIr(BS<3`?fj*GhfWeOU6s( z6fK-{L|(xo!bV5L+Aa}J>^D|1kARgUPJ9%nOr+8$D~v~S?=QBN?Ai-U_J%SqXL$Kn zG9u8Vozl}}d?-O?5vL~%8ZJ;|#4$HC537k3N%tTI%l(tPeC3qCw#IQpVMlzeHoALx znr~Vbdgb8s^HVSQr?AZ9qOdj49r7sha=Km+9yFo*_v7`1u&kf$?nN|f{+Q2~x^;TW zuT9eHQb@RSYhd#?&Z{yeG-JZuH?SURqn^clAOM24?G)>f--*WoT2~SkoJoD)v^T3W zL8N`#{I0b&iI6)GL&khlKWD^lT!x^%ag-#(TFg{hD{d6>@yTUZDBkj9+w~vicfwuD zs~xAJKQe+$xrKPgFW2xn>G z2fC0^Ny#QY%b82RX(poEt0a8YrGF#Clu5BO=IGsWtlN>}&u|BCV^SC5r^;@VA=_B$ zR=lRY1n5_zSthL8Og<^PJ=q`ei!rZppi3Nacu(JB@SYSR{yc0om0Q-LQ9v%2v-8(6 zd}j(8!(!=Le>YXi+ z()^7?JJ@rZT|T1CSe!MjT8-d(QEly3>$m2fbVg^mt->6Oo*h`tXONDM)Nq63x87hZz=H$WFFVX7W2_(%vvb0^UI~O;! zAmk6@F6K@3fULdxfu=1GUa@MHp;5eS4v=U%P?Gx)qeiw0H*mi4zvBJaqbgpRBsVZb3S305j%RJ$j1ax*d0OYUFY2|m^CX?jifpHgS zk<|OE!1t}S#r@aW#k-yoSOYZI(JftD(f|6M)x(Tez!2B<{rrwSjC*k=zOPSdqvl|| zN6Jw%8J|TnnMdMh+8f|FF<*tnd&^6t-iEv};brN4Sxq_I0m~@zF}nx98_X*MyR?)p zfnv*bSk}ubbmYcdk&zyyK$VTFu&oY$vYM{NWzvI0#A#=`WH@ZqiY_vnexpKeT`DDw zb2I6$veofV4-#cXn7>*|=Z*8r!aTEbX^(JJ@piRo7k;Cv4HF6JzGN_&)NVt2qO<9H zsfr=Lqq7-Mc|3CjqiZo_KKmz>SXYFVSf23UF|I-crG+8{Gld|64kiqyHe<3Ub9I?A zoigVqbqQuO-Fb=@lF)$YF#Js`w&**NEGmc@H<6luXstrNvW2e&!NenUl{AVj_A6Vk zneCW_e^l*9*z1#9$RlZ{q%l-q7;ZTb4c+8QRWy!s1Hx%4ETIh1?6l8WwG7Zr-lk-x zLw)SpgxWVS$pJR#EuK2`mZY4zYxGyj9kwMO)Qq<&^^V_?AI3?tD)DEM4>xXmOl56A zp91vS(g-q2vZ}TgA}UcaRp$#s!CzHYnXX0MFk@d;N3aj%dVkzjcO1AQ02KkHpu+1a zpJL$v%HBHyqlS~ucn(7b7C&OM_n%Xi-dQ9=Iq+BMKehLuMg#GJzXE9Gg(JX=Jb+rl zZS@9A1O!0ZuK2R!!%l%}AU8rx9~aNI@JqgKUvC653J!p&kg0V9!vVCo*D_h-77ANlK-l zc~-C(m&xLeBLFRkE1vv^09eF6fs z6=npzKl9T zL55AiE%FxRknZ`qap+@1MQn?ng%KnMe^m{-wyc;H0S7cWESbW{J}6_~;Sc2MM>huF z1*KBZa?I2*!n(PhW#|TSo1@_S&uL4FXPj6fs!-BxHn;~Q8vw&}4UXU)l|A!%p*Sqn zgfZOyS2jtWB{uB@rW)-8i5^5SswF}<8u$__%Rw@W&s`=Ic3^0umyK5ku{1 z{!9Rpi=@NHoUxBD;rYz~ms@323WAK+Cjn(a<#0jam;mvYS}@E~ z04$nR+Mn!2nn^zgw-{KU(oUo@%VhCsK?Fr6sGTLA0pdUI)&1oy(qDl4cp##2MzR+% z5RBrWfnl~Kx8VIx59)({g~I_k@%kU&lS4?T5Pm&AMm!RNJqD(|spGdOgYx6LEY`+A zCtqsny)gS!9|?)#eujS80b9IZ09)|BFbaPU$Sq;<2)QzR(Q2qP)cR#`PSWFWliVxP zU)IB*Ga$Q&B7*D~2+D*`xFTOh!`9*n0AmYCC|Rr}qMcYugKSDa1F#c+g?dvw0%6FW z2X%LI1O$WoSthGCJW9QQTPJae1WU~PtFdVpbjre==jp*pHO}RV5&aFV(4{l3(mGW z8}yFgnESb7^B1xs8V=Za;bmY1LftWCi3SE_@Z9`1K8v>epngDCdb~L;y1wL19iQ_O zI|JC4+ufh*0-MB{(Fj@h;v5zqw|2QR-ekyeIP_^P>|m*_88A%G)R#0PN^hyF;jb;} zsB`xLNt&mpbdkj0SEuEUcKeFIqGn>f_scDcB%@{g&eMF;vu1^m# zD-v1ASRn8D0{W}PQE^(p&@)ZMRQLj?BIo~QhR zCa$p@i;DXZ-_ITUrQG81PsQO)<&LE6Mz$e*?VJtHw!^Nj3scG?FEIkjOCB{E^1Qnn zvbrXnTjkN707%jS|49bx*4{D}_aA4Yt^1PG^ z=TbG(t>XLxRL_B2Xom)m6#m0Dkr4V|U7q9m-KWr_=!En98a5M|C}kyeKM|e$#|qS0 z@r&bk07_1Eez)%2zOJ~bs!q8Lx)==O*Y)oG{d|h=^Q~0Q-eF*5&U2I2lX#;;|JVK0 zyS42HyYTDE+>o1Zh-p3{%&P_003GMU?T*BifQ`O%)Aj>XLdSpnC-B@m=D2kG(~1F- z)U*#^mER9y(g)iDak(R`2g>+05tAQJ)AWq4cV!=x9ulw8#c$~L9PF)K_S3Y9KaK>B zS28Wk@=KT{8yRcrb7?tIs44N0q^fJgfOB7D=<51fN9RgFb~LHzZ`beUju9tWAL%+X zpUu^gha|+Yx@O|J?bkZ+W75+>t{Qrx&h_Kk&33mH^7)d^ zBt3(V85&?SluWVg`L^}c7LkaE%LU%=*gapXlPh$C@Bh5sEq+ML75;+MLfitash^&A zlTZ`Y)h?=mijrNMZxt_q;6&66pyKns`i#USU>J!|B>VPEf1e9fL>bSeM_vx*1|ly| zWqoo{@CF1*&!5}Ron%|Bkgo2Tz)U0Se@F5Ljz}oOy#HTY;GUZiL(bDEfO%LijWA8e zpjIC}*Qd;TN5`4mQnh0} zpYp3{#WdSJZ#%6>!1p#?P(}di*HkWAXtB+uFTkV!;QaI84%KS{7pqvH1B(EKiie5z%iq z@*gMz22|5Rjh+37d`SY-v=D=Kkr|swnurH6X6wACT5vb>$Rnz2BvMcvPO$&{@vtZy{q5es6w@BnY zpY`8+zJ4SkW5%|_PxS}$^ZxKFPjbYn(?81>RO{i-p0np&@XfK`xpk+d+w(d($?yD1 z@;|?lROeTc|M@kLzmoj>D`^0K8T|Xp;KyGE|Nb&0eT(^(Kl97~ zco|g3%iw>!3DDqsQu36Psne#X-jkb`Ur<<7!&b9`a=qv0&ctU2R^^uHMLTyrSy7!= zQk?%(f&8X<0;*c8E6aNBR5S0>sx&=)&oBR{x{CTFzjdF0OUp~k3kvo3`U+Yth5C}h zvd66!{c8I5So%l+{e(P8(%bj^r+_^d=kbc;P(RJvL)-%L-S|mJ9k`vZ4>3d&~RYEG;gZuO{lF zmPTElS6*JC7e7fSI@z}|sx>RGq;O%sdwrX#PMRiuKq&!z-E0G)eRq|Z)3^;!-x2h~rUV%*N+k53| z-_}{&wF|5Bs`4v~^9n1|(t0~Rjenf--kug@Px^MCu(GnO+^69L`dn9A{74H!Y8SSNXo17f%EEl=XXh73VWH6Xhz2iIegF zqVnpp0{&6v$vt0JJsGPOu2vRIrcV}5#(uKA8nbnB?@t`cAAX#y@-@%Gl(B z!c~(+j~V}x`9$kr>UB!m9S0QQCi(1m)u6&HXkdxKqwI)B11GGw}-p+;si7HH7~>$afPFwrBCUEl`)jJzwwk zt$IK0-K~{L(>&)8`IIAtU4KxXItHw>{VS=eY~1le};I$Mh8_U@Bm%^H^mb%gtk} zC*c_$x%6PmtIH^TP_iz~T`u-m@FG9h)7AxfO$-DN%13<;43GI7>StxlHqJ3EVG6;( zl!lmJ?Dt}h&ze_MFxi`n#Rj2golIo>=M4L;r-}U+ThDTu)~8x2{enzI31)QVavo3B zB_$Qs%0$*HUnMg7VRBkEs_2mN{R;1k5xrXQG=P5bo{ACjx%_YK01`dRW*bBFIl6PahB_Q_R=ayZg1Og1->iNA32{RuDc zt=^vK?WaW6@29`g()z`JA}d`<9qC)ludb}*Cph1G@?7CdPg0+&B^WF^S&Bb*jGM^w zMwRbO$*aX)T2EUunzh(6rY2%*jv0Xof%(ArUul@D=9RB5q~9Xa(+`^^$Q#=#pI5)e zd1`(i+xTx+b5==(CHGs^oKJtyQk>sYSFtjmsC{H1vZ&lln`y|wIVDwveWZQjq-va^ zx!+!_m+jwPtdDu$Ua*%3zlGRBzP{2%$y%A}ow<31`MGqqpo{b;kv_A39OE^G1VlX| zywtC5@9ZSc`EhD1doR7-RbF3=Rpjy9l5Z!buP!U5{c0~k&+8nXP)MLZXDTa{w}`o` z3PszLS@}NE_x031`wUT&mdyDBRTRE06~`&Dd-H6ISqZ&*qWt0s@@Z~?c;%SRPo@I> z5WkBj49{6$(6`e5|G|H}cj&T4JmcSxq2pJWRvR>kKanKuph4n_ z{6vx@Q73@^N6zH`{r?XAf7zjTw>oDX_Qktg-0d4m2?fi~HASUH?oqWxImz47ME37-q7c)mVb4{KGWMrVQ6- zE&tRsjCJm98_N5mJ36e<`QcdS+BPHlaUTCwyf-2s%&$-?e997T8MVas{er)~t`QY4j#^}uGxj%bOi@wzu*BEDA&k8Oa z*W6vH`B}bx+??yP;*%`JvCZA90_I%Lnmg{UW%>Ci6$XsW9~=AIR<`&jIb)p_u=hiI zMLMi%s`!u{Eo3#Ukma)?wwkSEiL4w(ma{56%Vib#-$G`^Gb^jcwFRhoe5Azc@VHXQ z*gN63+>P%|>0?hLwkj@x6vI7QUQ?v8(eY>KRZ(wODchvr`IS~2K~K||J!A#3N3 z&y1N1dvLYKw$YYJrrFo$#b-J144q9DjfWL8o`)5o+=@n6v9PHTR`mRDAbT=kNg1+j z32K?~tcu%L!prmp7B}y}IN@;z?E8Ea**9I$z9X&nce7z%bL*tn#_rCCJ?x4>8?#5Y zE;wp8{*9k#p7>xMtgAIXWsI8(8&E4uyT*uT!EAiJE7PErEsWt7=8tdgUa6g3kT-s? zrMWv-t1XzwZQhtevAU&ISRLiOaMWY*IGP^6}IwjOU$vJSSwv`5Dh>ZY>-COPA3gY@Q@rN~1g0YiGgH-lIFPy|cNc zxv-fm%*WkAudQ?%odH`%;4vp3sfyeCJwz@;$S=<>A6|XNo4zqmE&g@=JHX_*J=xs zd`5Yf-DCYfK5G21iWS2?vc|%#8p!@E)XCR`Zc(T>ZuCgS_{>?Oi%tV$<+gp39hi#4WdSK8EYmdvB9i86L0Z zFqU&WjmKn#@rZJ6=-SBb+1M5LKr}2GtuP+pd_2Zwj#C(qG4gn<%rAj0h1#BRiETA!%Fp0g7#~+t7RySNNzM`CwT}$3Iz#e_qzZYMlxILr2 zHt4)I%>HJU4XL!2P zP$HkE5Icozc6Kc|MNW zozO2IkLUS#vU##MA14lwkK=hhrqy_np^#_ff?gRp%K3SR$Ii$jedk9ab`eINX|0H- zV)@@Z%nU1^Az3UFkA<*V)bgD>l;e78iaR%lVE*9o$x_B_!^j_DivC#JQTKK*?hLX} z54Uy%Wll5&@iAi-y6frj?>=b!@M@^UzQp4k9y^ELa{KmQdHsuW&g-D{KFXQhLF+w5 z$GG~0-EySFM^p4{8gwO{R{Xiq^^<5fu;NK$d}chw&L-LmcvgLiFq#8$EWzUwxW^}Y z<0#hK+ma9Z`nQ_zSi~Ag9xCBJu7xMbizU6*KM_-ja=s<0vR=NX`CbnnEX5=1QLKMM z$-lD|?LX~cai+5s@W7{z=-t!gcr$qRcky@8o^Kz!l1))JHI^*U z1MLrJ4=-|G72g?oJd@4iwv;u5z(05_e1x&!A>^O?75y^<{&|4=XQm@|cN+Ik-0l>w zebvF187KTH5|Sdm^|! zZ2X(gmcbrtFMB>}^Vp*s(4KP4xl$gJbG)|o*fX2i10{A0j~^~(EPe1T_uZ||tfw3A z?g;qF7mYVz8MEl>nB@m`VX$RQ+jV4D7UVMD7VCOojnVbs!%&{h1z?a{xxR+fAJHA^7b+uUuL zu+AKYw$8K;-9naYOnN=ZliY2uU_a2hTJ~lD*%>d}86P$7OzZ7ofnTqw$hfWvz5|-b z;xn$yI*fPgO7qazEa%wZ@H&qqW%!|7Qez7I`bN$y_-(YeerO@8`O~r6@(_E+qA1Q0 z$srVp)Yox*zFe}K%xE>3V!75BQ@1H9dfOS-=EmD%Dc;xjk-Cv{7x()K`|N9lxx=G1 z>*rpxJUq>e**_tUdoH%0=O&_GZ`l*gqoNb)vYf+0YK@anXHf8{yLyin^@(Ke_ISe8 z0RL^Vk2BAVHq?n&)R>raM$@VQi6!rHySI&%*i}5Y1>JHt?{>QvpuBaD+noVM;_)S} zh2i0d!u8(?8o_38F|H3soisc)L1zAIZujfpW;}M{u^5lb^=`Kj48WrT^~G2X2~L9N zf-zEw+oGHq_7mnatyAhnHrN!Eysf|A9=N7QbXoONx$olahs{~tmitpNwl^kt?4ofT z5`3n0nr!_&@Y)Fb+vXwBBDU{{_MKT8)0x)q={+91*XuERU8K|1Wx7`Rgk<{NwaQ#g z?rwP&k3fvx7e*FPjLw1uB1T=1XzBWySwF#u{`_kK*)hy^D(XyY#>zRb^p709KGJ!z z>jiTrA8pf5bFYU4D~;ozV6)t-NM~c$kIdnB-G41;`aDQAci)_l3tQ3RB(y!V1 zm^F864Bto1VAQj8<(c#5*BY19Q9srhJw2HYuP&DRVlYu(1|7KHrF${nMD0&9-D5i8 z3bIYliF6iqVU3gwxT4*1yD8GS3}rnpOT4@oWdkp3czHg`>AXy(Oq8;{rF4{Xyrndh zD!ip+lx*Ho0!nq>QVdG<-qKi<8oi~FC^dUaVJMyTmV!`f@s=c%oZixn&Ou+>Dm|sE zC~fqX94OU!OJAY1-COz+rFw7aLTA?1hE;d8xL$R;(=ms}V(y&4b0_9(8Oknj4IVS_ zcma<~qb1fbI?NRs`AJ~p(QKD4G}8G|XV}cEpZzQIU*?-xw4VOZn1+_ObW;3n>~zfy z9T$nL%0h6~+meTf#;O>Ucl||V#!%@B)}3MTl&Le2GZE*FM3kD>@Bm zrJ(cvYu4MMqct0}rmv6#lLpgF8G>m3BkjO>e*L?7HX^Ln_#?D|^=nHSU+FQPyai+D z7iKNAXb=l|h&D(`&>S2QO*1w=T4d@7-qKl>mg0F!V>>^=%Az0NzX!*A*3iZ@?;0BE z9LhZ*b$)0b8m%>n95FW9cWr3ut#Q3aqqBoFe$`>RR&`sJbA0fLYvsAL;@=sz-`rn+ z1M~;`>fa$+`Lu)dAM4m{4wW;MWXcu(=W;vEI-CrtV7YGd{jnc^hfo zqM-Q&70q>A^Rpe#AvZ?F_UP_ekDpf2ZRNTxu)GwyPjs(&h;*-3&|RgXdjW4Dv!ev@ za#v9Qk*9tH$oVje=fga-6y)2|cF|H|M;Ka)?s(KpJ3+AztTkpiZwsc~AnNT&Gtur3 zd%;E_F@j43cVv6_r1Q;Ut*JHAew4EG&}i%d>k;SrH0)@HHjsrLLC;I2W#_$wbI6%bXbaBOd#Ei>ptwDv1)W+xAoA7 z*pIsl$4MqlF704rl*Ed_ec<7r zx!vo)JTM!Swz=IS!5JvGjg(mSR=4{QSn-P6{VaG9_p`zMxIP?o-663>XzMgsk9%9e z^?0P?`A1va?nEkkJh4r9Vu|AxMyYf`tuZrFdiv(vp%rV4Ph(tgst8GwclO8z+}1S5 z*NBZ_L8IhZ8Psca?DCzH*oTuRXteYu%5E_ZyLmSD#c4hJ;>Jj4IB$2T!_-~Iqqg)R zP43@h?|s=f(&ZlCYA2bi?f-4Q)3+b-azEnFsbr%|?G$4d+W%nw!(7@43~5|rTo^?$ zMJK3?sC?M!iM1ioJv~3c<&Lx;H6P`2!yxykD74%_a>shfd35dPecaQ2$Q(BQ5RWjL zNs@_9De_6ipf?H2BAwgX_ro`7`Yfj|i2SqLrD5bDZKGKGpXEJR)BYOrVJ)rbApuFq zhNJ4uG!OU;3G~d300SSjQPhhS?LV8Z88_%9X8P}4=HFqa#aQ1G>w*x6Qq6Y;p<0-T72k86#$MN@_;jixy}Bv?YM zQT@xj{)INS1FP$JIz`jUN*SG2R>?$>v#{@(?lm!*C)(zlXLn1?_e_WR-)1%s*Vh_@ zO_EC!La(CHxwudt_O#w4&fSsDhBnGGyV_=%@9!?oKha${J1M$9Z zJ}Yf=bHr;7Lvx12Vn@fVzuEe=_jGzktnX>T*^?!N?XL^l9j)z|v%3wW+syH%8mv7d za5k&!U~gtdBD>k3?N{}#pt=$IpbDyezLm6`YHd;V@fRvSZfYeT?{EE+IU`EgAiLXt(F=LG8Yab_e^m`-W(DDVJQ(y5BrFdh~?BeRdjyxy7$THqcl0S3-6smrZGX z)jJ}CV}0dzsK`Zgx$xGP&B4(TK0c;hT`-q?Ud6`&T=ItfS+kOj>s4%Qvy)Vd{YjO6 zu2Sjer(Ev1yZzO+-Cd3irN;cXj{vrD(&-BwB4_wEr-i3 zwx=s<`<{w66PHS}r>JO~tfDQR%Z;_i_0z_jX5^onVG;{MF8CBo$DWAZSGFThtOG50 z#9_~p3MSxT+l;f-Fp0&2C&40cCm0Hrfhmn{w-NmEpxYfz_xHQqokJxS1|9>?Hn`o} z!8KqBnD$GzI|IDD7kexs&T-^}Zxnqn#(BI;uOH)V>bj=lgDZ+Y7~^chaXDA#UPW!Ms%W!!lGMe{?JC+{R?&8v%QbgyR@AmpMO!16dcE^$6>V!( zv~A^bn>wo%wNX&ou^R9cXu&?H z9vlu@!3x?}1=D`B$M+k!MKvAYm_wqK{O(fmyM@aw?YN@o_YM`m&*M@V9rW7KV0mXT zxL0(wsCeGMC1X1Nj8$G~jX$rr(?LGqazPzuRO~ycVxP-Fat;T*7Zg4|d_sR4kElfR z7hLkJ<2^`@9^c=>Mise_xZEMf8+;#=<%|eXvU87$bUl~e>iD@i1ha3ppJ%@iTAzWSb0iGxfoH`B37bfqbDe3{UjCH9bEQ>_IOqA-o+)EGqcI|qT9WGF!n*)aaIFk!FaIg z1>~L}iRFOjzzx_>?FAFS8Zi5LQ_Sg9*mGL^pCEw@oRC~s{ch2}&MRG5f+|kyoXyXSe zIdK!0TGw{StdxNpRqQL{QUz^qs7BRmD!p95B~5KRF@imFw(mG@Q;|;Q(s6Ass`~ZE zDv~3)WN_PhRlh!^BI#-+$6#ZJH;@4wbs;PCks$YMg(#zMm zd_Px$!soZY`t62qZ1W9O8IFQ@=6o( z!hCw)3%rWGQx5pf4!1iQTmtIAh*#Y1FLV++zRm4!1P>watOpl^+2AJRt!U5yUezKG zAs?Lr7lHNQ&gb0jO3(9BvpZ~|;{C`Vvl&`Cd@>wo*+}^F~ z^9~iyy~8CN>|d$+yhTNF8<*T<|FddjomY{p;gV(cGknG>#g~E<0bgxP;gCH5h~&bdh9BSDm7Ln-%SgaGvE- zC%T?dw9lq!Uxf30F14?#*0X;I>94U$rJvim?B=c#VPR~4t&ginuHljuT{((NFL}ATD{Ub27ajI$r7h z(20tY;`OC%*yBjZ1xDnS^BRe@ZNwf1JhlOQBhUiQ1@$A_RTUDp`)OgQJA1g{}y z?EssQvns$m&;*X%>UNI=k0VFf-5PdcjobYZSO(UCx~JUkJaFGy?4>|UE%s7igtNYr z?Ag|N(>yeKY#;B7cebyocwz&Wtm*7B4~rc&!RNg1egCaZB|3|^opZ!&0OmJj-9HuZBwyrFPGfj@uH%>pQz~D$feeGY*4iAhbp#} zajCqH8bw`J6hSXd0J{@5oWqw^T)61eXfy_`afT*($a%E_KymR@5~| zMb~8qNqym%scKuQift#kex6#qACQp9L@7)UZsP%bLJ$ocCS;uVTMb0PX;%ffteE zLcwRjOaIa^_AKgyuRr5Bgnb#f0PO37n<_pxack(^eb-isTM1S=aih{2DvGVmW%kw|hk?!nu}9 zSG0bY^BZ>mTxxM^&-smX`|3NW;!`7+Ol@sYwevN#-9ML%Y~87NPI*N|UnrMit>5kZ z=H%zauk7FL{PsDQI%Tg_wauzF`dsoYd#R#6i;BKoTxyFwSJAe|RBT(%rE2Vp6?HwN zqRYaimfGj4+BQeUwz*s~-9A%M-#se&3|uP4o~&qFqKa)JxKyxxf>#&qnI8F}+kNgD z@)6hoo-22|*MW;(a=WuZSDo8E7PLL@c3=Hk!{Wgc;ANcmwu3K#Wneb;Kt}Ke@=XNj zLY{G4)v!I_G4L|l-wwV2mR%L+w{-9=|JATZ*3h1*#|Pgi`e3y4Eu30M zJNNL<3Ml*hilWa)JL|aQv))e&^!E8bRP?RlQY*T?RP^~5iasChe1uD7dp|4CTi2&5 zy3)B+3jeHtvTesyY>VcS;oeUR^w#&jioPH&b+hxJqHS-g*yiXYsY~9^3iQ_Xs*0|2 zTtbnp@FRR#gh)eGCep;ZnzUNf*?ch=`blMbcTdQK*Ixc1PepaBjt_l@h1zc)L zXR+!l4+Sc=nYiSP&d1EdCP*gn>A1jNpSXQkMKYdCj_ss9)2Q)T&QT%0pL`Q*_*@m) zP%g_lXZv|i?p_ty&JI5M9n<)0ToJKKuW}hwWY2Qh;~f+Et6XCy^nIO+Uh9rWE^w`O zyKiW|Jxe>TnTPql_t5L~ z*8laN(fkttnC%_k<#S7;`Mdw4ov|H%gXgoH!Go1N|7VrB9?oThI?nM=mxL(3_jFn% zy01D&w$1T-pM6d6U|+3ARkU84k=sUut-fuOc3OXgB> zj!H%AN>!{2=Tf1LB1K(!D!OjAlT>&6qh|3LioV(wt60{;o$Jd0eS z2j8!7yPcibuYk>`KK~UM+&2>`_489Md#vr8nevcwgq>EAZRE0h+kVeq zHxC}{iLf56%_=?K!X-Dh{f5VM2*!HMguYteRncnYvMbv5^Uu3^K9kfx3;t3?ei4_S z+qO&P^FcpT8Jkotm)N#NH8*Wm(HO}k!`hxvnNKzqImYF#w$>`~bqfebHJb ze;SEa7xHfJ&m%pqqVoioKHQqay&DnRU+<%8v!6@uYF*^biKN?C=X@2Ol zkaK2&L&2foA&cAH(uUjwHiAcr-0rnt9+(X_)Vkf#;C%2}tA<@DcDql5Yr!3$9`#DV zQ-x?3tSCSZ14n|F>>5^yTz3fMJ3#*4zfyEvSKIyB`3Zo(`>#CG4z&{imu#^A!~6Fg zArpLk-l7tj+qv9k`=1rZ`M*@gc`cW!w13*`({+KteLpd&)YD~Lc9H$J^tXJ2#VR;z zg3`NfO48|EI>r93>KW-Rwd~I&!|lrNxb0Cp|3NC;d9&;1irN1aMgN5JcmKnkm%8dy zK5_FC#nA}o@BfE8PjqcChho*B_o^f1Rio#<>UE0tg*)HjvJG9UdFBuGX8s<@Csca7 zjZ1FoT7eN6g7t>p>5lTr{X_hm&%*iXKipZ;^_Y)edvq>Q(YcgMWp_Q~lbMEu`07)B zO*`BfF5yynonI;H`n!s*1zgJ1`Gumc&sB6y<5CHoe^k_UN<~*BmkR6rouaOzD!Le# zy4KO8sOw!7U0-#O)E6E56?HYJ=sLxvnmcwY>e{KItC36X?f9vpu9sAFZRJv%IyNcl zdPYUp8ZK4Vu})Ff8Wmm3xYVMKDn(soD!PnZDz)QrMP2zSy5hLh*p8)&x*k^1HIz$9 z9odRfYI&*KK~i?d9Qw{5tZVct*Vx#e6;-^-HB%*vp6Ajh9n%$cPEpa>#HHSHB>24U zFm$l5zF0GJK8Squ70zNakq7M9pNs&vfNlSyVdrtCY6jPV+dvocRSCEU%mCLSe}sdv zVCN;A!60`Wd<5J9?u1+gXaY@OGvp${6=3(@HEbTvWG6xADzp#QRH1z^8mw>8Fy(QZ z$L-2+e79Vc%%x%-SNiN_hWgD_Be_(lgZ|beIHc#S7Sd}c^f#4pbG4JSqx}M%)dq{R z+8CdA(L&_!1W=Z~z@Kt+Y1dY@N)L%e@&qNK~hrIxk-Tv69H6b)~83TE(SSv`taeHCaX1BU~!GEv~mN=iH`@a<_XGa)YDH z?VbmQV=of{9=5vO_P-%#AQv45?Z|1H!Pk+C^1y5`6grI@wTDY>Z~aP9*WXoiZRApGTfb1$^|^|!5-ye3 z`bR}wr&M$;;8Ld6-zn-ks-kNemr7`DQq=XXimpg571p|6QCEYCF2<#<*>@}I+Nq-J zD}ILj!v0f5T`#HVI>n`$?VA*JJ)@$lkxT8huj424F%$aht5sQxws6Uf_DV&4r7HSr zxKxR~NYS=D72B3_sRi~&6?H9E(UrlarrEPpZJVoNTMU1j^r@GRkT1`oVVH&jwq9A~Z)I zY5dR;@Dokrhj!%ooS5^#8d+nop=K_1hAw~)WS_yTzg+z*aL{#p;7d<^x$W9WY(XaO0x=Lcy2&l)xZ zdh8}_`5F^h>^ zk=V?$hpz+;8-6aSCHP7Z(>nuohpxEq%lm5%8|5^1ooUt78=V>rdx>h@`KQ44xtfg` zGmbLw#f(vZigyNv20H^K78BS$Ps`fpX^Kqujt-hxNZ<9`t{bGg5~iDj=T|?wG)Mbc zP>aU2!1O)S6qod*CT$%4z5W>+r*}n!jdGg0MwxX7f__?Sj5lGNl5{T>o2Umt+n>qM zo{f83V=)(NS~Qly#T)Pc1$s~Zk+zR=Ms$U2hZn-=SAo(^p){(`jdC`1S|FX!HOiUX zb+QrXaXb?7AU|$^A7^J8`}t8jpdX9Avmdj$AL~26yB`ZpGe-yATO|A#Kz=lRD?je( zB)>Ix`ub>Nr`E?uI@w3D+($b)seiVEh|_}Xc&7Fs|2BF{ zK%GXftxGkL#+J8lH>YAok8w59;h`wX*|=)^1liUI=Uv3 z^x+Qg*&y_6MrXkGiToFo0vnwlj&fe?U`Oo-G%N?_l2xx^@3F@1{u>@@x(j@C7eV(p zzq*(9(tWF=x9(lgT>{;gkq2(<(Xa~W-C3=!JJv^c9CY91SNGUnx|{px&Vg>{e&hto zMbLe<*6mKiJ`3?W`%L2?Q#F0B6mr=GjOx6)NaVv+9Z#E{$b5qTqRBkd;47hl^qT;m zxProh3`Upk&cHW5LETi7#yS0)z_$$O?^lk;&6;THZA(X?*XXDu<*JpI)%G*=ll@4h1QXSRa(81y!Jv-MN$Gy0rL$@O( z_WsOFcrmD=#&|#UvTaWq-SFWG_;78<%oc;?X^X+M@qV&sX9v6c!e`O}t=!tujtg&p zPi|`&+L{)dnt6}hR%)NNp6$SOJ{~%Zhs$B=E*fsg{J6U$d9wM8Yp^~z`gvE7zA*ZL zYlxmQg|u&!)7nesOGjYCDCZgnSw$Y1H5MKj&fs4~|7S6?_Db3Ou5*=T6QhWAE*#*RVfg%{qgaxq);Pp6(V}~4lryrU>?3WyGVuy%7V+EO=v_>Fn3K7ESkllx!5`j?qG3;42zwl=Gc-+~K_o zK<^f{r<*3C4OjbAxrH0;Q_R80PPInz^VRkwl)`njM)I7aJqDR6|0gRX?Lad>utenE46cOU&BWs58yU9BS&x&J*h*krnFNKW}9Zf0z+?HWIm) zJn}+&=+uK5uFtdwBHxJPWsP3*hKA>@x^^4<@IqUFX-X!WFwsQc_a9_9(aHh?u7t8* z=U@eIPc)x*{a@O?1-_~BZ2WysPLh)}ZPP2E1V~yaX^W6nlnQ*>hV*R;j266sV_N`q zC*9OConLT#TMCGXw}7YxQ7dy=@YaY-ZY71`hHki|R6j1_qTjYQO)sYkEV6y}|2*d; zP(&T>+aG?XC+D2^eQxjbK9}=ej&1&O=ih#)6X~Ep2i=FF4{DwX*uKWjmhQHJrL=+d zK@38yGd_;vf7ls)&F-ov;gmgCA`64A{FHvHCNs-lBkkyqg{?!Yz(#krA^!a*@1+GX~?v*{7 z%}XYfxJppx++Jrf>fBR5bN(%1x$o;4u5o!iNR25*U$ruXlouO|zA{R!DsPrVwS2JB ze2aija$^|Vk#UWpX8n;qKBYZMoU7f#`_}1bhKp|Fx6_SYpyTHk;rVM+d!9!j!Q<*^ z%ddbx$Pdb%rsP4;m3?qL*$(kbyTbDt=xZZg+^h1pr9`zq>GuTSH#@t^~ha&v37^HHzB3t4E#q@}wp~%eB!rU!Y_n=%`~eB^%-VyL!35e=QBa zjb5PPaFpNN@C`JyM~BnkmTCC;B{ck_+YU6ec)%`iqU0#ZMf2ltreXCk8rA>}_kIHn zKfj2EF)|I#OK8~B{R+g5Lf~(sI5f1qiIUfD8yfl;jyLv$&cXc+2Pv5k=dweTIDV<<;7Z`z>`G@I;CmWN z_C3XS?Tf0#zTFyzc6e^Lni*xwYl#voX?i=V&3HRXGFseMxh*1o6*VttahHlk%ni2l z#b~og?agkQ=oMU0J!mGJ+zPo;e1HTeZB68|XHptQNKZ!jGlpf24k2i43q`e=oJ0*q zwy1}yOhH;eis7$?6v5LT714$G*b=f2@+-(+#CZ$ax{Vb=wXvJvwg_GeBZ_@Cx!P}0$TVF%h=>CXcINxn*fs}BcsuOUW^ zMaOgtJEkRYS`g$Z<6phIKv_#QqDJMxM^dE#6@X@J5LwlMO z{nNOt%N37maUX_S5iwUH@>>-WJpG(fM*9_I`sMH587p!nOIrxa@iio$`yuvCp_ICF zrBP6SGu-#>)Lirg^{=hl2lec&K z?dQ1-?P`AJ0HzRa_Wb9^gd&jIeBe+%VDT%$4eZ5>qCBMhzM|AATF)HwV9OfZzY1#AXg2 ziW4qZdZD*79;Zs}e?V=cT)PZPNsFKT+BYtxyDz*m$(6Xi&UkkM#_97gi~!@$mklEV zbbNT(rQe0pe^|Uf&>0WWR!3S$%SOZvqm$o3$%XuOzoVR;4nrwQB6fBt9$K6$O@dm7 zFB?Y_ly1N5(mp7?>#|GNL+RGbE zdh3%(J7=`y0*vw=H52S0?_S&JQn)sOY_YUv^xXGK+}FnqGtz3uyZh^Y;VgEem7D3g zPJFqp$cL@_L3{PVoLU+ zI-kARlyMQrT{cHa@ZKjVY1qj>O9pvEDtow!4;6Vnh?B^pRVgP3z$g)09HT<30wzXT z1;GA$*ce$>b;SuA1DiJ1vm*uCh7|ohd{xB88byP++99xWA-kC7S>xbOkP;RWMrXJi z+CGevy8qbiW(VV>y`im04DWb_rLrQ=T1Wh3qvPrmCG2{Dw{6F0_Gwp+d$ilcpcJ&S zaGhCv#i0oqM5}x?Mtso`4==6aLL)toR`Dl1;$R?4E{zz*?>^FH6WxJVn3~x)m82!~I12T}pHjpYC}ZuxJHTn~Q<^0jfNKJSflD?hF6nV+e@+Yy4i%a9t`A0u>C z+|V94*Em?)GcV)OxWTv#zh%;18hS{~`x$0*#s7RVd*%;;9Ro7^F|KP_Tx z!&)>nl4VC+qREY3a+O@~031yscfKCSGTgJ>o7`czPc6dT#0uC6(o4nn;=GX*nSuvo zIt62+8~@5Ur{7(r;B1F>e=jZ&z{seT%Jqp{zY^+`%c##M>VLWCp6*t9uGDS$FSKD1 zu!?VVE4?#E`pf>#&Hz3@!M}gr4}Q{fp&$IX`^)`cM)aHe!J+8a_k-MS61;Q6rM7Ns zg6e07QN7?i)$8`-nAQD|qmOsx412%K`;F+qdW?g{^l2R$mSWR(G>}K2C1?v7q}tne z8zY)QBe6*7yah^Xy0z>`lykey)L+huSQ*?i^kle*b@z=48%`@&MVuc+x8+KQyNBn5 z#%_Mtc&GgCWL1vz+5l|gh|hjp=Dip%hg^+E&4!@j6em+WtbdaL26iyOwiBMQ|?+$7)Y{N#s8C>FPc z38fWKCKu<^Brx}Z-(gUf4a5EQ_41;K*_Xil8>pKG_0kf!p|t!CWmT)1-5BQ|+ciki z>q2zBdUS@jBT8S&kf=%s-fZTc5`xgH_38*}8-A0$iuu@Y*v)KI+?akc&by5g)d@i+ z+*DN_oXQ>u9E+POb_29&%*upd${?j2w1hKi3bYOmU3c;nA9*az_Q z*^&ou=Bn7rYLBq)e!cANxR?Ri8=P;g#7upg8?v-zkgYYm9rsf883UZ}$#^@u^3QKaSI>Dnx&}B~ z3&*;Ox1$d`Co&}}ga7akEEVD4;Nh6_7$tT%%HYU^B z?sH~~`J%Al={RYCUSs(?jvxx8cxi}#?MRgJc9tX6_mlBB(g0;Fr=seSsD~$`^d3G~ zDQG~8GbKv+;LQT|mu-&eN8eyW0bNW@bTKNlfEV8FC_Ope`_8CY<|{gi0N(Zi*A6S_ zrv`q%GGGfdn3Ym}Cq_qD)u_;mF`Zg8j|i!@+{8MgRAu#o4s)R80`b>@rJV--cd0oC z*CTlsiwA+?N+H$xY8Tyfs*g|6G_7?Xz%M^Hahr6aDv~4V`-LW}{02@Z_sbk9-n;K% zjGuC#e}O#v^1Zj4E5zr;Ou4Vr2|}=x*#jj1p+zq{_%JQ=J3bGChLnL%v*t)k2J*c? z7sb*%lrClE0lkTqXU6Ho?T&b;(o7=6YGGI-N18RzkdXPyt#pH$sn(|sn)H<}{h%SG zvW86XIxA)^cdDRI2%`G&kz(jx`H?)rsHGic$3joPPpKiK&Jv=W*@ zgK#8jYtRf%A)G(gzknTyn|#8?94UX`3K#Yp{oq7u0xJw!`=6-m5Gij0?bf~S&e?!7 zfR4n+`7zq1Pg5tvS(9f59H)H_y<6BM-<9t*+LR-G(XVO2_TvV?a{8Z% zI|<@E5*2FDuVppmK>oh~<=LMm$J%tXrUkEfctQq>o7D3BHa=LAXoahLNpRXjl#F>; zIsO2@7d#}#)?oj6R_%HSY&Ag2Pev7-p8~{B`q7sX+p^Hp@*E;nm{?whU+Tz7h+>G9 zHvAr#n~P=_!V3hC+87@d}+qa z9BE@ecRup5B>YN_)D+{aA9v-gqvW^iXo{m#btM9Xq#Aw$1Qz`7Q=L7P-l z>{aoK^pF(ls&nCs6G>mcVy3Gpm@*xM7ZPO)D(EbMeRvtBQeA1h~O5pMKKJ-zq`R0K|X_T++0o@=aFUJVC#}Pfz9N89A3)^BT6z~$vBU;b- zq#9j?PMFDW5@xn*E2PJKmZr>YrXAW>N&ZYm)}!p+?bAa)K@RuzUHEcfj+86U3OLoL zPcdvVt|!)Z?W=K{@kn1<%E*uoo@-(`5q*mSCr5hmqPp=Oxn7gePb^T2U@d%}zDcov zq=*lyn}{tngqCS7WHV{oa-@f22D=*~leBI4UhuvzP{x_tuJryy%zEx^EmX5ir8@8)+tyvU*O5O;hVV1zlf{! zFNVXqwP!f}i+XaKGzqISBGGrwMOUnqb$KSnnBzf{y-r@Vh@8LJ>p>4dgy1}3`HpSk zU1nkvg4Zy?OA4C@?Nnbxk6vLb2-7EXq)4yE-NBwd;OL z_WzucYi=GI^6lijl?mT8Pw)g*iWtE;%*2wl$Ua?PV(6guM)2*_;%n2n^zyt>(B>Wj z*D4pExcm@8XIIg=5xcR+mCjIycisnc(*`sqoC?+S#NUN_Y{k5w=oQ1GLU zYoPv#9%8#aR0YUg%l7qXu$k#Pnj1Hz1mo(tRf; zM6m34stQ7M^RHq8sWiV69v!){YGeqmv|e*gX!`Bu-j$q_h~f#gdqno+G)t zl~}OZeF$PfD#H?*RI)ALg5^w!1hb{n10?vxO2xN5*1C>SW_M{`H#5KTW}x*XNHq;? z?vbdT82lJBeA2Cdc^-2xwAUI&?UO_LS5qObvPLWrn-b}Fe|LeOE5qpTO7c{Wbg<{b z_K1ohIP9v!j5^pZm# zDu;S4Q7zQl2lcQtfzmkZnBSZYx=A+)!6gEjg!X-%BPYylB9njymAXj?dgLBtVg=z_ zcDMz-ceM8jjK53im9+eCVQYkpyE?!D-wgvuJ;2qH$v9IWTM`E}!{Q{Z+^@1FeqdT4 zN4hVHe%q-dlOo~2cF}QU(ud(sx=66o2f6Gp%ZlCx>_m0azHa!O5X_E041#T_rq_UG zb4rQ9u7;iX)+@)QXQa^U^e~)xt@0b$ktn&HdlK!HD{u-lk88p^iWYKD>LMtQLvZIs zw=(xVThb4x67wbb)`qrhX?wr-7Z}rhGyG%G%Y}cU|6=&}^_zZiA!aO;W5#h1GmcNh zj24I)A*G4)W69tY$U|__2nr#MP!zA{{hn*3{8K3u$&2GKg8pc%~W@xG8|wFu5JDRV1*j zkgdY=PuTnmRL!Behl#J7%vvn7{|<=JlCFf7k@qrSf&zc)l&ckb%| zpBaLq`R5mKeS7(3%DBXfaEUUmJI~`P-*-FUxD}2mGOm%b3{C%{3{UhS#z_}pw96Q$ zoX0q{7wjPTymN3I{4eD_p5WRTw-|@dI%%$l_U}{P`(;c2yI1kYSXTFyWw$`tZ0XYh zrTh^n|NZ|`*0?<40sA=P5A~e<7yP)%HZaxV9xTv}cf$|I+js;UDy*-J9My*Yog z)ffYx(>);Mu ztY___A6MRZ8>%tWZ>aX|T;+L~9jxCBcYm`akA_~fxC;&#%m;X4tYaz{OA(GctV@$6PRdp|z088mj_iMR#)5)JFEs)${* zKpb5;2G?o46id-=kEQ6dr8NU~FL<0_g|N*0epE+kOwS3Aeqw#AV*W;7_Y z*~E|EaQrCo7PHn^Ezj&_JV=cgXPtdH|J}3O^DFXvM)G&=Ox341)*XQ3F7pG91;>6V zF3fw-IB(`GDA5kbTd~UYreG~u@2~~6tUB<3qvn`4R!w{)TM~LTj6_JGI#xw0nI?w! zKIny~6s?UW*2r~6$%w}sSs_w*bDt{Z<~YBo0uT6YD6fvHZm*8>KQ>&q+c6M^lJiI; zm2Gq2tf#H+l#l^)=v1`e^B{-Lmg0~@TOo%YA3)0|Rc1>Q_TU%@_O4I*vn69MiE#$L zSaX!KJfw4f_FRS`PDgVQRdIGWg>lv<-Qv%l%Yu9V!4)*>mVWk}5q_tlO|6UP6JaJ? z85*j&VtQ0yeO;s&$5RHnGUr0>VVfa)yw)@1t{FiNei3URW~|kQD?S}swsvOgnFST5 zph_;Wc5FFBw`&P%EC-o5>We8zib&Yk#>Fbrh~+Mc%+W+>!KxkuL^(}ClQaL=PpSqw zvev3juc!>1Sx}o2UTvs_A0OQTbkGj2;8d6Dv=?j4 z1ndPLbSb(n$HvvPsNrPAr^G;FmHI!PZJtvracO7~fMPF2xXw2LlQDe1`Npc$j)`me z(<|7o0h2ath&5VXIJ2lym`Tp~N^Q(nr0Sp(_Buv&R7V1US=GV8Rdz>3WOpp1RtQ^r z1Rh{j0}XIr=$HZ#NtT~#)9@X6m?E>-CXjMctIX9fc(%74L zFBk6J@jU*@hF{+?%vs^QAwHqPIuowUCr8y)y>L{BaFaQJVPHL7WO5Gc4S(82EXD@3 zH6*xV4z3|-Y$Z0}QUj48gZMmbmuEYu8HqWmEO|!>1KCe_poi16g6zwk_G1q@EFELl zYGwXW_RpFh1um{$t4T-%WPc?;0c3xrZ}P`S-%?~h;Z&FQw72@L1m7QYRhy}`95nI8 zzVd(uqC_i1ztiRGeO;t*PZ#z;&byXf$kTEH*4=B&YOpY<#cM<|sXC;IRVC=WGD#=j zEYo?-1v=%HO9^i=KMZt^!OXZ;iL>&VXsxN&;q`f`lukM6I*v%! zkqy+*LrVo`L$$+8y?A#OJlE28uku6%cQTx+2=!LL{jn75RP;0&<$1)FGfil%Y0>nP z<7;ZAF`&b@xit8lmhstP_qUZ(=(~BqFJJ`^YATse{_<&8mqXhPa7*h)#@#wbEGr<1U1mu0erQ{o<0<@?lNK3dAa*0*nIZJe0 zY^I7jfqDZ_KlhJkhnCk$Qw2U^cdi9Hzu6J((0UC$|E->MPJKo#snmCx|J1FPIJGV- zKhFIu)`gT+nR6pfq)nZqO+EE~bEAfm*swt;k@a^KJ7>bfSEB!pyhM_^vyC z^rbVtt41(g?1^y`;@s@#9IthVpFKDJMjv0cr^~mKPKW%VmsqLK*M|Kl6*BK^>Gocp zVf3GN%5CPX+0xa$YeBn}kzUlAxpIxPh|ZPIbO}v)C8~~SUE0Lei&0W&Ps};8+(}91 zbwfj$a6VM6tU16w!4iGqCgJuSt3~C_g#~i0Y^ktUE8{OX<(2WDjoEjo89pnPdskX7 z$>)5wwe~=ZndIB!nMPVhiq3^`eG_^F8~i;TQ*>F;-xSw0mXe@t0Z^KJSClQ)K{TJ_ zVOCTrO@jB{L5Xl$032Z*zwC<3c+r zt`9w2W$O@%wMS{pK~`6lbQs{g)-mCD7FaPin-b?n(dicW`+4|=$YgN>&IL zKsYmnABmWA6O|3e*sYnPtia7{v6{%W#}N*|R0+k|9T{v=Bwx~|agtW`LuQE0g(q|Q zd)ea8zoQqft%kp!ho7uE94?4#sp2};Ix<-9F(|Kr^7Jk#UE3UEX}^py!8qMmK7}p) zyjm~JsDQsv%Q2HRFl~q{=cZp7=a$oJfY#-ohlyokJd@xGEiPO~Yz-t*?@rE0P{u8q zSnb*VyB}n~J3Dmu!o2m4cIiVO^}Yjf%Np|vpslThA_~)T{W(w+}Rv65PhtIv^Yi|H?k63PhLXH0ba@H;oXCLx+-L6SyKH#+H>4y zA*Ln7S{yeTaUJ_Xi1rS~g=S^M#7m&nAs(1b=tg~v@aotc6^+dSJFO+ZX16OGTg~q)CbkYWOR@1C zBEfOm+jbixYGtO02KnpgUuK3{In8dKc^Ixd$d-6EGh3xnD_LNVCx;p^>^4BsR`U_f3delY!Q`_<#~c=rbWh+ z4ihPO&twRFV4~9z@1#k83zL#D!LUilGY(RX9;}kZr%vEd)|q8VYx+_L1)+#lFw_Q{ zw~YNrJQ63q16l#>tA$kpo%eJPZ=K)veb_bS4$S9QwyuZlH5{e?W0v`^?OBvI+pLPE z8TLc2tvmS>kir&_LUx?anLIHb&I2hdVMp_pRJ}GRkJ~{;{J291?+06@4v~DaK3lrB z8#CW5$ z2OmZq&+At_9P|*<>=w<~pYl6WY-;FD6PWgVf6BoAB%m~k`?L&4^j3F2Ps(L~nkCr> zG&RKHy%E>A(fll_u3yQovLGJ3W16x)?}=6w+w6LX;oK%1G0OIj^frmgc;!1<_2WWt zfjL{cuNy}dGa4a3+?Xw`kgtY(jV!H&vs1se1!6iqwe$Xr7HU`dAE;gH`h}Bw%Innl z$42zq7BC_m_}>ffc(bH)y*SdYjId`(r+Y7~EY6a8d$IS<>TYC+ zeMSW<#ti(^d~hUl2>O;RX>;Fd@xa&m!pqq`kS z8SKA@{(mH@-+m-+ZywWyR{Y5Ux`kHAIwnn?;)@iGhC^ICLQ!_z1N9v?m?SU$b{s(eZ60ZTo^6Ll0J-)Nj0JSz$#6) z9*Ju99*J8ZinwKfnIXar)j_64@~4BIW=ReG!|S!jaFl{?68tzip^CVmBuHQY*CYx} z?|=odF=EYdgb~vyng6^#v6qVv@G+9ceLCF zA!r0jclBd`*y~#bzxT+$-vZ4wwp5xqyVkFVo~Of=-Rsr<)YqHl{@kf~QXesb)O-8Y z{smB{xnC{!sAqlZ!7RR%p&fX(AA8gz@;(aKBZw^;5;mbWZI*qlrcdc3T%!;Ah_2&Q ze4M|w$3=F@yYSdZYB(bzC_1RGgYtjvX#^ci@#(=5>HR2S2g4qX_CW`lwTq!HpNgi) zny5=?BI4tElRZZ3Wy5+*1<8gUbA#MtGC|TG^#BB;7JAGLB>Q}isf44VA#!<~aYEh~82b*KOHb%1EhY~r_IJ6YuRhW51m;`E(~C(3=$C%Ajv>7}ou z>jTOUmt2Mer(1GR1%kW9s(wrW?!` zs6E?f38Qq@Smm^viEc)Lc;AFYAL@ZA zNXMg;k`gNGL0KoIT-=i@ukXZ}$s-b4dpL@g?b;p^6hun?Ts}0k1CG|6)XOuUc$@h` z4|<^w=Y>;CYg@8MVD!=2r}T%`HjGb9kbfIQEA9$nRjoe~r5SWvmUMgHDe#@Y3hZ>G zK@>doqBTodQY6|YuUVo^1R_oDi7e@ZC@$glkTpuQ4* zS%Km-pxAovTMko*jEgcdzT8{G+95CUns#7Y<+IT z?%W6&|56~oX_q54q+z)iaatdJ%V7sjt-xtH%YQ0MS`rt1 zeDxb2&oUF1$^e!sMYdErfBNfB%oUzMTa^O7ITQ5j*S$J9R-Faj3~RRdc<}$Fa>VEA zMQgRLrb4z>xO+@Aq?fIgqZgmI_9)is?+}?N)@oui=AgS}Yh{x-Hkoye|9l_T-W*x)PmemwpJ;_tkw4Dnv4DWUa(fJI7=rNtkoi; zGFJ!URft9Hvb9=7a?e|<8u0I~y6h*-!89m?@#+k)R>Cuiy~==l_1(>~z4|FwC6_V# zB71c@hW6@?*VUWgnI*ePC$}B;e`7D&EcfdU*UUs__Fgy2@(_3@Zi~+UU9ez^boa#c zU$S7T%|b9kwqLrFDmMK~*6Zu+mVQ%u!fx&9QAO}7OWKG07}K|BTx7R4$Akd4B`bnd z&#+_+qx#Jlx1~HV!evU(d=F%SIzP%pkw&Jx{y#bYDO37zz?A6ox+VfvZlr9VG9~YT zp(Ru5A0R>ZQcB9F3=OH_Xjnvvvv_D|-*+kT7b$aJFz>|?qB1$}H6-$s_aN4&7mILS zF3Dm76L_3fHZ;V+xpC6a&?~o4^1E?EL;K-;$9Ux(SL#=f z8vQLfYV>pS8i)JXFGU<_ym;j3*Ye2GTzTY3!>$dianv5u#2E3BOsS`zM2JNjtLEN^ zNbzNn#8z@|N6Ff^!7t*N(c^9?sd~(D5ch(Kts>l@K{b37$$rLd{i2qI{+mFsNG6pht*3lu^4Og!t+&!8bRmizMf6WlHDzajXaD>!&5CNKdqH z8qnbeIyx6nvTu?SGe6c^IcLl>D}a)`-cwOiOJ|(;PeskQ9*>iTw5Nc!Du~j5n>uJP zK-Ti;!`Sq3Uxpv*)h*$LPy&hyTV z0-4&!0a4w9Ijbv$?fjj$o$v}Vi^?mR?N~VBZ%pjLzH&fDn#n8~D zZM{Xt&psvGfwTWTKO6A-yDx6*MSUc=XHjx~N_t`!4V8aI;12oy(TXVk^+!2B*Md32 z#;6=WSy1Oyo65v_iFqiQ($#${7UBDsrvc7nm*G{#vgFA&cYzG$&L~DAN1`Tzxmyvt zlT|<@VYXC$-mb?P?Hc*(Du2|MGQ2ag1@9GMJQ`IqQw!RWMIc*p1xSkEIHWe5w`rP8 z!6@+8nbO%_1IWKPI#TAnFgkLR!))@Kf*FI9(}q*dYaH}M%g0?p-t14`E`8_Itr_$F zPRM~w8Vfa8+|<(9RR(-4xrvg66BU_ex#+f}RH+3rx~TK)(RmQ9Sq^-<1Y5VD?(bBB z7FIQ8Ad~|m4*p$5Yfs$q1nM}(n z6DxjktmM4`0E?GGFfX;Jz~{OSU(6h=tbj{!(i$i#S< z7IR@L)`+-nxV7z0fQhAd0Zu4y!19aa@^iXLDem5wEH6|iai#xDxN!Afru5Jr$R`0O zW$hwHnK-j+ow%W%6yxv1?uKe#y`r&54{wlZF(+xkHKR~M6fThhzPkt9=??P+iQ&8$ z-hS!oX6x(>p0JSfo-cD@s@P~2UNQ;HgvfW$+f6v?fVcbZ3T21GN zkQox&m>?A&^sKG6h?Sx;CkNN;e8}&S> zJ=cjmpN9r_(GRR_)z#E9CG((=dH6)KK2th0KsV*feTb8F=?2Kpw=6*YoQW$Q4Is0$ zMY3!_X4%*Vsz~s&$&Z0Yw$l>B$sL2fALv5ghZ36{pN1Ej=gOr9Alk$ye3*J_CExWA zYRA5hlxg0FlGi0m#lu*}d@{?8oWYZHGT2ZtSKj6GZ((XNwk0uoVf%V`zc&Q%Sv>hkBQVvcedG7VAPq0RrVdlFNM_Myk$UBrkm0 z*(oSl)1bgDhYaa4J;{d*V+rswUnqrsm5KeQ9^}+6;!0KAX)f2L?ANOG3m#jb(V+&)XDv*xn3x>x)Dd?C6JXpi1y!{T#Ne8%cB-%O2>9R zD${@~&qs9fr5E>%R%k`+M+yCuTM?ddr1)=PkXRj13N^8mAw+Fx8Tis6MipVj)F`<=&ildd-EWM)^)9XoGU^Z*WiA`3SVlB-bR__G?5z zgxub4SZ{ILEt!&`r>KVHuUvv{z1)edi~A8^`(l4{yXAFOV2Liaoug}LKDR;0U+$zE zG_RiOqbWM^F2+A4l#=zD^#mkoW2%k%Cyw-KQ*;}Nbn=}3EB2J)n;y92o+0t(!NO8y zkM?kM>y4DW0KRA?91Gw$-|}ET72f_M;j<0?#UkB7^4BJ`Qjwg0kQNc8Xxl!zdk3OLlWNWp#1Oi?HUx(a5A4)<(%Ei0C3 z*qH`Vf2G(UHafEOc&#z{{|e22hEUr_W${MkfZojy{C1jLnOtXkeby&&(H1T%jQF$ooRL? zpkbd*k#`T7pXm4SL`6!JeqS$63kX=_I(p^s8mh2OJSf_jA84)g(4uQjez`BheKDZe ziz5BW3qE&viAE9aJo&Pxm0Jt^VzD;l*-gPO&fASP-W6 zp^hLVpA1RbiL0%0TsWH@<9yC9itPcq-N5LRnNm~C9}vYa+i%*`D#rvi(aMzer-fY8 zHRsn%No^VO{(rOTFpog^*{%!FTLU)Hz*fq#CWStLPq!nkCAexshO8L|8Rv3-8TMZx zpX{xrq*5dnWsiv(PtuzpZ)p%QCVdayQ^s@Etk|{9ksQx;hHM@KYXKi@^*rn_hKd$j z7Eg;J(80cX0Qe18}Eu8Mh2|4Dn~XXuj9EI$mypjD#cNp=e4z+O8!_ zEpA=l`6WVx2MXu(r_?krN$vt9dmKycX;0d$!X{9)}$ z{l;0ez$kmF`w*9Xxf6115g^RaiA$FXWdLUez`62JRA&bYt}GbMCHBp*Fx;I0BE7kk zygOH!|6ejJ9$LF&JnjfFwlctpnI3<&LR;16kLYdgh$j;0jHb-n=Ew-8F)p&xQOZ(6 zH^uo>=$Ro-qK~LeBW+{ql@&zTY9RwLufZl{f-}{#KC3zDw3Q z{(iL4V`S?bYvHcEgD6Ami#y2r>Wzl}ZPNIy0@QehQX4emW##5#bVY}?G4A>@Y#16Mo`&jn53xdQQV$YHrF z8g^R2=lJRkK+)KcN5q|piahw90Sj0a3s{2^k2_E=j$|63OG>OBQ5nso;%&1#i1^#ijrR$a9wH$a#)qeFlgd7JG95s zT}w5R3m5VLxP=7I~&#{W=LjAugK+a-RheF^JCr6(8F-9 z$W!)#KNYw5aXjMM&<3W)75W01ppVRnUrP+J_eiDNR!{A=C3I?S)fJ)lqXOh3Y2g;= zEoVYBR!O@(n$kJK#{@E>Zeojte!Qf6u|D=YdP{sNgeWy)W}Y`jxj!9!KdOBX=c(My zmatH$BT82vcLWG+r3Kxl zz->z+i*X!}zyZAs+Ue=SdbzIOfQvfyWw#5oY2WUnaXa-Ga1`iq3 z|A;wE&lY=3PEzh<#lol2_ZO%jR3-1_r>gUV^Jz3$*bKVfQ z+V#%)aehugg(J?-2t`!|dgn-IdsJmb+iD!6yd#(2AZg6O97c+9&bd5unsu8kl1gZ) z;yRSMr0ERjSY$|l7$Ak%7H+YGeIhRQ7@ZI1O-s=A+5oYA6i%yYiKz+DHkB4G5tlnl zoRfi?d2x%8LprAdMKeYsMP?|INu5T#YgF*A8I5DCsf@Ss0Po3xx`12!Sgfi;PWe*a zj(jFt2+L8q+{$FR8)S);(o4#5a=AN`<>q5Ku9Ul|T*FSmI-2D&EP2a-TQ14!1ZR~S zOADn!qI9xVlTu`LKGG9E53oA-4Q*W%x0 z&K;z<0!+<1$Yf{8J{q|>Ty^bHg^#uUWc=YBZgKWSd=$ZxANPxUO~8Rp<^buR?X0~F z`qLu{WsCZ;?Qxd;$D-q6%^MFf=J@39O8htQIqy85Q-IG!-@xbVX3j!lOovtyxitmJ z2uQQI%(*Z8&kp6>g<@%!h#%i}jYFS*D4O18{3eAl&)1GQ(RhR1Qfbi+!APx_-T zjqM#&r;qQb?U_yX%Hz?>9&8+$Ezf%{>7eYptc+b7sgr5g+DB~lp%YLF={SM=<`p{X zP9$h~7tV_!DZ{>bRq3W2F^k|8sHKa&d6&a_A&EfDXS3hJ| zjTElC^lM=sR>`xQeWZHl)Dc5f8VhHQbP)nmWnuSMOvPT^A@B>^&C<} zTf)$O56JB|TfjL&*mhar3-d-ZaJ~X$B^P#zvnxBrJ(eLgb)#(LR#sP4(GF7hNf+*n zlp&e>(88XSr7@EMe#?n?wsCk*J=aTYzYk~B;F|gqaxaClmgUZw&g%2+{_aKXej?HC zaM$=+7j1#w-kl+R(9N8bm`&%$O09~0I?+q6s0b0;T+rM9G$%Ee4)T-?@&q-bvP0>Q zyQ*d+^s~K}6gGi=PCu`o#R+O(=q=xy3;L-={k$6WbGmctW$0&0q~YuIvM^z5WV?3H z2!(!(Ag^(eBIVr}_0J0l%OS=Co6`xAMVHvnSe{Ih^p|F~ka*X>!h?Tm@=88C9Vp&SokH8h0i7_?hy9P$c(D}iM z#KSmgZk#k-*jLqq9xO^Nf9)c{S1Ogc$2|KO;)=B8*pop*4`fLHh}m~67OCYEaV^R$ zlP}{Tw^C)E4V3S&$oh3UMt0DIN09q}486-cvUgegB~PnJ8CTs`1d@`$ac5&SJbyru zzr4;^bOjvC9g>lAEYl@MGK^AZn}XqumDq#QVLiCLo`a{Cq}$D$fV ztoIzgaj*&%4b={Dwt1DiZV|OACGZ}Wxjrw+D_^2I>JU>#uX4{{Q1`|+JvF|8dmd2F zL->@I2UFyyl|aEN_k#;C`}#7CLdlFE<|VU54(#e$_a;-*f*SFgaD={*0{64ku~ePO57CiwN7+xWQEVSDl4KpBSOf5ICvz-|b9LwS+Eczt z3-}T}lr#+TP!e)kLh}woQEU?xMcmHq*BqXn*yW%U>>1fM=t1o(&pI@h=%qcfY`~a@g!FtO4 z!24Sb%vnPw$g?YPcNrtUz7h23mOR|ilP?|*GEW=5#(iUgo97bT{E)Q)H+PwVhcvWI zCjwkdqc0wvFR3`RR$F6QE!v;Gz>P!ZW+iZA@xB`88^}}oNSSk`I}f<&2{gLpyX{Bf zq+Qu9$0!}{1#65u4R5yi4#hdk$3Ea;)5*kKY$fV2O5g8IxkB54D+H8pic;MjyEBp! z5GsJ%6}>p8nbzUz3gUOMd9n;v_7jUPt|rOdd5n_3SJ}Iy87w01TynU}IbE6K-Prn= z$g?yLv3v?PnFEQ~kA~yCZ#r1R1#xZbUXaR!Q(V53$HiuIAe%I>mh6_QqT?$a6OO53 zoE~E-XzylA2x26IVNk6eFR66Dj_HXIQ)#w=mf;&Hze5kLzCmtvA)>4uQT7i|#dO>{ z_to)Hq&)B#wtW8~+?QE?hLI}9sjI5yc3_OE?%?Cx?=eQr2w#_sF(Dcsx~}pR&Zabi zzpR1y5}=Git-vS~zra**R2!R3DxAE%*`Yqp%j@>mI4o=gMxY$7+9MM*F^7SVIY<^e zGg6q25hx$is0TJu_;vyP#iuyyb9pr8g8oe=>~>g>ao`y-&p_?V1KGNg zvel#h>0+FAdyLWxK2Y(JT!f41X`_2;++=({u*Q8s2OfvKR8=Gq&vAOhK_P?g&*MU`P)u2(ONL#AFu_NtN&JyDVjLJSFFX=<(!@WBV1jcQsTCECYVk?&|F1 z664xcu2xVRJZvrR0Qt%9<8`R&O`$PiCLe(J0{nTV=?4`+`^rLp>1J@Yb` z>>y9LbXSNeF^^U!Q66{DP{({i86y+T!E3~I3#p|@BM3l^4RFxId#YC+jQ8mc_3UjbrT)A+{=iI1r$Tf{Sep&Td7|TIz z@^Xyl(t-Bl3Hg3C^~V#`zw;IHbqK@hpAy`6QMauj}CpI9!~$b{i{nUxp1Ao-+R%uW&e*ax*oINU3w|Mvxo895+k;m z|D?@wzpBl^GncdLd+jC3c9Z_C?Ix&|y?9d3+ol-_+cY<}Ysaj!FI!uU@1EUm{X}%l zT>PasChyC3N*}^C5Ju_QSUh03`Yp%b!gxO-?irQ(tt^tf?}+^OPX6m?;=d(Li~emi zolqtAEE@lD0B2m`*svoHvqQc(=jc*VKYFX1O!(dca>c?Pz4(mByKDycMmP?n4Sh9WL%{m%;Kuc_Y4wZ|hng7$( zELuJKJoTW8V$OH+tDf>8MQN3F?LJv?N~+Da}LvSQV@VRMfEtuvR77o_NK4)>=$=e)8CvOy8Agt z=CQG*R%t8^#C&6$f{oM=S>|qv*hQ^0R#@g z3NwF?Uu4C7^#uCzlilk{+V6=i?YDH>`U9q5y42D~Hj^uE3^{h}lK15U7+Q?!Uw7bo zh3Sl(69(4?OW06eUtYXIs4&i)9p_W-1RCBTL!gI;yK|(ms)B1(*b2J}bjaxdf(FE?G$U^WPFxvW|4Azt;}(nASb(is82CqrJx_ zCT&p@BL$@Bu233V2^#x2L!Gq+vp{=B96te8LqGc609rt$zqnwzK2H6l0CS~VWZhM< zO;t0GPjby-%B<3Ksi`j=^b#Ygo8o+W`=}|*Rkb>(jp>NpJx+{_a^XAug6WZ$92p^f zOw^zayG6EPcCjv=V!4Ldam3!%8=_P9IR?Wg;sQAlHyZVMx?#Hcd`w5zIkG!&1OT-Y zXfqlkQ`l7T1{rH(Roe0Y$K1PsM^T-P<7akfcV{n2mJl!`0cJxIHi%(Cgn)?2k{mW@ zC0s>p>jcow2GnT%Y(!f(s0h^Bja&>AX|NRoqGm-j5n-dEMJ(+mpyguPscp^fPA;<) zVTFF-|GqPu3uycG|NHfOo?o74vpX|q&Uw#!-s`!%FUIx7Ue`sYitlxBB~XSiW74%% zo1f>=KnDqK%45jx&fY=teCdHB*Y@E=J%OHI6-oj*T_ZjRIH{w^$xDHgM;r%P%3DW% z9OqnEZvGN7?#>e}fRiV{XE&d^&T}WdE`gKeE-Z1Yw2^{rc{rBou^*5tQcS17mtmX$ z;o=D1XQd}fX8@*dG2SOAnFnMcMRy9{b4hOlu0Y-!09WjM)kbv!t}K8nb$^#r4(X;I z0$iPf9-dNhH5c&2$hWAtLY(b{-y7VT znml>`TfB?*)_<0FhY#w@v!faEtG^BI%lsykv;SM;Qs4cb9hb()KwsV;#gISzb)YZF z%GqF3&i~%H%=r(G%bY=dIX{vi*1xLu>ufynS?s|c49@d+Z)gMEDf0c+d*<S0#pl_MMqts8SpQj`^8EgHm8T=$Sn^mLpEO__LZ+pILW zK{DqKlMcC4L-(q2N>h|~yU>3C4KBZ+<`Tk~=_yK47`>dXRwnlwc?X|PR!;Yj;98KY zYXLX6{bc|*v%i6xNB$*lD*p*?rT}iHByjU&nB*@0A8{l68@NeUKI{3PaN_{ni~`(f zapW~@BrEUqAU0A%8pbAd?RWQt@VRa)vrUcW6x^NV=1>!zhv(>i$ZKusn0N8op92m^-mEx#@9lB+x@LEVFjKg2 z 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

    rXM=)mzf!chMx<@ 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 literal 0 HcmV?d00001 diff --git a/test/resource/fms/fms_self_starting_host_bundle/fmsSystemTestSelfStartingA-signed.hap b/test/resource/fms/fms_self_starting_host_bundle/fmsSystemTestSelfStartingA-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..6400fd7419717874242452134fc5ed217a33a1ea GIT binary patch literal 113144 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%0D! zYd3%z(P}`{KvAQ%8n9|sih>9me6(nb-3`(55W9MNn`|bJ2?AZQxA}d)GaCrttG(^# z^ZR3VcFvr0zK`=g-^Y24`%*|<-AA0H`R%wdA1Z@I93&`!7{e@{dFdiw(!5ATC`Xn|L+e!=N12L<4uUd7=7h?}d_m?&3y zu+O;p-oi?6CB~}2Kk>Yn2y9K?*$6RL8P}&jneyYMtPJXD>ervNtZWcX5#bDrA^HK=B8?JW#w8Qq4fIzWL*2;KgOM_#l!hFHYt% zj(a(xmzVL}3s|p1x@V~iY!hgRUI+BSw(5~uSmW0{bE4;LnrEV!>8r<$agm!fj+R~b<=VP3`MLo5b+@?YM zkv$*v%{kB}p98HBpixIk6GE%+6}HzTq1}cQZqXpU-d8p6@kv!RRrBw_y6d}*C_`Ag zm0|to;{P{!38by-OG$F&fj<39PIf3!??ajTyUhJ+shZx{hi8_l`1Or!sSo9m^7w%a zB}qipW5O5cF`*UVo4&Cgn|ltf&&p}ZaWDK@m?qgCxn&(Clc3LAgOmh7Mmld98rlwe z;OU=IaveP12+vjUJPV$;f}RlIncRy0U9PfySABK;jtAPD+LueDlqRrWeLTb7;g!eM z=-AkKWTH01dWUD^9IMS)`584Ih;vq_V{ASD0&U_31p;146P~XoJOc9dC1agu_1|1M zC218c5P9V)AN5?_NXh1JLA=_4V|P3=c%7>>d*kr!hf*=nJQHLby(8iJMlFx=3-V;D z-$Jm0Z#iez0?5aMF6F+D+Egf|V6pyV7YSbi>A@X_^WMDGtNEmkU3Pfi2K7($ZcJQ} zF%m*&;u;D)tY>4wOWW1wI(R+=&vTN`9(a!Q@PiXbu5we4lPyX((p?ajX)#%@a)+GZ z{U1NpNpN)4cf*%jN>j+e+V+gJmNR5bAz=>idl`IJQY3`ytJ`*1m`T#Z`zz#S66ULu z`9T}NpPW21KUaBW=lOYAGOsBAkN=xm>l0_{dvGW8m!06HHMSI=do$GBhOrCZEAd^Pu*^xTo#^YY`>Chc zhmmxp|1#MY)&=}+Ku#LgwhIdn(xu<9*$;=^^Rlo z`Lmvs4y2Q8;I@HxB6gT{Z^ngwz6u<5f_8FdAxsn3bYR?`aF7Z%*7fci?mi0*y)H{O7q_%@<&JsiwI*g zeD!-iOpv<&*yUqyBuIPxo+2r_{Z}lN75N**#L))vk|QPTa;R_X_Oa}ESB`J2&&D7Z zNTYC>UHX-1h*%`2`ZP{@7QDafs<_B#|ASTh5x+DT%2IP9go(Qjbh#v7=vPe7T>g8i z5=ZN+gdkf0?%coZ#ukBf!Y5t)Y0h?t>jqQ~Q zU6Zi1hfX&P*7hvQcranHu4Jo$j?&2eQr=HUu`O)fb1)&qK1vYBW>FuRzCANxsU?#? zjyNHWcjSe%=fe@3)F{?PmPk}u>LW$=@clk4*ACYv$;=if`1xBzA#7$=pU&6pi$MCU zm~{`9qLI-oJLZ*aKD5be)N=daYL>V&H)QP<|yI4s;}@h{oqGEXZyjz?(_S>UEN>Z58jJ^SwF~85(D4^uD(z|J&?q@ zaRk=0&R~80UexJkZ%R$TlYb}9Xn{^~$9z=PlM$Rng#7v4ntsnwuH72|81<_)TaeG@gDH{YG|18+SXB*Da_T}ZII8yd# zTr0Z|%H9Iy@Iu-kcQyKrYrq%3GQmHzbC9IhMd*6{*o;6&oIaPKP@NF|ww-%S2t#i) z>tiS-_#Le(7G!U-Z?iE8Yx>ay@3Sh@B!ro8RaIGdCc8IuC}At#1+~p$P9}s?1}Wvh zvR@syh1v#(E<1XRkG))V=-}CWY95~3geT&H{YmEIju~TDRp~pb5W93C)XLuIqRqNk zs!tcA%~cHgP|(G6s?URCMGfHpE=lmv`@ag)njt|p8YN{5jG2(btEDKY| zUiht5hTO#EVBRqACeo7dM8>n7At%cKnifh{m3Ah)Do$r*;aQ9n$099$QX+)C_8PQz z-Nf~$=m%X@Rih#{mE@B10L<)sg>G&XY$^jyzfumBgy-r`&`|bG8JZ~rFh?AM>0TH5pQJG7A*Ln;1w?Vj8 z!?heP0j|G))V3o>$?KYp$&8dz+dd<6Ex+QU<2Fs zUMyv$^x`@MKH*lCa_D2~rO|#_>7MC<>(bx(NT`fjH&eEJx|+ zBNK7d4)QpT#r30629L(+kN9wfU;qiugeZ~^e_O!5vQ?aY@MSg>GRb;klBv)NmUEX_ zdURsooiX$5Q#y*EzBdNE+nper2KfKhfGbpQ*K+k885?6&V`|wLW&DJS!w}Ef(l+H%jIST2s{ulZ@IncLql;wT-fgA1R(o<5V+E3~PAzaGbA(DUpHP4HD zlumCFKZ}A?Ob0vU%u((b$PWNs6m#>CyOfoM%r;tK2V?J z`SWdbgP!Turw-c86<+h8C8eTL1gwhE{yy z;f-yexLL2R`r*SR$yS)#OTrKS1oZx$+GU5U^(Wdm%o^|ms=fDvp2nHuVNZZ-qEO>$ zbzF+LRz`lVuCvfZiQ{?rr;i;4&x1H={qMljaY(mKfZDs5|3A9Q73{^vw0fycE zs~O&V`{~r3;ae5L@Jwww_2Q!th3Ls79^$|IRy0=c6^kMc32SjJiNtl8>%j*T0{FHD z-d5OWM=D+>MTX8J;0L|&az-NG`i?O>y6=Yd<<-?J?#5Ij?yV(|DM$^B-_iO zK7oI%l=tKM5fUy27%sRHtF(4`tWE#0k-g+?WXBT0rd)M=)zCzw+@>6<4&sEA2+y)d z%&O%mPs_g)9qdFjvvmf$l%ZAqPoFO0$j?z&KaJu0X7nrb@oe=&3BLY7JT2e4LF@6g z0+~jXW5HKX-#b{yvL6=)sjkL!C?T})>od15u!AO|4RCQA1+bGd7z2B#dsql>W?7rx zG1|hS@S50ud{1yQ$d6v;Qd}$wS}3UeI#>ZT-qnXT>c!w9&?pV+vpZxOq~v*-aIcB+ zBQ3G5vR>FKr%-@P(D!dU9aL&ez&r!yy>lu#qnNuvAtm}!h-S|SnWj)ZBmNGhGg7;~1PR!h@)sv&_J*O;@ z)pE_&CgOln1WV!j^i7)nBSm~z-%MPo5!6hL5P_s^&4K9G;`V`8lC~9RkMH<9@;Gzr zMSx+^( zza6lh%djt<=%t%NfTt-i8rMu%^NVt#C4p^{#hY4l)CfLP7{7IpqqOyqLQb_xT-dGk z>oqybuj90EKWMVSF3atdWZp{2BmSYG;0`WOk+e;V1b=9?gx;HICyuOZ+_TLkmJaG} z0NYL-!96CgSzQqU(%eJfS?A@G&$p}3TW+D`H&ExV;Qm($*HLhRDy*9d;VXrkLu(~c zh;f3)-tyfXWn-@|L@(K))?L3xi*vB9I;g9D5AV%q!?kqD2_q8=r4Q=MY zf+YX15bWCx0TH4}igUQaC!wD~Ye1A96vE%KlW9Vj3{pXmIn&c(=8;3 zcOM!YDuugKDA&Ae;?V9>1LZ6O^io$xDM-+CnYccQ6tR3}gr^zs^kF1m-wHbEX;D7% ze%G-7wuUWIwYCnluh5hlKwAir1(cyiu!BK9e3P(H)sSiwBV=y}|E>jjQ`=K#e!A*E zkAi~S|^2d9K>&8eaV4zo@BHJZ|PoENdk6azoYT+K%>LHGd z0PlgQ%%7opLkk5CJi@1|*uhEc#_fX4lQ%ruplnF|kE5Hwe+1uUCf#r!z`D4Df=}^! zPviC)HeH3Zw{{-=Ba>p7_ghs35xV)8vOp^A??lJOuB;jzfhS|Yo)eiphHqU8 zSRP1_wj8BU=C(MJD|d4gsax{}TYPVUFG$t8gl3(p3%GC@(>%d!MJ7OfCG0?-AqDhF57uQ$>bb)a^s{oi zQP2Ic>uh<%_w08@vXv79Y0XE^8Dq~@HVm9vsp+?S+tPp@=1m>6j97bVX!5dbrF#J9 zTlX0aQLuP=yP7Q%kD2iaIb^y=+C!5kPHcm)0LQhE_B`)kx0BNHwOaX@!K#UAQ4l4&?& zoUPOk7)JO>MzvpME0%#-A+RrTwA&sNnHr1!rHf7=Q$LJ;(nZ29;L}LWiq;17MD?(K z-S8P97#V*U2Hj9iF9pfwv>bz7+WNB`ubGj;fXB~p^`@@L$_~WIjohQCue_mSAbDIf zrf5>gJ!*;}Ki-0rXMNiG;B4@Zb;;G5xS}gtdAa}hx1vw?)%7d!Z(9E+{pZ%dy8otI z&-#pos?Rt9e8!1MpV0w6BZM>wemohR0da^YA*4o(Rf#gyXUtY!>qk51h>!Fc9dVcX zb@y!L)7MG(6x4qLuD4V;qiQ&5l_z&Tj*S1rW0Ka|#z=I~Vz{S{4mwDSuaJSyN+vSh zpuo)lxRz<{0IfU;ZLJEeyW2PdT2J>dwAWwX05Bee>#8J8x!zI#upgYQ)TvNj={Ajk z@=7=Qa<8jncL?j2*Yg2}11{y3v#|bg{^hB#g6F^rs<7@k1FP)yR{+MZ;aaQ08m;os z_D}NglRkvV&VlGvAuc!racDOQF9cZg;L5y38^aU48xs!e$hoAJ70~{D+L&LqqJy?R za_^iS z!SL-KPA5dtLcf!q34O2Uz3aI5QH$RlB2&kO@0VtK_QiEGFkKAK_s{m+zwC9E#Z=pJ z5qR@)lF=UL-o*9&)*Y+cq6yMYCV)OIIF_)*K1^8Kp{Fj4Rda3DJ*)luR;&lA-&mf( zni6hDrqT31=U)dYbeWm8OHH^tAy8k9k$!!3aK{?|1MH0zn<4eh<#{X;=dw156V#Ey z;2!%RrCAZE#rlpx=*&t``}a;i@b{Hf_T>Ae7P9GNWx9p4SXlor={oz9R}ijKat($X748^w?GdX zcto8Cr%|(07jsJv@S`in;o9rxiCs) z`{26Oey_OX&@v@a!M!5BIfHTWWkp|cgz`%BRYG4#X`YCfeRTbcA4&RaOZ zBA@QhRvf)V<}7@%;UMR@-{kxB$qY+^j^$#y;_PS&Z`e8dQf0}U8ET22?n}u@j>k2nxk60wv*)6Ibja|5obuY)*7Sb z$A?xnR<@m7Qf>?D)EtfD%fP#BBq*^QMB*qfwlFCo(cm6Vu1EvrsgMPR7%f=SV*xLx zIc)RfAG)n-pd+hMcjC^9(8(pWDbe-zl~qEAsgbHF*VJ-RemY<9KV97PV9Cb^w*wxu zgDW`Jr8^P85|seG;Datr)>YrQnika`Ek8~yM6NLZ;Z)0lT7^qPjQ|)2DAw!wH9)dP z@3voAmD(}6kw0-Kdj%jFqZYZr@r#q!R0x&iWU$o5f=AgVs~T{CbfIGgcqk!_4-=jvyT!=|Irl6NKh1D3hdpSz1=_^AcRsG_i5aXtCP=|%}bdhN} ztT%eRi#V+HsB1|0(6zXaq@j(tfJy^+h7A1ks9RkHt7k;^P?hsy2?O3wy0?cjv;ptS zJnlpHi;j-*jYgGz;SF|=F&Zd`^zjtSl=n1P>s75) zX+v#Ii)J64SW~Nv0~x--YhbH9WMX#gM**W^G`5)YD^}F~jo<`nsH5 zYYT6)H;V?A!^U;Y45an^k+@D1g(y1SJ-S)6bx`*TyKeG_5pFUcp_AiLqcWcVxC`q{ zH(-ren_xmwm?>8jM+sFp~JnY{VTl$4aW;`*4;YfL`v zjgvxmaxMCguBD`H(a_M1aCcm-t)0a_!IFLAD&fZMYb9;u!U3_CYE4x51;+v^{Ip*8 zc0I#)#cJ;=>?QeJ(ADS;wc1I(JCSLn(@D|kXgOe*t+;wITC?Wh)YR^TRYOk88O}_}%YPVgQ_9hx_eIhlbkVUa>^OeJywmB!DwPjwnB2qgZf| zlvu!SbC&lLLOUs55qY4>)gcrc4^mkqYpY5+EO2iWCmqfLE#_l065JR%+X26yMX!iW zlO{ndcjvf`;?WMQr&9QVgfTbKxgg@sK+SLDn%LaKSP#^x6N67IGvrE_34+YLVL zMBEr8SYD2n^*^_IfqIVqdo=be3pG1{F5rq44z5}o55~G z-ptl`Q^>ws^&_T_OiysLRSIW+7CjbE{cZL3^vAI_VH(&!khWqrI`#^i1e}8&r#q0~ zgL;{9L}s)FYPmdi=2IQFoWmEfM+5?TiJm3$W6HOQyy zB5szY+%}N*B)3_Rjf6Oh6ILtk^?d`py*Cmri`Fmh$TXEjo9`T^Z22pW#AC#=2vQlhOWJul3iD#pMX1Z^S#`Q+P)RsiJPsI_h|e2 zvy>0}A5REY-DbX78_%03)Y}_uv{*PgE40Q&XF+^1XIe=j%6Ul4%r4J+S|)@%VhdN= z)zPnf)E{Tpm}V)z=s&yuG)vjiFC=%im_RFLDRcUBzlUq>?p9ZQ(-+dt?506n9_=p; zd=RIOe-@K*@w4kUvy^N5&+e*0*njT}Ui;;+muRrv8R|NX`2c&Ljh2{>=CN6!djNWF zg5ET3>M(R`-r_ujEvm4ym00&k$oc0%exr|s`D=&wvS4eZCSmKFiUT!LtE9~=FA^j> zEwUaJZKU8mnXqlN=n9sqc$PWI!Fy>&`OS=J_$qHvyr7d*q1se2t}+M zs8RY{f$8iA(t!jC?lTIYUmdIh@O+?qWb3@w_hDD#cQKw{-L@X0*Jzynw_T;bw&$9( z`F5S0X4wm|w(00?z=bWqh3o`fFl}-ong?81&JN}+uX=G%owtLC_+e3q?gd??kC1$_ zK3ln}8zbK=Wm_NKk#?R50f2Fpwic#JSZJ>wO{bWS7DMgZN3`&CsGVc0#iwP1?w5l& zKZEtJ5&0;}`075*!r|!?Ek4PP{VBgA#ifVdG>I9{^rsB$PXcmddY_TujNaPrr%0J< zPqUSs-G&DXrP{S4PN;fzss)9666q|H~p zW7Iz^gqPT}m8ZLLRxzUi;=_&E$}iNXpjnYS)sMA`ShXUBN66s`|v+O-+>Eah(_c3EdBCwj5>-qzi~5X$d^rok-X zQfP6o?*Lbc7&hVm74W|&vI*=K@5+kmHxA^-o?0zeOTHgZfi< zPmJj|86n>lYCcCY-^*&gr5!rRN2dG?@bX2kAJ$dIGT_!)@R|<9g}Q(p_mEepyft_8 z34Mz?_Zb(Q=riy?=fk6!D41KZ{nkqR8Y2nLp$}9C+T&zfJLqkk)63ZKLc(j+X7;kc zAA=gK^yhmLUXro7Ik?}L=lfaW()ynz%Id5eHGbUGi=5-09Om8iy=kpW0jtEoims7Z zx>YPQ0ZZ=5j3k~}$}0mJo*uw6Q^ix4#M20PPVK{;ZVi%U{eeDn$}pZs)$#i9iTsze zdEEwIJLIyse+T{lK-|3TK*HTJt_!vJ-T|bEY#F8}w>LYvDkVp?Q2<{?IMaJGS`kAM zKJpz(+7}KD?Ov$K-~FH~=6F*FZ6@g1=70xB?m?PT$fV)1eRGo#J3CvDrTkeYQ)?o3 zfL5C3JPPqw$jH?4<9!)fiUjGeMS%bPM9OgOh>WazvrHW3m^08KVF{ld z>+ufY2z|N9ya}jqECQaSBzZDfCgH1=4zE4n*z;a8ad_4%w<#mg1pUu?rLcic&wS(^ zBey{aTLIHpKlX>+!8P#z6ZQYAAi37o3OnaEHkqO4nQ)indVN#sOU(=K@)#a9$E?8h z>;Zk#5-793U$6G4CxZIHEWVVX9{5c^_Nbq!dw;T&c6f?MgiR<-Z>YBR!G5iea1BA| zBc_gHi3v@$Jzla?J*mV+Qll9$L6bpq9pvxtX#g2a37SC@nVXQqBBcJPAN7L?Bx@%_ zSw0p|Q6mDgu( z)OtuK4D?w)c;K>YtvtCHY262YG_j z%T8SP5^`=qKbfd|;+7chm%?XHzp%Lj*GdJ3*H#@<=SnMBx{bQbM|Dr=*yW*j!Ls4% zscFTD=({#uY!=f!LE!iDyw}8*L5z=3@`S$vyclHYzE#kvM9$g*_yE%@Rt==MN2~!_~Hf26z^f zZm^&2LBH?AwcOOvwr99Up!ad8PwNkDd(c0z)!_L`PKjSnoVxV~;xvP9Mf-jXZ09dS zJH#~bf@hwympx1Aj_*)V7d`XhJ5NqEJTS`7co zwwX1!dW=k1<%w!q#X4cVpV2`dSFrIw-02ZN`-7Pd)^XasJb8B~?~df%s^07KD?WR} zTmk=_fbk`OvGev2xjquizX_;vny`qA+_^^fLu)Sh$ z)cNG7UAZwb@wrfb^Ue#-z5(w){;GQRjT0y>WBHGP#g0!%&IQsi`ePH5KCuDlJaq-` zqtOLS(rO7$l@aZzFWgCfYw^E@(SRP>=~g=_#1<)2Tk2GA-LB$*6TGtyH4QYlT8f#p z7+;&0-_)jG&#`S@GKmyuUV<&Dr80kfAa0sYr)NL*j!~D?QxEi_mMLt|GY)j{gX+_p zL7rtMHI)T4Rf?*qOik%8J+e@E1a(yk*yc=-uaA07s;_z*STiiy8sx$Lm#Q9LeJ^UO zbv5Oxwvu{LTbWgDwW1f_m-TAe>T~c+G;KAx1!K@%s3Enxfn@wulIaK;lXZc@VHO%U-Zf+!j;QcR+(_-2Fs0pQpie zn}u+Os=rJ}b!_%|+Uv{omU&ZpQg3zi=wkSkrA$D2tm)e_&e2#YTpd@^Tf$O`wVbF{TD8291~(R4NLwIt(|_rTX!Ar;}eT$05E zh>zxnq+PcF_HH%$1&^yovS-H%y@e{KrLmVG4(1O|@J>*l^J63Pe$vw_l>&8l$@@b% zzLll4_BaDK*oXBY@}x{A+Y16uOGvx6j;dIdY)iL3X7y$y`N0D}w3wJ!XGx2aF|oGF zCQ~sCP{%+Q3CHRvxp6)vk9vlNu7bO%VrYoKJv4J@C=>1<%+$uXQonfC=&!@GMt9lo z5q*cAk#MH*+?k_S)S07&>dcXW%?;fn)*dp*j08!ha=f3!h{GsXbMJ$v_`F2q)!f^0 z()c#mMVvEw*atav4~cK!xeD?c!VOwq6T6|`J1iio?~%BJ;%%Q+mEMnq##qdC$8IEAZ=Dx6j=9U zDp&WD@act`{dlNtd~NEWFYQ=-%>JKxj>U7YI1sn&PaSkvp6D(YALyTOPXi8IY^IU)%iSsO#nPM()Q4+s5z=Io_0oTR4)*zIe&O}PHZ>JCo0}#zr!={mElowusZ9tga|G?#7t|l=HpQ~M*~z*$_7Bs}jRC1ME|c{- zN8W$RlLfH}(|+UmCrX1j>hoCd1th_Y2$ltvJGG#|gLZ z)E^gT1N^4$bKCm*J`zs**6{k2^yE%lUDKVRo7M57U&QfuXPj%|S}|sLJ+Ass4wQM_ zrs>k6~jiV=WAZ{ZVyA`opSUGqSc1Oi$ z?PgrjZcumk{=r7s5jjZUvf?ySXqK0MHA zId6|R?(uKip=YV;+WJ;WC@u0eh4x9bDE%m&=!!dXv8Kz%K}|Erl719R^Ln2_Is`L9v)FX$$vcp}?yexZ68R{B2$3wO0;D)+xe!ixbWW$hArnYglR zowQ*EDaQZ%ef8DB6`I5%KD8kl5hbRaO@snr;GNp9K&@ny!*mk%Crb~ zi*_c2_74*R2)6Z@1xlZTy_>ia(GL^6l@<$;mAkkY{$I4~!-SOtjfTz-Au=ScabYUm z=WncbNEMQ{CPx66Yb7!{{TMl0W9{;B!#Gt)bTV*cf+1ER;a+X)9_qi(c)Am5K2sZ{ zq8(V>W~y1iw8(=(orhK&zajGm`1M#`yMft46-QgDCS=u!!Z-8gn*ao^- z_|s_*fkk%H63fx;gTe2aBG*EWP2%zBQu{(R*8q5%_=b;Cf2|U{{66FO_YpJ0`;hap z;arI*=CL2m@*!pLCY=n{moHRL?)z($I;?w!A(4_l9n)Z(JOkr+^iN%+#L!9oRN?68 zN{qU!xMLVvApO{|+$}=6%R*kE4?&Afk)jZRd>^U#K8qq&r_SLQzU}N3w5VxN;8sC| z^pKh4Lxiy$Xjv?j;+ZJee_jJVwM)1I6Hjf*^=fB68k+>aE7TwwB2XVlDr!o;iI4di zzn+siq^4?q&_-`!xYqr>&-v!H7o1XHOs?+}+S;H+HuP+)M)@ZB!4>P4+e#ZmeFWFB z*H>d1p&H8w)!LdZ>_;stgi@yuVKiJ&vvzhtnpa!nW&Q^FQ3^AaLpwiGalqZ;qdNK0 zb9+V`v?BJSqVZa25sMeD4KmmNTaTrm7ZgWBgPVB`3fZb->jM z*O`_F{i)IRA4!{SX<8=H?Igc3DJAFE?UTMlv(6;bMru~%OJm%1M*e-iFYW;s^2PoS z@}>5l=8F)w17CK+)dZJ*9x1rPlPL+)0k492lIWYS?qju8pr1z>uVGX5ENG^10M=Hkv)S7x#P^^j`o& zv!EGD&)yjTqg?u;-qW^2lt{5ZqGxr`^K(1->5HMyR@%j6ZP=$%)KfYZC;L6T(UB6Z z->;Bng#;{d8NFy^30>4By&<_+6X06mr$v_@J-;tQx)jp%MUnaFS(`gDM}vfVo}6!K z)z$*LSZs{=cTup5i*})o_lDc{1XnmhsN<1tp}K7kYBTIj7g~R$`;F~LwMtWW3kQUCb(UJ)L-*Jj0`1aQaNqT-jJyXh_48=Y`!cUZA z9D(&`d(YP17IH}zwp!&iDGWmWbQ{82hr2e^nhhgr#WPZ}@WQ9=T z4XGR{Yo`8k)>u7Z*|{^s8OmKi-_FZ4+irDaD9`pAYC1s+ukw5%z2P%S?eHJ>{G$&* z%297>TGQ-{z?*hyzi%Jh>#P3)bwuJc6Fh2pIqATC2hyS?LbX}qd^HlTS#PK#&W2!p zb&8~e6g)9!AEZ>Q-O9b?PE_Go^~1Av#5qz_A9(r=wd3#_W8x&vXk zS9u`DmY{|?Ch5BCgy~Sv9H{4_x8f!@U~o~vST1=chlAni1lBzhpuW7zwDtcbBmAMp z?Gy1di18I6PRjH*Rcp9aefBf6%NO&ajn74uKLE>m&GaYh>{YDxNsf&#{}ZpvP(JC? z`s9(h8s5PbOa3L;-f{-pL*2vJ*6#`K$W&tLS*aOH=k9${xxYNGOpUWZ+nxCz!tuax z?FsbutcS}_4c)fJ@9g0SIT>8^%*o*5CQ)FGVH?ApI0A$IR*=WOL)M9(A8hbj**dWi zQn6238ERiVHLxjBMgpOjbe%sBVdSq9=XQuT9Cu8K0-P%!7mE*-#U^+sCZqaCKXK(c3nS{ zlB*{U4IRIPk~_u@4IP2IY5dR-@z+Xb!^^teM`Ad}3o1&O)DBELr}e6AJL?OIM})>ci4ydM`J9!ZO~LT@=4p>hT7 z_8UqU2p^M7<>hYTk|Q@Q?_Oq>e@m}U%mf#uM#{_!$dvoj!T00F_i&xc57}}SiFCxt z^$W^b`Haerh%lYbJ{A2<7p}6#v(?CoWh)v)OSEN$FN6?c0O4B#xVB2L+ZMWEd2AWZ z;}N)^mqEMzB5$Rv<3}HiBq5|ki1T{Z87Eg=TYhEv#g%ChS}M#~S#|Ot&_jVP$9x}M zK}+d!3i1X$7Wm($_E#yC%AEeKqN(GojM+jcVK*$(Ac`Ov(?K$5QZjgmp#EFRVP>|> zZ}X7Cck)VDS-2EhJ-=HBxzQJm>nJTO^0+*2!9Pr~?l3Q?1Ub3Wljpf2;dGllixd2U zf^spz&xyo!1!m7^PkUVFMBRFmTN@)+N01Ema1JBIxaM44InBE54n-%lR&gELTGDie zYb-L969c3W+rlT6uur6AeyiucyjdzX`mkRl78#eA4`HK*hkD?gzd=M7poyHO1>#yPUoUCbY25=Uh@@nzGUYdL}n(`l1QyBOr}*u>WSWc zF1=-6O0WI@NU!A^(p#_T^xC`IRlrq6WWU3`I)b-doJmq>^p2an;WZBad@|nxK>1tKrY1N2%dFUDApZG z;_@!suZg9M_%2ZSr!7Gr$xx=o55&1PTrEu3W4#9tmMBI`iel7}2?luqhhGBvKD&6d zaM^`lRQj+=UETZ>b#*g-0jQ97Iuc`ib=d#=4uudKQi!;eCukeu@_2%GAU?V$5hL0f zh4#BwZNK>ft`Wkv%Zi>|H=2R#6(B0%&wM?|&9sx0!N2Q9-l(mtud1RQr0|n2JQ*oN z@${jFJ*sk}k^y|jkwmt2WKYcpZv8HrQGyJCD z<|O5_yO$I;gM7|DBcH`dY=7TdwmTQ((}?nU3Cibe&&+QipDD5WFO$o{q^?o*TBJzB zA3exRy`)GR8>3B&BEl;0@j&Nvf@jesHHg+Idg4`)Vas3Jvq-4z*-xRpdn4Q5N=yjG zmSH@(T8$?gw>$hh#Zd=4leXU!Se)fyiS@)gNOApP{&f= zn{htBz8bw#&i}G((P2zk7S3Y#i_WkpE%P+^mV30w;clo|=f7r5SvZ?LAleS~6%D`s|d?Efdc{od17S=JoqzowWN?Bv?_XU>>&qXyz zSnf$2ac~Od_0^&@-@e9IcMWxFIWP_LT%I>fD_^2JC`u_~*Z3AMseAdW-dbPAGY_c$ zetb*I!YS(83cz5E@4h7%eVvb^P%=*0B{Vj6p~a6$(+kQi=};W!qNP%&(FzNGx8Kq*3)PoDKA0^5AwpP zc{PdA^h>$)oJ5?3eln5BM&bCFa?t9<%&N2xw1rw^fzGq@rIFE2MMp2ndrIcG7N09T zmOTP}Xqg}P2R;S8Z2#yMAD&2=++hW^HcBael0P0=eH7!TO+2_zGLC)7ckz-PVB5zX zJAx}CEM?*4P>-`?h21D~Y3hl!Ap_t5J=>rMZh^!UV!z&;_b5bF^ZbuOpI+xP#NLXN z{HJ{g>$Gj1&z8_TriU7Rkox<#fJ5pox+!0O4HnlP{hKJWm^YkMGJPHBTm~`99kN)ZA(Z8q!cR z9SL!=!CX8xU(s=>t)7;RM$|vMff`YzW;Iab2)vNs>&av0*mTcoUmj4?6Ke3OsqF_6 zq+L5L$ErknK^x=gz?&Vxw-TJ=;~>zm>1c8-w&rzMl^c6grWiYLhk*9oMQXZvSH>_0 zgmU1(+Fo4KOzUuW1!?lKMJf->xJoUdC&Q=nSe52p?d*~k(1>_)$^Ne95^arlL)$|V z&(i$FaU66q2OM!9j3)TtY|w^F62`XOz?DhIxO^p#ljn25n>5gt?CPqb!>h$fhjcP$ zMqdiryTuU!AIV}F)axfII@2q%nFzAZuoa{XN1&QSGqm~!wbg}~ws%B3KR_p&xOKiu z5@SeN=pk(R{&%m7aaus)iizVYTwd?A-EIpFFwXOpUk7O7y37uv`cgz;=nRuoPpAp2fXzT z^VW>=XOcPNHks11Hc+#YT#S>=w81wsVY5CJy2p1`1|F4(!{PJ!zDUyC@-U}^Rp05@ z37i%>B!(@EQ2@wayEQsDCTRRNzXtfuKZaigwJIJNq($TRu$-rW<-R15_a$HpY2geQ3LZtgi!CcU( z+pQZF!n*; zvI#Zo#694D&-Xt8{Jh_nh8p9dXMF1U3o2(d4T8@XdF}_hVRm11uHCrzwZW8h%xOIH z{aUmkmZ%jtdDe#fIj-7}ykQ%%7}8es5eJ_z6Rbsm=gW8ENH6}oVrPA|z%t<9l{-5- zx#YYyrq>k?%i98pOkUQB@!2Mp%ho{N>FVgoQHT(aLVW6}JDT*We+PHJM3wR8c|D6V zmv1MJcuiBJ6xnYyDU`<(H1u*%n9j&#d-zgm-BRi(lE`UzS6;^OT)U=fY5T6h@##XC zzZmYs7RJ*wTdNw_pQCl~`*D;&Pq&a7DSh4_>;T_ANzoba@T|(Sc?8emgws(6v0Pp` z#5a=xCrtK*cK?|5NPYGHLbF8J}@u${^OXZhxlg(uC)maoCzd61Ja1!`i(~ z`Cr`z-rj#wh7$iC8M@jw693}8olZ*5KD+krKj*n{@9XD0PuSb$ypZ1cBj}CD#8vq< zZI=5*Z3dRPj9uRAE*Wk&QDo8}~S)9v!k?ek7O?`*Tadup5W6Uke- z?7R_^_f%b4|Ib1fj#phFVmr9tked)JNRKC|pTz`&~Nw&)W?rM>o zesi9FP)9Ll#ZiZvG3!JFHeuAYfTQVx+g_XWlCL%YayubUQ*sThwpsi$sRe7!FgE)DPPCJ(1 z+l;cFa7}qf?=&r8PlF!@*03i@}!hnL9^$YHEIM;T8pj(jIkXl);KsN?wgr->p|7R9i} ztgo#RXYkL~NubVG)H+ixsMD$DEF}Dyuajv}N4j#V*A4tw-2KGZk-F&5yIo_4bx|`T z1*GWKNE%xW68kVinRSJ;Kzc?UJ_1_9Joep$;J7?Nn@9o1N>{70t7Dt0Di2Tf&SToD zQsh@U$R&DIS0(uL_AxVx&ytaK9UN0 zxyw=_FvUKBNh-Ih?FuW^{>3nQW)g0i|e8Vk1Wz25bm(Cr=a_-oxz$?)A zdf*kmSoKj|z$-KGN?qUOk|W&Ay}+x(K;dDPSGB+=D$iGWg*=lZD2M$qPOg7yOrv#&{8YN(a8Vw{1etM6)j)1c{@o<>>JP`d?78C5wtv!MajLNkECVXYj=+RSNGix`Tw`R zo8SHAeRneOB5=@f?edNKclF(L)2D05&EajLaMTx zZ_<>H2EL9rPTS<2lt#(mx!@J&| zPrAOCXI|jh-V93iS|~A}Pibw9n3cdO#7cm-@k zbC_9!pwnI9Ta|KlNeFX^9c?5{SvY`u<#t<(B_glUy$xK){qsb=$6{l+M&cph0V%9Z z@Hc-u!B5#G=K1FO{(9~{c{h&ES|b+5#c*$YO5}oF^V%jdLXX9aq2PeIHa;})K0)$>DNCGcx3K- z6QWIs$Lb)?43YzJT`q0Xx9YaiZRyI3y&JoYd zd;ahoy)>n{U*8JxOPqw?O4szvx;F3ppLh;xlIS))Tq!~1e|txqT=B%1LeDQ{qtPJ$ z)>!Q;2wgkwzsB8C?wD#m_y9{lw7*~D43cvi?klhDxiSaGyjfymJ;9QXEj2;e7i|abomY@OYwQsN8O#Qx_cl_V(WnI_Oe}z#ha1?IJVNoi?8Qf26$&d=pjnIDRLY zB$G60Qz%$UfJq;aR)iFJ6hv%8dYj^d@^bO9It67X1+}<-*`n^+;tSAqQ+Zer*}^Io zL~KNqf{?1n0*adgx;*S|ba!nYeN0#v0{CnH=gcH+L3h9V|NZ*;B+bm+x%b?2&pnTO z&pl_aZya5f@qR|uWhR;>=7OD;6=oQ2IxqN#5NU+2NY6rzrT}1Qfo?nWzmRFr>`=dT zJfwRiMVi>286cyi>q@CM;(w5*Gs6#N%nYwqfozE602FLwHEYjcY^HN}#q!X`Q)i;b z&!kacyX)wX!j02Yr&|TEp-c2}ie!C;I6ab1;v28vY9{pWF!b)xHzP)!D)L9w%R`yG z=JO}3$(XzShod}uGDJ3RbsPf=GzYVK6zug4qPyrjpk*ASZ$^@J4-EY}Mw+?H+6%VJ zx+~me!^Nbq&VUgHY?s;ZXAd0}Ht3GR)%e1hqA|=Gp+34TqSGH7IvU<7@EI@bFN_kW zO&=-1lV!`CT4@BkOs|VPr~4#C9(yB_%rc|R=MF`A?aiVM-qn={3K32F_ND*~W*7y;?a<9neLHT6+IgCS~xy)XAB&_Ew;w^aqsW3{^g*n|QZ0#{E zKsfSp@`anl;xMbZSr{R1g&spanqk7P#Z0OR>ovcIyElt8tkF*E*T$c}W=5;e-V#Wo z%;>4-taMxPUf)s*b>6uv!swvgX~_U9VrC3Lm?usu+&4W>0H`!jW)#NzHHJ0D!J-l9 zNmC4M>qnUq-am15O_;5Q8)`J z{vVj($x?R53Yruc?B61y^f$z%{|-maiA=E?IAT4A8U%Mm|1;Dgo_CP* zE2>vzBx2E!k*mzi6@B#TYz8U2pLZ;cXER8a8X_5iH@v7jVD-r&z0guF#J!h=Loku=-f(1r zPIH4d?rA(dS=!K~K!=!I(wQv198r8A-fUEPX2)}8F(PKqVmu>jQzS!Z=56fTGhLc! zf#FH#m|-ZH;aNTr9Z{k>B%fWzjGO~%Sx*_w$MNfMx-be$PA#!kIkRi=oGqUO{RJ)P zc+Ay!JZ7#=mX;~`YopoB6jyR4o((rc>D1aur9@or#9W*k^Dgo%*3yP3`HKa zpu>JUllf~W>ZON*cU<^v_H7rs=KSfx*9$(o@R#W+(y?GJWinHw_k)a>mZ@axJSH$A z?nmL(Jj?Vb(J@Yd{Ac!2e|jKAY78=USYB0^4|VPfVl+D$&JepwiE0P@By5Ma$9D{f zXNh4!qu3cNgL_jtM#eK|vA$8V6`hRnhke62hBV&5khSoct7pg<_`C@BE`S~P4SWPn zId6vXYjS$?%cb=zmn9`=jT+Rg!mfiTUa@J7LVO%+erpDN@C!nOu(hMan z!9-j+tk?9v)T`}RFBew)V3VbBd$~CLEFFYvKTuw@V42P?TUDWT=J)3wP29_JCrjZj zpp*LANEuRv>3|K-rKEbFK)q4uvHZStuL@)5PR^sj# zKY91_tM20YVf3sX5Z8?vkKnHJ!pxcIreuAx^kEm-fUx9K-d*F+o)rN8eeoKI?A@Ff z_inBPEq5g7w+$@fVnw5|6r(IHcbddpk*O_o7kHt@wZQM?8abblGO~t@F#zzqU9zMN z&6eLqOKo5r9*m>&+Zab!7!k&U{9F);4I{Ue3%ak_C{LK}$k@0i@e zn25e#3k{t(|Heo7csp$eiSIe6-w2;O*+ibN>;5nL^RnDpEZo1fO1ZV}aH6%wgFLjc zP0f&?TG82`mt(Q7mh%G-qKQm>T8t+qecXxJ;hJ~zq9LNu&y%wNk4mo+{~SxNCQ>8m zUcv)~+)gVk16wq^a6J|<7#<>@=EdJQl>+T1ncV}VlwaP-8M{lJ> z8Wt;TN@VM0+(nXxNtV6}W9zFsweg&My_x8KXOfP9{d-{-WjKf_xiT3 zmzcy^18(uhTHPt4OFxx})s1%aO7|BP&pD?0jx5m9neKlL9TYXEJa)ox!@$#ukL?GJ zVJ-IsekUf!pDluC<9eS>Z7J*Le`=DPU0hW5Ka+iMKX4TJ%{L4<`5x3S40+yRI+-J- zsOr<3(g)ICTrwHVH#y<^Qp*m9s%2teGW0(+##~R}^OECI%MDl6oPJHsX;5=oZ_O$H zre@4us1E=Y{HS)!Qmw2bn4~FP7#9Tdt>wh!Q*q3k#1At`XaWE^UggEjUTUE9qfc% z00kRet5L2`g+~4Y*TwDx3m&Mo^8Apj;O~fW5*EUJ- zb)Jf?EPK{_D)u62aOnJOL9&$B@vP%=3*0Ao{`^qv#WIsr-^oVj6SS@rn0WYamah{M z&m_In$;bE1KO_o2HOKkszIMVt3;of^?|$2k_nOQi9leF$bMeoDN5Mx{o6tx7EXckqT`LUHLr(-Pij`5G=3j@sPo6j-4m0~M}l)RiQ z1>3V+%&x3b+@HXeIN&h#t0)&J1pSXlA6-U1@qRlqb-179O%m6sgX^!_&G1{*Ssko4 zs$twd73{LMf1B~?Sv(oX`6U+wCbccQl_&OeA8_%_ojUaUcgL&140kWi1$7fDs zho*G76C`9i@nv=sa&HeIGc|;mJG$fN20+?R zrOogzLCy8e$SUKTQ8TkOvPx|(zQ+QZ9pxKkRM~-W1O4s z+H`U>AdHVyc>u*vD?1$i6nSZtj@^_3p zO+cr~h^Ttk$JFsrsB9`lL-3*x0 z0j6}PVs&K86=2Zi};5tx&<|k3I2L|LO(y2_Q-JOwkx{-*)d9W<+>X?^qMQzEdux}0Y~bx zSWcNP@`(r^6SY|-~7%~{!kXWrkx)Val;rX|!8-_BOsz^N{nIz(`+!_(MLi3EFZ$zrKGs9c;tRMHvOwz`#2SrU} zCDBG!F@mr~Nc#rybt{N~()=)qtV$-4=Z*3i5XoOXGu)s~ zj&MwJlvQmezr<)ZPq5QQ2&yQn8weWig_gxYpGHPgORP|{p4c!;I9rPmxfy+v+{O{8 zWfjmsUKph%w2-udG9HBcc+6ORJZ5e@4%i2bhVLlOXz>?2&oo2~Dje&r3=?U2^btwL zFkuJN5Membu~!z+c>$0wy}cbAdNEK$Zw*}Aw->MKTR7CeZwvhYd(TFSWq}&HKVl$I zuLkPP!L?Q4L<95%XeRP(l9uL3YJxq`MhI6%<^F^in4Mqa2>j2xw1~PWP+igihq~6} zXLhkS&Hiw1$|5){uJW8{)Tc&5KZP!=aFBDAb}m9#YR9;R_8_v_eg! zhDrCSYl*EDFpOH^j*vO9l=8x%7#r9E-^S+QUOUju=Fk@LBhaJjMb=&~XnQl4Cv2pN zArr<6_Kmwplszmt{c}k*EXe)B=?r z0&X-e&^)w1uEqhbwnVfr0_$J|^5P@#tWoh^>^}m(hYm87>DpT&dCc-_F22dXx0`j(U+Oy(r5M+?4?(dMW9~6ZO!CnB`e+ zFO2-*AoM_!prcf|7n%r{oIC7QG8X%AJ$us>fq_1y&{Uauoekec zko5ZK5;BW^D82$b)v!+Gf&PT=lvhrVhbGQaY!_ZbqQ;~$n!WCLEW6Ppt?n9HSMSx= zp>6GwZEKb>fyOelZg0~~Rr|ylt{L$N@Q+)TJFS7~rT2%ARC2y2Etr|bBt6)%oF#6vO*D9JKO4|lN*lPQ+aZhSXNp3=2Wa7~c+*-aR+D0^DKF6Z?F4XRol zXcW;#TPlFwlSw>E4YzeEa1}V8ac4I%*&_ptJs=o&qnGnaho*%Wiz;}!vV^f;=U47A zep00lB<_FoE@F9KSa}wJ@-^~(GP<>e$=1KqhXq?#VjUJ~%hsg=JA7HVAifTZHuhwB z));{se|4S^=l6sd;q#9(-96nMgxnJ9?s0VzQV!P=Ja3fO9~Ju&SF?*_OGaSCN1hhO zxS=qONaBIMC;x_f9l zA#1+t?!om&BW37yy(^9))IPrxYi2fl40E}N%lC?4%b27)J9#fqLBIr-A0vNbRBaq# zlHKQzVU#X+s(V*ja23)h)pc&`BE$vlrNKvtkoXz_v8A@EWcuZSev_e%(VZIF2(+Kl zn&Zl&N-Q)sz`HW3lA+KjE$C7_^l_)r()y`4;a_i(4u*LAl|^1bi--ii#_H1_# z0oaS64{PCi1$~TVN@^{&ioBoEky*t?nWTXm>gCKE z^XYHBtD2_ccu3BUfu8w54R-60z!cX_@jiJvne6)mli@yc2YZ5R1t!Vw& zQI}K7`R)cRwCR=uAG{tYZ)K+;fcY_ox-4<-csIuGmY(cX?IPJEz+{s;i^oNk9>&@S z#b>+Bk0K0k7aFwJo$Xz>%#U-IB^|_fH}DadzohwZ-97t&&VU}tJzsS982{4U1G1A$ zIN9Cfg#XW<=c4bg=e2gx1 zpw(bwb}t0JriYu?)K_r4b6_$3y$Zg#1X%LVCTczd(A zhBE6-QeC?a^f8mPsa@QS|LfbCY-aOdc|@HqXM98#fV@M`EY8kuEOI&GcQfU2UfF>> zB9Y6{CLou=Qfh6USn#8C$zM-uiv*#O7<+8)dkO{<9$l z^sYz?P(sNtEiki;(#!21wwYZ_rnwX#%T#dBcOX2&+i`}IY=D#e zs;vy`@A??{!+aQn{Fd&Xn}F^d@cVZ7UHKg$%fC^^2^L)%0`y}H(;Zj zX1SA$M6SW1mS&zTwHVjEvO1(;q5xWL!UOVL-$M zxVo=%V()ym(@Aj}cqZ~bjN{S z8EBmoUBZDjW)tY;=E96dhvr0n2GaW6h*eYtp7E_5A_%&7&{M`F&5kf5-$Y+@;N=@( z{3_wY0k5C`4?=$Nr|zCb@c+#~cTeE&gowabJ`T&e#?0M~TIzHmw@1l2&Vy&yRyuC? ztJj&L=AZ-kehTgMp zJ2H@itq(KVg91Zb8FBvdT!hIU5xBAHT@m>a&ebf6+}Z(eH%3S{`!-WI+(YUR8laeP zYJ3E-E-8p|{x==!*T(fq`WxdTxHY^4c+bwi!3X5x7r=LS!Dl^OuLZtjgx}SBR8=*y zvxkexAB)A?2+K^n*pgd?{1W=`3pvN{ zCf0Wc_lSjyG8)kMjL&&7rWEHJO|O&R6WZDMd-xW+3Clq3a^xxX=GK^{G0m4lDW~KJ zJ4x^JYByl)+F4u@;K1w1Jo_^`CBWp&fe*ejy`?lTp{kJTht9D0zOQ@-X=lL!Z>-dd%Bwl#YZDrzlMfaMc_#_C}!t`ixWJePF8( z0RCI`Eg>Hs?(SIt{|A4r@Zg%pq^jG+ff8l|{yF#QZgmyv_x=#G@g=;g!<@o%^aRGt z5YZ#*aVPp8InxJ-swhu#C|H>( zJXL}2hgPOh`mjsetN9tFgI!8afh6hl!6{H@#@`j)G5O!xsYYp27uTAo1;hx>o;9foqT}XG!0F>qD}}^Mm}( zkuG_i`T?+dGd~e=XMAl;kTdk~6`*ZNQrFs8xqMx}7_Wm}i8jiijU|6Wo^6!Ibm6{b zk~I0CvL8%D6RmOM`oKupHvwCEF)Td5h-+gD%8t5MmOSftCbj@HW6+$fxbl1`q)i1~ zM+L2$F$YJTm*gg3*wu9^l*|Ae{4+5DWdEU%X~4G&`329woyG%2USV-yp;3Chi?P-( zgnQ=31J(+RC0OH#`f)$GoCu2#g_6yne?S?0Pk=J9Z+mS`u)VeNz9IJAL;((FFzE2; z_m+TR$u)R*pi4hy(L&=%=uaiN0V7~qTF@dFpara-1B)J?!EeIx!a{_HU+}9YZp>*P zH}boMKX1a)GrBaC;k8gU2caS)=N}6dhAf8E zrh;1cKx^9+4u`!(|B_j*KAr}a$P&yE`dqaj|9`pqn}?2RlTYb&Pksp)wx0^64FHQ} zz+3WK7RfPWv|KkYa4Mu>Y8-k$kAC&}=u7TcjIqKQ`vN~3b!k8b>xCtm73GW7;{EP9 z>A480XD?utuTX8sT7tVWQz+WUdmWQnm@z@WYRrv(ehJ>G+J8$x*|$9v(&sa_EfKX= za}J|UlAKu?uIZ`Jx*BYd0>7~2O);}VBOV=kLj|c-ZEt`#xB=!2CZ{lC#gLidz|x|~ zcT1Tp=;0cYHQVt*kx_DWn$gc}LUI64UbezW910C!fC{bOJP4RdwU!?W>48$%erHu= zua&2hr1Kro>qyQx`X!9homYr&++UToFWi-06wffB1AM0MUK_iY5MAaenM%!paxPOS zC%N_IGo|q`E2r`^C7$8ubG`y=`TTDm+#)be24;ym)$OhK@@|q-77(6OYa@V|>VYfR}Gu>c!Hbd4Sy$VQ8JK z^k%xZh_i=gEpZK*4R|+7-*ph%&;47(8AIgw3%u*+^8@vCek^;$=@@H&0evSb?#?hu z?}lLn24+^w&w%;GjHG6#uwb<#&37s`zImp^8Sjj_ey@rcnL9)3zkL;B>uHR)?22eq z`i#RN)y7&!fzLp(y;)R)vOrhUCprJH04T6|i+CzFHSl%J-29R=*9kgI zO+I=hg#smNo4SRs*iun1uz`9}v%%)Xoz;KAGHpZk64wF)5Wv+ak4~8 zk}^8FFRr*ue1B;L`M2a_uRo+3x5kln;#SKbzb7`|eoo7s8W3Zq-ha8~hlQXoV6BxU zbB2E+a8wmzER`k7oms;_5(q|KFHzRISAlMDSHE}-paIBp=hfQ zry(|u*s709g+m#}MzOr z6LoQ#ojqbQjzbZQ!jdAow?s!pw`N0)W3*pAc7&f9YdfvoV5_)(Npgl#eQ64Eb@79T$ow*ecFHY2^-L6`%uKlWQySwkrm*GvOh27NHhFIn{oQcPJ z)62XnNt)8$een;MI?pLG`=@jWu~%lZAhS0{`s)z)h7&r(`}p8i8y(NEQI-Q~{|?GcHtJ-EsQjA4aQ320DF&PcTA>4|fU=AZ(9z3QHIfwFlH4P;bH2bwz7Y z^=kP%RmZtuMP%a{LbL$?*|S9UCnZbFUNRCh24qSqGKew-WaLdYa{g!4HvqQ&8YI&2 zIdkS%=ghewd(IsDs5x_{!F3*7-w4+e;riOYY4FK|&t&*a9R_t+0#^7Q5*QBOg9DlH zJuqN_Z*yQUe47G8;oA^MgKu462z;}F0r1TPu7hukhh~&2!^FlvaLe~^y|Z2S#)C;; z600hcj0BAj><5%TQh4M8*aP$@pVZXdbNWbk57XS;^TKD{Jx{`CCw$(5d!N8(D}3tV z71=9H>>BF#&o(U22A49CUz{_5fVTtg6 z3=wir7$w+5m@BpnpG~lelc^{sf%VxSGWG_6;aA33awJA76A;|pRg%$7=#_i8EP?MjQ(W~XHUy+M4}kxWB=M&$7Nk#XW`N37+W zHmqY&P_+T;b%fbo-=2idu@`LVysro$*6NteTv@`z|5xrY(o)gtHBr4ta<8-)16DdK z#@(MMZgpt=1~FB>x?WrZtuW#i2j|lWn2U*-vI3-=6;j)#I+#BKY?;C!i&;LohwD(lO|lnBj+v2Ft)kS}G4!sweo<{I%C`@ zTAmmzZg!~r*#P74z>?h=v?TC!%-FmlW(;f;=ZZPKwXPSp3G2i$xF0^W7O*vjju$e8 zwZaf_rDKN3`O@h?aiDj|6C{`V=Za}wEBu=7Un62oPdoBjCiSZ~O?(hwR_d)4x4_4Q z-WrS7L%k+CT37(}-UamS?wn_hG9y&&&U4D_Fiaiq@6h<6na@Dpp10N0fTV$iFL&-W@3v+AV=T$EUM2FNIL z0AurGsVd<9SC`r^`z*a!eJ`cOL|Rq-74YKyw7{zx)|=~4&iMDB+gdJ^|F^w;E{MA$ zg4gO+1svktUNc2mbLoUilym1%b)byS0(rm;Bbg*8Q#cf2c%y)F1YxuIj^e7Xcm{a8 z6>2LCVQdvL7NcMumG@@$LMdGf8C5CP_j0)nZH(9iHcPSK1IdT}fLHf4coi4C<@*)y zT+IiUw`t%_EPJx|&5La$+eHzE_q%3#_loI&y=wW1i%y2SJGyA`Tt9GcmgF!2T6~8; zoi|8jT@1Cmx$;W4t2{2(#xmm)*y2UOYXH1V7w_?=Q#DAQODEJKK2ZT)c$C2b)v%93 zWZp_4^%|U{$~XaNf`}2uj@anW=?`4h$M>({^t;;nZ15LAOBm&1-u8ednnDvApTUEp zCv@3Bb5D{U=)&FvJ6XCur~`ZSP>7xP4E*A$R@N|$_a}jUcAblit#Td?5q7u_kuixl2GjkTod^ZgU&qrAM1%Bsr~L_B9jtU4r1v}R)F8dri5Ur|P%<(} z8r+4e$lAD9!%;8pYmv;9EV4F9njgX)P?E)NAnTQ#i4>k>CP{2p->#)Wda<*R9x1^U z$~5_&4(_e!)CH6rYRjDlDXj}vQMuk-5q-Qb>Cl%Sz98f`pAqtgue&FajW(r}M4f7Q zXR4f&HkzKu&m6U>l>Y@Py{P1?&Sr2)crq+W zI@pdQ`Efhy9#wxL@pDO9YIA9$99swFYw7BKXOnPb=C-eo%_E#wl`|$V!UYszVB%rer(CF~Ik$RqH9oSV`ks9qu(yovQ8vPX9!}p**Z*PKk%G9_5 zWS{V0rO>yM3l!CXt&MK)JBwtC?*juyJBaVSO&bHV>Xni75W|=u@5KQmB*{W`0jV z|9`B5v!Vwi8#NNVBD|Fr#cU~o1w1WZU_Nm6b3zjDF`^)1F3TbdXzS9V4jey0*iykp zvk6`+byRfViPx?1_X@=#3+QNIz1$HmZ;qdJy|%t-*VH#HUZ0~wIq7PU4uGvZySHBS z?a+O#^upYMSAxK_qE7}Jk5pukj2(Ku`8-3+2VVRmA(IX$dpb3{ao2tYT}2Bit`7YS z<$l@EVzx(qvwJE9o!`CP!O*=vHeW9`_*l&32sX-xpg;2NXB{KX8lpCxI$#&ec2A;O zkTTCYV&@th*=HxwpP}xsdm30;3Ev-sbgVr|h9Sw0t5MUaIe_wG?{2~ED!$1-&UItF z-23fG*-(zn4osp2;^`*j`|S~iHiy`|2oJJ|yd+E(&c?FivgjE6nk=3L`@HBzf3kbEBlRrF!S~GVTws`M zcpT=_k-<68Cru)o+2dlSHnH-P^n_2<3nE|*C^Nl(@D}75e;nyd}l*{9)iAA?@>|K#-7kC zSR~a4G`*DXi6~T8eSr90K14_^^gn#CJ055DX*$i7O#83?6CQNaLbd03h#_Bl--}k? zFP<31AS^q=a+Ct9@{kB?28)@=qiPScj)|Jp=35+>{$w!FA@pL4%EJUm4&jT2V&wQ6 zsUbBN`m;8|QpTR`e{nZ6+I9{sXPx7`T0c`#8Aeh~fQ4SIj+iGg(=z<1FJAKhEXG+F zDOF|8ll%sq_Ec(EpJMbG!m}908f@dN-?gQ>QsaFb9?=F+4}ZqN`ULVB>Zdmh_o>#| z0P3o1ZD^2dgTqXNL3*@fJkaZ|PYC%Ca6+V1#+=LgSj@DfbNV>=4-hh(V}Ot0RaPck zMk-6Lwmy<1DU8-flGGkfSQL-!C0S1|Qa||gLiGaB3p6>K9*~DO`~cMi&D!*1A-Y5q97~J3>j)k#N1BaN`HU zz?~V~%hRW#jKJ6iA0AfD997e7*Xh{k-ZQ7DS-N+h4(VAgnys^n4snK1C|X5Ez%#+4 zi7J32wKepiBg3CV9}qi5GUi|YpIV6^xp=RwrEe_)NAs_3oD9>r@M#=->k-Uw-kaH0 zj+#>Q1;FqDn@{DXe zK(cu{dTHYU3)GRZr@Ln~{J#zALS4%!pJ`2!{GnYH*%RjeNj0Z;F6{;1gmMGYrv~q)XY{naX+INPq~V-DPX*jv*S4P zv^d84U`B)r+;;Et4qfm0I$hv+EWMHKf41%&E@}hb61%wUlD6*oADxs_`mX~EINLRw zX2I>IZz^{ zXn1jaRTJ+NG$G%s5i#?5AyAVP#QtW7xH=~8L0_QQ4!_e&m%E6M2Y&H7@X@b*gcQEp zEypHL0qJjbO`%p9!X)W8A;2Pw&`ZHR6$ssS$MyaOp! zqC@GW8x9g*_s5D3#r>#Ub_gZ=*^p9J17*L$vUa`n=YtrN0(~3?fh||%%%oY=0ah&$ zr^nJB;q2SW4~5hV4~2+|jarCaI?`na9$~msFRcbUl!Q=*u+c*1yM?%0fjVZvBZoq` z=W-~Nwy5&J){oKFz*rzdT!|cuEU%ZAbZG#hf=)C1Ueu+g16%`Vpl|l$0Qn~&QYO+* zLaH=kHArJRtC~pNHx+>eA|VZ`9)|6Yw9s+K+m+&Z7k#5P8Oepw7eC$F|64lioR7dJjE2W4Y7#iq`$OlM_=x z;&ArkvC;L%L;3-eDd*8O5D$7kHiDIB{E69nr}r~gCjG4RMym8-M%VTz!#@7akvkNP zWCs0>Ghaly#+}?5mNeWQ&IDWbSwF?Q;{=)Js(h;mxaZS&SR`k%!%de{KB-5BSL+}n7n>*B?5w-L{(UxV4!kk+i)xH`u3 zCW?CbycqZUCiz4fgH~SvSC1;ax6>MmXS?ei7fy30ZpRhp6yCcXY?AGi1a7Be#Lgxj zX4AnAE!9TTK$ag4u|?WVhoSbvU}YSRah@@P5Z~_+gj_M7){A;+T30~C(@Z!M>pO@Q zIPaT`fHmAB^WR(J9IHrJ>ShF&5Or6U1OF|@(R#zH-GKDPMAJBRAXi-FZ2-L`H@-)e zbfSUIkFg^rdy4_eVyX@h-+bU_4HVujY;Uqai(-f3K}5(Kg7!7^TRs$G&GqFVdkSst z_}&z@Wwuh$t(StG4Q|HXP!6!AFm`~AA-S=ZH{7i;WA&j}TK${<_x zmLi8%cS7rhSneKKs@&Rdq}kW(O$G2Sdgy@skPda={Chl-+-s$z#AS-Vo%oIc4>|&$ zB_9%U>+idJ_I^dkHt6@JCPM1oR_v&1TsxdeM$ba8B$#yr-ETPt(!~B*Dp)5OK=U<@ zB0uMDa7;VRfrgFe$wpBZXd^t_i=Adqj8ZI9+rL_-iQ4@*`pxbAMt@df?B5fn38!(z zLdNG2_%#_uAGIqO|4xiJ!`LyJOQRd#MM_>Fz8vH2H+l=j8jx}j#0uGpsGDOxx zfWbbf*j}jEI8=zi%^hcC3?7AVcvrQinDuXQ13%3&NDUojKq(J|TVs4Z;kBNV#m7S| zdD4FzaCSVTx{C`S=I}(WruJ-%tv^}(bN|^G2l&h;4UT`coQc^9S?&U@CY|7J#w*o| z?vG{aVm#dYo4+-rG1oZGwy?iHLq8vi=agSh+Ap6tUQyjV6wku%m(Rk_3=2uUr{Qmv z_dWbrZt01c;TNDETO-OTj(RiBH*KU^qm8_f#Eb?Fa435YV>4s|?GNu#*O9TP`+Wu& zXCJJgs@E*2RY^M{ueG(p?5zRqmf67Wa6!-Q9c-O^Lb%%E(|Gh!T|{43w!1Z?)8@zR zhJ4v>(0fz?9_m;bxvx0GKb|fV{~?ka{^hs*2dkm~Z2lqg*EU11WtbG7ja=l1i%Vl{ zgI;=|6Ev0x@g3d=(vT)uL1Hm09V(wumR*%4xSEBLEtIuf5-ntFfVNR+2G#cFwlg2;y^y7!d$I$sQd(I-FW7-E03OzYqvss{2b0qy>zijA5GIS zYjBNe63k;n!>-x!Uz11QbL}a`>}v{S1KN+#yFt_25oHPM+3ZE@UN3W*d~rF< zj6Pojy#n8eTraMG-AR82R5FQ9jnA0p!t#t!os(BY0n*fM0zj>TnPX))Ocl7e#NmX= zy)%Yw@0&5$CL2vBctY)XNb@TCTmmPq#`SaD%SiKU>!#8|k;R!}uJJnQO5j{(pyLZN zY);t^BG+3_qiudV7hrSJkz%(j3k$-)4eOAn6^g(IH-HSR2ENDuUmU`27}*atEAT_j zCX|QoM-+JoZ;|=ML^@E7YY~i?1bEu+@V0nibiMJ>t&HHa)|k246XVS!_ZGiqQxRyA z2I<4d>-64OK}zFpD8VlR9zVOn=uV<*dwnF5fyWO4x>;15?az0wc34k7de!RExcKVQ z?tZIFMsX8xW6i5~FMij-`R-bHW-&AQ%tD|@X>`~Qvmh8k8MfA|t(yiIQwOXtk|U{+ zT6;%wByv8$)_54nx%5uJ)=2tQjCfGr$ZSEJZ4T7{&VW)?#9AmGh4DNZ;|h<$h#rLz zJq%^9row!&G>*B9IOfjDRuF!3z%wm`DL4w>=VC_Tzq5t(Qd)REe6PUX2-@APz-wAz zv!%T>E7t(@)t`24q5uE1yDi*D zy8*X)6SKKs{}|U8oLRg=6^p_EH@`!kQL{j@Km8MueO9r?Z*Y4Y+4BC^&M@kDP~Plt zyQrtcF4lSTsS5avs+Z3&z-P?xrWd#?>I9p7sDspn$!p|>TfYDN?SIcHpZfm5+x>av zqR@N)5O))@XIppAY%d`nysp?9>l&FgE9fE@$zF78l@oR5C*+u^!vG7KwP_x<0sVhC zH@i;tavA8mrntV#QaopIk{UfJ0pr?}@|7WAeB~s?I7E}7Kc=YJVBEAZ$ZK$R+d(IH zfh?#9YUypbXU0@HYv7r(x?~rodU34YbZ~yczqi2XF$NCDY#zL)4QQk3jCTPqek`It zvaxRXYtK6dtiM*HJ_l0M6fMv*8ysLWmeT71Q-<(Zk)_Q|A4Gd@8Pxi7(4Pw)`O2FV zEzlr8-s_zpulYX@)U(%-dSZgCUyI%`Kt0)D_hiSjkLjf^g4uyFFmEQ%(Q*An8;o=6 zN`+647S8qRFQ37$T%etEvi`C%bWYY^K7()2R;x+&fV!IEYoSl;ciMlDEXg?O^)BL* z-i6wM-W~9H>>WaW`I=(i8o;t)ue6$oKj)bhQ=4_rCWzQfM%- z_x;oqdG9;W7WcKsRVR>~T3Sm}C`$9w9q&?ZJxH1RLCSENwZHaq6V(A5=woA`RRC8& zsK1+gFGxTA3E3+r#Renr&$f9oPa17MvZ*KPC^kMV=V;%gmwCqWD6D|)&7pg_`yHI7gG*A1I3&Muxp zV=c$q9C5xsy||C>r-;ADU4_MtV$Qd8VHCK2bYT(T*WOh~IjOVr%Mj5W0VvWvCGpj# zyMW@5^L_^3|LqzSC(ZA&!S~@##3;A9&RYaLXm;_Bc~DU?@}L#P3irA*h;0$uQ{M~k zFu!jNso0yuHQvcI!@bp!(fjTYcy}PY+vH$@^KEt1`9M1i+F@=u+?W|jQzx&>&E%wo z@ipr~y?dH$v=C;Gp<~NpHaebwvZ z4G(S+`C$erGpMX<4`{@-P%RPgGpNM{8s!}(2LFRo6Bbe#M$e+2+_>ItTx;@ zgW!iJ&EgT^BlurgvKpTGLrhk)NFoc#IgB1EZk(?d%_Y@)IB9d2g5_h-&LNSE#$Drj zH=Yuz`H2-`TzliB_x3A$dMmH-fh>yqKst(l>;qX;e6>34UQ*VXIK!)yVbf`mKu9FTlMMY-h^?Wn~PnpOIlP($rFrud?TWKcpIP z2tJJ4T3%C8>P7#Z)u0b>;tG&Fo|5_n7^xb+mAa}cur`F#Tta+Ppgx9HSEOU!cR%j; zRF+_mxDxCUSAzYnuK3Tr{pG&uJ!&_!n+&jgtnQ6XH#=r*Hi%0p(zH;bP-(I3Ysk`C z$GDbBbf@EPKQHFSDJ>T$O%p&`$!JHpv!c3Q97`V(nSy$u8|G~EKg`*`T{UM{x1VcU zCO#z6;!*ycj${6>LMroBzJ!y=*jUSUp-T)3WNhd^(D1pdX!ySNlWipc_3JGq#pC?Q z2R27)K%YUMxJD7Z;3N@s-5-0A|3+kTW>Pj#B`_0o!ZPtGfGtg~;mL?stP!H(M*_+1 z^0WD~YrBf))rnMjFze^o6mC$!>7UQ zaCPJl)6x8oDxsAbk;ybqo-xE~FZV96%W-5CFA}|^YDcfC`ik;@N7rtUAm!;^A`Q9( z93X=80)3O#G_rJle6M1FM*s~14fGN1f*jN8fgVjH$oET-SU) z#rVmEjnkU+%#{JE)(|PvL|(a0b;U?3an-2Oc+Pp@=?T*f&F5LoAFgO7MD*$_!^smC zcxKP4A~}Lct_S^E&H3P+f2!A{`*NvjhpLvbk}SQnubr`v^xIt8cQA%hrW^XPj)=y$ z_2Ti6zJ#;uYE@A))7qg+(t3;@8#S*x-eF2gS$pB)@2;5Zo^=fH*UR`b_xg0G;n%=8 zMx1esENfG+Yxt@CKet}0ZYTT$ZJ^7(Nl4%gLKbc8?m7KBA+OeT_k02WSJZa*eAPe* zew3K)Lwh4A31X3DxSv?LOu%TW8%F*}h_h+^D%`z_!$BhT6*h0V2)za^Shd|#(m!sy zF`!&=Es6bG%u|K(xTJ}b&WDKafo+7O0UVP79t!_&+|b=a+_;y_N%uEZD!k)iHah>O zDC!~H3H$N=deB;IKUE%hkon(m=!8r@9s2h&Is46jFOv;#BK}fbDr*(kETHe2up2VJ#mzwPch3ZFUax_eSz>h7`sLGg8b z`~2wJSI|?g7y8zI%`L9uFteBiS`P!%teESHJ; z#{`(X(dV=~4ck$sjt}FCW*_d4Lj|!W{}a_ulM35k^^YXCbcHNs{X#Ru<>8y{$VYxp#cmxeTaV& z%?`Zhx{1D5`rZu0Uw@TmYy|*Z|T^{wVoj1a>w@P>RKDisAorLQ# z_lDk-%Xm7mz2U9f_q^XKV`O-1 z$$9l-ht9KX0pR6sD7mS(q%B^Ol}j?M(`Z`YDc3#psnY6rYq~&{YYwd{T`pgf_1OO3 zgE%_jU~A0Ap6-pEV*)xy>su%Ny=#oTQugRj?JoCFl*W&RfilVlNeoeW*cNSM9=VN{ zSX6=5kd7UdjyYhb(ZMmsq?aa!%e?P_7NlI+!{|NwD+>vXqS{@mI)4+s%h-nmi0>Hi zn}?4P@*DV6z`Xn8+U}nBwi0p^{C*w&KL!7%9K*m!gg`rbms7j*Q}SR4$H8qJ!zqjHp@Qn>S72;=-Ge1>(>7hRPW7I3#ZjJW&O-xmu) zCpC8=9&fpLVAr!g)ksii5Iske?8wcJ^LNo9BfzEkq7*5nz7 zL*%+4B8jG`8->T6)8Q`3D!imKs4F>|Pj%8`azqH7RMj=~yY~-6pC0V)xqAyC^AG>f zBf@p#>h2yb^q0cD&ph2d zCx!|Ip7nBe9{Bw&{9X?Ci+-#4dX${kEW;HLpe8N)_#(!Zg>arBMo3tp zCMByodS&snQcOfaUD%X_;S?6 z6!~wWTSSrx<+6^4RGE2{cnGhT4h7M>_)th)#_%ZF6TZPZsk@WNcZlyXXzSzWlvs?| z64rxts57w+CQF?I7UI9H=WK61qoJP1f1(~HUJnEHJPGxvA&Ua|xe zwAc_YWs|+eonjxo8hXpD5BAY3wrkyOqQhw#O{E!Bm8FALvx6RQlbA;f+*x$hP&;r) zHeByj(_~k2X-a~RN;5h!+K#SN*L$b1Q;8v|M1s7$k&t_z?e3WY{We1XFRkkCx%WBr zhg;F80W36ocZn97gnrnk);qN4NFIA?vqN>xpWf&&wW2@hfZMQU(DoKQ>C6PKVeV9X zenh$7oK)YXjrVDEyx$`o9sZ!m7h=pKELjgQTo3Iwz97e{$x4H{4)U|h?6tXhr!wA} zUibqYgl{}B1>V{8Om|Nmz^<7=vYJDx8y|P7%bBHk791=Qp|Yg$wYaa9w5wx_>}yDJ zGh4XnxVphFH}6KTN_D{Z&#}Klokb;krp&Tj_Gh{A7rFjlEnrLCvc}ONTlI=X6_S7B zTJ4J+#CFb)*6mN%qP+Y6vG?xrO%-Y5_{_=u(&Y3?3k8yvLfUdkL6>q-($EeS&=y3O zbwPuu8&=;Xitctrm!w=})eWeamP_kpT||Tyc6|lG6fe81D{cbS7cJFO5Lz0LlUgC5 zYroHPPEtz2_5FU|@8|RTQoVRxM4reH#yE?sp!G;mrLvQ2XWtR z7{z1dQWIE%?>B`MUXbdNJ;1Le_}bX~(bW)d1J~OI4%)znIlz;gbu|hS6{tNkD9r&# z@8$?Dx%JJ>)eSf!ZkVZD|5)iTcaB^23|+6>M%HV^cfO)EIpC|&p!|jxaK|)_7>khL zXz1@B&bQ;5`Hn%p^EL7}Ld5c2V-lnJ*)4o|zVxOg=SGcO`&B*I*&6Y8=RA#DoyNno zSl>*nIrEYVGK2a8W!O507Nhk2=9pw}TTs@l-H3COPqJ~+K4gk!{C<+ylEV9<)STTS z(W78sci+7- z@FL={*wuI){p!Di*I&Q760ed1TTmlz+B+32oVz+pmJqSjM<-4xSQGS2`=TR7TuzJW zb<|ErQX3rxqA8nZ(lp9bBh^wRCGxrN*c{Baj>%KhXavXoSlCxDkW0$=@!>>#_z zUf{R4f%C%T2>F=&7x|R5kXCX6xbr(=q$WB9I5-FR_$R>C6X|4nBXv+GEv2{9#dHn* zJ$;$}iEg8>(}VOM^dlOk&Gf(MXS9{-s;K9UcHJ84^-R;Rd7{ea;Q#{r4z!uxt@|x~ zkdvS%*7&?K6pktQCb;C#P3{sGLSW%*bdS=99B_|^o}j+Vp>RwCxitLcm?zvm*X59^ z2w|1oC}2n}h17PH6w*i`jUD0M9D0EC2qo!tRSx*2o_J`D6oOWmbI|+Hx$hICc()V} zxF+Rrf+>dx@^dI_gahtS-Uzt_IVLF{qs!3?`W&rb$WaT%9Hnqo?t=di;<*aqxe7ef zEIIha45nC!UJk&BC8tN92Qj_I^EJKC0r#O$!!^>lr%JVOQac6%HbVfLE7JlV(;zKf z7*AOu-ObZH)3S1m!a!)vAZSfCwB`r%7sT^VhrH9{w1GB33eLbPM7z;a1gWOuZaNDu z8ufR>(}7hbQVdTW5QBAco*&7v=BgZC+ERFnk^yJt`fBjAK4S>UwXxSBL z!&@8WbVDR8um)mXSf>0G_aK*~ZzI8lmhQEWIvq;j!^XuB6T0%mb*Bi4yEVQcj* zb0L0HkVyHk%+Agi?8-fjU+UJJT>18DR0AcLPK76Nj6&@Vx5 z_vGh?NWMe7#XD=r(ERft!IQ;ftSGd*eS6NY{Sz2DV1g+_&kda25CNmj)LdcfkeLnqF=Qx7PptdfFT*HvF=VznE>gWh z=<~!SKOxrSoTgY3pCZV+Yc|D9d`ga?H)Q5hL7vJXx*#nlA*C^_vt~#o>a8i#-C#9I zccWD=-IJ_p>29)e!euP3#8(bgobP#%N^-KN$mdBw)D^!!n1FoV1cbUe0pBA?sUC94 zci%igPNCs{DnYl(@k=VCyU#Zx{@lPb33AHMAHGq(S5J&TH}ls^P>~$}$S65~b$1oCF`;NZy?SygRjc z=1k_3=!fARM>IdVh2(N>I+1f3T0$|UK*!ZMO;O4@T~EhIQ#1^6OxVP>M<_|`wvF?A zD;iWRT{-~|R}vL|y7ka$nl4MpP3LG0v8kKs1iDVq!qrUA=GNR-6Y@39hV? zA&W&yNRHm4h_5j!8$A2f;+8Y7{2p!_lc%q!+^2Lad$lrO4kLTy5cMVoF zOqfCPmzEv@8XSueJGWl(%v~XU6)Bh($}6BDS`=$1!)9c^!cxH&elcpN`uvMWem10M zn7iQX&~HF5K2QMW>9DiyxVw`k>=b!=YknH;(ulh|nVh0s=@cz=$;iy$()_Vu)SXN6 z3&TtEQ^QLO3PM?UuBzcqh|OYJ26z|FhcdN{R<$+G&xiW$7u&g7o>j(_L#cmuOlzR) zs~Ty3QVYr9JQbIo?xF>n7G?ghAdY-a04L5C3Mm4|;_r|v8+f302l)91*UIZ&zJ^g} zmB0VKLCIE>OL8I)eEodlPW2Oa*80c&Nzn}?(_hiO)05%P-s-q`NI&2?Tmephj*2dy zwhH$nqT;nyhHV0~0amH8>3=Gh#g!*?iV z_Yw>4d4>DFN_%fzMK_dmBVDqg%)lARa&*(GmOmEV2jz%EOEG}Pvvt}!(y zi#oG5)O?z9ey1;(;|4V|_Px`@vPP5iu}ZKm(uniEYICpAs6VcE6Wh=rU!#RIT31Gl znh_6+?P5rof8kSNYYbEI;GR2~itT1LHYi5NV880}la5Y5pLTas*R&LW8U1=fQ z=4c}KNx%QIzw#fAFaNix%gN~W8-dapF~!ia`BS=WI|oUUp(oeUJ|M;o#kM_=4?RRv zf(G^$qZT|LPhm`Mr@3axN%J75`8wN_Zo^KJS1BNW{rw`I=mFzw&>x&7qRESVH$lxc ztHEw-1=(wQKFyEm{sQSdRjVP*K<{6&HR4asDs1^jOaUSaM6eAD4-mb?8nQ6tX)12H z=w-z6RP26|wsqjEPsJ8_Om*s5*BYCDeB5nz)SWjab>DiVJ7nAR$E%I zCzs|j(ZU^yjTC-WaOkvdtS)Q{P`fO@Q~dbdL4IhY@Je(lITXuoI+4mYK1ylp$05d5k^_(5Z_vz z6tKL-L_1jm@@r|qkZ^k7N}R9vUT%jr9yi82cNbD)WVN=2SQ;X;mJzX_nu_D!Bo?jz z#pptk3E1uQebK>-qe&K-ApN~gv*42d-UaxO1dZ;Emw!hSV!@Uw{H8#mO%WPpvxlig z;m1>9awM#WhNvW;@`Qy24)I+t#wqbsMJ{Q~sFa4ey43=#dlQDYX1V^j|Dd0%E= zl$8#rp4Dv@hV-D~%Q1Z|Qpe;cBS@}$wCdPRqcekZN2@}r^#wu|z>7v-4D)PJfi`%L zMFkkyZG*!|<<&6jV573MdCbi~#ur>(M(T$Nwy zgIXex+qR2lwKe0eB0o923$v)|c4@~>vDSmuvs#65;TdSB4HK9YCSDg}A z1iIxOX!jqNKj?fTN-EYs%Sj2b!7r{gu#~{26PZ!a*W%P_!Cj&uQRQ+TNNh8z&6N*JWW7rSmJo-t7SaQ)riNHIOuB?$5jD`sFijKiBrU)1B$Bz zxwnXTsE6j7{D0l03{=^2!ge+k?3a0wN%+ollc5gj^qfz-5&1E7nJ$3qE~XltA4V6k zPtfPvK$DG7XVR37uSD&fqciovOgclrybvaaIvsHABR*ANu`MNRsx2~+-;wT z{4JN4vQg(hNF1HFK6sRj5>jgP(1(^Le3xL!&=Hh42r{3TIB z$QZ4EO84(}BKI%resm|z#r{LA^V>j{5L4Z1r$h9wN)C`bd_s$p{Ye3&`mHO|16h7* zF#~7aygy0eBe7bRStzTf?nfZ4#mpb=uZZ0C4M_d;(L3r##dHa02aT8TBwH20uFkA zmp)&A7;|C?$f=*>SDnSJvGRIq!FMxL{QuRaMSP>?Rfzv5CuPo%IRc-X0?3`Z4KiOG z_@3tKYmqawz!{b}XH<4hV)E!FHsB6%Y_+Zyc_U?6N}M-R`tgQ3!twP{yZZWmT#;Ul zT)~4})@>=adAlB2L9C6D+n1%(kjP&No@J7<4)bLRrU2YcDS@}6Dl=u!*H+yYbz~KH zD^ZWbv6<-SElyL!sa_-HBx7nq*t;9Ta^ITjU@V-H$NO<#VzfV3y%@&#DyJ=|W>9aw z|G3Gog4R03uYIO~EM0K)4p||OHQfq%tR=0u)>tDV-Di@>B@kkcNkR zraB{Nc#CB|XwRjjxotFC^yOu_b(62J++uCkMa4M(bUGnR1h@Ap`%fEK2)Svodb8I5 zwsf|r%!TKC5+4bsEqj?NM(-cbv;jyjr8yf$&fEPjjU?5c^CB;d6m%OG77Pw8Eii{r zUOnagQ&dL=*wT*5dUU9@smn{XPGe}9@VBquBiXNN=V@yGzN_4!5jFInqe-(QloT*M z4}7N~wp+pymx?{h$ta{W>cl-QQ!HtIv?CS~QvfUnLe!>av?w$=8u9xMVmlVZ6o|`S zhV30LkP#`*Jr4HCsSeesw4*DXDW478VPWG-i8$w9#9HM^+q%b7#4!Kokbey8Xw^ql zL?K`~`iO>*KDs?+b6TJ*rZkx9e%tQO-pkZ}Qyo%cS@(TAf8B0fk!=7<5$xe z?U+d?@Lj9x+hjf}^vQfQ(swle#&7=~_)7!L%=?y3++}Uj?XRep!Op5=lwlemgZ5Z=s{4K(_ zvmbQIT&fP^+G5f%7oJfzyj762D~xnZhq}qcTy5w>VGIGQabJ`JX>MW%!S=vWRR#Le z>yz~Rmb;H9IDfad&ls-V9_47`C0`W3V?lXzlTPcvQIw6R**U1zc; zK(^sOAZR)rlKx+JPxv35@Yw8;9Yl@Njn~sCr&oK%~ zEPLw*S_&LZhcBO}zC@#0Q+;y^m~P`H@HoMb6!%r1VDt0yLk1Yfq~KI&RQ{J?cxF#x z^9u!t<&4=|Yn`A!R7r=!T29ocr_G~dpK+=#sn1XARBNWq`8rJU)WYW2Bm7`i0+!NK z0A(>#-GO#}ZO?^sZ{es{i}#(w(atp^=W2y|H{Sd5qdKtFNyHV^Nr8M8x3+=5PWcc= z>+*#KMEu+*TcSt7^1zdqw60IuQUcgtcme@XQL-hT5U^KduGiO=Xp)+dtJ6Z)l8rj> zLx(U^KrLpR8yD9g*OEz!fOfasvy;OqU~y_|fER9A=DaUL$?qbR;w(7max3nggti%I zA4u(C7zS$-;PEWw`ALFYMgf!o{eFwKmJI*TXpjA&hzVsdff6jb8srn?4{h)vCY@mr z)IeUIWeX{gUK^P0)YaS<0c#;2ITUwqPFasL5Jo{409&#qK@YGF*J*3;u7$oJg`hiq zNj17g81-%H8l>vI)i>a|VRn;cgp z*{EqjFK`-iTS{A8tBlue>AA3RFOIZosTWfMNzr-6#3*jsJq@(*y|(MZn|Egh4A0%0 zxAHbm_MsSQGJ@se{1!R+S3ZgRHDyC^eE#H+hMK2_%n(e^{}g+8Gqn#6p`0^H{9w8UKPZ74kQex`uEhf> zlKlUhFDdXR;4i)rXqvY{K&kZ+cpJp(yKUgQfv>8?fnSxJu^Ti2QypjHTHZfP3<}{t zzY+{9&k{Y-ndB`Mz$yzEx1gP5@`Ifu>TItct;#a`TY)Njp|`Fj^>$yv`oHjkrG5hu zZ@2`l@?!~@AL*sHeQ{)MyV^TlPV25 zVS81cO&Ro5{mM2DU}8l(1Z*VR@4ENwxTCEe`07+UY8`^}R0e7GX+(;D7HA^86SQ{m zsTQ9m`%BuYvdvNtKPX{7B)Gu+qI;cl@uxE8Ij#k+MS`To#;5o(kF5c#!~)-K3Tx1YII&ztJ1vipvO1f}$SD5Z>-u=biIw8m!!p}+hqg=KjJObMN zC{a#Gb-w>GS|(wsXQ?4WK$)%%pahMV0s6mGYPqRyJ5ZE*kP^2GiTY%EU>Z~1jCkx# z@zQ`R@@@cnyBldd^Iv@jCB zmN|f!5gX3RR&?)tkmSJc63{Pa25dnaVk_Iwm{9}cIS1!n4M1W2nHw0+ajC=y&X6%< z*rC|G`pjU6&Dm{P>eY;Z`fR%`ZU>&=l=H$O(6nOt>B`1GE=U(Fi`4jjrY#z(mrjp2 z3JVs|d|k_nkjkFn#j&Tc);}(&cdNw7XYkFns%%XtB~aOE02^nqNVN{86CCVK zX+L_@9Cvl<7Gwq;?D3k^+7xMx;&%=E&nSN{?=-FwYdbuDIp9{Za!qRU8V&u};^ucJ z$0Y@!wAkX>9@JK0NwjEzs|3dRYzfmXk&^72Lv8LSG>T@=e$dmJZ$Ey)jVHzd)uzweaGKjgT4T0`Y1xAr?ytScnHfUQa=@|);bQ2s z&(4UAxI@i2=7rGqGsSywPlY1r-*M2l*^#D32Qvtm@~>yg8}ZAraZCxJ4QK3)7PvnY z!FN}YvVV^e$3NiGNIP$-#QP!;hI5ADfw7k(A`O<`v6fkGOlc^&Oj zMP4PX)Qtj*)0(Hw3|iS#(XN^*T9ivhWd@gyERxqmMizvZj!X?NEzA!|CoD*7BB?AB zS3aaQkxa(9KWm(ixZs+|M(N2I>c17&M4s_9(gI`4O}j`g%~yCdEy{x46%iO;;VV`| z8uly2JI^&enD`Fp%zPzVS#D<1TkK;JJKbljKNRawWp7QF)Lk{;n>5GtMea*y$qj8ExuKk(l;nn2lk~9~q$cKZbfT{{^Cm~y9F%f%ymqZae| z&~El_J3{Y;@XHn|zU18-%>zrT-P;OSp?;%zWH_$8NEjQbFpZhmo2&@;Hyg8ur9gkC zhoO%Zw_d9LT32Ys^^k>4UDHwnPWts&ABlJsI7`Y!rgASv?c|I0f{B#{r0YE|mV@st z%q0i@kN$3zet$0g&gl*R@BM9v=dJCHnIrwql79abhq=5J?JL_Ad35+R=4+=p=Jk)Y ze~Nqi4<9$N4BB!Ru7)V4u_GOvNP18x&3n(7_q&h+E}H+jaZu zj6jMXW2jpxtu7F8>uN=S+H@_-_}YRtM8tQ4#G>@81f?`D__x&*#;h^0uo%}FYNU0B zu_Oy5BK|#3v*42dwgLQ>1dZ*Dmw(3+c|>W}?~N9kl`!5$nQ=ylf;Uf%)b9}2N-GO^ zVkO13PUBj^ShsMDL);H`PVbt75l558zgOVVUeOiW)Zmwx!s+0bz!M#HStNRFk5UyC zXU344+oicxNwZGoVZ8GG;&8%h*V)D%HAW12OpkUk8R5<*qHa}sAblHOll|H+m?M_Y z>!MVbwlx*JopPZ4_83y~{ngkHgJN=t4zYXXKAZ)i;F%b)WW<8rKz~9<=xoiO5`l~u zZ8^@8{VMUDb1JX|ww~iy^45INKikfMm;Lqcy~zQ7%Yj{^!7E(jCE|0?1JsZ6u2|B& z&`&3OwzFymK6$QtjON%)V={wt$7n*vI>qzF?D^wW5MDIqLfBZhXiPD~^^?6(yIJ8M z6t=KmK<>ZxR5J%~ZI!J!jAe2LBJP7Ywd7MRsouvFW8MVr{!^4QlH4lG1IJ131IL$) z0V-=8;``7C8o#j)r6l&FYRhYYRg~cxwLEh*GCp%<_gyWQ^V$^B+-au|&ph0R^HcG8 z)A1|iToYDeE@R!5`G`1r|7Z)pCD|X{wZ`cXkNU9wO2{Afp=Ua;N6pd$$u;TQvR~`p zPeeQ_&4|xl1@xofSCI_pDTf&LLN9T%FRkj*f$aLgtB)9<=Q*-1%F*Sl9D0A~%Jjfm zmilVERF_<;T;>j`Oxr4~eK6FHy{`|;vtO&ape87XQt0!7qo2|d1i07dBjR`aa9E&N>xA_D^Sz9m0Uqn*Pa#N;WvPHzMtm& z{1ldjbH!^`fgCj7Db1DP3D8QNY&|Az*7$GOQ_)Q-RpQJJm2?(T-6|WyZ#KznGF&O< zoI`Cr-$sKLOUFZ)bN=vz>`8jgAgEc>*B{cPjYQNCns>)M6-utDbLU9s=0It4Rvu*Y zZBx20?9f79u(U>>gi&}Rj63eD+5CbpLP=Y+QLS#BG-qW#eBkR32^BROS~PCnTBqug z=EBrYjbhxKt}q$SGnL@^Epn#kL7rtWGNP&d_sHi!yAv=D?%ZcxRLSmzadP`tAF=K1 zYOSseEF6Qg)k^=LqDx6q4a#4f^`TaWPV3Nv=dRk&NN&ki31;+t4ftK|gpj=Aq6*2g zDSN7MmE6K`oE3d9%huPcje+g#Beu|XJY)DEXk*N2XZO{IC2gK>mz!i^dAh~URunM$FO~i+pj$*lNg2QhgPD!d=_c% zh~`%JrT(DfYKf}*SY{(ia@3GCcd=zAzRfieS6Clk&ZHS9hgh|IuSD&Km!}8rwZgbk z;TSs^v> zrMzQSlF=XmswGJW`gPjB^fgZp2_LVrfb_{#fF!%65$SvL?zkPQBYB$Il;b#;)a;GV zcbGJ_RO+b`A1!c*GkwOuBCxRU0StcS`zT82+r8^5xQkw5Mfg6DcJUJQ(6%OAOXK{g zPx%0T<*t8T;zIFX-_cyIhWC^1Wsa(R8`$(q!+hYU>;qQA-rr>diobGZ1`D&jxW7}A zzK+=L4=Lm8tvJU?^?XfP-xW1gCUtaXJ^06{ovY~7@nr($!Mqh=zDAZ&KG1mOM-_p^ zwq&Slyv=zuq4nb>*5Z2W&mOGk{5!Ev946q3D=)nIEy3@*#@#X06nR>;FiI3OQbwJQ z8IIdn>QufqzS5dUz>B$!eR{a!WN+Lufum;TKi1}vjL4&;`zu7wuh-}iA`U(D8vJ8w?*v~>02h*cW6;0Xse1S z_)LkS>e^f55`QgF^Ja;fN#VWG@#bkq`8YN8kpuDk_Tm8olxn<*?Tf0+xCY4wz$;MQ zFRfAD)VoF*aN@Hkm@!gDfF}wxwY4ESB_OR*I)uHaXuh3vjtbNfo+NS zobZ)gX%&#F1EseU>_At|W~6Je4@;COJLwwQ+Agin?2&9HEH6=dQkWEE9>e(b5ZY&w zM`R*}4)IIx&yVksR@miJ!|~bE44?d$_m<;Nv&1uU3kP25)9igoHmEl5bP{n&wXF4; zefbPW-@_nv7owE(p>#yu_UEA1qjfd4U2c87cioW7?Z?^r@^~GW*L4sJd2MGEliT89 zwBSuhzeYM`T2sq|6i{x?1nI^HPzHS<@x-tQjyceV^@3Zu*{h+=np(9`@7B~_mU%S5 z?_LBt=bkYW!=FZFS@Elg3TN1+{U)NiYAs@~gj+F-hjnr|%JK!dlo8=Q(H=YCI_;5& zhU~qxHj3@WQj6m)(gtscuSEFRhistGx7NLq?7?-2Cm60me8>z!JkFjerN@++K^1U4 z%KU|UR$vd?Ws0q0a)06K#BY7(8hrQNC zh(lCxWVnq@V52=?51hvLi|+Ofcy;s~8ym1eC03u7*Go8?)W>IuK`E`5r~=-zL@#rV zQvCe1ETqJ46;h(6&|@B@4RhrL$#7Lb?V2v274UhSFNRB0$CxWAFSlW~Ozq)V%8YnF8KoQ@ z&1c)Gg<>o9TK@z=(OVlCL2W9Dqqhffl@3?ysD%vI`U|C+^x*^m4wD4M_nd zU^7IJ=Fp)`xxHBT$Oe;u{=y1Dwxyo(B6X=gK@Tzl-#y9Q5~z_mVNV+LsbstyfE2&LHBaVS>lB_Np&{NN0@QapGzF$1m? zC!YOxGvG>b*V)7jxKiBLfivJd@Q^xmN2gkz0oRo?olqW^)A9_sVL@iF95}Bd-6YL{ zD}za0XXfL~t3n)jmJVOlPKK{&M|{_J$o=wo`{n*YN<7+rC7;+NJ}I~cpID&Bq~5TN zXzAMv6}$fi{Y8e)X_q*-m&UWDnnqc6pOU#i-*Ju6D)mZndm<0!FgLE2${X2^CyX?K zBuH=eO7r)Y-EHn|1|e4qti29KKS# z<#fHP;~I1LO0oXjm2>#epJ)2c;aj1^e})HII`DvKe{igGVaE3cZaPR!G>~+k@wm7q;Isf!!MPcl7 zp@ZKYB>8MCo5Z{jZs>SZn)RQ+NX{e(Th3KUVTHKj94}ywgB|6KZ%H{YeW1hE=wJ%* z;d8`-XX)WQ{|9gZj}wcFN^$aeO0R!2=y4T$sa)FeO86YgtOYyMQ1yCjIw6Ir;I}ug z(yd>^HkQllNy*Pul`8#7(OU_%bN;NYdw1-X`UR(opzB7-Dyu;~B`BHz3P<#jZ&#O?s$dZ*Br8*7Jv%_#s?tU_a zJ4!AQ6HTRBGK}5?7TDw70N^~XxD4{%0iKQ8*a~I0o=)1(dfNPF%*9A0{LPSl|7U*+ z?#JT$rnnkbaDf;lV{NMNy#hklfd;$Ro4ncP#u>7lRc^P!gC{Me*3u$c{60XH*{S}_ z7@dUHOU5cXo>)_&oO#NH1v`modi$m5OoA;Q4Q*fI>)&pXtfoKoH|F0w8v<7WT=w1= zxunSw?2P9(2e4*GH<>h}%^a|FlNp>~4nTN@Hp*%7*_5`Iq87qS@0BAy$sj(h)JCmW z{EdXmEX>?5_tE)xMSG?=zV7g%?ob#t zAbqa$zZBP`N~2N09IL&$nhH^6oE1|Vbn6_Q!lTrpmQosPpAue*mZ*`##*Zdl4=w-O zbiMV_Qpx(<)Eb-I^hHO8SWHeUR@2jpVuF9C71#QEg(jd=wEwdSkmpI7MCCWtPb-po zQ!G$@Ok1STYw&wXg1)4dafX`Z;xCAH>RP6iJXMlk4tKRayW4yJf-t|S;{1!Qzn$;# zRF^F{=IENwHwlRzsQ>v|0jZ+^%eKyIteJj3&BbqO>YB#;oQ|&pULxxE8>CoctsG0f zrYmX0N035D6Gg;9>Z5i&k!Uoz;XWZCy|bw{x^3n_TF@a{4A8SbzrD9kZ(*gB<^kL2 zusMJuIv)S?(#vTk-PjA0`-=sB(=F$pama1BtMvrS+KSeJ#;EnTo;K!>hP1Pt*rSM% zLsS|l$PR0w1d%rk5b)~`e2T3d*pA%dHRzG+L~2k=ccnq%LQ!kzO$(#Kw1wXU*xJD& zfN}Kr3f!Ay0pp)FZ8!w2Jp`$yT-fzG5k32emER;&2Jx8OfRw>81=QhCmbJ9c6dgvr zwL>WBdcbb1sVwz54}wq9@C{j}YvJsVfXwB-Ld$f&&&PH!PRQDdoTl|V7$4)ZCo?*Q z7U$*1!ev9YMpSC^=-gIM_HQ6p$64u2cOQ5Lqu*vt;=8_*vdO_USu34QP}XqK46+dS z9$&~@7nAh-BreKx(*U{Jax~F2d^57L$pPou1T7|jL z(KVzxEAvU`jX{vzw5W6ql$&0iE1D@8F+KbJta~q-^(V9V@q3(Q0G$v2-suoE)u!VQ zPy40%g*gLI%BZuMnte+2MSir+`1c_tf)e(2Ln(*GDx zzH3N%}V$W#6?ZLrGnRBQ&}EXwt~AJRE;n(ylT&~Z1|Wob<_&mX!8 zwab6Ie-1E-lRv}9nF;eZom*MxLEW7m)ussyw zJrR22%TcQQHarn}ALZ#?oljP3KL)>(rZifr>^3fhCDO6__1KqV+Yrk-uRecCNLi}| zOb>!zTgP=>1vSkFloq>Al>BBX2yu5nqBU7}r%>7>;98WCt66 z9A^)V5fz~kBM0qO)JL==HAa_$^#i{bj~MILWSQ79=!v(P38iP#Uj;J!AwgMl4^xX~ z@>V2csCFLWU(uPtt66t=e!Ft>JuJ%b+#!7q$>qd{I|=amD-kER4O5Q#B&y?oh>MmTbXa=9VqH}giMQ0`N=;Vm4 zQ4@HC&27{MCNh)o2s;GN5x$iX@r{c*L0+|6>(d5iOV5b-+C|FnBy*jAc%vOGW`(Hk zv@%lw^&|z0b8gTqaT_1l!Hk`4j~SmQooyc8uV05}0ctmy0?D;&8c#5wz#k<)>{(@~ zoIMQX96$XELu#P5C}165-qkr1`~-_e*^F}~e2so%y1>_fT&UD<#278g2#+QVeC^SG z4AR7-6h>KyP-sEPLamVBVfy&~J?y;ArP%b>^NSoPGY`e?+5}~R?r_HlQgz2cf7T&$pY5pwrHH#&m9g0~5rTEZkxn{8JW`WNjB-f@0 z2Q!TuXStgOnmyD$OZt*|mMeCIcc<1k2Jx=)tW-Z@PV;S0-WsRrGrlG%I-R7x)&-J! zHk9`X!_u(Sod9(O z3RLc$f_;3J((Q>YU*@-b_ac zQY*(mEA7xq#EG0XZ~lboHzwB}Zs*+rC;u7L^_oR`cBvyZ@Ci$|h_Bs&w-; z8V|j((%tAJQA#RZ7s7q(eCw2zX@#6j&~H_;exq^yruWMl?v+zGDrK!ggrDpZ2i&2a z^39p;U0>dM#$Kom{IbvUO7*gD@^+kU2Tx0)j?I zIWveW6kkcFYDU_BXn#1R$U3gxAC410JVSz?%!t1yb^fuW#@4dG#oO8Z&&$;h= z*Y|$wu62LCla*)I-m~}2erERU*|U@98M3YYi3nRm(}{ZV5QYgyr*(5T^QMGG^O%8* z0t2!su1dbMkkg}QsDpUUi!e5H^lPR=uKp0s82{MLn!~(9c=SEdh5hAKwDD4eWEutA z8)Ch?9ylKu-AXQxmYijNk~*!Xdr{8`cFtO6C(PYy_|`w+o|%cith2=x%_BIldQRSp z)ATu7qzEq4EjQ^W`F`!PnEq|&`J;eo8spad2`I2=PN|MCv@hDz-wYv!)9{U~aLe;{ zn5X*dkE$kTlr^~{@z7Z|a9_P+z7rdLp$X`y;tNnKDG6F_;_V$^ zKVja5r_z2lBp-R+2=q{UpoUPAmP^~Z8MRooy`+(V#Ebo8kNu~ifkxvEK3e-^z0Ls_ z*v9_--PzRnYm&h+Io!oZ%w!|lJdRxR{pCY3j@&Ka=K8y@nl}4icYc~DDgnk-y%#lF zQ`sC~I235ATeHBUopMWDJsixsl%{ChR+C1^V4^evpPc>j<9{7}X55=za{t1!fHC_HV%;IB_^+@wIM zo{@_=)F2@ZNpp%ieXIQqog=UTU1{$1tpB_$N+LICyzuhudwSeb%1N#EwWxlfB9>nc zCAD;coqJ4scMDqvCvZ|1%uc~x4C8*1Zn$5QT#Q4iM@#jnP56D2+_m*1QWu;tF>eO$ z`@aonW(d7VB}>gY@Xm449$Kz6yjHD|dnY5egLq5RG%{s8u;78x_VY%Dn?7Z6man#i z0%stku3N(qjGy3P!`BbuYQ1T)wNdZh;~hOS-4kiejZ;CbPiu9ga_`-$5YA$?Yc!SF z$x^L!UM?O|KfCK(+357-f&PPBSM?ILarqs!3fFn@LjiAgDS|U~((Us;g=Uqmy6VS? z5@@*&wGv!2vmK#XnimaSZILd|{okta2o9R-PxW@qwZ+ZZ8J!qB6KYJOeweeceEypJ zjwDJ*UkgMjT=cbOJ}ffTqZiy$vJ?Pntu}%nf2F-oesHwJ5KzBmjo^w;zrPiA%X+`a zDeD+)K^_sxFV%WuvFd4^h#R`;R=KZvKyBPHv^N;o8j zoN>VMt(5k;i)Z)!V|V4dBCBdfcuk*uH7yOQu;%A~^L!Q}^K@hHI+1VB6aG~4F&vrN z!#6#buV$U7{Q|+?s|j~rxV|uccuDW*_f(P$=zv)xz0Hc@LEMst<&fz9R4nW^ zVQh#@S`X=)i&~TC1(Dji%|taSA_FAm1|1gUl=dgxZUnwL&1kq*^|zz3+90x?_GGszCjFr@LsV9j#RKk~V|1nIT` z!L&dd%VBje`<}T+^3I(X=)r{~5GhgV`}borI?B8Iz0;FiLBIbMUzom? z2TC|QygEGjBY~;i)GQkPW}8uEZ*wY?H@t>Q<5e6@iYrrtAzP4{Wc)3^OZ?otFQs>X zq{Rh`i`~ZgYEr`cgi@)Ug`7?}u&pr9osMld!6;!=_Etg%US*x|ZhzA7^d0kr^pNqd z`xz4+f@L4*>?I0;D`z5wZb0xjVxp+iPz6h9^z`;?2E?zME>1chQ9L?7$u%qu>WNFWyB!T=2vyiulKuI ziFSKXVm?M*S?2y9*NIiGP{kh-4a%7U7+WK7(sjs4P)%ycL-ar$}-r zfAG^^^HQ32ua{X26M(OiJ;l*2K~8Y;>RvsV5l_(m{*$^r^rTJ+nHG$^Fg&-xjS^tW4Wo ze7`33cjI(#ies+f`2#ciA;F7B&TVbWsf#0&B!j`*uC8QbK@=~Xkqc1itg2u-nGgm` z2@LyIp-Wj^3(Gw%50lAGu0j_hZy~7=D?xh5wONyQ>4n?Wy9vY^$O&z7b)WuBmIs|( zEL*&0*@8UjnLAzCZ+?nJ!A#;FAuOeADG`ZP~ByPD+`71?1}_B7>DXpmXih;H+J;wyg#PB_sNH8 z(YS)yJ^VeLzJ~C9!yB}@4r(8EzwsRrJshmhotyF(-gzpanm$x z96iU@antijRFAV=%s36_5KAA0W@CYhWh4WMUMM9^S*9izP1)Sz;;J)#Q$VItlLUpS zl>h@_>(?h6_9G9gJ=PwM?5%yD2^noADp2qECS?ka`<3b!cBDq!z9m8thN1~L=r7W# zx>cwwaig;;V4Kkv`BA3Dm|K?5XT=4Pz2#LgWmZKu6BGGEA=A>elb$whZMwkjaHPst5a8e~s&J5NP0?=NnT?eu(Fxs;Hl9CqhCU`(Hs8TW@1p@BDmPdlwk?&`u~Y9 zk{|y7vFTsa^i>?TPiXUt3kw zs(ups=4<&K!m%NDjSbDoGj3$8Alu~56nNF>K9By6L_l%SI zXBqx8OPrlifF8zbDY?@Z49VLiXO|4X1DdzGT360m!1 zV_Wr0<)SQ2TxKNyjmw2|8*}CZDJhahHH9|Q&GG&Whk+k6=b5cMvb7Fjhh+s3GL$u& z?%hdJxgHL_`F0-LUI#C#Y!cSKi?CJf$)z_0T{L-Gv1frTm-ucjGR(1Ln|#&HW(W$} zffJK6y-Sqyn`pbcwvaZtAN?g(`qTHrHsM|wt8#bbWL4F{oaky{fy@yFvh~8=rxRXF zyh-zNa&^SOfAjGv=FR5;f)SR-(E5~Ob<9Sz19&HEF9RdAN3d^lYY7pMxcfxUF=c#F zJu%%Rgt|USWBclAcSriDbF%wJME&e(QWs$3{9U$o@n^xJ)6fwe!SL?k`uB~t?jvJU z&;hj^iqlsglC3}91Zg3wD@r7O6lQz+9FESj46ZaQ44PF2w-nGlGr~SpJQaMDT0uy1 zeF+mX$m%Kmwl<{5mwKdBYXK$tm^#zP1GVSFAId} zWG7Q`oe;$@V&C4|WwPOU%XU9H%xqk(%|5`*XLsmJ%56iv{EzXE;As!|^{ItxVH4-^ zNW_xbqE6hcCSsFq`+UPY-6wV1lXrlVBG*Kq8(nL&zF!&6kCD$swcM7Ja@n$@?q=!? zyf`d%d?ffyPwCk%=>*2_?TxNi=@g1iDz1SIqGNnKAr1cbtM1ermNCC?m35+QNW^iG z^d?q)LjO=e;O-zx&T#=1Vlkcn*__~G$)~jX9-I@LW(AY)9%oC%M?u5;J`W{8nVn>( zcO1DpP8;82j>bol)l|}XT$16uM;)AWc+4A=9f=#DuFS~<$882y&`Z}LSm_NM@m1Y z;m$fokCFlDatfqNLn~nQ$VA$0iZi#pEaCh88Dkyb>HV@An1Ykr_BWyNUHS>)usc-R zOg;9g=WRLUJ1|>jc0Gf}p&9|L)}cQB(UCI$QHNZicp@1UWeai_f@V+ByXJ&@T{K2z z{}+>%ROcCu+nb-Z8DakB3Fblb=Yn8bvB|m+|v=doR|B_D=NXSf1&~ z?f+umVjXrzWj+`C@S?|IG5D?Kcyq}9)?!RHqlN}?Epct46h+MfKvz17Izz$vZZ@r<6%)l2BU(fPQaa7mue3}fxoYWh^xNXNcx#~qDV z-mTyy&`zOxV!}>QEvR>4Ew-!1Y%Q&)Ncz0iKNVsGHop8dSqubJ1_aANxDDXA*Aya!@!3E&l}uX zq8ql=bPX2VcWZz0G%lLsiL{Q1*tm5oJ{6LbRs(;KgF>AECku*^-F>84LnV(E6MBxb zn8n>Q6}w)od*2PGhN|%RR|mS?_$J9fqMl%32~?bleYb0zd^v@j35bPOBKve1FL5(O zdEVYwqA#^d{jw7Y{_(*UmQ!Jy=S)drJs$I9-H?eHlzm_!SWU?p9Zg1~HUY6CC7Iqq zGU`+lAMu!BpMhrZSfn}>pV4wG$=v%@e-ob2x&Hd7JTFnsh9$ZR8I@uE!#M86bT~0Z zXvGLWodu-xn?~ol*8B~vXI{1!)aygB^{?^TTYjSJscR1g4=4^UrKIaJ%H?8jZvQj} zEM&Mj>9IcSx|K)yI8{UJbrH@u?SQIj7#W;!{2g(|AFwk1EAF>K=Hp z)fv>`G5LyVnE+yt-w-)m>JmceGj{tcg{!w~b|X!(Dz_}jrry)O(LhLX7bWs_J|Y0>6h{`GNyq_me4y?B~u&neTnHhzcJHt z=%b_ZgG8SChY|@3cramBVAd>VQnV))w*>Q8Do3FUCpGr$o+g*_ySoiPu1)1{v*qp) z>QAjbN-ZQP=6^n(;-8U1RB8?wxt@OP(u2g%bKO?IZ<+{gnou|CRW0)8(Hd2$O5Asw zejUF){T0e|-c!+P|0b#k&-pqMq&+2Pf7k`7?Hf)^KJH75EiFb6jR6Gsokg3unU^n+ zsuG(w)Og=1czP&bYcf^p*}_iu#UQ<%~u#{b6frt5DQH=HJx39Y#_{5<`v-2+qocvaJ!laL$H4B&74msVD zE;oe9=I52bXPMH`g68(aB;1^SD=J5eyaPD5=VGXhYM^iFt0`FO7=CFGkmXAQUr-$d zjg$1BqIW#yC4m-C;xDSG$u}?j0>bB0`(B=iv06>%gr0nn!-2(lC&znlJSF`Qt0|}T zt-0!WE9BTq8pHd}Uu#>3ce_~Ac!zJ07YF@Xhw_#%$9j4daJ%ARwE=&m_KSuzP25Fl z8JQEcZETF%OPa6tQ_;^=mn0mwI;Plhtvnv-6>SDU>IdnkPIXU=c&^(uu&!46$5Llp zgoaJ{aWSt{{an>vikyI(8V8Pd-=u&^VULMO@BWEyKF=QDOGGL)ZUq3cRo-2X8l>qe zlV^SOsR(`?Y%cr8F+~CU3Oj1O)$xxtCsp6;Gb~622Qsi{UhhdCOm@C{bI9r#A#~mD z%+rAtT86aF511@ToWU9K67X?FO|Q_IdR8?w3BIQx~^k!mBy_0*(%x zdxBCqf65s*h3mwhn%@otZwofKQH#VKh|h(I&>U5;p~lEijkX6>$44t-zo^FYlpKY{ zQ)%}S=)-(AgsyEGED_Rf)!js$r;uiCRY1JPV<7u(h319hdFR8k>XcjMI@5H^%Z!m{ z=Umc-;eax3bahHPTetgLV_C_vPQ3L)zj5)8bzsb)T0+8a?mWz zN@sHP)wi@wCLAiXX+O%Iw7P$J^7gYwO=-+pDlo1X6FLH1@#O9sU!9!B2pdcmnd!G*B}V{zN`_@A7y0QU#LpLP}mx1tkZ~o@jh%I z`h{&t|8bymWZJcD=RYdU=Rn_VE979aCIt}w%nd#2pehOdgDLZ4w@U>HwmPb5uUbA&F()VlzjdZ@)OA@E7y)hnRwtasv-8Yc71oPN3480r6O_mq~Np}o^~v~o3zN7mI4i= zBftQ~N!n+wv4opp9BOcj!wP3e#gP=N>{B7t7zz}vW$+?~5p`3mMT{k)e&%`&#r2lw z2v&3aQ**JslU}-0rUuH*=A#@xwHOw2K;~2UclHv&bQg%A=!1AB) zmijHahU+EG(OWFi6xz*ph?_AjH^j-SKX)VW&B=^gXb}suwpL+>Gj1q+%do^5UldVl zsD3F$J4T=e9~Pp3;5H{7X_h^j!NH0a;WGn9QCNo4&zPV{*&hC0|^_l7&^zc%cX_Llza2 zxP69)C4?Kn01HdP5Y^BX2lLH*KYet$#nwOpZ!X-rDNWhi{0c!@g%O`1^l5fOT!V$K z&M^HXW^ahtr`&9n+Pd99B-l!}bzhn=wv`)!w-GLd@vb3+1+QXo)*=YCrknom6ge9$f zTU^q_+O5=E49TH(2!iWURf=<`?b!ntMV#|HO@hRut_g08u~i;-`Gp^7EIOSmtand_ z4d$H5D`lL4SerIJ3dkMD+_l;exwMnZx}h(i(tu2rw(I;NJhey~nC9CVzk84L(^kAm z{I0F>vJCCm-q`E*_d@kB)k40-S(yIyTbd-bsYSDLIk>Z>=zlC2w}<5+ ze{|=W$)IE6+ILskvUD1X_dCga=iKs=pKF_NYbOiOt1Lz>E{&phn?7A`)Sgz%N}0gs zO?K+4dp#QcH&Rct?y6XcMlWpaqz&!v7ntl>j!b?{_Me1){&6uwt8eKy9q;6IUNP8C zIKQH~{F5XWJvlO&f76H6DquWb-Rn@;`57ZLnZ7(nI)4lm%>1Wt|`NIrFdDgQ?zd8GP zHC%c-oU?seWUi%}JpWVXFL-#vhhGEJ6cRy(DgNVeO$9Z3lnMfu`YBC0zgT~uC*zjt zSL!M_H?w!;W;bCBnXx$oFAIa_hkB*48-sqTy0irIK2ExVa~sgts)w|{=GE)}TQi+&|1H@#nP1S{UJjM#st z&pKJSa*sB`;92a#MV?-&;p}A1TUON|{cL%OGm95lC&EGPF9q}K${YBPo9^W=7J0;H zvCQ95k+@*>V;|^~OIDT6ysXSnZHlsi29?a-7}<<7>z3O0+P}H}{9x~?yZPo*ErKMi zPK^JCQ%na6SN-{Y*Ug3u>=vn3PvXS zXC7}z$~8leEzT5Zee(NGCC9(1q@2Q|Ev5rEymt0vwN-q~&}mR{U%%-@gYDEY;T7q| z>A@TMJywewz1|0rIpyp_H~jL%wcD$c8ylC`c)ga+?K5aTu_hb3SHH?VER!UdT{(A! zT)dl$^|I{zrgZw^tass4ld^G;-*lnErau_kWVW=K+at4d(2>SiyL9lT$x6zX*T7s~ zLNZn2SS__TA73kVN;~&}Ld}i&C3^nV=0iiR$+@1v)y2enczQ2=#yYwJ<;L_%ToUX9 z-XG>7W3a+nrH+ya)!FB?o2RD*!k>DQ^nJ_k!9RZVOl?Z&Rihj8vW$+GHBKZ&F2=LI zJ`7fwYQoXcAinmLxw?Zq9T$gS1RnaSaE@3kw5+DNKk+?uDy{ zA5!2F_tRO)Sh2L6d=xTBLM*bg+&}3AVBe}c5Gao z?43M)xg`C$U~o@I1?{objfd|AD zVuOTWE3@^2*}FpconQ{|tNQFA-Vj$f0^-5{n?!I&IPy;vmiljZV+Zl@baHUAv+=yT zDgLV@ucV@;#i5|2XP~C6rU1geV(2QF!@z243Sd741&}QS3i45t2SL@8Y_t^w{S-l9 zc_`G~(ZyL?M^{%7*AA*%~N0 zgB6s1qXMD8Hvdee`$*o$R>jrX84T1=+6G{h zF&3+(=z;<}gHeCtoaNzQU8IkK?r$=xDEX)>8aOK%g5}kIm&*~XX%73RHc=`Dphv&o zC(=MkNy5j}SX9mAk-Dd?kf^AdvYxAnF#x5Z2y*+K25evsQw97Jm6EcLoeBzJBBTtk z!S;okvbw7+_I~Yz41J6ZKnC(qyFYqYP5!E<&0)XyHCSHWM@s<&GO#t#R?yW&7>hdC zyO^kIiHLdw9tnd~ZBRfVXB~NaB}F(=Sx?Or2zlg&(l+taS22gF`+yygs*Z++5&$J} zS2cjaBNJ1YmKzidM8dtjY$3YtAOkp1&Bss?hbem+ zYQhb@goX8u9(Xw@DLdGxdFuIrw11=46_*D&h%3p1zzXsrARpDM9@PVA%gdW6DeHKm zJiHuT&0%(W^14WMdmlSfcTFz|xR#+2)CLUlQBhEESJ4NHNMN}Y<#j=dHXx9XsjeCd zr0!`0(9sn_h$yOg2_lf@Fio(%rh+0=SJY4y=n9Y*(NS@fcLhW3orL@x#9=NHNQ8}_ zlCGK{;E|RO!ogEq7o_H+s_z97GKRPsISIneVSXT2Wq`OM%vRk)Tia6`rt2>1qpGdr zs%RoFqU~wur){E+t;P=S>7fKuN2&X%ARPtGVZTiYB`wAOW}5tCKK@}^?BH$!S94GR z>5KG)xOq8YDXy%F1H{JD>uSz(U6oq>UTTFc;lj>w?Cf=OLS9)Yg#Ig!l!2XYY_;6aJ@1rSot{=Kmay+3Lzjs2p|L$!seo;^b{fzKp|n^ zA0PnnZwdhb2>dPt@4pg4#{=%*5tb zoAdD($o&&-$ICnKij*IOP`qKsT`IcQ_H1eb!v@ZKu#Z2m{S}7CXCTMk^etWY1qog2 zE0G?2SoBwhcUgJ>9RNF499C`u1_0e-n(^>zF1jCN85-4-xBP3j2?I0vRRGto2q&xqezhy|2qd*9gxKtSE5x{yt{-PB;JuJRr`8m|~J( zTi;?;o*VLOagbU^qK`LIsC<-V&(|{FRR5BXwV!a<$K>u|o)d{#UlgQZS<=Iu{iZL- zB|&RE7Mg^dQ7t)-wE+`~Gf}rE^_ZG*74nvO%CkhNQ27@~^!yxUIaYrZvHH{ThyGAv z#H0T%3&8Q;9J)Jz+rJMT`@b4GJviL+pOgqF0u=v?68#4L2PN?aQ2j%B2>G56;BevF z;t+tvCVgMHP=q9JQmB8uxC7s?1G#DV*YcAkdpE9_nDm<^Wj+i(sTwpPP>BYsyg?+$ zzyFZFS8H`@kVAfb(k?Rgr^=12Fp8;~_nD_ww5PY(qdg`$?y~A4P1Mj2h*h?- zlvj#EeWf^r0DNrrcTK`2`imyfOHySNG6u}!Xn*K`!~5}#sn7N9zmFb16bE3B2kN;>p)YU(ZYL97&m=qmPa#hP z+~NZ_u^vtK^S$(E0ChQE#bYm}c|^8%O7b2c(Ovt6?{F^t5MNG@3PU&{R*!73dNlus z9%rd3z z4tjVl8#pS?P963pQzf0sb>QnsI=!*4X2+zW^}Ap+ZkG^rX5%rzJWDXU$4P^ z@+Cbo^r~<3pH@El@FgLE>a(lVBwaAedE}JVbC3BLn^}a3=W}SMNSf4`05BL=9;;-s z*nI%NA9e}}Tu1_+cGnT~8k`p)5T5Xn*InPeDpRLTQoi;13g&74xV zMmTZp)cRs5=+euT0m0W&{uJYCb9F5Si;BW_>VMr_Dg1*FH(iWC1iN9w!Nq>>T;*50 zH*7AvX+A)?H0b`+eC%%6BktAPug)AihFXe15k68mwW9a1Zps|iJP2b)uKEx2;5gIt z{h!Rkf7(sKZn%JdwG3C_f5JxnKi!jY>zO$D*R_G83@lR;O-hG2-en_>y@dVvnJv1U zDVCP5T6QAgy!h;;C^6Aw7u6uIoUc3Zxr_w1+M7Y0; zt{*zrNQP!*LOXVgSqm>2$tD-ipMC)AHovB_6O~E zs>*nIZz7q#1^usg@>f6m|N2S)Vrltb@8o~IlmF>{?O&+S|9U6?o_C^zUE@IiN$=#h zh4kO@PJq~;B|ubETv+(OdM9_TC$JWMUp-GGZJZ%A%@26IyNyiq<&>yXeN#=o#nJGW zWdV;6hd>3OgvY^c6i;nC6ns6vagu^a6|10xf!_lmN zVZ*`c##ZU-WQ&BjI_P`aV56uor~x)gqY6iQf&}~okZ>IhLZT}UJnSbDo14~Nxkmp7 DcWXm# literal 0 HcmV?d00001 diff --git a/test/resource/fms/fms_self_starting_host_bundle/fmsSystemTestSelfStartingB-signed.hap b/test/resource/fms/fms_self_starting_host_bundle/fmsSystemTestSelfStartingB-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..a28de7950d6edcd31877260c6560179b6d40e1ff GIT binary patch literal 113353 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ì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%0DNR8f~wevV@YM<68 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 YFXD~V*CHmlEJ1(^F}PT;>C!U#e +#include +#include + +using std::string; + +namespace OHOS { +namespace AppExecFwk { +typedef bool (*FunctionPtr)(); + +class FormEventSubscriber; +class FormAbilityPerformance : public Ability { +public: + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + // Test case list + void FMS_performanceTest_0100(std::string data); + void FMS_performanceTest_0200(std::string data); + void FMS_performanceTest_0300(std::string data); + void FMS_performanceTest_0400(std::string data); + void FMS_performanceTest_0500(std::string data); + void FMS_performanceTest_0600(std::string data); + void FMS_performanceTest_0700(std::string data); + void FMS_performanceTest_1300(std::string data); + void FMS_performanceTest_1400(std::string data); + void FMS_performanceTest_1500(std::string data); + void FMS_performanceTest_1600(std::string data); + + std::shared_ptr subscriber_; + + class PerformanceFormCallback : public FormCallback { + public: + PerformanceFormCallback(std::string name, int code):caseName_(name), code_(code) { } + virtual ~PerformanceFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilityPerformance *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + using FormFunc = void (FormAbilityPerformance::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityPerformance *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_PERFORMANCE_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp b/test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp new file mode 100644 index 0000000000..93f5120367 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp @@ -0,0 +1,373 @@ +/* + * Copyright (c) 2021 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. + */ +#include +#include +#include + +#include "form_ability_performance.h" +#include "app_log_wrapper.h" +#include "form_test_utils.h" +#include "form_st_common_info.h" + + +namespace { + using namespace OHOS::AAFwk; + using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_PERFORMANCE_TEST_0100, + FORM_EVENT_REQ_PERFORMANCE_TEST_0200, + FORM_EVENT_REQ_PERFORMANCE_TEST_0300, + FORM_EVENT_REQ_PERFORMANCE_TEST_0400, + FORM_EVENT_REQ_PERFORMANCE_TEST_0500, + FORM_EVENT_REQ_PERFORMANCE_TEST_0600, + FORM_EVENT_REQ_PERFORMANCE_TEST_0700, + FORM_EVENT_REQ_PERFORMANCE_TEST_1300, + FORM_EVENT_REQ_PERFORMANCE_TEST_1400, + FORM_EVENT_REQ_PERFORMANCE_TEST_1500, + FORM_EVENT_REQ_PERFORMANCE_TEST_1600, +}; + +static std::string g_formId = 0; +static std::string g_bundleName = "com.form.formsystemtestservicea"; +static std::string g_moduleName = "formmodule001"; +void FormAbilityPerformance::PerformanceFormCallback::OnAcquired( + const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); + APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); + APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); + APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); + APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); + APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); + APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", + __func__, formJsInfo.formProviderData.GetDataString().c_str()); + + g_formId = std::to_string(formJsInfo.formId); + + if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0100) { + FormTestUtils::PublishEvent(this->caseName_, 101, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0200) { + FormTestUtils::PublishEvent(this->caseName_, 201, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0300) { + FormTestUtils::PublishEvent(this->caseName_, 301, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0400) { + FormTestUtils::PublishEvent(this->caseName_, 401, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0500) { + FormTestUtils::PublishEvent(this->caseName_, 501, std::to_string(formJsInfo.formId)); + } else { + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, std::to_string(formJsInfo.formId)); + } +} + +void FormAbilityPerformance::PerformanceFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); + APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); + APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); + APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); + APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); + APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); + APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", + __func__, formJsInfo.formProviderData.GetDataString().c_str()); + + if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0100) { + FormTestUtils::PublishEvent(this->caseName_, 102, "true"); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0200) { + FormTestUtils::PublishEvent(this->caseName_, 202, "true"); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0300) { + FormTestUtils::PublishEvent(this->caseName_, 302, "true"); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0400) { + FormTestUtils::PublishEvent(this->caseName_, 402, "true"); + } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0500) { + FormTestUtils::PublishEvent(this->caseName_, 502, "true"); + } else { + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 2, "true"); + } +} + +void FormAbilityPerformance::PerformanceFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilityPerformance::FMS_performanceTest_0100(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_performanceTest_0100] AcquireForm end"); + } else { + APP_LOGE("[FMS_performanceTest_0100] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 100, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_0200(std::string data) +{ + bool bResult = DeleteForm(atoll(g_formId.c_str())); + if (bResult) { + APP_LOGI("[FMS_performanceTest_0200] DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200, "true"); + } else { + APP_LOGE("[FMS_performanceTest_0200] DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_0300(std::string data) +{ + bool isReleaseCache = false; + bool bResult = ReleaseForm(atoll(g_formId.c_str()), isReleaseCache); + if (bResult) { + APP_LOGI("[FMS_performanceTest_0300] ReleaseForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300, "true"); + } else { + APP_LOGE("[FMS_performanceTest_0300] ReleaseForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_0400(std::string data) +{ + bool bResult = CastTempForm(atoll(g_formId.c_str())); + if (bResult) { + APP_LOGI("[FMS_performanceTest_0400] CastTempForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400, "true"); + } else { + APP_LOGE("[FMS_performanceTest_0400] CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_0500(std::string data) +{ + std::vector formIds; + formIds.push_back(atoll(g_formId.c_str())); + bool bResult = NotifyVisibleForms(formIds); + if (bResult) { + APP_LOGI("[FMS_performanceTest_0500] NotifyVisibleForms end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500, "true"); + } else { + APP_LOGE("[FMS_performanceTest_0500] NotifyVisibleForms error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_0600(std::string data) +{ + std::vector formIds; + formIds.push_back(atoll(g_formId.c_str())); + bool bResult = NotifyInvisibleForms(formIds); + if (bResult) { + APP_LOGI("[FMS_performanceTest_0600] NotifyInvisibleForms end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600, "true"); + } else { + APP_LOGE("[FMS_performanceTest_0600] NotifyInvisibleForms error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_0700(std::string data) +{ + bool bResult = RequestForm(atoll(g_formId.c_str())); + if (bResult) { + APP_LOGI("[FMS_performanceTest_0700] RequestForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700, "true"); + } else { + APP_LOGE("[FMS_performanceTest_0700] RequestForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 700, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_1300(std::string data) +{ + std::vector formInfos; + bool bResult = GetAllFormsInfo(formInfos); + if (bResult) { + APP_LOGI("[FMS_performanceTest_1300] GetAllFormsInfo end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300, "true"); + } else { + APP_LOGE("[FMS_performanceTest_1300] GetAllFormsInfo error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_1400(std::string data) +{ + std::vector formInfos; + bool bResult = GetFormsInfoByApp(g_bundleName, formInfos); + if (bResult) { + APP_LOGI("[FMS_performanceTest_1400] GetFormsInfoByApp end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400, "true"); + } else { + APP_LOGE("[FMS_performanceTest_1400] GetFormsInfoByApp error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_1500(std::string data) +{ + std::vector formInfos; + bool bResult = GetFormsInfoByModule(g_bundleName, g_moduleName, formInfos); + if (bResult) { + APP_LOGI("[FMS_performanceTest_1500] GetFormsInfoByModule end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500, "true"); + } else { + APP_LOGE("[FMS_performanceTest_1500] GetFormsInfoByModule error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500, "false"); + } +} + +void FormAbilityPerformance::FMS_performanceTest_1600(std::string data) +{ + bool bResult = CheckFMSReady(); + if (bResult) { + APP_LOGI("[FMS_performanceTest_1600] CheckFMSReady end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600, "true"); + } else { + APP_LOGE("[FMS_performanceTest_1600] CheckFMSReady error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600, "false"); + } +} + +void FormAbilityPerformance::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityPerformance::onStart"); + Ability::OnStart(want); +} + +void FormAbilityPerformance::OnActive() +{ + APP_LOGI("FormAbilityPerformance::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityPerformance::OnStop() +{ + APP_LOGI("FormAbilityPerformance::OnStop"); + + Ability::OnStop(); + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +void FormAbilityPerformance::OnInactive() +{ + APP_LOGI("FormAbilityPerformance::OnInactive"); + + Ability::OnInactive(); +} + +void FormAbilityPerformance::OnBackground() +{ + APP_LOGI("FormAbilityPerformance::OnBackground"); + + Ability::OnBackground(); +} + +void FormAbilityPerformance::SubscribeEvent() +{ + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityPerformance::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityPerformance::Init"); + Ability::Init(abilityInfo, application, handler, token); + + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0100] = &FormAbilityPerformance::FMS_performanceTest_0100; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0200] = &FormAbilityPerformance::FMS_performanceTest_0200; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0300] = &FormAbilityPerformance::FMS_performanceTest_0300; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0400] = &FormAbilityPerformance::FMS_performanceTest_0400; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0500] = &FormAbilityPerformance::FMS_performanceTest_0500; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0600] = &FormAbilityPerformance::FMS_performanceTest_0600; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0700] = &FormAbilityPerformance::FMS_performanceTest_0700; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1300] = &FormAbilityPerformance::FMS_performanceTest_1300; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1400] = &FormAbilityPerformance::FMS_performanceTest_1400; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1500] = &FormAbilityPerformance::FMS_performanceTest_1500; + memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1600] = &FormAbilityPerformance::FMS_performanceTest_1600; + + SubscribeEvent(); +} + +void FormAbilityPerformance::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityPerformance::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s, code=%{public}d, data=%{public}s", + data.GetWant().GetAction().c_str(), data.GetCode(), data.GetData().c_str()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityPerformance) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemStress/BUILD.gn b/test/resource/formsystemtestability/fmsSystemStress/BUILD.gn new file mode 100755 index 0000000000..de3f0bad09 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemStress/BUILD.gn @@ -0,0 +1,70 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemStressConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemStress") { + sources = [ + "../tool/src/form_test_utils.cpp", + "src/form_ability_stress.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ ":fmsSystemStressConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/base:base", + "${aafwk_path}/interfaces/innerkits/want:want", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemStress/config.json b/test/resource/formsystemtestability/fmsSystemStress/config.json new file mode 100644 index 0000000000..8124df3ddc --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemStress/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.stress", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.stress.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityStress", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability Stress", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsstresstest", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h b/test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h new file mode 100644 index 0000000000..7e1d2dd3d3 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_STRESS_H_ +#define _FORM_ABILITY_STRESS_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" +#include +#include +#include + +using std::string; + +namespace OHOS { +namespace AppExecFwk { +typedef bool (*FunctionPtr)(); + +class FormEventSubscriber; +class FormAbilityStress : public Ability { +public: + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + // Test case list + void FMS_stressTest_0100(std::string data); + void FMS_stressTest_0100_sub01(std::string form_id); + void FMS_stressTest_0200(std::string data); + void FMS_stressTest_0200_sub01(std::string form_id); + void FMS_stressTest_0200_sub02(std::string form_id); + void FMS_stressTest_0200_sub03(std::string form_id); + void FMS_stressTest_0300(std::string data); + void FMS_stressTest_0300_sub01(std::string form_id); + void FMS_stressTest_0300_sub02(std::string form_id); + void FMS_stressTest_0400(std::string data); + void FMS_stressTest_0500(std::string data); + void FMS_stressTest_0600(std::string data); + void FMS_stressTest_0700(std::string data); + void FMS_stressTest_0800(std::string data); + void FMS_stressTest_0900(std::string data); + void FMS_stressTest_1000(std::string data); + void FMS_stressTest_1100(std::string data); + void FMS_stressTest_1100_sub01(std::string form_id); + void FMS_stressTest_1100_sub02(std::string form_id); + void FMS_stressTest_1100_sub03(std::string form_id); + void FMS_stressTest_1200(std::string data); + void FMS_stressTest_1300(std::string data); + void FMS_stressTest_1300_sub01(std::string form_id); + void FMS_stressTest_1300_sub02(std::string form_id); + void FMS_stressTest_1300_sub03(std::string form_id); + void FMS_stressTest_1400(std::string data); + void FMS_stressTest_1500(std::string data); + void FMS_stressTest_1600(std::string data); + void FMS_stressTest_1700(std::string data); + void FMS_stressTest_1700_sub01(std::string data); + void FMS_stressTest_1700_sub02(std::string data); + void FMS_stressTest_1800(std::string data); + + std::shared_ptr subscriber_; + + class StressFormCallback : public FormCallback { + public: + StressFormCallback(std::string name, int code):caseName_(name), code_(code) { } + virtual ~StressFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilityStress *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + using FormFunc = void (FormAbilityStress::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityStress *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_STRESS_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp b/test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp new file mode 100644 index 0000000000..e4c2aa860e --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp @@ -0,0 +1,630 @@ +/* + * Copyright (c) 2021 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. + */ +#include +#include +#include + +#include "app_log_wrapper.h" +#include "form_ability_stress.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" + +namespace { + using namespace OHOS::AAFwk; + using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_STRESS_TEST_0100, FORM_EVENT_REQ_STRESS_TEST_0100_01, FORM_EVENT_REQ_STRESS_TEST_0200, + FORM_EVENT_REQ_STRESS_TEST_0200_01, FORM_EVENT_REQ_STRESS_TEST_0200_02, FORM_EVENT_REQ_STRESS_TEST_0200_03, + FORM_EVENT_REQ_STRESS_TEST_0300, FORM_EVENT_REQ_STRESS_TEST_0300_01, FORM_EVENT_REQ_STRESS_TEST_0300_02, + FORM_EVENT_REQ_STRESS_TEST_0400, FORM_EVENT_REQ_STRESS_TEST_0500, + FORM_EVENT_REQ_STRESS_TEST_1100, FORM_EVENT_REQ_STRESS_TEST_1100_01, FORM_EVENT_REQ_STRESS_TEST_1100_02, + FORM_EVENT_REQ_STRESS_TEST_1100_03, FORM_EVENT_REQ_STRESS_TEST_1300, FORM_EVENT_REQ_STRESS_TEST_1300_01, + FORM_EVENT_REQ_STRESS_TEST_1300_02, FORM_EVENT_REQ_STRESS_TEST_1300_03, + FORM_EVENT_REQ_STRESS_TEST_1700, FORM_EVENT_REQ_STRESS_TEST_1700_01, FORM_EVENT_REQ_STRESS_TEST_1700_02, + FORM_EVENT_REQ_STRESS_TEST_1800, +}; + +static std::string g_bundleName = "com.form.formsystemtestservicea"; +static std::string g_moduleName = "formmodule001"; +void FormAbilityStress::StressFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); + APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); + APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); + APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); + APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); + APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); + APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", + __func__, formJsInfo.formProviderData.GetDataString().c_str()); + + APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); + + if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0100) { + FormTestUtils::PublishEvent(this->caseName_, 101, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0200) { + FormTestUtils::PublishEvent(this->caseName_, 201, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0200_02) { + FormTestUtils::PublishEvent(this->caseName_, 204, "true"); + ability_->FMS_stressTest_0200_sub03(std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0300) { + FormTestUtils::PublishEvent(this->caseName_, 301, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0400) { + FormTestUtils::PublishEvent(this->caseName_, 401, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1100) { + FormTestUtils::PublishEvent(this->caseName_, 1101, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1300) { + FormTestUtils::PublishEvent(this->caseName_, 1301, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1700) { + FormTestUtils::PublishEvent(this->caseName_, 1701, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1800) { + FormTestUtils::PublishEvent(this->caseName_, 1801, std::to_string(formJsInfo.formId)); + } else { + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, std::to_string(formJsInfo.formId)); + } +} + +void FormAbilityStress::StressFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); + APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); + APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); + APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); + APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); + APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); + APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", + __func__, formJsInfo.formProviderData.GetDataString().c_str()); + + APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); + + if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0100) { + FormTestUtils::PublishEvent(this->caseName_, 102, "true"); + ability_->FMS_stressTest_0100_sub01(std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0200) { + FormTestUtils::PublishEvent(this->caseName_, 202, "true"); + ability_->FMS_stressTest_0200_sub01(std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0300) { + FormTestUtils::PublishEvent(this->caseName_, 302, "true"); + ability_->FMS_stressTest_0300_sub01(std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0400) { + FormTestUtils::PublishEvent(this->caseName_, 402, "true"); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1100) { + FormTestUtils::PublishEvent(this->caseName_, 1102, "true"); + ability_->FMS_stressTest_1100_sub01(std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1300) { + FormTestUtils::PublishEvent(this->caseName_, 1302, "true"); + ability_->FMS_stressTest_1300_sub01(std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1700) { + FormTestUtils::PublishEvent(this->caseName_, 1702, "true"); + } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1800) { + FormTestUtils::PublishEvent(this->caseName_, 1802, "true"); + } else { + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 2, "true"); + } +} + +void FormAbilityStress::StressFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilityStress::FMS_stressTest_0100(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0100, 100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_stressTest_0100] AcquireForm end"); + } else { + APP_LOGE("[FMS_stressTest_0100] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0100, 100, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_0100_sub01(std::string form_id) +{ + bool bResult = DeleteForm(atoll(form_id.c_str())); + if (bResult) { + APP_LOGI("[FMS_stressTest_0100] DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0100_01, 103, "true"); + } else { + APP_LOGE("[FMS_stressTest_0100] DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0100_01, 103, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_0200(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0200, 200); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_stressTest_0200] AcquireForm end"); + } else { + APP_LOGE("[FMS_stressTest_0200] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200, 200, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_0200_sub01(std::string form_id) +{ + bool isReleaseCache = false; + bool bResult = ReleaseForm(atoll(form_id.c_str()), isReleaseCache); + if (bResult) { + APP_LOGI("[FMS_stressTest_0200] ReleaseForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_01, 203, "true"); + } else { + APP_LOGE("[FMS_stressTest_0200] ReleaseForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_01, 203, "false"); + } + + FormAbilityStress::FMS_stressTest_0200_sub02(form_id); +} + +void FormAbilityStress::FMS_stressTest_0200_sub02(std::string form_id) +{ + sleep(3); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0200_02, 204); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(atoll(form_id.c_str()), want, callback); + if (bResult) { + APP_LOGI("[FMS_stressTest_0200] AcquireForm sub02 end"); + } else { + APP_LOGE("[FMS_stressTest_0200] AcquireForm sub02 error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_02, 204, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_0200_sub03(std::string form_id) +{ + bool bResult = DeleteForm(atoll(form_id.c_str())); + if (bResult) { + APP_LOGI("[FMS_stressTest_0200] DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_03, 205, "true"); + } else { + APP_LOGE("[FMS_stressTest_0200] DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_03, 205, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_0300(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0300, 300); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_stressTest_0300] AcquireForm end"); + } else { + APP_LOGE("[FMS_stressTest_0300] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300, 300, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_0300_sub01(std::string form_id) +{ + bool bResult = CastTempForm(atoll(form_id.c_str())); + if (bResult) { + APP_LOGI("[FMS_stressTest_0300] CastTempForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_01, 303, "true"); + } else { + APP_LOGE("[FMS_stressTest_0300] CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_01, 303, "false"); + } + + FormAbilityStress::FMS_stressTest_0300_sub02(form_id); +} + +void FormAbilityStress::FMS_stressTest_0300_sub02(std::string form_id) +{ + bool bResult = DeleteForm(atoll(form_id.c_str())); + if (bResult) { + APP_LOGI("[FMS_stressTest_0300] DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_02, 304, "true"); + } else { + APP_LOGE("[FMS_stressTest_0300] DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_02, 304, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_0400(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_0500(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_0600(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_0700(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_1000(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_1100(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_STRESS_TEST_1100, 1100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_stressTest_1100] AcquireForm end"); + } else { + APP_LOGE("[FMS_stressTest_1100] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100, 1100, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_1100_sub01(std::string form_id) +{ + std::vector formIds; + formIds.push_back(atoll(form_id.c_str())); + bool bResult = NotifyInvisibleForms(formIds); + if (bResult) { + APP_LOGI("[FMS_stressTest_1100] NotifyInvisibleForms end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103, "true"); + } else { + APP_LOGE("[FMS_stressTest_1100] NotifyInvisibleForms error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103, "false"); + } + + FormAbilityStress::FMS_stressTest_1100_sub02(form_id); +} + +void FormAbilityStress::FMS_stressTest_1100_sub02(std::string form_id) +{ + std::vector formIds; + formIds.push_back(atoll(form_id.c_str())); + bool bResult = NotifyVisibleForms(formIds); + if (bResult) { + APP_LOGI("[FMS_stressTest_1100] NotifyVisibleForms end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104, "true"); + } else { + APP_LOGE("[FMS_stressTest_1100] NotifyVisibleForms error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104, "false"); + } + + FormAbilityStress::FMS_stressTest_1100_sub03(form_id); +} + +void FormAbilityStress::FMS_stressTest_1100_sub03(std::string form_id) +{ + bool bResult = DeleteForm(atoll(form_id.c_str())); + if (bResult) { + APP_LOGI("[FMS_stressTest_1100] DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105, "true"); + } else { + APP_LOGE("[FMS_stressTest_1100] DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_1200(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_1300(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_STRESS_TEST_1300, 1300); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_stressTest_1300] AcquireForm end"); + } else { + APP_LOGE("[FMS_stressTest_1300] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300, 1300, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_1300_sub01(std::string form_id) +{ + std::vector formIds; + formIds.push_back(atoll(form_id.c_str())); + bool bResult = EnableUpdateForm(formIds); + if (bResult) { + APP_LOGI("[FMS_stressTest_1300] EnableUpdateForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303, "true"); + } else { + APP_LOGE("[FMS_stressTest_1300] EnableUpdateForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303, "false"); + } + + FormAbilityStress::FMS_stressTest_1300_sub02(form_id); +} + +void FormAbilityStress::FMS_stressTest_1300_sub02(std::string form_id) +{ + std::vector formIds; + formIds.push_back(atoll(form_id.c_str())); + bool bResult = DisableUpdateForm(formIds); + if (bResult) { + APP_LOGI("[FMS_stressTest_1300] DisableUpdateForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304, "true"); + } else { + APP_LOGE("[FMS_stressTest_1300] DisableUpdateForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304, "false"); + } + + FormAbilityStress::FMS_stressTest_1300_sub03(form_id); +} + +void FormAbilityStress::FMS_stressTest_1300_sub03(std::string form_id) +{ + bool bResult = DeleteForm(atoll(form_id.c_str())); + if (bResult) { + APP_LOGI("[FMS_stressTest_1300] DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305, "true"); + } else { + APP_LOGE("[FMS_stressTest_1300] DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_1400(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_1500(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_1600(std::string data) +{ +} + +void FormAbilityStress::FMS_stressTest_1700(std::string data) +{ + std::vector formInfos; + bool bResult = GetAllFormsInfo(formInfos); + if (bResult) { + APP_LOGI("[FMS_stressTest_1700] GetAllFormsInfo end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700, 1700, "true"); + } else { + APP_LOGE("[FMS_stressTest_1700] GetAllFormsInfo error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700, 1700, "false"); + } + + FormAbilityStress::FMS_stressTest_1700_sub01(data); +} + +void FormAbilityStress::FMS_stressTest_1700_sub01(std::string data) +{ + std::vector formInfos; + bool bResult = GetFormsInfoByApp(g_bundleName, formInfos); + if (bResult) { + APP_LOGI("[FMS_stressTest_1700] GetFormsInfoByApp end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701, "true"); + } else { + APP_LOGE("[FMS_stressTest_1700] GetFormsInfoByApp error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701, "false"); + } + + FormAbilityStress::FMS_stressTest_1700_sub02(data); +} + +void FormAbilityStress::FMS_stressTest_1700_sub02(std::string data) +{ + std::vector formInfos; + bool bResult = GetFormsInfoByModule(g_bundleName, g_moduleName, formInfos); + if (bResult) { + APP_LOGI("[FMS_stressTest_1700] GetFormsInfoByModule end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702, "true"); + } else { + APP_LOGE("[FMS_stressTest_1700] GetFormsInfoByModule error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702, "false"); + } +} + +void FormAbilityStress::FMS_stressTest_1800(std::string data) +{ + bool bResult = CheckFMSReady(); + if (bResult) { + APP_LOGI("[FMS_stressTest_1800] CheckFMSReady end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1800, 1800, "true"); + } else { + APP_LOGE("[FMS_stressTest_1800] CheckFMSReady error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1800, 1800, "false"); + } +} + +void FormAbilityStress::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityStress::onStart"); + Ability::OnStart(want); +} + +void FormAbilityStress::OnActive() +{ + APP_LOGI("FormAbilityStress::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityStress::OnStop() +{ + APP_LOGI("FormAbilityStress::OnStop"); + + Ability::OnStop(); + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +void FormAbilityStress::OnInactive() +{ + APP_LOGI("FormAbilityStress::OnInactive"); + + Ability::OnInactive(); +} + +void FormAbilityStress::OnBackground() +{ + APP_LOGI("FormAbilityStress::OnBackground"); + + Ability::OnBackground(); +} + +void FormAbilityStress::SubscribeEvent() +{ + APP_LOGI("FormAbilityStress::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityStress::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityStress::Init"); + Ability::Init(abilityInfo, application, handler, token); + + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0100] = &FormAbilityStress::FMS_stressTest_0100; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0100_01] = &FormAbilityStress::FMS_stressTest_0100_sub01; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200] = &FormAbilityStress::FMS_stressTest_0200; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200_01] = &FormAbilityStress::FMS_stressTest_0200_sub01; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200_02] = &FormAbilityStress::FMS_stressTest_0200_sub02; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200_03] = &FormAbilityStress::FMS_stressTest_0200_sub03; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0300] = &FormAbilityStress::FMS_stressTest_0300; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0300_01] = &FormAbilityStress::FMS_stressTest_0300_sub01; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0300_02] = &FormAbilityStress::FMS_stressTest_0300_sub02; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0400] = &FormAbilityStress::FMS_stressTest_0400; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0500] = &FormAbilityStress::FMS_stressTest_0500; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100] = &FormAbilityStress::FMS_stressTest_1100; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100_01] = &FormAbilityStress::FMS_stressTest_1100_sub01; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100_02] = &FormAbilityStress::FMS_stressTest_1100_sub02; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100_03] = &FormAbilityStress::FMS_stressTest_1100_sub03; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300] = &FormAbilityStress::FMS_stressTest_1300; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300_01] = &FormAbilityStress::FMS_stressTest_1300_sub01; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300_02] = &FormAbilityStress::FMS_stressTest_1300_sub02; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300_03] = &FormAbilityStress::FMS_stressTest_1300_sub03; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1700] = &FormAbilityStress::FMS_stressTest_1700; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1700_01] = &FormAbilityStress::FMS_stressTest_1700_sub01; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1700_02] = &FormAbilityStress::FMS_stressTest_1700_sub02; + memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1800] = &FormAbilityStress::FMS_stressTest_1800; + + SubscribeEvent(); +} + +void FormAbilityStress::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityStress::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s, code=%{public}d, data=%{public}s", + data.GetWant().GetAction().c_str(), data.GetCode(), data.GetData().c_str()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityStress) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonA/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/BUILD.gn new file mode 100644 index 0000000000..d68dd6133b --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/BUILD.gn @@ -0,0 +1,80 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestHostCommonAConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestHostCommonA") { + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "../tool/src/form_test_utils.cpp", + "src/form_ability_commona.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ + ":fmsSystemTestHostCommonAConfig", + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonA/config.json b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/config.json new file mode 100644 index 0000000000..81bf59d215 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.commona", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.commona.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityCommonA", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonA/include/form_ability_commona.h b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/include/form_ability_commona.h new file mode 100644 index 0000000000..89ae25797a --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/include/form_ability_commona.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_COMMONA_H_ +#define _FORM_ABILITY_COMMONA_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriberForCommonA; +class FormAbilityCommonA : public Ability { +public: + ~FormAbilityCommonA(); + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + void FMS_acquireForm(std::string data); + void FMS_deleteForm(std::string data); + void FMS_acquireForm_batch(std::string data); + void FMS_deleteFormBatch(std::string data); + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback() + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; + + using FormFunc = void (FormAbilityCommonA::*)(std::string data); + std::map memberFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriberForCommonA : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriberForCommonA(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriberForCommonA() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityCommonA *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_COMMONA_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp new file mode 100644 index 0000000000..e13edecc50 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_commona.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" +#include "system_test_form_util.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_ONE_NORMAL_FORM, + FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, + FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, + FORM_EVENT_REQ_CLEAR_FORM_BATCH +}; +void FormAbilityCommonA::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called[%{public}s]", __func__, std::to_string(formJsInfo.formId).c_str()); +} +void FormAbilityCommonA::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100, std::to_string(formJsInfo.formId)); +} + +void FormAbilityCommonA::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +// Create one form(temp/normal) +void FormAbilityCommonA::FMS_acquireForm(std::string data) +{ + APP_LOGI("%{public}s called, data: %{public}s", __func__, data.c_str()); + std::shared_ptr callback = std::make_shared(); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + if (data == "true") { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + } else { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + } + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[form_ability_commonA]AcquireForm end"); + } else { + APP_LOGE("[form_ability_commonA]AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100, ""); + } +} +void FormAbilityCommonA::FMS_deleteForm(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, "false"); + } +} +void FormAbilityCommonA::FMS_acquireForm_batch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "false"); + } +} +void FormAbilityCommonA::FMS_deleteFormBatch(std::string strFormId) +{ + APP_LOGI("%{public}s called", __func__); + int result = STtools::SystemTestFormUtil::ClearFormRecords(); + if (result == ERR_OK) { + APP_LOGI("Clear form records end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "true"); + } else { + APP_LOGE("Clear form records error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "false"); + } +} +FormAbilityCommonA::~FormAbilityCommonA() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} +void FormAbilityCommonA::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityCommonA::onStart"); + Ability::OnStart(want); +} +void FormAbilityCommonA::OnActive() +{ + APP_LOGI("FormAbilityCommonA::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityCommonA::OnStop() +{ + APP_LOGI("FormAbilityCommonA::OnStop"); + + Ability::OnStop(); +} +void FormAbilityCommonA::OnInactive() +{ + APP_LOGI("FormAbilityCommonA::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityCommonA::OnBackground() +{ + APP_LOGI("FormAbilityCommonA::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityCommonA::SubscribeEvent() +{ + APP_LOGI("FormAbilityCommonA::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityCommonA::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityCommonA::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_ONE_NORMAL_FORM] = &FormAbilityCommonA::FMS_acquireForm; + memberFuncMap_[FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL] = &FormAbilityCommonA::FMS_deleteForm; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_BATCH] = &FormAbilityCommonA::FMS_acquireForm_batch; + memberFuncMap_[FORM_EVENT_REQ_CLEAR_FORM_BATCH] = &FormAbilityCommonA::FMS_deleteFormBatch; + SubscribeEvent(); +} + +void FormAbilityCommonA::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormEventSubscriberForCommonA::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriberForCommonA::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("KitTestEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str()); + APP_LOGI("FormEventSubscriberForCommonA::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + if (eventName == FORM_EVENT_REQ_ONE_NORMAL_FORM && data.GetCode() == EVENT_CODE_100) { + return; + } + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriberForCommonA::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityCommonA) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonB/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/BUILD.gn new file mode 100644 index 0000000000..2d93b79c14 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/BUILD.gn @@ -0,0 +1,80 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestHostCommonBConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestHostCommonB") { + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "../tool/src/form_test_utils.cpp", + "src/form_ability_commonb.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ + ":fmsSystemTestHostCommonBConfig", + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonB/config.json b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/config.json new file mode 100644 index 0000000000..052634ce88 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.commonb", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.commonb.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityCommonB", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonB/include/form_ability_commonb.h b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/include/form_ability_commonb.h new file mode 100644 index 0000000000..fcce3fb32c --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/include/form_ability_commonb.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_COMMONB_H_ +#define _FORM_ABILITY_COMMONB_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriberForCommonB; +class FormAbilityCommonB : public Ability { +public: + ~FormAbilityCommonB(); + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + void FMS_acquireForm(std::string data); + void FMS_deleteForm(std::string data); + void FMS_acquireForm_batch(std::string data); + void FMS_deleteFormBatch(std::string data); + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback() + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; + + using FormFunc = void (FormAbilityCommonB::*)(std::string data); + std::map memberFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriberForCommonB : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriberForCommonB(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriberForCommonB() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityCommonB *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_COMMONB_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp new file mode 100644 index 0000000000..1eb64bf8aa --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_commonb.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" +#include "system_test_form_util.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_ONE_NORMAL_FORM_B, + FORM_EVENT_REQ_ONE_NORMAL_FORM_B_DEL, + FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, + FORM_EVENT_REQ_CLEAR_FORM_BATCH +}; +void FormAbilityCommonB::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called[%{public}s]", __func__, std::to_string(formJsInfo.formId).c_str()); +} +void FormAbilityCommonB::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM_B, EVENT_CODE_100, std::to_string(formJsInfo.formId)); +} + +void FormAbilityCommonB::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +// Create one form(temp/normal) +void FormAbilityCommonB::FMS_acquireForm(std::string data) +{ + APP_LOGI("%{public}s called, data: %{public}s", __func__, data.c_str()); + std::shared_ptr callback = std::make_shared(); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + if (data == "true") { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + } else { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + } + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[form_ability_commonB]AcquireForm end"); + } else { + APP_LOGE("[form_ability_commonB]AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM_B, EVENT_CODE_100, ""); + } +} +void FormAbilityCommonB::FMS_acquireForm_batch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "false"); + } +} +void FormAbilityCommonB::FMS_deleteFormBatch(std::string strFormId) +{ + APP_LOGI("%{public}s called", __func__); + int result = STtools::SystemTestFormUtil::ClearFormRecords(); + if (result == ERR_OK) { + APP_LOGI("Clear form records end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "true"); + } else { + APP_LOGE("Clear form records error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "false"); + } +} +void FormAbilityCommonB::FMS_deleteForm(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM_B_DEL, EVENT_CODE_101, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ONE_NORMAL_FORM_B_DEL, EVENT_CODE_101, "false"); + } +} +FormAbilityCommonB::~FormAbilityCommonB() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} +void FormAbilityCommonB::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityCommonB::onStart"); + Ability::OnStart(want); +} +void FormAbilityCommonB::OnActive() +{ + APP_LOGI("FormAbilityCommonB::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityCommonB::OnStop() +{ + APP_LOGI("FormAbilityCommonB::OnStop"); + + Ability::OnStop(); +} +void FormAbilityCommonB::OnInactive() +{ + APP_LOGI("FormAbilityCommonB::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityCommonB::OnBackground() +{ + APP_LOGI("FormAbilityCommonB::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityCommonB::SubscribeEvent() +{ + APP_LOGI("FormAbilityCommonB::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityCommonB::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityCommonB::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_ONE_NORMAL_FORM_B] = &FormAbilityCommonB::FMS_acquireForm; + memberFuncMap_[FORM_EVENT_REQ_ONE_NORMAL_FORM_B_DEL] = &FormAbilityCommonB::FMS_deleteForm; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_BATCH] = &FormAbilityCommonB::FMS_acquireForm_batch; + memberFuncMap_[FORM_EVENT_REQ_CLEAR_FORM_BATCH] = &FormAbilityCommonB::FMS_deleteFormBatch; + SubscribeEvent(); +} + +void FormAbilityCommonB::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormEventSubscriberForCommonB::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriberForCommonB::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("KitTestEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str()); + APP_LOGI("FormEventSubscriberForCommonB::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriberForCommonB::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityCommonB) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/BUILD.gn new file mode 100755 index 0000000000..bc1f36c5a3 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/BUILD.gn @@ -0,0 +1,70 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestHostNoPermConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestHostNoPerm") { + sources = [ + "../tool/src/form_test_utils.cpp", + "src/form_ability_no_perm.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ ":fmsSystemTestHostNoPermConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/base:base", + "${aafwk_path}/interfaces/innerkits/want:want", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/config.json b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/config.json new file mode 100644 index 0000000000..662ab9e31a --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/config.json @@ -0,0 +1,60 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.nopermission", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.nopermission.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityNoPerm", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/include/form_ability_no_perm.h b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/include/form_ability_no_perm.h new file mode 100644 index 0000000000..4e4fc48d4b --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/include/form_ability_no_perm.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_NO_PERM_H_ +#define _FORM_ABILITY_NO_PERM_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriber; +class FormAbilityNoPerm : public Ability { +public: + void SubscribeEvent(const std::vector &eventList); + void handleEvent(std::string action); + + void FMS_acquireForm_0200(); + void FMS_deleteForm_0200(); + void FMS_releaseForm_0200(); + + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback(std::string name):caseName_(name) + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + + using FormFunc = void (FormAbilityNoPerm::*)(); + std::map memberFuncMap_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityNoPerm *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_NO_PERM_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/src/form_ability_no_perm.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/src/form_ability_no_perm.cpp new file mode 100644 index 0000000000..c0bab3eab5 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNoPerm/src/form_ability_no_perm.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_no_perm.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +void FormAbilityNoPerm::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityNoPerm::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityNoPerm::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilityNoPerm::FMS_acquireForm_0200() +{ + std::shared_ptr callback = std::make_shared("FMS_acquireForm_0200"); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_0200, EVENT_CODE_200, "false"); + } +} + +void FormAbilityNoPerm::FMS_deleteForm_0200() +{ + int64_t formId = 1; + bool bResult = DeleteForm(formId); + if (bResult) { + APP_LOGI("[FMS_deleteForm_0200] end"); + } else { + APP_LOGE("[FMS_deleteForm_0200] error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0200, EVENT_CODE_200, "false"); + } +} + +void FormAbilityNoPerm::FMS_releaseForm_0200() +{ + int64_t formId = 1; + bool isReleaseCache = true; + bool bResult = ReleaseForm(formId, isReleaseCache); + if (bResult) { + APP_LOGI("[FMS_releaseForm_0200] end"); + } else { + APP_LOGE("[FMS_releaseForm_0200] error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0200, EVENT_CODE_200, "false"); + } +} + + +void FormAbilityNoPerm::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityNoPerm::onStart"); + Ability::OnStart(want); + + std::vector eventList = { + FORM_EVENT_REQ_ACQUIRE_FORM_0200, + FORM_EVENT_REQ_DELETE_FORM_0200, + FORM_EVENT_REQ_RELEASE_FORM_0200, + }; + SubscribeEvent(eventList); +} +void FormAbilityNoPerm::OnActive() +{ + APP_LOGI("FormAbilityNoPerm::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityNoPerm::OnStop() +{ + APP_LOGI("FormAbilityNoPerm::OnStop"); + + Ability::OnStop(); +} +void FormAbilityNoPerm::OnInactive() +{ + APP_LOGI("FormAbilityNoPerm::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityNoPerm::OnBackground() +{ + APP_LOGI("FormAbilityNoPerm::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityNoPerm::SubscribeEvent(const std::vector &eventList) +{ + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityNoPerm::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityNoPerm::Init"); + Ability::Init(abilityInfo, application, handler, token); + + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_0200] = &FormAbilityNoPerm::FMS_acquireForm_0200; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0200] = &FormAbilityNoPerm::FMS_deleteForm_0200; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0200] = &FormAbilityNoPerm::FMS_releaseForm_0200; +} + +void FormAbilityNoPerm::handleEvent(std::string action) +{ + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(); + } + } +} + +void FormAbilityNoPerm::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("FormEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityNoPerm) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestHostNormal/BUILD.gn new file mode 100755 index 0000000000..97f7b4d475 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/BUILD.gn @@ -0,0 +1,82 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestHostNormalConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestHostNormal") { + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "../tool/src/form_test_utils.cpp", + "src/form_ability_a.cpp", + "src/form_ability_deleteform.cpp", + "src/form_ability_releaseform.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ + ":fmsSystemTestHostNormalConfig", + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/config.json b/test/resource/formsystemtestability/fmsSystemTestHostNormal/config.json new file mode 100644 index 0000000000..e3ec3c806a --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/config.json @@ -0,0 +1,122 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.normal", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.normal.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityA", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }, + { + "name": "FormAbilityDeleteForm", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }, + { + "name": "FormAbilityReleaseForm", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h new file mode 100644 index 0000000000..975d137a16 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_A_H_ +#define _FORM_ABILITY_A_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriber; +class FormAbilityA : public Ability { +public: + ~FormAbilityA(); + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + void FMS_deleteFormCommon(std::string strFormId); + + void FMS_acquireForm_0300(std::string data); + void FMS_acquireForm_0400(std::string data); + void FMS_acquireForm_0500(std::string data); + void FMS_acquireForm_0600(std::string data); + void FMS_acquireForm_0700(std::string data); + void FMS_acquireForm_1000(std::string data); + void FMS_acquireForm_1100(std::string data); + void FMS_acquireForm_1200(std::string data); + void FMS_acquireForm_1500_1(std::string data); + void FMS_acquireForm_1600(std::string data); + void FMS_acquireForm_1600_1(std::string data); + void FMS_acquireForm_1800(std::string data); + void FMS_acquireForm_1800_1(std::string data); + void FMS_acquireForm_1900(std::string data); + void FMS_acquireForm_2100(std::string data); + void FMS_acquireForm_2200(std::string data); + void FMS_acquireForm_2300(std::string data); + void FMS_acquireForm_2400(std::string data); + void FMS_acquireForm_2500(std::string data); + void FMS_acquireForm_2600(std::string data); + void FMS_acquireForm_2600_1(std::string data); + void FMS_acquireForm_2700(std::string data); + void FMS_acquireForm_2800(std::string data); + void FMS_acquireForm_2900(std::string data); + void FMS_acquireForm_2900_1(std::string data); + void FMS_acquireForm_3000(std::string data); + void FMS_acquireForm_3100(std::string data); + void FMS_acquireForm_3300(std::string data); + void FMS_acquireForm_3400(std::string data); + void FMS_acquireForm_3500(std::string data); + void FMS_acquireForm_tempForm(std::string data); + void FMS_acquireFormBatch(std::string data); + void FMS_acquireFormBatchB(std::string data); + void FMS_acquireFormTempBatch(std::string data); + void FMS_deleteFormBatch(std::string strFormId); + + + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback(std::string name, int code):caseName_(name), code_(code) + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilityA *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + + using FormFunc = void (FormAbilityA::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityA *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_A_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_deleteform.h b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_deleteform.h new file mode 100644 index 0000000000..9af88ac6a1 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_deleteform.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_DELETEFORM_H_ +#define _FORM_ABILITY_DELETEFORM_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriberForDeleteForm; +class FormAbilityDeleteForm : public Ability { +public: + void SubscribeEvent(const std::vector &eventList); + void handleEvent(std::string action, std::string data); + void FMS_deleteForm_common(int64_t formId, std::string caseName); + void FMS_deleteForm_0300(std::string data); + void FMS_deleteForm_0400(std::string data); + void FMS_deleteForm_0500(std::string data); + void FMS_deleteForm_0600(std::string data); + void FMS_deleteForm_0700(std::string data); + void FMS_deleteForm_0800(std::string data); + void FMS_deleteForm_0900(std::string data); + void FMS_deleteForm_1000(std::string data); + void FMS_deleteForm_1100(std::string data); + void FMS_deleteForm_1200(std::string data); + void FMS_deleteForm_1201(std::string data); + void FMS_deleteForm_1400(std::string data); + void FMS_deleteForm_1401(std::string data); + void FMS_deleteForm_1500(std::string data); + void FMS_deleteForm_1501(std::string data); + void FMS_deleteForm_1502(std::string data); + void FMS_deleteForm_1600(std::string data); + void FMS_deleteForm_1601(std::string data); + void FMS_deleteForm_1602(std::string data); + void FMS_deleteForm_1700(std::string data); + void FMS_deleteForm_1701(std::string data); + void FMS_deleteForm_1702(std::string data); + void FMS_acquire_tempForm_batch(std::string data); + void FMS_acquireForm_batch(std::string data); + void FMS_deleteFormBatch(std::string data); + + std::shared_ptr subscriber_; + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback(std::string name):caseName_(name) + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + FormAbilityDeleteForm *ability_; + std::string caseName_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(std::string case_id, int64_t form_id); + void DeleteForm_0300(int64_t form_id); + void DeleteForm_0400(int64_t form_id); + void DeleteForm_0500(int64_t form_id); + void DeleteForm_0600(int64_t form_id); + void DeleteForm_0700(int64_t form_id); + void DeleteForm_0800(int64_t form_id); + void DeleteForm_0900(int64_t form_id); + void DeleteForm_1000(int64_t form_id); + void DeleteForm_1100(int64_t form_id); + void DeleteForm_1200(int64_t form_id); + void DeleteForm_1400(int64_t form_id); + void DeleteForm_1500(int64_t form_id); + void DeleteForm_1501(int64_t form_id); + void DeleteForm_1600(int64_t form_id); + void DeleteForm_1601(int64_t form_id); + void DeleteForm_1700(int64_t form_id); + void DeleteForm_1701(int64_t form_id); + + using FormFunc = void (FormAbilityDeleteForm::*)(std::string data); + std::map memberFuncMap_; + std::shared_ptr callback_; +}; +class FormEventSubscriberForDeleteForm : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriberForDeleteForm(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriberForDeleteForm() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityDeleteForm *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_DELETEFORM_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_releaseform.h b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_releaseform.h new file mode 100644 index 0000000000..a596482858 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_releaseform.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_RELEASEFORM_H_ +#define _FORM_ABILITY_RELEASEFORM_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriberForReleaseForm; +class FormAbilityReleaseForm : public Ability { +public: + void SubscribeEvent(const std::vector &eventList); + void handleEvent(std::string action, std::string data); + void FMS_releaseForm_common(int64_t formId, std::string caseName, std::string lastFormId); + void FMS_releaseForm_0300(std::string data); + void FMS_releaseForm_0400(std::string data); + void FMS_releaseForm_0500(std::string data); + void FMS_releaseForm_0600(std::string data); + void FMS_releaseForm_0700(std::string data); + void FMS_releaseForm_0800(std::string data); + void FMS_releaseForm_0900(std::string data); + void FMS_releaseForm_1000(std::string data); + void FMS_releaseForm_1100(std::string data); + void FMS_releaseForm_1200(std::string data); + void FMS_releaseForm_1300(std::string data); + void FMS_releaseForm_1400(std::string data); + void FMS_releaseForm_common_del(std::string data); + void Clear(std::string case_id, int64_t form_id); + + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback(std::string name, std::string id):caseName_(name), lastformId_(id) + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + FormAbilityReleaseForm *ability_; + std::string caseName_; + std::string lastformId_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void ReleaseForm_0300(int64_t form_id); + void ReleaseForm_0400(int64_t form_id); + void ReleaseForm_0500(int64_t form_id); + void ReleaseForm_0600(int64_t form_id); + void ReleaseForm_0700(int64_t form_id); + void ReleaseForm_0800(int64_t form_id); + void ReleaseForm_0900(int64_t form_id); + void ReleaseForm_1000(int64_t form_id); + void ReleaseForm_1100(int64_t form_id); + void ReleaseForm_1200(int64_t form_id); + void ReleaseForm_1300(int64_t form_id, std::string lastFormId); + void ReleaseForm_1400(int64_t form_id); + + using FormFunc = void (FormAbilityReleaseForm::*)(std::string data); + std::map memberFuncMap_; + std::shared_ptr callback_; +}; +class FormEventSubscriberForReleaseForm : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriberForReleaseForm(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriberForReleaseForm() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityReleaseForm *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_RELEASEFORM_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp new file mode 100644 index 0000000000..7fed60a204 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp @@ -0,0 +1,904 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_a.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" +#include "system_test_form_util.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_DELETE_FORM_COMMON, FORM_EVENT_REQ_ACQUIRE_FORM_TEMP, + FORM_EVENT_REQ_ACQUIRE_FORM_0300, FORM_EVENT_REQ_ACQUIRE_FORM_0400, FORM_EVENT_REQ_ACQUIRE_FORM_0500, + FORM_EVENT_REQ_ACQUIRE_FORM_0600, FORM_EVENT_REQ_ACQUIRE_FORM_0700, FORM_EVENT_REQ_ACQUIRE_FORM_1000, + FORM_EVENT_REQ_ACQUIRE_FORM_1100, FORM_EVENT_REQ_ACQUIRE_FORM_1200, FORM_EVENT_REQ_ACQUIRE_FORM_1500_1, + FORM_EVENT_REQ_ACQUIRE_FORM_1600, FORM_EVENT_REQ_ACQUIRE_FORM_1600_1, FORM_EVENT_REQ_ACQUIRE_FORM_1800, + FORM_EVENT_REQ_ACQUIRE_FORM_1800_1, FORM_EVENT_REQ_ACQUIRE_FORM_1900, FORM_EVENT_REQ_ACQUIRE_FORM_2400, + FORM_EVENT_REQ_ACQUIRE_FORM_2100, FORM_EVENT_REQ_ACQUIRE_FORM_2200, FORM_EVENT_REQ_ACQUIRE_FORM_2300, + FORM_EVENT_REQ_ACQUIRE_FORM_2500, FORM_EVENT_REQ_ACQUIRE_FORM_2600, FORM_EVENT_REQ_ACQUIRE_FORM_2600_1, + FORM_EVENT_REQ_ACQUIRE_FORM_2700, FORM_EVENT_REQ_ACQUIRE_FORM_2800, FORM_EVENT_REQ_ACQUIRE_FORM_2900, + FORM_EVENT_REQ_ACQUIRE_FORM_2900_1, FORM_EVENT_REQ_ACQUIRE_FORM_3000, FORM_EVENT_REQ_ACQUIRE_FORM_3100, + FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, FORM_EVENT_REQ_CLEAR_FORM_BATCH, + FORM_EVENT_REQ_ACQUIRE_FORM_BATCH_B, +}; +void FormAbilityA::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(this->caseName_, this->code_, std::to_string(formJsInfo.formId)); +} +void FormAbilityA::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, formJsInfo.formData); + + if (this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1200 + || this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1600 + || this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1600_1 + || this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1800 + || this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1800_1 + || this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1900) { + std::string strFormId = std::to_string(formJsInfo.formId); + APP_LOGI("%{public}s, delete form, formId: %{public}s", __func__, strFormId.c_str()); + ability_->FMS_deleteFormCommon(strFormId); + } +} + +void FormAbilityA::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityA::FMS_deleteFormCommon(std::string strFormId) +{ + APP_LOGI("%{public}s called, formId: %{public}s", __func__, strFormId.c_str()); + if (strFormId.empty()) { + APP_LOGE("DeleteForm error, formId is 0"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "false"); + return; + } + int64_t formId = std::stoll(strFormId); + sleep(1); + bool bResult = DeleteForm(formId); + sleep(1); + if (bResult) { + APP_LOGI("DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "true"); + } else { + APP_LOGE("DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "false"); + } +} + +void FormAbilityA::FMS_acquireForm_0300(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_0300, EVENT_CODE_300); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(-1, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_0300, EVENT_CODE_300, "false"); + } +} +void FormAbilityA::FMS_acquireForm_0400(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_0400, EVENT_CODE_400); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, "com.form.bundlename99", FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_0400, EVENT_CODE_400, "false"); + } +} +void FormAbilityA::FMS_acquireForm_0500(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_0500, EVENT_CODE_500); + // Set Want info begin + std::string moduleName = "moduleName99"; + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, moduleName); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_0500, EVENT_CODE_500, "false"); + } +} +void FormAbilityA::FMS_acquireForm_0600(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_0600, EVENT_CODE_600); + // Set Want info begin + std::string formName = "formName999"; + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, formName); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_0600, EVENT_CODE_600, "false"); + } +} +void FormAbilityA::FMS_acquireForm_0700(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_0700, EVENT_CODE_700); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, "abilityName9"); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_0700, EVENT_CODE_700, "false"); + } +} +void FormAbilityA::FMS_acquireForm_1000(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1000, EVENT_CODE_1000); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, 0); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1000, EVENT_CODE_1000, "false"); + } +} +void FormAbilityA::FMS_acquireForm_1100(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1100, EVENT_CODE_1100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1100, EVENT_CODE_1100, ""); + } +} +void FormAbilityA::FMS_acquireForm_1200(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1200, EVENT_CODE_1200); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME2); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME2); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME2, FORM_PROVIDER_ABILITY_NAME2); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1200, EVENT_CODE_1200, ""); + } +} + +void FormAbilityA::FMS_acquireForm_1500_1(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1500_1, EVENT_CODE_1510); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1500_1, EVENT_CODE_1510, ""); + } +} + +void FormAbilityA::FMS_acquireForm_1600(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1600, EVENT_CODE_1600); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1600, EVENT_CODE_1600, ""); + } +} +void FormAbilityA::FMS_acquireForm_1600_1(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1600_1, EVENT_CODE_1610); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1600_1, EVENT_CODE_1610, ""); + } +} +void FormAbilityA::FMS_acquireForm_1800(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1800, EVENT_CODE_1800); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1800, EVENT_CODE_1800, ""); + } +} +void FormAbilityA::FMS_acquireForm_1800_1(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1800_1, EVENT_CODE_1810); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1800_1, EVENT_CODE_1810, ""); + } +} +void FormAbilityA::FMS_acquireForm_1900(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1900, EVENT_CODE_1900); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1900, EVENT_CODE_1900, ""); + } +} +void FormAbilityA::FMS_acquireForm_2100(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2100, EVENT_CODE_2100); + callback->ability_ = this; + // Set Want info begin + int64_t formId = std::stoll(data); + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(formId, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2100, EVENT_CODE_2100, "false"); + } +} +void FormAbilityA::FMS_acquireForm_2200(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2200, EVENT_CODE_2200); + + // Set Want info end + bool bResult = CastTempForm(-1); + if (bResult) { + APP_LOGI("CastTempForm end"); + } else { + APP_LOGE("CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2200, EVENT_CODE_2200, "false"); + } +} +void FormAbilityA::FMS_acquireForm_2300(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2300, EVENT_CODE_2300); + + // Set Want info end + bool bResult = CastTempForm(0); + if (bResult) { + APP_LOGI("CastTempForm end"); + } else { + APP_LOGE("CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2300, EVENT_CODE_2300, "false"); + } +} +void FormAbilityA::FMS_acquireForm_2400(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2400, EVENT_CODE_2400); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2400, EVENT_CODE_2400, ""); + } +} + +void FormAbilityA::FMS_acquireForm_2500(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2500, EVENT_CODE_2500); + + // Set Want info end + bool bResult = CastTempForm(EVENT_CODE_1234); + if (bResult) { + APP_LOGI("CastTempForm end"); + } else { + APP_LOGE("CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2500, EVENT_CODE_2500, "false"); + } +} +void FormAbilityA::FMS_acquireForm_2600_1(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2600_1, EVENT_CODE_2610); + + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2600_1, EVENT_CODE_2610, ""); + } +} + +void FormAbilityA::FMS_acquireForm_2600(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2600, EVENT_CODE_2600); + callback->ability_ = this; + // Set Want info end + int64_t formId = std::stoll(data); + bool bResult = CastTempForm(formId); + if (bResult) { + APP_LOGI("CastTempForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2600, EVENT_CODE_2600, "true"); + } else { + APP_LOGE("CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2600, EVENT_CODE_2600, "false"); + } + + FMS_deleteFormCommon(data); +} + +void FormAbilityA::FMS_acquireForm_2700(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2700, EVENT_CODE_2700); + + // Set Want info end + int64_t formId = std::stoll(data); + bool bResult = CastTempForm(formId); + if (bResult) { + APP_LOGI("CastTempForm end"); + } else { + APP_LOGE("CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2700, EVENT_CODE_2700, "false"); + } + + FMS_deleteFormCommon(data); +} +void FormAbilityA::FMS_acquireForm_2800(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2800, EVENT_CODE_2800); + + // Set Want info end + int64_t formId = std::stoll(data); + bool bResult = CastTempForm(formId); + if (bResult) { + APP_LOGI("CastTempForm end"); + } else { + APP_LOGE("CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2800, EVENT_CODE_2800, "false"); + } + + FMS_deleteFormCommon(data); +} +void FormAbilityA::FMS_acquireForm_2900(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2900); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2900, ""); + } +} + +void FormAbilityA::FMS_acquireForm_2900_1(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME2); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME2); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME2, FORM_PROVIDER_ABILITY_NAME2); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910, ""); + } +} +void FormAbilityA::FMS_acquireForm_3000(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_3000, EVENT_CODE_3000); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_3000, EVENT_CODE_3000, "false"); + } +} +void FormAbilityA::FMS_acquireForm_3100(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100, ""); + } +} + +void FormAbilityA::FMS_acquireForm_3300(std::string data) +{ +} +void FormAbilityA::FMS_acquireForm_3400(std::string data) +{ +} +void FormAbilityA::FMS_acquireForm_3500(std::string data) +{ +} + +void FormAbilityA::FMS_acquireForm_tempForm(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); + + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP, ""); + } +} +void FormAbilityA::FMS_acquireFormBatch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "false"); + } +} + +void FormAbilityA::FMS_acquireFormBatchB(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME2); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME2); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME2, FORM_PROVIDER_ABILITY_NAME2); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH_B, EVENT_CODE_BATCH_B, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH_B, EVENT_CODE_BATCH_B, "false"); + } +} +void FormAbilityA::FMS_acquireFormTempBatch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add temp form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "true"); + } else { + APP_LOGE("Batch add temp form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "false"); + } +} +void FormAbilityA::FMS_deleteFormBatch(std::string strFormId) +{ + APP_LOGI("%{public}s called", __func__); + int result = STtools::SystemTestFormUtil::ClearFormRecords(); + if (result == ERR_OK) { + APP_LOGI("Clear form records end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "true"); + } else { + APP_LOGE("Clear form records error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "false"); + } +} +FormAbilityA::~FormAbilityA() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} +void FormAbilityA::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityA::onStart"); + Ability::OnStart(want); +} +void FormAbilityA::OnActive() +{ + APP_LOGI("FormAbilityA::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityA::OnStop() +{ + APP_LOGI("FormAbilityA::OnStop"); + + Ability::OnStop(); +} +void FormAbilityA::OnInactive() +{ + APP_LOGI("FormAbilityA::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityA::OnBackground() +{ + APP_LOGI("FormAbilityA::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityA::SubscribeEvent() +{ + APP_LOGI("FormAbilityA::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityA::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityA::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_0300] = &FormAbilityA::FMS_acquireForm_0300; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_0400] = &FormAbilityA::FMS_acquireForm_0400; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_0500] = &FormAbilityA::FMS_acquireForm_0500; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_0600] = &FormAbilityA::FMS_acquireForm_0600; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_0700] = &FormAbilityA::FMS_acquireForm_0700; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1000] = &FormAbilityA::FMS_acquireForm_1000; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1100] = &FormAbilityA::FMS_acquireForm_1100; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1200] = &FormAbilityA::FMS_acquireForm_1200; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1500_1] = &FormAbilityA::FMS_acquireForm_1500_1; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1600] = &FormAbilityA::FMS_acquireForm_1600; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1600_1] = &FormAbilityA::FMS_acquireForm_1600_1; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1800] = &FormAbilityA::FMS_acquireForm_1800; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1800_1] = &FormAbilityA::FMS_acquireForm_1800_1; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1900] = &FormAbilityA::FMS_acquireForm_1900; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2100] = &FormAbilityA::FMS_acquireForm_2100; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2200] = &FormAbilityA::FMS_acquireForm_2200; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2300] = &FormAbilityA::FMS_acquireForm_2300; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2400] = &FormAbilityA::FMS_acquireForm_2400; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2500] = &FormAbilityA::FMS_acquireForm_2500; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2600] = &FormAbilityA::FMS_acquireForm_2600; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2600_1] = &FormAbilityA::FMS_acquireForm_2600_1; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2700] = &FormAbilityA::FMS_acquireForm_2700; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2800] = &FormAbilityA::FMS_acquireForm_2800; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2900] = &FormAbilityA::FMS_acquireForm_2900; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2900_1] = &FormAbilityA::FMS_acquireForm_2900_1; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_3000] = &FormAbilityA::FMS_acquireForm_3000; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_3100] = &FormAbilityA::FMS_acquireForm_3100; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_COMMON] = &FormAbilityA::FMS_deleteFormCommon; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_TEMP] = &FormAbilityA::FMS_acquireForm_tempForm; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_BATCH] = &FormAbilityA::FMS_acquireFormBatch; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_BATCH_B] = &FormAbilityA::FMS_acquireFormBatchB; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH] = &FormAbilityA::FMS_acquireFormTempBatch; + memberFuncMap_[FORM_EVENT_REQ_CLEAR_FORM_BATCH] = &FormAbilityA::FMS_deleteFormBatch; + SubscribeEvent(); +} + +void FormAbilityA::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityA::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("KitTestEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str()); + APP_LOGI("FormEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityA) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp new file mode 100644 index 0000000000..7c021f2c0f --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp @@ -0,0 +1,905 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_deleteform.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" +#include "system_test_form_util.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +void FormAbilityDeleteForm::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s receive formId:%{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + if (this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_0600) { + ability_->FMS_deleteForm_common(formJsInfo.formId, this->caseName_); + } +} +void FormAbilityDeleteForm::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s receive formData:%{public}s", __func__, formJsInfo.formData.c_str()); + if (this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_0300 || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_0400 + || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_0700 || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_0800 + || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_0900 || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1000 + || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1100 || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1200 + || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1400 || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1500 + || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1501 || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1600 + || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1601 || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1700 + || this->caseName_ == FORM_EVENT_RECV_DELETE_FORM_1701) { + ability_->FMS_deleteForm_common(formJsInfo.formId, this->caseName_); + } +} + +void FormAbilityDeleteForm::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilityDeleteForm::FMS_deleteForm_common(int64_t formId, std::string caseName) +{ + APP_LOGI("%{public}s called, formId: %{public}s, caseName:%{public}s", + __func__, std::to_string(formId).c_str(), caseName.c_str()); + if (caseName == FORM_EVENT_RECV_DELETE_FORM_0300) { + DeleteForm_0300(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_0400) { + DeleteForm_0400(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_0600) { + DeleteForm_0600(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_0700) { + DeleteForm_0700(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_0800) { + DeleteForm_0800(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_0900) { + DeleteForm_0900(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1000) { + DeleteForm_1000(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1100) { + DeleteForm_1100(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1200) { + DeleteForm_1200(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1400) { + DeleteForm_1400(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1500) { + DeleteForm_1500(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1501) { + DeleteForm_1501(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1600) { + DeleteForm_1600(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1601) { + DeleteForm_1601(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1700) { + DeleteForm_1700(formId); + } else if (caseName == FORM_EVENT_RECV_DELETE_FORM_1701) { + DeleteForm_1701(formId); + } else { + return; + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_0300(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_0300); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0300, EVENT_CODE_300, ""); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_0400(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_0400); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0400, EVENT_CODE_400, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_0500(std::string data) +{ + APP_LOGI("%{public}s start[%{public}s]", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0500, EVENT_CODE_500, "true"); + } else { + APP_LOGE("%{public}s error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0500, EVENT_CODE_500, "false"); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_0600(std::string data) +{ + APP_LOGI("%{public}s start[%{public}s]", __func__, data.c_str()); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_0600); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(atoll(data.c_str()), want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0600, EVENT_CODE_600, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_0700(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_0700); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0700, EVENT_CODE_700, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_0800(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_0800); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0800, EVENT_CODE_800, ""); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_0900(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_0900); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0900, EVENT_CODE_900, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1000(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1000); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1000, EVENT_CODE_1000, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1100(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1100, EVENT_CODE_1100, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1200(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1200); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + if (data == "true") { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + } else { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + } + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1201(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1201, EVENT_CODE_1201, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1201, EVENT_CODE_1201, "false"); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1400(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1400); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + if (data == "true") { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + } else { + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + } + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1400, EVENT_CODE_1400, ""); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_1401(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1401, EVENT_CODE_1401, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1401, EVENT_CODE_1401, "false"); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1500(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1500); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1500, EVENT_CODE_1500, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1501(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1501); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1501, EVENT_CODE_1510, "acquireError"); + } + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1501, EVENT_CODE_1510, "deleteError"); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_1502(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1502, EVENT_CODE_1511, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1502, EVENT_CODE_1511, "false"); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_1600(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1600); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1600, EVENT_CODE_1600, ""); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_1601(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1601); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1601, EVENT_CODE_1610, "acquireError"); + } + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1601, EVENT_CODE_1610, "deleteError"); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_1602(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1602, EVENT_CODE_1611, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1602, EVENT_CODE_1611, "false"); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1700(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1700); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1700, EVENT_CODE_1700, ""); + } +} + +void FormAbilityDeleteForm::FMS_deleteForm_1701(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_DELETE_FORM_1701); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1701, EVENT_CODE_1701, "acquireError"); + } + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1701, EVENT_CODE_1701, "deleteError"); + } +} +void FormAbilityDeleteForm::FMS_deleteForm_1702(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1702, EVENT_CODE_1702, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1702, EVENT_CODE_1702, "false"); + } +} +void FormAbilityDeleteForm::FMS_acquire_tempForm_batch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "false"); + } +} +void FormAbilityDeleteForm::FMS_acquireForm_batch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "false"); + } +} +void FormAbilityDeleteForm::FMS_deleteFormBatch(std::string strFormId) +{ + APP_LOGI("%{public}s called", __func__); + int result = STtools::SystemTestFormUtil::ClearFormRecords(); + if (result == ERR_OK) { + APP_LOGI("Clear form records end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "true"); + } else { + APP_LOGE("Clear form records error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH, "false"); + } +} + +void FormAbilityDeleteForm::DeleteForm_0300(int64_t form_id) +{ + bool bResult = DeleteForm(-1); + Clear("FMS_deleteForm_0300", form_id); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0300, EVENT_CODE_300, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0300, EVENT_CODE_300, "false"); + } +} + +void FormAbilityDeleteForm::DeleteForm_0400(int64_t form_id) +{ + bool bResult = DeleteForm(0); + Clear("FMS_deleteForm_0400", form_id); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0400, EVENT_CODE_400, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0400, EVENT_CODE_400, "false"); + } +} + +void FormAbilityDeleteForm::DeleteForm_0500(int64_t form_id) +{} + +void FormAbilityDeleteForm::DeleteForm_0600(int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0600, EVENT_CODE_600, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0600, EVENT_CODE_600, "false"); + } +} + +void FormAbilityDeleteForm::DeleteForm_0700(int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0700, EVENT_CODE_700, std::to_string(form_id)); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0700, EVENT_CODE_700, "false"); + } +} + +void FormAbilityDeleteForm::DeleteForm_0800(int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0800, EVENT_CODE_800, std::to_string(form_id)); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0800, EVENT_CODE_800, "false"); + } +} + +void FormAbilityDeleteForm::DeleteForm_0900(int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + APP_LOGI("%{public}s DeleteForm1 end", __func__); + bool realResult = DeleteForm(form_id); + if (realResult) { + APP_LOGI("%{public}s DeleteForm2 end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0900, EVENT_CODE_900, "true"); + } else { + APP_LOGE("%{public}s DeleteForm2 error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0900, EVENT_CODE_900, "false"); + } + } else { + APP_LOGE("%{public}s DeleteForm1 error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0900, EVENT_CODE_900, ""); + } +} + +void FormAbilityDeleteForm::DeleteForm_1000(int64_t form_id) +{ + bool bResult = ReleaseForm(form_id); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + bool realResult = DeleteForm(form_id); + if (realResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1000, EVENT_CODE_1000, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1000, EVENT_CODE_1000, "false"); + } + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1000, EVENT_CODE_1000, ""); + } +} +void FormAbilityDeleteForm::DeleteForm_1100(int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1100, EVENT_CODE_1100, std::to_string(form_id)); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1100, EVENT_CODE_1100, "false"); + } +} +void FormAbilityDeleteForm::DeleteForm_1200(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200, std::to_string(form_id)); +} +void FormAbilityDeleteForm::DeleteForm_1400(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1400, EVENT_CODE_1400, std::to_string(form_id)); +} +void FormAbilityDeleteForm::DeleteForm_1500(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1500, EVENT_CODE_1500, std::to_string(form_id)); +} +void FormAbilityDeleteForm::DeleteForm_1501(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1501, EVENT_CODE_1510, std::to_string(form_id)); +} +void FormAbilityDeleteForm::DeleteForm_1600(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1600, EVENT_CODE_1600, std::to_string(form_id)); +} +void FormAbilityDeleteForm::DeleteForm_1601(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1601, EVENT_CODE_1610, std::to_string(form_id)); +} +void FormAbilityDeleteForm::DeleteForm_1700(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1700, EVENT_CODE_1700, std::to_string(form_id)); +} +void FormAbilityDeleteForm::DeleteForm_1701(int64_t form_id) +{ + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_1701, EVENT_CODE_1701, std::to_string(form_id)); +} +void FormAbilityDeleteForm::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityDeleteForm::onStart"); + Ability::OnStart(want); + + std::vector eventList = { + FORM_EVENT_REQ_DELETE_FORM_0300, + FORM_EVENT_REQ_DELETE_FORM_0400, + FORM_EVENT_REQ_DELETE_FORM_0500, + FORM_EVENT_REQ_DELETE_FORM_0600, + FORM_EVENT_REQ_DELETE_FORM_0700, + FORM_EVENT_REQ_DELETE_FORM_0800, + FORM_EVENT_REQ_DELETE_FORM_0900, + FORM_EVENT_REQ_DELETE_FORM_1000, + FORM_EVENT_REQ_DELETE_FORM_1100, + FORM_EVENT_REQ_DELETE_FORM_1200, + FORM_EVENT_REQ_DELETE_FORM_1201, + FORM_EVENT_REQ_DELETE_FORM_1400, + FORM_EVENT_REQ_DELETE_FORM_1401, + FORM_EVENT_REQ_DELETE_FORM_1500, + FORM_EVENT_REQ_DELETE_FORM_1501, + FORM_EVENT_REQ_DELETE_FORM_1502, + FORM_EVENT_REQ_DELETE_FORM_1600, + FORM_EVENT_REQ_DELETE_FORM_1601, + FORM_EVENT_REQ_DELETE_FORM_1602, + FORM_EVENT_REQ_DELETE_FORM_1700, + FORM_EVENT_REQ_DELETE_FORM_1701, + FORM_EVENT_REQ_DELETE_FORM_1702, + FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, + FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, + FORM_EVENT_REQ_CLEAR_FORM_BATCH + }; + SubscribeEvent(eventList); +} +void FormAbilityDeleteForm::OnActive() +{ + APP_LOGI("FormAbilityDeleteForm::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityDeleteForm::OnStop() +{ + APP_LOGI("FormAbilityDeleteForm::OnStop"); + + Ability::OnStop(); +} +void FormAbilityDeleteForm::OnInactive() +{ + APP_LOGI("FormAbilityDeleteForm::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityDeleteForm::OnBackground() +{ + APP_LOGI("FormAbilityDeleteForm::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityDeleteForm::SubscribeEvent(const std::vector &eventList) +{ + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityDeleteForm::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityDeleteForm::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0300] = &FormAbilityDeleteForm::FMS_deleteForm_0300; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0400] = &FormAbilityDeleteForm::FMS_deleteForm_0400; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0500] = &FormAbilityDeleteForm::FMS_deleteForm_0500; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0600] = &FormAbilityDeleteForm::FMS_deleteForm_0600; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0700] = &FormAbilityDeleteForm::FMS_deleteForm_0700; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0800] = &FormAbilityDeleteForm::FMS_deleteForm_0800; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0900] = &FormAbilityDeleteForm::FMS_deleteForm_0900; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1000] = &FormAbilityDeleteForm::FMS_deleteForm_1000; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1100] = &FormAbilityDeleteForm::FMS_deleteForm_1100; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1200] = &FormAbilityDeleteForm::FMS_deleteForm_1200; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1201] = &FormAbilityDeleteForm::FMS_deleteForm_1201; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1400] = &FormAbilityDeleteForm::FMS_deleteForm_1400; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1401] = &FormAbilityDeleteForm::FMS_deleteForm_1401; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1500] = &FormAbilityDeleteForm::FMS_deleteForm_1500; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1501] = &FormAbilityDeleteForm::FMS_deleteForm_1501; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1502] = &FormAbilityDeleteForm::FMS_deleteForm_1502; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1600] = &FormAbilityDeleteForm::FMS_deleteForm_1600; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1601] = &FormAbilityDeleteForm::FMS_deleteForm_1601; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1602] = &FormAbilityDeleteForm::FMS_deleteForm_1602; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1700] = &FormAbilityDeleteForm::FMS_deleteForm_1700; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1701] = &FormAbilityDeleteForm::FMS_deleteForm_1701; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_1702] = &FormAbilityDeleteForm::FMS_deleteForm_1702; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_BATCH] = &FormAbilityDeleteForm::FMS_acquireForm_batch; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH] = &FormAbilityDeleteForm::FMS_acquire_tempForm_batch; + memberFuncMap_[FORM_EVENT_REQ_CLEAR_FORM_BATCH] = &FormAbilityDeleteForm::FMS_deleteFormBatch; +} + +void FormAbilityDeleteForm::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityDeleteForm::Clear(std::string case_id, int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + APP_LOGI("[%{public}s] clear ok", case_id.c_str()); + } else { + APP_LOGE("[%{public}s] clear error", case_id.c_str()); + } +} + +void FormEventSubscriberForDeleteForm::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriberForDeleteForm::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("FormEventSubscriberForDeleteForm::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriberForDeleteForm::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityDeleteForm) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_releaseform.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_releaseform.cpp new file mode 100644 index 0000000000..1d2cdb7044 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_releaseform.cpp @@ -0,0 +1,636 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_releaseform.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +void FormAbilityReleaseForm::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s receive formId:%{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + if (this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_0700 || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_1000) { + ability_->FMS_releaseForm_common(formJsInfo.formId, this->caseName_, this->lastformId_); + } +} +void FormAbilityReleaseForm::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s receive formData:%{public}s", __func__, formJsInfo.formData.c_str()); + if (this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_0300 || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_0400 + || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_0600 || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_0800 + || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_0900 || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_1100 + || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_1200 || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_1300 + || this->caseName_ == FORM_EVENT_RECV_RELEASE_FORM_1400) { + ability_->FMS_releaseForm_common(formJsInfo.formId, this->caseName_, this->lastformId_); + } +} + +void FormAbilityReleaseForm::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilityReleaseForm::FMS_releaseForm_common(int64_t formId, std::string caseName, std::string lastFormId) +{ + APP_LOGI("%{public}s called, formId: %{public}s, caseName:%{public}s, lastFormId:%{public}s", + __func__, std::to_string(formId).c_str(), caseName.c_str(), lastFormId.c_str()); + if (caseName == FORM_EVENT_RECV_RELEASE_FORM_0300) { + ReleaseForm_0300(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_0400) { + ReleaseForm_0400(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_0600) { + ReleaseForm_0600(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_0700) { + ReleaseForm_0700(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_0800) { + ReleaseForm_0800(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_0900) { + ReleaseForm_0900(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_1000) { + ReleaseForm_1000(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_1100) { + ReleaseForm_1100(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_1200) { + ReleaseForm_1200(formId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_1300) { + ReleaseForm_1300(formId, lastFormId); + } else if (caseName == FORM_EVENT_RECV_RELEASE_FORM_1400) { + ReleaseForm_1400(formId); + } else { + return; + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_0300(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_0300, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0300, EVENT_CODE_300, ""); + } +} +void FormAbilityReleaseForm::FMS_releaseForm_0400(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_0400, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0400, EVENT_CODE_400, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_0500(std::string data) +{ + APP_LOGI("%{public}s start[%{public}s]", __func__, data.c_str()); + bool bResult = ReleaseForm(atoll(data.c_str()), true); + if (bResult) { + APP_LOGI("%{public}s end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0500, EVENT_CODE_500, "true"); + } else { + APP_LOGE("%{public}s error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0500, EVENT_CODE_500, "false"); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_0600(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_0600, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0600, EVENT_CODE_600, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_0700(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_0700, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(atoll(data.c_str()), want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0700, EVENT_CODE_700, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_0800(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_0800, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0800, EVENT_CODE_800, ""); + } +} +void FormAbilityReleaseForm::FMS_releaseForm_0900(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_0900, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0900, EVENT_CODE_900, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_1000(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_1000, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(atoll(data.c_str()), want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1000, EVENT_CODE_1000, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_1100(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_1100, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1100, EVENT_CODE_1100, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_1200(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_1200, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1200, EVENT_CODE_1200, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_1300(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_1300, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300, ""); + } +} + +void FormAbilityReleaseForm::FMS_releaseForm_1400(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_RELEASE_FORM_1400, data); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("%{public}s AcquireForm ok.", __func__); + } else { + APP_LOGE("%{public}s AcquireForm error.", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1400, EVENT_CODE_1400, ""); + } +} +void FormAbilityReleaseForm::FMS_releaseForm_common_del(std::string data) +{ + APP_LOGI("%{public}s formId: %{public}s", __func__, data.c_str()); + bool bResult = DeleteForm(atoll(data.c_str())); + if (bResult) { + APP_LOGI("%{public}s DeleteForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, "true"); + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, "false"); + } +} + +void FormAbilityReleaseForm::ReleaseForm_0300(int64_t form_id) +{ + int64_t formId = -1; + bool isReleaseCache = true; + bool bResult = ReleaseForm(formId, isReleaseCache); + Clear("FMS_releaseForm_0300", form_id); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0300, EVENT_CODE_300, "true"); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0300, EVENT_CODE_300, "false"); + } +} + +void FormAbilityReleaseForm::ReleaseForm_0400(int64_t form_id) +{ + int64_t formId = 0; + bool isReleaseCache = true; + bool bResult = ReleaseForm(formId, isReleaseCache); + Clear("FMS_releaseForm_0400", form_id); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0400, EVENT_CODE_400, "true"); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0400, EVENT_CODE_400, "false"); + } +} + +void FormAbilityReleaseForm::ReleaseForm_0500(int64_t form_id) +{} + +void FormAbilityReleaseForm::ReleaseForm_0600(int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + bool isReleaseCache = true; + bool realResult = ReleaseForm(form_id, isReleaseCache); + if (realResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0600, EVENT_CODE_600, "true"); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0600, EVENT_CODE_600, "false"); + } + } else { + APP_LOGE("%{public}s DeleteForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0600, EVENT_CODE_600, ""); + } +} + +void FormAbilityReleaseForm::ReleaseForm_0700(int64_t form_id) +{ + bool isReleaseCache = false; + bool bResult = ReleaseForm(form_id, isReleaseCache); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0700, EVENT_CODE_700, "true"); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0700, EVENT_CODE_700, "false"); + } +} +void FormAbilityReleaseForm::ReleaseForm_0800(int64_t form_id) +{ + bool isReleaseCache = false; + bool bResult = ReleaseForm(form_id, isReleaseCache); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0800, EVENT_CODE_800, std::to_string(form_id)); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0800, EVENT_CODE_800, "false"); + } +} +void FormAbilityReleaseForm::ReleaseForm_0900(int64_t form_id) +{ + bool isReleaseCache = false; + bool bResult = ReleaseForm(form_id, isReleaseCache); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0900, EVENT_CODE_900, std::to_string(form_id)); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0900, EVENT_CODE_900, "false"); + } +} +void FormAbilityReleaseForm::ReleaseForm_1000(int64_t form_id) +{ + bool isReleaseCache = true; + bool bResult = ReleaseForm(form_id, isReleaseCache); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1000, EVENT_CODE_1000, "true"); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1000, EVENT_CODE_1000, "false"); + } +} +void FormAbilityReleaseForm::ReleaseForm_1100(int64_t form_id) +{ + bool isReleaseCache = true; + bool bResult = ReleaseForm(form_id, isReleaseCache); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1100, EVENT_CODE_1100, std::to_string(form_id)); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1100, EVENT_CODE_1100, "false"); + } +} +void FormAbilityReleaseForm::ReleaseForm_1200(int64_t form_id) +{ + bool isReleaseCache = true; + bool bResult = ReleaseForm(form_id, isReleaseCache); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1200, EVENT_CODE_1200, std::to_string(form_id)); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1200, EVENT_CODE_1200, "false"); + } +} +void FormAbilityReleaseForm::ReleaseForm_1300(int64_t form_id, std::string lastFormId) +{ + if (lastFormId == "") { + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300, std::to_string(form_id)); + } else { + bool isReleaseCache = true; + bool bResult1 = ReleaseForm(form_id, isReleaseCache); + bool bResult2 = ReleaseForm(atoll(lastFormId.c_str()), isReleaseCache); + Clear("FMS_releaseForm_1300", form_id); + Clear("FMS_releaseForm_1300", atoll(lastFormId.c_str())); + if (bResult1 && bResult2) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300, "true"); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300, "false"); + } + } +} +void FormAbilityReleaseForm::ReleaseForm_1400(int64_t form_id) +{ + bool isReleaseCache = true; + bool bResult = ReleaseForm(form_id, isReleaseCache); + Clear("FMS_releaseForm_1400", form_id); + if (bResult) { + APP_LOGI("%{public}s ReleaseForm end", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1400, EVENT_CODE_1400, "true"); + } else { + APP_LOGE("%{public}s ReleaseForm error", __func__); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_1400, EVENT_CODE_1400, "false"); + } +} + +void FormAbilityReleaseForm::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityReleaseForm::onStart"); + Ability::OnStart(want); + + std::vector eventList = { + FORM_EVENT_REQ_RELEASE_FORM_0300, + FORM_EVENT_REQ_RELEASE_FORM_0400, + FORM_EVENT_REQ_RELEASE_FORM_0500, + FORM_EVENT_REQ_RELEASE_FORM_0600, + FORM_EVENT_REQ_RELEASE_FORM_0700, + FORM_EVENT_REQ_RELEASE_FORM_0800, + FORM_EVENT_REQ_RELEASE_FORM_0900, + FORM_EVENT_REQ_RELEASE_FORM_1000, + FORM_EVENT_REQ_RELEASE_FORM_1100, + FORM_EVENT_REQ_RELEASE_FORM_1200, + FORM_EVENT_REQ_RELEASE_FORM_1300, + FORM_EVENT_REQ_RELEASE_FORM_1400, + FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL + }; + SubscribeEvent(eventList); +} +void FormAbilityReleaseForm::OnActive() +{ + APP_LOGI("FormAbilityReleaseForm::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityReleaseForm::OnStop() +{ + APP_LOGI("FormAbilityReleaseForm::OnStop"); + + Ability::OnStop(); +} +void FormAbilityReleaseForm::OnInactive() +{ + APP_LOGI("FormAbilityReleaseForm::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityReleaseForm::OnBackground() +{ + APP_LOGI("FormAbilityReleaseForm::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityReleaseForm::SubscribeEvent(const std::vector &eventList) +{ + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityReleaseForm::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityReleaseForm::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0300] = &FormAbilityReleaseForm::FMS_releaseForm_0300; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0400] = &FormAbilityReleaseForm::FMS_releaseForm_0400; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0500] = &FormAbilityReleaseForm::FMS_releaseForm_0500; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0600] = &FormAbilityReleaseForm::FMS_releaseForm_0600; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0700] = &FormAbilityReleaseForm::FMS_releaseForm_0700; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0800] = &FormAbilityReleaseForm::FMS_releaseForm_0800; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0900] = &FormAbilityReleaseForm::FMS_releaseForm_0900; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_1000] = &FormAbilityReleaseForm::FMS_releaseForm_1000; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_1100] = &FormAbilityReleaseForm::FMS_releaseForm_1100; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_1200] = &FormAbilityReleaseForm::FMS_releaseForm_1200; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_1300] = &FormAbilityReleaseForm::FMS_releaseForm_1300; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_1400] = &FormAbilityReleaseForm::FMS_releaseForm_1400; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL] = &FormAbilityReleaseForm::FMS_releaseForm_common_del; +} + +void FormAbilityReleaseForm::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityReleaseForm::Clear(std::string case_id, int64_t form_id) +{ + bool bResult = DeleteForm(form_id); + if (bResult) { + APP_LOGI("[%{public}s] clear ok", case_id.c_str()); + } else { + APP_LOGE("[%{public}s] clear error", case_id.c_str()); + } +} + +void FormEventSubscriberForReleaseForm::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriberForReleaseForm::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("FormEventSubscriberForReleaseForm::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + if ((data.GetCode() == EVENT_CODE_1300 && data.GetData() == "") || + eventName == FORM_EVENT_REQ_RELEASE_FORM_0700 || eventName == FORM_EVENT_REQ_RELEASE_FORM_0800 || + eventName == FORM_EVENT_REQ_RELEASE_FORM_0900 || eventName == FORM_EVENT_REQ_RELEASE_FORM_1000 || + eventName == FORM_EVENT_REQ_RELEASE_FORM_1100 || eventName == FORM_EVENT_REQ_RELEASE_FORM_1200) { + return; + } else { + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); + } +} + +void FormEventSubscriberForReleaseForm::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityReleaseForm) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalB/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/BUILD.gn new file mode 100755 index 0000000000..30e6a8c55b --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/BUILD.gn @@ -0,0 +1,80 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestHostNormalBConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestHostNormalB") { + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "../tool/src/form_test_utils.cpp", + "src/form_ability_b.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ + ":fmsSystemTestHostNormalBConfig", + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalB/config.json b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/config.json new file mode 100644 index 0000000000..5102f274b6 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.normalb", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.normalb.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbilityB", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityB", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability B", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalB/include/form_ability_b.h b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/include/form_ability_b.h new file mode 100644 index 0000000000..d5e5c7a636 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/include/form_ability_b.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_B_H_ +#define _FORM_ABILITY_B_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriber; +class FormAbilityB : public Ability { +public: + ~FormAbilityB(); + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + void FMS_deleteFormCommon(std::string strFormId); + + void FMS_acquireForm_1400(std::string data); + void FMS_acquireForm_1500(std::string data); + void FMS_acquireForm_1800_2(std::string data); + void FMS_acquireForm_1800_3(std::string data); + void FMS_acquireForm_2400_1(std::string data); + void FMS_acquireForm_3100(std::string data); + void FMS_acquireForm_tempForm(std::string data); + void FMS_acquireFormBatch(std::string data); + void FMS_acquireFormTempBatch(std::string data); + + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback(std::string name, int code):caseName_(name), code_(code) + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilityB *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + + using FormFunc = void (FormAbilityB::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityB *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_B_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp new file mode 100644 index 0000000000..bbe58b211a --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_b.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" +#include "system_test_form_util.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_DELETE_FORM_COMMON, FORM_EVENT_REQ_ACQUIRE_FORM_TEMP, FORM_EVENT_REQ_ACQUIRE_FORM_1400, + FORM_EVENT_REQ_ACQUIRE_FORM_1500, FORM_EVENT_REQ_ACQUIRE_FORM_1800_2, FORM_EVENT_REQ_ACQUIRE_FORM_1800_3, + FORM_EVENT_REQ_ACQUIRE_FORM_2400_1, FORM_EVENT_REQ_ACQUIRE_FORM_3100, FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, + FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, +}; +void FormAbilityB::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(this->caseName_, this->code_, std::to_string(formJsInfo.formId)); + if (this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1500) { + std::string strFormId = std::to_string(formJsInfo.formId); + APP_LOGI("%{public}s, delete form, formId: %{public}s", __func__, strFormId.c_str()); + ability_->FMS_deleteFormCommon(strFormId); + } +} +void FormAbilityB::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, formJsInfo.formData); + if (this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1800_2 || + this->caseName_ == FORM_EVENT_RECV_ACQUIRE_FORM_1800_3) { + std::string strFormId = std::to_string(formJsInfo.formId); + APP_LOGI("%{public}s, delete form, formId: %{public}s", __func__, strFormId.c_str()); + ability_->FMS_deleteFormCommon(strFormId); + } +} + +void FormAbilityB::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityB::FMS_deleteFormCommon(std::string strFormId) +{ + APP_LOGI("%{public}s called, formId: %{public}s", __func__, strFormId.c_str()); + if (strFormId.empty()) { + APP_LOGE("DeleteForm error, formId is 0"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "false"); + return; + } + int64_t formId = std::stoll(strFormId); + sleep(1); + bool bResult = DeleteForm(formId); + sleep(1); + if (bResult) { + APP_LOGI("DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "true"); + } else { + APP_LOGE("DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "false"); + } +} + +void FormAbilityB::FMS_acquireForm_1400(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1400, EVENT_CODE_1400); + // Set Want info begin + std::string formName = "formName999"; + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, formName); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + int64_t formId = std::stoll(data); + bool bResult = AcquireForm(formId, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1400, EVENT_CODE_1400, "false"); + } +} +void FormAbilityB::FMS_acquireForm_1500(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1500, EVENT_CODE_1500); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + int64_t formId = std::stoll(data); + bool bResult = AcquireForm(formId, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1500, EVENT_CODE_1500, ""); + } +} + +void FormAbilityB::FMS_acquireForm_1800_2(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1800_2, EVENT_CODE_1820); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1800_2, EVENT_CODE_1820, ""); + } +} +void FormAbilityB::FMS_acquireForm_1800_3(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_1800_3, EVENT_CODE_1830); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_1800_3, EVENT_CODE_1830, ""); + } +} + +void FormAbilityB::FMS_acquireForm_2400_1(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_2400_1, EVENT_CODE_2410); + callback->ability_ = this; + // Set Want info end + int64_t formId = std::stoll(data); + bool bResult = CastTempForm(formId); + if (bResult) { + APP_LOGI("CastTempForm end"); + } else { + APP_LOGE("CastTempForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_2400_1, EVENT_CODE_2410, "false"); + } +} +void FormAbilityB::FMS_acquireForm_3100(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100, ""); + } +} +void FormAbilityB::FMS_acquireForm_tempForm(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); + + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP, ""); + } +} + +void FormAbilityB::FMS_acquireFormBatch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "false"); + } +} + +void FormAbilityB::FMS_acquireFormTempBatch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add temp form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "true"); + } else { + APP_LOGE("Batch add temp form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "false"); + } +} +FormAbilityB::~FormAbilityB() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} +void FormAbilityB::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityB::onStart"); + Ability::OnStart(want); +} +void FormAbilityB::OnActive() +{ + APP_LOGI("FormAbilityB::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityB::OnStop() +{ + APP_LOGI("FormAbilityB::OnStop"); + + Ability::OnStop(); +} +void FormAbilityB::OnInactive() +{ + APP_LOGI("FormAbilityB::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityB::OnBackground() +{ + APP_LOGI("FormAbilityB::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityB::SubscribeEvent() +{ + APP_LOGI("FormAbilityB::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityB::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityB::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_COMMON] = &FormAbilityB::FMS_deleteFormCommon; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_TEMP] = &FormAbilityB::FMS_acquireForm_tempForm; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_BATCH] = &FormAbilityB::FMS_acquireFormBatch; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH] = &FormAbilityB::FMS_acquireFormTempBatch; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1400] = &FormAbilityB::FMS_acquireForm_1400; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1500] = &FormAbilityB::FMS_acquireForm_1500; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1800_2] = &FormAbilityB::FMS_acquireForm_1800_2; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_1800_3] = &FormAbilityB::FMS_acquireForm_1800_3; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_2400_1] = &FormAbilityB::FMS_acquireForm_2400_1; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_3100] = &FormAbilityB::FMS_acquireForm_3100; + SubscribeEvent(); +} + +void FormAbilityB::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityB::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("KitTestEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str()); + APP_LOGI("FormEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityB) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/BUILD.gn new file mode 100755 index 0000000000..5630620e87 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/BUILD.gn @@ -0,0 +1,80 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestHostNormalCConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestHostNormalC") { + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "../tool/src/form_test_utils.cpp", + "src/form_ability_c.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ + ":fmsSystemTestHostNormalCConfig", + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/config.json b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/config.json new file mode 100644 index 0000000000..c3bb05c974 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.normalc", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.normalc.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbilityC", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityC", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability B", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h new file mode 100644 index 0000000000..2c6b0b1288 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_B_H_ +#define _FORM_ABILITY_B_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriber; +class FormAbilityC : public Ability { +public: + ~FormAbilityC(); + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + void FMS_deleteFormCommon(std::string strFormId); + + void FMS_acquireForm_3100(std::string data); + void FMS_acquireForm_3200(std::string data); + + void FMS_acquireFormBatch(std::string data); + void FMS_acquireFormTempBatch(std::string data); + + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback(std::string name, int code):caseName_(name), code_(code) + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilityC *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + + using FormFunc = void (FormAbilityC::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityC *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_B_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp new file mode 100644 index 0000000000..173c9a9c73 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_c.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" +#include "system_test_form_util.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_DELETE_FORM_COMMON, FORM_EVENT_REQ_ACQUIRE_FORM_3100, FORM_EVENT_REQ_ACQUIRE_FORM_3200, + FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, +}; +void FormAbilityC::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(this->caseName_, this->code_, std::to_string(formJsInfo.formId)); +} +void FormAbilityC::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, formJsInfo.formData); +} + +void FormAbilityC::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityC::FMS_deleteFormCommon(std::string strFormId) +{ + APP_LOGI("%{public}s called, formId: %{public}s", __func__, strFormId.c_str()); + if (strFormId.empty()) { + APP_LOGE("DeleteForm error, formId is 0"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "false"); + return; + } + int64_t formId = std::stoll(strFormId); + sleep(1); + bool bResult = DeleteForm(formId); + sleep(1); + if (bResult) { + APP_LOGI("DeleteForm end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "true"); + } else { + APP_LOGE("DeleteForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999, "false"); + } +} + +void FormAbilityC::FMS_acquireForm_3100(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100, ""); + } +} + +void FormAbilityC::FMS_acquireForm_3200(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_ACQUIRE_FORM_3200, EVENT_CODE_3200); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_3200, EVENT_CODE_3200, "false"); + } +} +void FormAbilityC::FMS_acquireFormBatch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "true"); + } else { + APP_LOGE("Batch add form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, "false"); + } +} + +void FormAbilityC::FMS_acquireFormTempBatch(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + + int formCount = std::stoi(data); + APP_LOGI("%{public}s, formCount: %{public}d", __func__, formCount); + want.SetParam(Constants::PARAM_FORM_ADD_COUNT, formCount); + // Set Want info end + int result = STtools::SystemTestFormUtil::BatchAddFormRecords(want); + if (result == ERR_OK) { + APP_LOGI("Batch add temp form end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "true"); + } else { + APP_LOGE("Batch add temp form error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, "false"); + } +} +FormAbilityC::~FormAbilityC() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} +void FormAbilityC::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityC::onStart"); + Ability::OnStart(want); +} +void FormAbilityC::OnActive() +{ + APP_LOGI("FormAbilityC::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityC::OnStop() +{ + APP_LOGI("FormAbilityC::OnStop"); + + Ability::OnStop(); +} +void FormAbilityC::OnInactive() +{ + APP_LOGI("FormAbilityC::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityC::OnBackground() +{ + APP_LOGI("FormAbilityC::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityC::SubscribeEvent() +{ + APP_LOGI("FormAbilityC::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityC::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityC::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_COMMON] = &FormAbilityC::FMS_deleteFormCommon; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_BATCH] = &FormAbilityC::FMS_acquireFormBatch; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH] = &FormAbilityC::FMS_acquireFormTempBatch; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_3100] = &FormAbilityC::FMS_acquireForm_3100; + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_3200] = &FormAbilityC::FMS_acquireForm_3200; + + SubscribeEvent(); +} + +void FormAbilityC::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityC::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("KitTestEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str()); + APP_LOGI("FormEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityC) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNotSys/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/BUILD.gn new file mode 100755 index 0000000000..6c67d9f296 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/BUILD.gn @@ -0,0 +1,70 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestHostNotSysConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestHostNotSys") { + sources = [ + "../tool/src/form_test_utils.cpp", + "src/form_ability_not_sys.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ ":fmsSystemTestHostNotSysConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/base:base", + "${aafwk_path}/interfaces/innerkits/want:want", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNotSys/config.json b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/config.json new file mode 100644 index 0000000000..bf7d51772e --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.notsystemapp", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.notsystemapp.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityNotSys", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNotSys/include/form_ability_not_sys.h b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/include/form_ability_not_sys.h new file mode 100644 index 0000000000..8e5eb6467e --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/include/form_ability_not_sys.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_NOT_SYS_H_ +#define _FORM_ABILITY_NOT_SYS_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriber; +class FormAbilityNotSys : public Ability { +public: + void SubscribeEvent(const std::vector &eventList); + void handleEvent(std::string action); + + void FMS_acquireForm_0100(); + void FMS_deleteForm_0100(); + void FMS_releaseForm_0100(); + + std::shared_ptr subscriber_; + + class AcquireFormCallback : public FormCallback { + public: + AcquireFormCallback(std::string name):caseName_(name) + { + } + virtual ~AcquireFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + + using FormFunc = void (FormAbilityNotSys::*)(); + std::map memberFuncMap_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityNotSys *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_NOT_SYS_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNotSys/src/form_ability_not_sys.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/src/form_ability_not_sys.cpp new file mode 100644 index 0000000000..ef06ae7609 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestHostNotSys/src/form_ability_not_sys.cpp @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_not_sys.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +void FormAbilityNotSys::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityNotSys::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityNotSys::AcquireFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilityNotSys::FMS_acquireForm_0100() +{ + std::shared_ptr callback = std::make_shared("FMS_acquireForm_0100"); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_ACQUIRE_FORM_0100, EVENT_CODE_100, "false"); + } +} + +void FormAbilityNotSys::FMS_deleteForm_0100() +{ + int64_t formId = 1; + bool bResult = DeleteForm(formId); + if (bResult) { + APP_LOGI("[FMS_deleteForm_0100] end"); + } else { + APP_LOGE("[FMS_deleteForm_0100] error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_DELETE_FORM_0100, EVENT_CODE_100, "false"); + } +} + +void FormAbilityNotSys::FMS_releaseForm_0100() +{ + int64_t formId = 1; + bool isReleaseCache = true; + bool bResult = ReleaseForm(formId, isReleaseCache); + if (bResult) { + APP_LOGI("[FMS_releaseForm_0100] end"); + } else { + APP_LOGE("[FMS_releaseForm_0100] error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_RELEASE_FORM_0100, EVENT_CODE_100, "false"); + } +} + +void FormAbilityNotSys::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityNotSys::onStart"); + Ability::OnStart(want); + + std::vector eventList = { + FORM_EVENT_REQ_ACQUIRE_FORM_0100, + FORM_EVENT_REQ_DELETE_FORM_0100, + FORM_EVENT_REQ_RELEASE_FORM_0100, + }; + SubscribeEvent(eventList); +} +void FormAbilityNotSys::OnActive() +{ + APP_LOGI("FormAbilityNotSys::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityNotSys::OnStop() +{ + APP_LOGI("FormAbilityNotSys::OnStop"); + + Ability::OnStop(); +} +void FormAbilityNotSys::OnInactive() +{ + APP_LOGI("FormAbilityNotSys::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilityNotSys::OnBackground() +{ + APP_LOGI("FormAbilityNotSys::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilityNotSys::SubscribeEvent(const std::vector &eventList) +{ + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityNotSys::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityNotSys::Init"); + Ability::Init(abilityInfo, application, handler, token); + + memberFuncMap_[FORM_EVENT_REQ_ACQUIRE_FORM_0100] = &FormAbilityNotSys::FMS_acquireForm_0100; + memberFuncMap_[FORM_EVENT_REQ_DELETE_FORM_0100] = &FormAbilityNotSys::FMS_deleteForm_0100; + memberFuncMap_[FORM_EVENT_REQ_RELEASE_FORM_0100] = &FormAbilityNotSys::FMS_releaseForm_0100; +} + +void FormAbilityNotSys::handleEvent(std::string action) +{ + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(); + } + } +} + +void FormAbilityNotSys::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("FormEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityNotSys) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/BUILD.gn new file mode 100755 index 0000000000..1d86964e73 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/BUILD.gn @@ -0,0 +1,70 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("selfStartingTestHostAConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("selfStartingTestHostA") { + sources = [ + "../../tool/src/form_test_utils.cpp", + "src/form_ability_self_starting_a.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ ":selfStartingTestHostAConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/base:base", + "${aafwk_path}/interfaces/innerkits/want:want", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/config.json b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/config.json new file mode 100644 index 0000000000..8a8d382473 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.selfStartingA", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.selfStartingA.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilitySelfStartingA", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability Self Starting A", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/include/form_ability_self_starting_a.h b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/include/form_ability_self_starting_a.h new file mode 100644 index 0000000000..78e8f9a3af --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/include/form_ability_self_starting_a.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_SELF_STARTING_A_H_ +#define _FORM_ABILITY_SELF_STARTING_A_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriber; +class FormAbilitySelfStartingA : public Ability { +public: + ~FormAbilitySelfStartingA(); + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + void FMS_Start_0300_01(std::string data); + + std::shared_ptr subscriber_; + + class SelfStartingCallback : public FormCallback { + public: + SelfStartingCallback(std::string name, int code):caseName_(name), code_(code) {} + virtual ~SelfStartingCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilitySelfStartingA *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + + using FormFunc = void (FormAbilitySelfStartingA::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilitySelfStartingA *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_SELF_STARTING_A_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/src/form_ability_self_starting_a.cpp b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/src/form_ability_self_starting_a.cpp new file mode 100644 index 0000000000..63fab68951 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostA/src/form_ability_self_starting_a.cpp @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2021 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. + */ + +#include "form_ability_self_starting_a.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_SELF_STARTING_TEST_0100, +}; +void FormAbilitySelfStartingA::SelfStartingCallback::OnAcquired(const int32_t result, + const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilitySelfStartingA::SelfStartingCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called, caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), + this->code_); + FormTestUtils::PublishEvent(this->caseName_, this->code_, "true"); +} + +void FormAbilitySelfStartingA::SelfStartingCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilitySelfStartingA::FMS_Start_0300_01(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_SELF_STARTING_TEST_0100, EVENT_CODE_100); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_SELF_STARTING_TEST_0100, EVENT_CODE_100, "false"); + } +} + +FormAbilitySelfStartingA::~FormAbilitySelfStartingA() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +void FormAbilitySelfStartingA::OnStart(const Want &want) +{ + APP_LOGI("FormAbilitySelfStartingA::onStart"); + Ability::OnStart(want); +} +void FormAbilitySelfStartingA::OnActive() +{ + APP_LOGI("FormAbilitySelfStartingA::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilitySelfStartingA::OnStop() +{ + APP_LOGI("FormAbilitySelfStartingA::OnStop"); + + Ability::OnStop(); +} +void FormAbilitySelfStartingA::OnInactive() +{ + APP_LOGI("FormAbilitySelfStartingA::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilitySelfStartingA::OnBackground() +{ + APP_LOGI("FormAbilitySelfStartingA::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilitySelfStartingA::SubscribeEvent() +{ + APP_LOGI("FormAbilitySelfStartingA::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilitySelfStartingA::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilitySelfStartingA::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_SELF_STARTING_TEST_0100] = &FormAbilitySelfStartingA::FMS_Start_0300_01; + + SubscribeEvent(); +} + +void FormAbilitySelfStartingA::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilitySelfStartingA::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("KitTestEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str()); + APP_LOGI("FormEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilitySelfStartingA) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/BUILD.gn new file mode 100755 index 0000000000..512d087459 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/BUILD.gn @@ -0,0 +1,70 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("selfStartingTestHostBConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("selfStartingTestHostB") { + sources = [ + "../../tool/src/form_test_utils.cpp", + "src/form_ability_self_starting_b.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ ":selfStartingTestHostBConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/base:base", + "${aafwk_path}/interfaces/innerkits/want:want", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/config.json b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/config.json new file mode 100644 index 0000000000..9306f37ea3 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.selfStartingB", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.selfStartingA.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilitySelfStartingB", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability Self Starting B", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsStressTest100", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/include/form_ability_self_starting_b.h b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/include/form_ability_self_starting_b.h new file mode 100644 index 0000000000..e56fe20afb --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/include/form_ability_self_starting_b.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_SELF_STARTING_B_H_ +#define _FORM_ABILITY_SELF_STARTING_B_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +class FormEventSubscriber; +class FormAbilitySelfStartingB : public Ability { +public: + ~FormAbilitySelfStartingB(); + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + void FMS_Start_0300_02(std::string data); + void FMS_Start_0300_03(std::string data); + + std::shared_ptr subscriber_; + + class SelfStartingCallback : public FormCallback { + public: + SelfStartingCallback(std::string name, int code):caseName_(name), code_(code) {} + virtual ~SelfStartingCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilitySelfStartingB *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + + using FormFunc = void (FormAbilitySelfStartingB::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilitySelfStartingB *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_SELF_STARTING_B_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/src/form_ability_self_starting_b.cpp b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/src/form_ability_self_starting_b.cpp new file mode 100644 index 0000000000..28f419e5df --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestSelfStarting/selfStartingTestHostB/src/form_ability_self_starting_b.cpp @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_ability_self_starting_b.h" +#include "app_log_wrapper.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" + +namespace { +using namespace OHOS::AAFwk; +using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_SELF_STARTING_TEST_0200, FORM_EVENT_REQ_SELF_STARTING_TEST_0300, +}; +void FormAbilitySelfStartingB::SelfStartingCallback::OnAcquired(const int32_t result, + const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); +} +void FormAbilitySelfStartingB::SelfStartingCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called, caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), + this->code_); + FormTestUtils::PublishEvent(this->caseName_, this->code_, "true"); +} + +void FormAbilitySelfStartingB::SelfStartingCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilitySelfStartingB::FMS_Start_0300_02(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_SELF_STARTING_TEST_0200, EVENT_CODE_200); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_SELF_STARTING_TEST_0200, EVENT_CODE_200, "false"); + } +} + +void FormAbilitySelfStartingB::FMS_Start_0300_03(std::string data) +{ + APP_LOGI("%{public}s called", __func__); + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_SELF_STARTING_TEST_0300, EVENT_CODE_300); + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("AcquireForm end"); + } else { + APP_LOGE("AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_SELF_STARTING_TEST_0300, EVENT_CODE_300, "false"); + } +} + +FormAbilitySelfStartingB::~FormAbilitySelfStartingB() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} +void FormAbilitySelfStartingB::OnStart(const Want &want) +{ + APP_LOGI("FormAbilitySelfStartingB::onStart"); + Ability::OnStart(want); +} +void FormAbilitySelfStartingB::OnActive() +{ + APP_LOGI("FormAbilitySelfStartingB::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilitySelfStartingB::OnStop() +{ + APP_LOGI("FormAbilitySelfStartingB::OnStop"); + + Ability::OnStop(); +} +void FormAbilitySelfStartingB::OnInactive() +{ + APP_LOGI("FormAbilitySelfStartingB::OnInactive"); + + Ability::OnInactive(); +} +void FormAbilitySelfStartingB::OnBackground() +{ + APP_LOGI("FormAbilitySelfStartingB::OnBackground"); + + Ability::OnBackground(); +} +void FormAbilitySelfStartingB::SubscribeEvent() +{ + APP_LOGI("FormAbilitySelfStartingB::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilitySelfStartingB::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilitySelfStartingB::Init"); + Ability::Init(abilityInfo, application, handler, token); + memberFuncMap_[FORM_EVENT_REQ_SELF_STARTING_TEST_0200] = &FormAbilitySelfStartingB::FMS_Start_0300_02; + memberFuncMap_[FORM_EVENT_REQ_SELF_STARTING_TEST_0300] = &FormAbilitySelfStartingB::FMS_Start_0300_03; + + SubscribeEvent(); +} + +void FormAbilitySelfStartingB::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilitySelfStartingB::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str()); + APP_LOGI("KitTestEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str()); + APP_LOGI("FormEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilitySelfStartingB) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn new file mode 100755 index 0000000000..8f79639ac6 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn @@ -0,0 +1,70 @@ +# Copyright (c) 2021 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. +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("fmsSystemTestUninstallAppConfig") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "../tool/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${appexecfwk_path}/services/bundlemgr/include", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", + "//utils/system/safwk/native/include", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", + "//third_party/jsoncpp/include", + ] + defines = [ + "APP_LOG_TAG = \"formManagerSystemTest\"", + "LOG_DOMAIN = 0xD002666", + ] +} +ohos_shared_library("fmsSystemTestUninstallApp") { + sources = [ + "../tool/src/form_test_utils.cpp", + "src/form_ability_uninstall_app.cpp", + ] + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + configs = [ ":fmsSystemTestUninstallAppConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/base:base", + "${aafwk_path}/interfaces/innerkits/want:want", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//third_party/jsoncpp:jsoncpp", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json new file mode 100644 index 0000000000..e3d8e51a72 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json @@ -0,0 +1,80 @@ +{ + "app":{ + "bundleName": "com.ohos.form.manager.Uninstall", + "vendor": "ix", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 3, + "target": 3 + } + }, + "deviceConfig": { + "default": { + } + }, + "module": { + "package":"com.ohos.form.manager.Uninstall.FormAbility", + "name":"FormAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "FormAbility", + "moduleType": "entry" + }, + "abilities": [{ + "name": "FormAbilityUninstallApp", + "icon": "$media:snowball", + "srcLanguage": "c++", + "label": "Form Ability Uninstall App", + "launchType": "standard", + "orientation": "unspecified", + "type": "page", + "visible": true, + "skills": [ + { + "actions": [ + "ohos.aafwk.content.Want.ACTION_HOME" + ], + "entities": [ + "ohos.aafwk.content.Want.ENTITY_HOME" + ], + "attributes": [] + } + ] + }], + "defPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "grantMode": "system_grant", + "label": "$string:entry_MainAbility", + "description": "REQUIRE_FORM permission in detail" + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.REQUIRE_FORM", + "reason": "fmsstresstest", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "always" + } + } + ], + "js": [ + { + "name": "formDemo", + "pages": [ + "pages/index/index" + ], + "type": "form" + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h new file mode 100644 index 0000000000..34626d10c3 --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef _FORM_ABILITY_UNINSTALL_APP_H_ +#define _FORM_ABILITY_UNINSTALL_APP_H_ +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" +#include +#include +#include + +using std::string; + +namespace OHOS { +namespace AppExecFwk { +typedef bool (*FunctionPtr)(); + +class FormEventSubscriber; +class FormAbilityUninstallApp : public Ability { +public: + void SubscribeEvent(); + void handleEvent(std::string action, std::string data); + + // Test case list + void FMS_uninstallTest_0100(std::string data); + void FMS_uninstallTest_0200(std::string data); + void FMS_uninstallTest_0300(std::string data); + void FMS_uninstallTest_0400(std::string data); + void FMS_uninstallTest_0500(std::string data); + void FMS_uninstallTest_0600(std::string data); + void FMS_uninstallTest_0700(std::string data); + void FMS_uninstallTest_0800(std::string data); + void FMS_uninstallTest_0900(std::string data); + void FMS_uninstallTest_1000(std::string data); + void FMS_uninstallTest_1100(std::string data); + void FMS_uninstallTest_1200(std::string data); + void FMS_uninstallTest_1300(std::string data); + void FMS_uninstallTest_1400(std::string data); + void FMS_uninstallTest_1500(std::string data); + void FMS_uninstallTest_1600(std::string data); + void FMS_uninstallTest_1700(std::string data); + void FMS_uninstallTest_1800(std::string data); + + std::shared_ptr subscriber_; + + class UninstallAppFormCallback : public FormCallback { + public: + UninstallAppFormCallback(std::string name, int code):caseName_(name), code_(code) { } + virtual ~UninstallAppFormCallback() = default; + void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; + void OnFormUninstall(const int64_t formId) const override; + + std::string caseName_ = ""; + int code_ = 0; + FormAbilityUninstallApp *ability_; + }; +protected: + virtual void Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) override; + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; +private: + void Clear(); + using FormFunc = void (FormAbilityUninstallApp::*)(std::string data); + std::map memberFuncMap_; + std::map calledFuncMap_; + std::shared_ptr callback_; +}; + +class FormEventSubscriber : public EventFwk::CommonEventSubscriber { +public: + FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) + { + ability_ = nullptr; + } + ~FormEventSubscriber() + { + ability_ = nullptr; + } + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + void KitTerminateAbility(); + + FormAbilityUninstallApp *ability_; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_ABILITY_UNINSTALL_APP_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp new file mode 100644 index 0000000000..a0784dce6c --- /dev/null +++ b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2021 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. + */ +#include +#include +#include + +#include "app_log_wrapper.h" +#include "form_ability_uninstall_app.h" +#include "form_st_common_info.h" +#include "form_test_utils.h" + +namespace { + using namespace OHOS::AAFwk; + using namespace OHOS::EventFwk; +} + +namespace OHOS { +namespace AppExecFwk { +std::vector eventList = { + FORM_EVENT_REQ_UNINSTALL_TEST_0100, FORM_EVENT_REQ_UNINSTALL_TEST_0200, FORM_EVENT_REQ_UNINSTALL_TEST_0300, + FORM_EVENT_REQ_UNINSTALL_TEST_0400, FORM_EVENT_REQ_UNINSTALL_TEST_0500, FORM_EVENT_REQ_UNINSTALL_TEST_0600, + FORM_EVENT_REQ_UNINSTALL_TEST_0700, FORM_EVENT_REQ_UNINSTALL_TEST_0800, FORM_EVENT_REQ_UNINSTALL_TEST_0900, + FORM_EVENT_REQ_UNINSTALL_TEST_1000, FORM_EVENT_REQ_UNINSTALL_TEST_1100, FORM_EVENT_REQ_UNINSTALL_TEST_1200, + FORM_EVENT_REQ_UNINSTALL_TEST_1300, FORM_EVENT_REQ_UNINSTALL_TEST_1400, FORM_EVENT_REQ_UNINSTALL_TEST_1500, + FORM_EVENT_REQ_UNINSTALL_TEST_1600, FORM_EVENT_REQ_UNINSTALL_TEST_1700, FORM_EVENT_REQ_UNINSTALL_TEST_1800, +}; + +static std::string g_bundleName = "com.form.formsystemtestservicea"; +static std::string g_moduleName = "formmodule001"; +void FormAbilityUninstallApp::UninstallAppFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); + APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); + APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); + APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); + APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); + APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); + APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", + __func__, formJsInfo.formProviderData.GetDataString().c_str()); + + APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); + + if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0100) { + FormTestUtils::PublishEvent(this->caseName_, 101, std::to_string(formJsInfo.formId)); + } else if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0200) { + FormTestUtils::PublishEvent(this->caseName_, 201, std::to_string(formJsInfo.formId)); + } else { + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, std::to_string(formJsInfo.formId)); + } +} + +void FormAbilityUninstallApp::UninstallAppFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const +{ + APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); + APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); + APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); + APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); + APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); + APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); + APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); + APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", + __func__, formJsInfo.formProviderData.GetDataString().c_str()); + + APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); + + if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0100) { + FormTestUtils::PublishEvent(this->caseName_, 102, "true"); + } else if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0200) { + FormTestUtils::PublishEvent(this->caseName_, 202, "true"); + } else { + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 2, "true"); + } +} + +void FormAbilityUninstallApp::UninstallAppFormCallback::OnFormUninstall(const int64_t formId) const +{ + APP_LOGI("%{public}s called", __func__); +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0100(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_0100, 100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_uninstallTest_0100] AcquireForm end"); + } else { + APP_LOGE("[FMS_uninstallTest_0100] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_0100, 100, "false"); + } +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0200(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_0200, 200); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_uninstallTest_0200] AcquireForm end"); + } else { + APP_LOGE("[FMS_uninstallTest_0200] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_0200, 200, "false"); + } +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0300(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_0300, 300); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_uninstallTest_0300] AcquireForm end"); + } else { + APP_LOGE("[FMS_uninstallTest_0300] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_0300, 300, "false"); + } +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0400(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0500(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0600(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0700(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0800(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_0900(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1000(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1100(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_1100, 1100); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_uninstallTest_1100] AcquireForm end"); + } else { + APP_LOGE("[FMS_uninstallTest_1100] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1100, 1100, "false"); + } +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1200(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1300(std::string data) +{ + std::shared_ptr callback = + std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_1300, 1300); + callback->ability_ = this; + // Set Want info begin + Want want; + want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); + want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); + want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); + want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); + want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); + // Set Want info end + bool bResult = AcquireForm(0, want, callback); + if (bResult) { + APP_LOGI("[FMS_uninstallTest_1300] AcquireForm end"); + } else { + APP_LOGE("[FMS_uninstallTest_1300] AcquireForm error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1300, 1300, "false"); + } +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1400(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1500(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1600(std::string data) +{ +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1700(std::string data) +{ + std::vector formInfos; + bool bResult = GetAllFormsInfo(formInfos); + if (bResult) { + APP_LOGI("[FMS_uninstallTest_1700] GetAllFormsInfo end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1700, 1700, "true"); + } else { + APP_LOGE("[FMS_uninstallTest_1700] GetAllFormsInfo error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1700, 1700, "false"); + } +} + +void FormAbilityUninstallApp::FMS_uninstallTest_1800(std::string data) +{ + bool bResult = CheckFMSReady(); + if (bResult) { + APP_LOGI("[FMS_uninstallTest_1800] CheckFMSReady end"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1800, 1800, "true"); + } else { + APP_LOGE("[FMS_uninstallTest_1800] CheckFMSReady error"); + FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1800, 1800, "false"); + } +} + +void FormAbilityUninstallApp::OnStart(const Want &want) +{ + APP_LOGI("FormAbilityUninstallApp::onStart"); + Ability::OnStart(want); +} + +void FormAbilityUninstallApp::OnActive() +{ + APP_LOGI("FormAbilityUninstallApp::OnActive"); + Ability::OnActive(); + std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; + FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); +} + +void FormAbilityUninstallApp::OnStop() +{ + APP_LOGI("FormAbilityUninstallApp::OnStop"); + + Ability::OnStop(); + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +void FormAbilityUninstallApp::OnInactive() +{ + APP_LOGI("FormAbilityUninstallApp::OnInactive"); + + Ability::OnInactive(); +} + +void FormAbilityUninstallApp::OnBackground() +{ + APP_LOGI("FormAbilityUninstallApp::OnBackground"); + + Ability::OnBackground(); +} + +void FormAbilityUninstallApp::SubscribeEvent() +{ + APP_LOGI("FormAbilityUninstallApp::SubscribeEvent"); + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->ability_ = this; + CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +// KitTest End +void FormAbilityUninstallApp::Init(const std::shared_ptr &abilityInfo, + const std::shared_ptr &application, std::shared_ptr &handler, + const sptr &token) +{ + APP_LOGI("FormAbilityUninstallApp::Init"); + Ability::Init(abilityInfo, application, handler, token); + + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0100] = &FormAbilityUninstallApp::FMS_uninstallTest_0100; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0200] = &FormAbilityUninstallApp::FMS_uninstallTest_0200; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0300] = &FormAbilityUninstallApp::FMS_uninstallTest_0300; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0400] = &FormAbilityUninstallApp::FMS_uninstallTest_0400; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0500] = &FormAbilityUninstallApp::FMS_uninstallTest_0500; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0600] = &FormAbilityUninstallApp::FMS_uninstallTest_0600; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0700] = &FormAbilityUninstallApp::FMS_uninstallTest_0700; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0800] = &FormAbilityUninstallApp::FMS_uninstallTest_0800; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0900] = &FormAbilityUninstallApp::FMS_uninstallTest_0900; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1000] = &FormAbilityUninstallApp::FMS_uninstallTest_1000; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1100] = &FormAbilityUninstallApp::FMS_uninstallTest_1100; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1300] = &FormAbilityUninstallApp::FMS_uninstallTest_1300; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1700] = &FormAbilityUninstallApp::FMS_uninstallTest_1700; + memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1800] = &FormAbilityUninstallApp::FMS_uninstallTest_1800; + + SubscribeEvent(); +} + +void FormAbilityUninstallApp::handleEvent(std::string action, std::string data) +{ + APP_LOGI("%{public}s called", __func__); + if (calledFuncMap_.find(action) != calledFuncMap_.end()) { + return; + } + calledFuncMap_.emplace(action, 0); + auto itFunc = memberFuncMap_.find(action); + if (itFunc != memberFuncMap_.end()) { + auto memberFunc = itFunc->second; + if (memberFunc != nullptr) { + return (this->*memberFunc)(data); + } + } +} + +void FormAbilityUninstallApp::Clear() +{ +} + +void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s, code=%{public}d, data=%{public}s", + data.GetWant().GetAction().c_str(), data.GetCode(), data.GetData().c_str()); + auto eventName = data.GetWant().GetAction(); + ability_->handleEvent(eventName, data.GetData()); + CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); +} + +void FormEventSubscriber::KitTerminateAbility() +{ + if (ability_ != nullptr) { + ability_->TerminateAbility(); + } +} + +REGISTER_AA(FormAbilityUninstallApp) +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/formSystemTestServiceA/config.json b/test/resource/formsystemtestability/formSystemTestServiceA/config.json index c7baafed52..9c9e18be8d 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceA/config.json +++ b/test/resource/formsystemtestability/formSystemTestServiceA/config.json @@ -1,56 +1,61 @@ { "app": { - "bundleName": "com.provider.bundleName1", - "vendor": "ohos", + "bundleName": "com.form.formsystemtestservicea", + "vendor": "neusoft", "version": { "code": 1, "name": "1.0" }, "apiVersion": { - "compatible": 3, - "target": 3 - } - }, - "deviceConfig": { - "default": { + "compatible": 5, + "target": 5, + "releaseType": "Beta1" } }, + "deviceConfig": {}, "module": { - "package": "com.provider.FormSystemTestServiceA.src", - "name": "moduleName11", + "package": "com.form.formsystemtestservicea", + "name": ".MyApplication", "deviceType": [ "phone" ], "distro": { "deliveryWithInstall": true, - "moduleName": "moduleName11", + "moduleName": "formmodule001", "moduleType": "entry" }, "abilities": [ { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "visible": true, "name": "FormStServiceAbilityA", - "icon": "$media:snowball", - "label": "FormStServiceAbilityA Ability", - "launchType": "standard", - "orientation": "unspecified", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", "type": "service", - "visible": true, + "launchType": "standard", "formsEnabled": true, + "srcLanguage": "c++", "forms": [ { - "name": "formName111", + "name": "Form_Js001", "description": "form_description", "isDefault": true, "type": "JS", "colorMode": "auto", "supportDimensions":[ "1*2", "2*2" ], "defaultDimension": "1*2", - "landscapeLayouts": [""], - "portraitLayouts": [""], "updateEnabled": true, - "scheduledUpateTime": "0:0", - "updateDuration": 1, - "deepLink": "", + "scheduledUpdateTime": "10:30", "jsComponentName": "card", "formVisibleNotify" : true, "metaData": { @@ -63,19 +68,15 @@ } }, { - "name": "formName112", + "name": "Form_Js002", "description": "form_description", "isDefault": true, "type": "JS", "colorMode": "auto", "supportDimensions":[ "1*2", "2*2" ], "defaultDimension": "1*2", - "landscapeLayouts": [""], - "portraitLayouts": [""], "updateEnabled": true, - "scheduledUpateTime": "10:30", - "updateDuration": 0, - "deepLink": "", + "updateDuration": 1, "jsComponentName": "card", "formVisibleNotify" : true, "metaData": { @@ -90,23 +91,17 @@ ] } ], - "defPermissions": [ - { - "name": "com.permission.CAMERA", - "grantMode": "system_grant", - "availableScope": ["signature"], - "label": "CAMERA permission", - "description": "CAMERA permission in detail" - } - ], "js": [ { - "name": "card", "pages": [ "pages/index/index" ], - "type": "form" + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": true + } } ] } -} +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/formSystemTestServiceA/include/form_st_service_ability_A.h b/test/resource/formsystemtestability/formSystemTestServiceA/include/form_st_service_ability_A.h index 610caccc59..9d54dda7e9 100755 --- a/test/resource/formsystemtestability/formSystemTestServiceA/include/form_st_service_ability_A.h +++ b/test/resource/formsystemtestability/formSystemTestServiceA/include/form_st_service_ability_A.h @@ -31,6 +31,7 @@ using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; const std::string APP_A_RESP_EVENT_NAME = "resp_com_ohos_formst_service_app_a"; const std::string APP_A_REQ_EVENT_NAME = "req_com_ohos_formst_service_app_a"; const std::string COMMON_EVENT_TEST_ACTION1 = "usual.event.test1"; +const std::string COMMON_EVENT_ON_DELETE = "usual.event.ondelete"; /** * Form event trigger result */ diff --git a/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp b/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp index e229ca09f0..adca34c255 100755 --- a/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp @@ -337,7 +337,7 @@ void FormStServiceAbilityA::OnDelete(const int64_t formId) clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); + PublishEvent(COMMON_EVENT_ON_DELETE, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, std::to_string(formId)); APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); } diff --git a/test/resource/formsystemtestability/formSystemTestServiceB/BUILD.gn b/test/resource/formsystemtestability/formSystemTestServiceB/BUILD.gn new file mode 100644 index 0000000000..a85feccfd2 --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceB/BUILD.gn @@ -0,0 +1,58 @@ +# Copyright (c) 2021 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. + +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") +subdemosystem_path = "${appexecfwk_path}/test/resource/formsystemtestability/formSystemTestServiceB" +config("formSystemTestBConfig") { + visibility = [ ":*" ] + include_dirs = [ + "${subdemosystem_path}/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/services/bundlemgr/include", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "//foundation/distributedschedule/services/dtbschedmgr/include", + "${even_path}/cesfwk/innerkits/include", + "${even_path}/cesfwk/kits/native/include", + ] + defines = [ + "APP_LOG_TAG = \"formSystemTestServiceB\"", + "LOG_DOMAIN = 0xD002200", + ] +} +ohos_shared_library("formSystemTestServiceB") { + sources = [ "${subdemosystem_path}/src/form_st_service_ability_B.cpp" ] + configs = [ ":formSystemTestBConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/want:want", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/formSystemTestServiceB/config.json b/test/resource/formsystemtestability/formSystemTestServiceB/config.json new file mode 100644 index 0000000000..baf8da59ed --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceB/config.json @@ -0,0 +1,107 @@ +{ + "app": { + "bundleName": "com.form.formsystemtestserviceb", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 5, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.form.formsystemtestserviceb", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "formmodule001", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "visible": true, + "name": "FormStServiceAbilityB", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", + "type": "service", + "launchType": "standard", + "formsEnabled": true, + "srcLanguage": "c++", + "forms": [ + { + "name": "Form_Js001", + "description": "form_description", + "isDefault": true, + "type": "JS", + "colorMode": "auto", + "supportDimensions":[ "1*2", "2*2" ], + "defaultDimension": "1*2", + "updateEnabled": true, + "scheduledUpdateTime": "10:30", + "jsComponentName": "card", + "formVisibleNotify" : true, + "metaData": { + "customizeData": [ + { + "name": "originWidgetName", + "value": "myTest" + } + ] + } + }, + { + "name": "Form_Js002", + "description": "form_description", + "isDefault": true, + "type": "JS", + "colorMode": "auto", + "supportDimensions":[ "1*2", "2*2" ], + "defaultDimension": "1*2", + "updateEnabled": true, + "updateDuration": 1, + "jsComponentName": "card", + "formVisibleNotify" : true, + "metaData": { + "customizeData": [ + { + "name": "originWidgetName", + "value": "myTest" + } + ] + } + } + ] + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": true + } + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/formSystemTestServiceA/include/form_st_service_ability_a1.h b/test/resource/formsystemtestability/formSystemTestServiceB/include/form_st_service_ability_B.h old mode 100755 new mode 100644 similarity index 76% rename from test/resource/formsystemtestability/formSystemTestServiceA/include/form_st_service_ability_a1.h rename to test/resource/formsystemtestability/formSystemTestServiceB/include/form_st_service_ability_B.h index e5e3042934..d3dff856cb --- a/test/resource/formsystemtestability/formSystemTestServiceA/include/form_st_service_ability_a1.h +++ b/test/resource/formsystemtestability/formSystemTestServiceB/include/form_st_service_ability_B.h @@ -13,8 +13,8 @@ * limitations under the License. */ -#ifndef FORM_ST_SERVICE_ABILITY_A1_ -#define FORM_ST_SERVICE_ABILITY_A1_ +#ifndef FORM_ST_SERVICE_ABILITY_B_ +#define FORM_ST_SERVICE_ABILITY_B_ #include #include #include "ability_connect_callback_stub.h" @@ -22,19 +22,26 @@ #include "ability_loader.h" #include "common_event.h" #include "common_event_manager.h" - #include "form_provider_info.h" namespace OHOS { namespace AppExecFwk { using AbilityConnectionStub = OHOS::AAFwk::AbilityConnectionStub; using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; -const std::string APP_A1_RESP_EVENT_NAME = "resp_com_ohos_formst_service_app_a1"; -const std::string APP_A1_REQ_EVENT_NAME = "req_com_ohos_formst_service_app_a1"; +const std::string APP_A_RESP_EVENT_NAME = "resp_com_ohos_formst_service_app_b"; +const std::string APP_A_REQ_EVENT_NAME = "req_com_ohos_formst_service_app_b"; +const std::string COMMON_EVENT_TEST_ACTION1 = "usual.event.test1"; +/** + * Form event trigger result + */ +typedef enum { + FORM_EVENT_TRIGGER_RESULT_NG = 0, + FORM_EVENT_TRIGGER_RESULT_OK = 1, +} FORM_EVENT_TRIGGER_RESULT; -class FormStServiceAbilityA1 : public Ability { +class FormStServiceAbilityB : public Ability { public: - ~FormStServiceAbilityA1(); + ~FormStServiceAbilityB(); protected: virtual void OnStart(const Want &want) override; @@ -47,6 +54,11 @@ protected: virtual sptr OnConnect(const Want &want) override; virtual void OnDisconnect(const Want &want) override; virtual FormProviderInfo OnCreate(const Want &want) override; + virtual void OnUpdate(const int64_t formId) override; + virtual void OnTriggerEvent(const int64_t formId, const std::string &message) override; + virtual void OnDelete(const int64_t formId) override; + virtual void OnCastTemptoNormal(const int64_t formId) override; + virtual void OnVisibilityChanged(const std::map &formEventsMap) override; private: void Clear(); @@ -70,7 +82,7 @@ private: std::string nextTargetAbilityConn_ = {}; std::string zombie_ = {}; - typedef void (FormStServiceAbilityA1::*func)(); + typedef void (FormStServiceAbilityB::*func)(); static std::map funcMap_; class AbilityConnectCallback; sptr stub_ = {}; @@ -96,7 +108,7 @@ private: { if (resultCode == 0) { onAbilityConnectDoneCount++; - PublishEvent(APP_A1_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityConnectDone"); + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityConnectDone"); } } @@ -110,7 +122,7 @@ private: { if (resultCode == 0) { onAbilityConnectDoneCount--; - PublishEvent(APP_A1_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityDisconnectDone"); + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityDisconnectDone"); } } @@ -122,9 +134,9 @@ private: ~AppEventSubscriber() = default; virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; - FormStServiceAbilityA1 *mainAbility_ = nullptr; + FormStServiceAbilityB *mainAbility_ = nullptr; }; }; } // namespace AppExecFwk } // namespace OHOS -#endif // FORM_ST_SERVICE_ABILITY_A1_ +#endif // FORM_ST_SERVICE_ABILITY_B_ diff --git a/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp b/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp new file mode 100644 index 0000000000..07825d77bf --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp @@ -0,0 +1,373 @@ +/* + * Copyright (c) 2021 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. + */ + +#include "form_st_service_ability_B.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "form_provider_client.h" + +using namespace OHOS::EventFwk; + +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; + +namespace OHOS { +namespace AppExecFwk { +using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; + +int FormStServiceAbilityB::AbilityConnectCallback::onAbilityConnectDoneCount = 0; +std::map FormStServiceAbilityB::funcMap_ = { + {"StartOtherAbility", &FormStServiceAbilityB::StartOtherAbility}, + {"ConnectOtherAbility", &FormStServiceAbilityB::ConnectOtherAbility}, + {"DisConnectOtherAbility", &FormStServiceAbilityB::DisConnectOtherAbility}, + {"StopSelfAbility", &FormStServiceAbilityB::StopSelfAbility}, +}; + +FormStServiceAbilityB::~FormStServiceAbilityB() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +std::vector FormStServiceAbilityB::Split(std::string str, const std::string &token) +{ + APP_LOGI("FormStServiceAbilityB::Split"); + + std::vector splitString; + while (str.size()) { + size_t index = str.find(token); + if (index != std::string::npos) { + splitString.push_back(str.substr(0, index)); + str = str.substr(index + token.size()); + if (str.size() == 0) { + splitString.push_back(str); + } + } else { + splitString.push_back(str); + str = ""; + } + } + return splitString; +} +void FormStServiceAbilityB::StartOtherAbility() +{ + APP_LOGI("FormStServiceAbilityB::StartOtherAbility begin targetBundle=%{public}s, targetAbility=%{public}s", + targetBundle_.c_str(), + targetAbility_.c_str()); + APP_LOGI("FormStServiceAbilityB::StartOtherAbility begin nextTargetBundleConn=%{public}s, " + "nextTargetAbilityConn=%{public}s", + nextTargetBundleConn_.c_str(), + nextTargetAbilityConn_.c_str()); + + if (!targetBundle_.empty() && !targetAbility_.empty()) { + std::vector strtargetBundles = Split(targetBundle_, ","); + std::vector strTargetAbilitys = Split(targetAbility_, ","); + for (size_t i = 0; i < strtargetBundles.size() && i < strTargetAbilitys.size(); i++) { + Want want; + want.SetElementName(strtargetBundles[i], strTargetAbilitys[i]); + want.SetParam("shouldReturn", shouldReturn_); + want.SetParam("targetBundle", nextTargetBundle_); + want.SetParam("targetAbility", nextTargetAbility_); + want.SetParam("targetBundleConn", nextTargetBundleConn_); + want.SetParam("targetAbilityConn", nextTargetAbilityConn_); + StartAbility(want); + sleep(1); + } + } +} +void FormStServiceAbilityB::ConnectOtherAbility() +{ + APP_LOGI( + "FormStServiceAbilityB::ConnectOtherAbility begin targetBundleConn=%{public}s, targetAbilityConn=%{public}s", + targetBundleConn_.c_str(), + targetAbilityConn_.c_str()); + APP_LOGI("FormStServiceAbilityB::ConnectOtherAbility begin nextTargetBundleConn=%{public}s, " + "nextTargetAbilityConn=%{public}s", + nextTargetBundleConn_.c_str(), + nextTargetAbilityConn_.c_str()); + + // connect service ability + if (!targetBundleConn_.empty() && !targetAbilityConn_.empty()) { + std::vector strtargetBundles = Split(targetBundleConn_, ","); + std::vector strTargetAbilitys = Split(targetAbilityConn_, ","); + for (size_t i = 0; i < strtargetBundles.size() && i < strTargetAbilitys.size(); i++) { + Want want; + want.SetElementName(strtargetBundles[i], strTargetAbilitys[i]); + want.SetParam("shouldReturn", shouldReturn_); + want.SetParam("targetBundle", nextTargetBundle_); + want.SetParam("targetAbility", nextTargetAbility_); + want.SetParam("targetBundleConn", nextTargetBundleConn_); + want.SetParam("targetAbilityConn", nextTargetAbilityConn_); + stub_ = new (std::nothrow) AbilityConnectCallback(); + connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_); + APP_LOGI("FormStServiceAbilityB::ConnectOtherAbility->ConnectAbility"); + bool ret = ConnectAbility(want, connCallback_); + sleep(1); + if (!ret) { + APP_LOGE("FormStServiceAbilityB::ConnectAbility failed!"); + } + } + } +} +void FormStServiceAbilityB::DisConnectOtherAbility() +{ + APP_LOGI("FormStServiceAbilityB::DisConnectOtherAbility begin"); + if (connCallback_ != nullptr) { + DisconnectAbility(connCallback_); + sleep(1); + } + APP_LOGI("FormStServiceAbilityB::DisConnectOtherAbility end"); +} + +void FormStServiceAbilityB::StopSelfAbility() +{ + APP_LOGI("FormStServiceAbilityB::StopSelfAbility"); + + TerminateAbility(); +} + +void FormStServiceAbilityB::OnStart(const Want &want) +{ + APP_LOGI("FormStServiceAbilityB::OnStart"); + + GetWantInfo(want); + Ability::OnStart(want); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnStart"); + SubscribeEvent(); + + // make exception for test + if (!zombie_.empty()) { + std::unique_ptr pWant = nullptr; + pWant->GetScheme(); + } +} +void FormStServiceAbilityB::OnCommand(const AAFwk::Want &want, bool restart, int startId) +{ + APP_LOGI("FormStServiceAbilityB::OnCommand"); + + GetWantInfo(want); + Ability::OnCommand(want, restart, startId); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnCommand"); +} +void FormStServiceAbilityB::OnNewWant(const Want &want) +{ + APP_LOGI("FormStServiceAbilityB::OnNewWant"); + + GetWantInfo(want); + Ability::OnNewWant(want); +} +void FormStServiceAbilityB::OnStop() +{ + APP_LOGI("FormStServiceAbilityB::OnStop"); + + Ability::OnStop(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INITIAL, "OnStop"); +} +void FormStServiceAbilityB::OnActive() +{ + APP_LOGI("FormStServiceAbilityB::OnActive"); + + Ability::OnActive(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnActive"); +} +void FormStServiceAbilityB::OnInactive() +{ + APP_LOGI("FormStServiceAbilityB::OnInactive"); + + Ability::OnInactive(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnInactive"); +} +void FormStServiceAbilityB::OnBackground() +{ + APP_LOGI("FormStServiceAbilityB::OnBackground"); + + Ability::OnBackground(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnBackground"); +} + +void FormStServiceAbilityB::Clear() +{ + shouldReturn_ = ""; + targetBundle_ = ""; + targetAbility_ = ""; + targetBundleConn_ = ""; + targetAbilityConn_ = ""; + nextTargetBundle_ = ""; + nextTargetAbility_ = ""; + nextTargetBundleConn_ = ""; + nextTargetAbilityConn_ = ""; +} +void FormStServiceAbilityB::GetWantInfo(const Want &want) +{ + Want mWant(want); + shouldReturn_ = mWant.GetStringParam("shouldReturn"); + targetBundle_ = mWant.GetStringParam("targetBundle"); + targetAbility_ = mWant.GetStringParam("targetAbility"); + targetBundleConn_ = mWant.GetStringParam("targetBundleConn"); + targetAbilityConn_ = mWant.GetStringParam("targetAbilityConn"); + nextTargetBundle_ = mWant.GetStringParam("nextTargetBundle"); + nextTargetAbility_ = mWant.GetStringParam("nextTargetAbility"); + nextTargetBundleConn_ = mWant.GetStringParam("nextTargetBundleConn"); + nextTargetAbilityConn_ = mWant.GetStringParam("nextTargetAbilityConn"); + zombie_ = mWant.GetStringParam("zombie"); + FormStServiceAbilityB::AbilityConnectCallback::onAbilityConnectDoneCount = 0; +} +bool FormStServiceAbilityB::PublishEvent(const std::string &eventName, const int &code, const std::string &data) +{ + APP_LOGI("FormStServiceAbilityB::PublishEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + code, + data.c_str()); + + Want want; + want.SetAction(eventName); + CommonEventData commonData; + commonData.SetWant(want); + commonData.SetCode(code); + commonData.SetData(data); + return CommonEventManager::PublishCommonEvent(commonData); +} +sptr FormStServiceAbilityB::OnConnect(const Want &want) +{ + APP_LOGI("FormStServiceAbilityB::OnConnect"); + + sptr formProviderClient = new (std::nothrow) FormProviderClient(); + std::shared_ptr thisAbility = this->shared_from_this(); + formProviderClient->SetOwner(thisAbility); + + return formProviderClient; +} +void FormStServiceAbilityB::OnDisconnect(const Want &want) +{ + APP_LOGI("FormStServiceAbilityB::OnDisconnect"); + + Ability::OnDisconnect(want); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnDisconnect"); +} +bool FormStServiceAbilityB::SubscribeEvent() +{ + MatchingSkills matchingSkills; + matchingSkills.AddEvent(APP_A_REQ_EVENT_NAME); + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->mainAbility_ = this; + return CommonEventManager::SubscribeCommonEvent(subscriber_); +} +void FormStServiceAbilityB::AppEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + auto eventName = data.GetWant().GetAction(); + auto dataContent = data.GetData(); + APP_LOGI("FormStServiceAbilityB::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + data.GetCode(), + dataContent.c_str()); + if (APP_A_REQ_EVENT_NAME.compare(eventName) == 0) { + if (funcMap_.find(dataContent) == funcMap_.end()) { + APP_LOGI( + "FormStServiceAbilityB::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + data.GetCode(), + dataContent.c_str()); + } else { + if (mainAbility_ != nullptr) { + (mainAbility_->*funcMap_[dataContent])(); + } + } + } +} + +FormProviderInfo FormStServiceAbilityB::OnCreate(const Want &want) +{ + APP_LOGI("%{public}s start", __func__); + FormProviderInfo formProviderInfo; + if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); + return formProviderInfo; + } + std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); + std::string jsonData = std::string(""); + for (int i = 0; i < 200; i = i + 1) { + jsonData = jsonData + std::string("beijingB" + std::to_string(i)); + } + std::string formData = std::string("{\"city\":\"") + jsonData + std::string("\"}"); + FormProviderData formProviderData = FormProviderData(formData); + formProviderInfo.SetFormData(formProviderData); + APP_LOGI("%{public}s end, formId: %{public}s", __func__, formId.c_str()); + return formProviderInfo; +} + +void FormStServiceAbilityB::OnUpdate(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityB::OnTriggerEvent(const int64_t formId, const std::string &message) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); + APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); +} + +void FormStServiceAbilityB::OnDelete(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityB::OnCastTemptoNormal(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityB::OnVisibilityChanged(const std::map &formEventsMap) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); +} + +REGISTER_AA(FormStServiceAbilityB); +} // namespace AppExecFwk +} // namespace OHOS diff --git a/test/resource/formsystemtestability/formSystemTestServiceC/BUILD.gn b/test/resource/formsystemtestability/formSystemTestServiceC/BUILD.gn new file mode 100644 index 0000000000..f08c7721fa --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceC/BUILD.gn @@ -0,0 +1,58 @@ +# Copyright (c) 2021 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. + +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") +subdemosystem_path = "${appexecfwk_path}/test/resource/formsystemtestability/formSystemTestServiceC" +config("formSystemTestCConfig") { + visibility = [ ":*" ] + include_dirs = [ + "${subdemosystem_path}/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/services/bundlemgr/include", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "//foundation/distributedschedule/services/dtbschedmgr/include", + "${even_path}/cesfwk/innerkits/include", + "${even_path}/cesfwk/kits/native/include", + ] + defines = [ + "APP_LOG_TAG = \"formSystemTestServiceC\"", + "LOG_DOMAIN = 0xD002200", + ] +} +ohos_shared_library("formSystemTestServiceC") { + sources = [ "${subdemosystem_path}/src/form_st_service_ability_C.cpp" ] + configs = [ ":formSystemTestCConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/want:want", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/formSystemTestServiceC/config.json b/test/resource/formsystemtestability/formSystemTestServiceC/config.json new file mode 100644 index 0000000000..81c2839e9f --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceC/config.json @@ -0,0 +1,87 @@ +{ + "app": { + "bundleName": "com.form.formsystemtestservicec", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 5, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.form.formsystemtestservicec", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "formmodule001", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "visible": true, + "name": "FormStServiceAbilityC", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", + "type": "service", + "launchType": "standard", + "formsEnabled": true, + "srcLanguage": "c++", + "forms": [ + { + "name": "Form_Js001", + "description": "form_description", + "isDefault": true, + "type": "JS", + "colorMode": "auto", + "supportDimensions":[ "1*2", "2*2" ], + "defaultDimension": "1*2", + "updateEnabled": false, + "scheduledUpdateTime": "10:30", + "updateDuration": 1, + "jsComponentName": "card", + "formVisibleNotify" : true, + "metaData": { + "customizeData": [ + { + "name": "originWidgetName", + "value": "myTest" + } + ] + } + } + ] + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": true + } + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h b/test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h new file mode 100644 index 0000000000..1fbfb4d26f --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef FORM_ST_SERVICE_ABILITY_C_ +#define FORM_ST_SERVICE_ABILITY_C_ +#include +#include +#include "ability_connect_callback_stub.h" +#include "ability_connect_callback_proxy.h" +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "form_provider_info.h" + +namespace OHOS { +namespace AppExecFwk { +using AbilityConnectionStub = OHOS::AAFwk::AbilityConnectionStub; +using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; +const std::string APP_A_RESP_EVENT_NAME = "resp_com_ohos_formst_service_app_b"; +const std::string APP_A_REQ_EVENT_NAME = "req_com_ohos_formst_service_app_b"; +const std::string COMMON_EVENT_TEST_ACTION1 = "usual.event.test1"; +/** + * Form event trigger result + */ +typedef enum { + FORM_EVENT_TRIGGER_RESULT_NG = 0, + FORM_EVENT_TRIGGER_RESULT_OK = 1, +} FORM_EVENT_TRIGGER_RESULT; + +class FormStServiceAbilityC : public Ability { +public: + ~FormStServiceAbilityC(); + +protected: + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; + virtual void OnNewWant(const Want &want) override; + virtual void OnCommand(const AAFwk::Want &want, bool restart, int startId) override; + virtual sptr OnConnect(const Want &want) override; + virtual void OnDisconnect(const Want &want) override; + virtual FormProviderInfo OnCreate(const Want &want) override; + virtual void OnUpdate(const int64_t formId) override; + virtual void OnTriggerEvent(const int64_t formId, const std::string &message) override; + virtual void OnDelete(const int64_t formId) override; + virtual void OnCastTemptoNormal(const int64_t formId) override; + virtual void OnVisibilityChanged(const std::map &formEventsMap) override; + +private: + void Clear(); + void GetWantInfo(const Want &want); + std::vector Split(std::string str, const std::string &token); + bool SubscribeEvent(); + static bool PublishEvent(const std::string &eventName, const int &code, const std::string &data); + void StartOtherAbility(); + void ConnectOtherAbility(); + void DisConnectOtherAbility(); + void StopSelfAbility(); + + std::string shouldReturn_ = {}; + std::string targetBundle_ = {}; + std::string targetAbility_ = {}; + std::string nextTargetBundle_ = {}; + std::string nextTargetAbility_ = {}; + std::string targetBundleConn_ = {}; + std::string targetAbilityConn_ = {}; + std::string nextTargetBundleConn_ = {}; + std::string nextTargetAbilityConn_ = {}; + std::string zombie_ = {}; + + typedef void (FormStServiceAbilityC::*func)(); + static std::map funcMap_; + class AbilityConnectCallback; + sptr stub_ = {}; + sptr connCallback_ = {}; + class AppEventSubscriber; + std::shared_ptr subscriber_ = {}; + + class AbilityConnectCallback : public AbilityConnectionStub { + public: + sptr AsObject() override + { + return nullptr; + } + /** + * OnAbilityConnectDone, AbilityMs notify caller ability the result of connect. + * + * @param element,.service ability's ElementName. + * @param remoteObject,.the session proxy of service ability. + * @param resultCode, ERR_OK on success, others on failure. + */ + void OnAbilityConnectDone( + const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) override + { + if (resultCode == 0) { + onAbilityConnectDoneCount++; + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityConnectDone"); + } + } + + /** + * OnAbilityDisconnectDone, AbilityMs notify caller ability the result of disconnect. + * + * @param element,.service ability's ElementName. + * @param resultCode, ERR_OK on success, others on failure. + */ + void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override + { + if (resultCode == 0) { + onAbilityConnectDoneCount--; + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityDisconnectDone"); + } + } + + static int onAbilityConnectDoneCount; + }; + class AppEventSubscriber : public EventFwk::CommonEventSubscriber { + public: + AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + ~AppEventSubscriber() = default; + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + + FormStServiceAbilityC *mainAbility_ = nullptr; + }; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // FORM_ST_SERVICE_ABILITY_C_ diff --git a/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_a1.cpp b/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp old mode 100755 new mode 100644 similarity index 48% rename from test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_a1.cpp rename to test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp index 8a3d6e97ff..b1f2db41c0 --- a/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_a1.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "form_st_service_ability_a1.h" +#include "form_st_service_ability_C.h" #include "app_log_wrapper.h" #include "common_event.h" #include "common_event_manager.h" @@ -21,26 +21,29 @@ using namespace OHOS::EventFwk; +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; + namespace OHOS { namespace AppExecFwk { using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; -int FormStServiceAbilityA1::AbilityConnectCallback::onAbilityConnectDoneCount = 0; -std::map FormStServiceAbilityA1::funcMap_ = { - {"StartOtherAbility", &FormStServiceAbilityA1::StartOtherAbility}, - {"ConnectOtherAbility", &FormStServiceAbilityA1::ConnectOtherAbility}, - {"DisConnectOtherAbility", &FormStServiceAbilityA1::DisConnectOtherAbility}, - {"StopSelfAbility", &FormStServiceAbilityA1::StopSelfAbility}, +int FormStServiceAbilityC::AbilityConnectCallback::onAbilityConnectDoneCount = 0; +std::map FormStServiceAbilityC::funcMap_ = { + {"StartOtherAbility", &FormStServiceAbilityC::StartOtherAbility}, + {"ConnectOtherAbility", &FormStServiceAbilityC::ConnectOtherAbility}, + {"DisConnectOtherAbility", &FormStServiceAbilityC::DisConnectOtherAbility}, + {"StopSelfAbility", &FormStServiceAbilityC::StopSelfAbility}, }; -FormStServiceAbilityA1::~FormStServiceAbilityA1() +FormStServiceAbilityC::~FormStServiceAbilityC() { CommonEventManager::UnSubscribeCommonEvent(subscriber_); } -std::vector FormStServiceAbilityA1::Split(std::string str, const std::string &token) +std::vector FormStServiceAbilityC::Split(std::string str, const std::string &token) { - APP_LOGI("FormStServiceAbilityA1::Split"); + APP_LOGI("FormStServiceAbilityC::Split"); std::vector splitString; while (str.size()) { @@ -58,12 +61,12 @@ std::vector FormStServiceAbilityA1::Split(std::string str, const st } return splitString; } -void FormStServiceAbilityA1::StartOtherAbility() +void FormStServiceAbilityC::StartOtherAbility() { - APP_LOGI("FormStServiceAbilityA1::StartOtherAbility begin targetBundle=%{public}s, targetAbility=%{public}s", + APP_LOGI("FormStServiceAbilityC::StartOtherAbility begin targetBundle=%{public}s, targetAbility=%{public}s", targetBundle_.c_str(), targetAbility_.c_str()); - APP_LOGI("FormStServiceAbilityA1::StartOtherAbility begin nextTargetBundleConn=%{public}s, " + APP_LOGI("FormStServiceAbilityC::StartOtherAbility begin nextTargetBundleConn=%{public}s, " "nextTargetAbilityConn=%{public}s", nextTargetBundleConn_.c_str(), nextTargetAbilityConn_.c_str()); @@ -84,13 +87,13 @@ void FormStServiceAbilityA1::StartOtherAbility() } } } -void FormStServiceAbilityA1::ConnectOtherAbility() +void FormStServiceAbilityC::ConnectOtherAbility() { APP_LOGI( - "FormStServiceAbilityA1::ConnectOtherAbility begin targetBundleConn=%{public}s, targetAbilityConn=%{public}s", + "FormStServiceAbilityC::ConnectOtherAbility begin targetBundleConn=%{public}s, targetAbilityConn=%{public}s", targetBundleConn_.c_str(), targetAbilityConn_.c_str()); - APP_LOGI("FormStServiceAbilityA1::ConnectOtherAbility begin nextTargetBundleConn=%{public}s, " + APP_LOGI("FormStServiceAbilityC::ConnectOtherAbility begin nextTargetBundleConn=%{public}s, " "nextTargetAbilityConn=%{public}s", nextTargetBundleConn_.c_str(), nextTargetAbilityConn_.c_str()); @@ -109,39 +112,39 @@ void FormStServiceAbilityA1::ConnectOtherAbility() want.SetParam("targetAbilityConn", nextTargetAbilityConn_); stub_ = new (std::nothrow) AbilityConnectCallback(); connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_); - APP_LOGI("FormStServiceAbilityA1::ConnectOtherAbility->ConnectAbility"); + APP_LOGI("FormStServiceAbilityC::ConnectOtherAbility->ConnectAbility"); bool ret = ConnectAbility(want, connCallback_); sleep(1); if (!ret) { - APP_LOGE("FormStServiceAbilityA1::ConnectAbility failed!"); + APP_LOGE("FormStServiceAbilityC::ConnectAbility failed!"); } } } } -void FormStServiceAbilityA1::DisConnectOtherAbility() +void FormStServiceAbilityC::DisConnectOtherAbility() { - APP_LOGI("FormStServiceAbilityA1::DisConnectOtherAbility begin"); + APP_LOGI("FormStServiceAbilityC::DisConnectOtherAbility begin"); if (connCallback_ != nullptr) { DisconnectAbility(connCallback_); sleep(1); } - APP_LOGI("FormStServiceAbilityA1::DisConnectOtherAbility end"); + APP_LOGI("FormStServiceAbilityC::DisConnectOtherAbility end"); } -void FormStServiceAbilityA1::StopSelfAbility() +void FormStServiceAbilityC::StopSelfAbility() { - APP_LOGI("FormStServiceAbilityA1::StopSelfAbility"); + APP_LOGI("FormStServiceAbilityC::StopSelfAbility"); TerminateAbility(); } -void FormStServiceAbilityA1::OnStart(const Want &want) +void FormStServiceAbilityC::OnStart(const Want &want) { - APP_LOGI("FormStServiceAbilityA1::OnStart"); + APP_LOGI("FormStServiceAbilityC::OnStart"); GetWantInfo(want); Ability::OnStart(want); - PublishEvent(APP_A1_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnStart"); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnStart"); SubscribeEvent(); // make exception for test @@ -150,51 +153,51 @@ void FormStServiceAbilityA1::OnStart(const Want &want) pWant->GetScheme(); } } -void FormStServiceAbilityA1::OnCommand(const AAFwk::Want &want, bool restart, int startId) +void FormStServiceAbilityC::OnCommand(const AAFwk::Want &want, bool restart, int startId) { - APP_LOGI("FormStServiceAbilityA1::OnCommand"); + APP_LOGI("FormStServiceAbilityC::OnCommand"); GetWantInfo(want); Ability::OnCommand(want, restart, startId); - PublishEvent(APP_A1_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnCommand"); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnCommand"); } -void FormStServiceAbilityA1::OnNewWant(const Want &want) +void FormStServiceAbilityC::OnNewWant(const Want &want) { - APP_LOGI("FormStServiceAbilityA1::OnNewWant"); + APP_LOGI("FormStServiceAbilityC::OnNewWant"); GetWantInfo(want); Ability::OnNewWant(want); } -void FormStServiceAbilityA1::OnStop() +void FormStServiceAbilityC::OnStop() { - APP_LOGI("FormStServiceAbilityA1::OnStop"); + APP_LOGI("FormStServiceAbilityC::OnStop"); Ability::OnStop(); - PublishEvent(APP_A1_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INITIAL, "OnStop"); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INITIAL, "OnStop"); } -void FormStServiceAbilityA1::OnActive() +void FormStServiceAbilityC::OnActive() { - APP_LOGI("FormStServiceAbilityA1::OnActive"); + APP_LOGI("FormStServiceAbilityC::OnActive"); Ability::OnActive(); - PublishEvent(APP_A1_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnActive"); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnActive"); } -void FormStServiceAbilityA1::OnInactive() +void FormStServiceAbilityC::OnInactive() { - APP_LOGI("FormStServiceAbilityA1::OnInactive"); + APP_LOGI("FormStServiceAbilityC::OnInactive"); Ability::OnInactive(); - PublishEvent(APP_A1_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnInactive"); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnInactive"); } -void FormStServiceAbilityA1::OnBackground() +void FormStServiceAbilityC::OnBackground() { - APP_LOGI("FormStServiceAbilityA1::OnBackground"); + APP_LOGI("FormStServiceAbilityC::OnBackground"); Ability::OnBackground(); - PublishEvent(APP_A1_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnBackground"); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnBackground"); } -void FormStServiceAbilityA1::Clear() +void FormStServiceAbilityC::Clear() { shouldReturn_ = ""; targetBundle_ = ""; @@ -206,7 +209,7 @@ void FormStServiceAbilityA1::Clear() nextTargetBundleConn_ = ""; nextTargetAbilityConn_ = ""; } -void FormStServiceAbilityA1::GetWantInfo(const Want &want) +void FormStServiceAbilityC::GetWantInfo(const Want &want) { Want mWant(want); shouldReturn_ = mWant.GetStringParam("shouldReturn"); @@ -219,11 +222,11 @@ void FormStServiceAbilityA1::GetWantInfo(const Want &want) nextTargetBundleConn_ = mWant.GetStringParam("nextTargetBundleConn"); nextTargetAbilityConn_ = mWant.GetStringParam("nextTargetAbilityConn"); zombie_ = mWant.GetStringParam("zombie"); - FormStServiceAbilityA1::AbilityConnectCallback::onAbilityConnectDoneCount = 0; + FormStServiceAbilityC::AbilityConnectCallback::onAbilityConnectDoneCount = 0; } -bool FormStServiceAbilityA1::PublishEvent(const std::string &eventName, const int &code, const std::string &data) +bool FormStServiceAbilityC::PublishEvent(const std::string &eventName, const int &code, const std::string &data) { - APP_LOGI("FormStServiceAbilityA1::PublishEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + APP_LOGI("FormStServiceAbilityC::PublishEvent eventName = %{public}s, code = %{public}d, data = %{public}s", eventName.c_str(), code, data.c_str()); @@ -236,46 +239,45 @@ bool FormStServiceAbilityA1::PublishEvent(const std::string &eventName, const in commonData.SetData(data); return CommonEventManager::PublishCommonEvent(commonData); } -sptr FormStServiceAbilityA1::OnConnect(const Want &want) +sptr FormStServiceAbilityC::OnConnect(const Want &want) { - APP_LOGI("FormStServiceAbilityA1::OnConnect"); - + APP_LOGI("FormStServiceAbilityC::OnConnect"); + sptr formProviderClient = new (std::nothrow) FormProviderClient(); - formProviderClient->SetOwner(std::make_shared(*this)); std::shared_ptr thisAbility = this->shared_from_this(); formProviderClient->SetOwner(thisAbility); return formProviderClient; } -void FormStServiceAbilityA1::OnDisconnect(const Want &want) +void FormStServiceAbilityC::OnDisconnect(const Want &want) { - APP_LOGI("FormStServiceAbilityA1::OnDisconnect"); + APP_LOGI("FormStServiceAbilityC::OnDisconnect"); Ability::OnDisconnect(want); - PublishEvent(APP_A1_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnDisconnect"); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnDisconnect"); } -bool FormStServiceAbilityA1::SubscribeEvent() +bool FormStServiceAbilityC::SubscribeEvent() { MatchingSkills matchingSkills; - matchingSkills.AddEvent(APP_A1_REQ_EVENT_NAME); + matchingSkills.AddEvent(APP_A_REQ_EVENT_NAME); CommonEventSubscribeInfo subscribeInfo(matchingSkills); subscribeInfo.SetPriority(1); subscriber_ = std::make_shared(subscribeInfo); subscriber_->mainAbility_ = this; return CommonEventManager::SubscribeCommonEvent(subscriber_); } -void FormStServiceAbilityA1::AppEventSubscriber::OnReceiveEvent(const CommonEventData &data) +void FormStServiceAbilityC::AppEventSubscriber::OnReceiveEvent(const CommonEventData &data) { auto eventName = data.GetWant().GetAction(); auto dataContent = data.GetData(); - APP_LOGI("FormStServiceAbilityA1::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + APP_LOGI("FormStServiceAbilityC::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", eventName.c_str(), data.GetCode(), dataContent.c_str()); - if (APP_A1_REQ_EVENT_NAME.compare(eventName) == 0) { + if (APP_A_REQ_EVENT_NAME.compare(eventName) == 0) { if (funcMap_.find(dataContent) == funcMap_.end()) { APP_LOGI( - "FormStServiceAbilityA1::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + "FormStServiceAbilityC::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", eventName.c_str(), data.GetCode(), dataContent.c_str()); @@ -287,20 +289,82 @@ void FormStServiceAbilityA1::AppEventSubscriber::OnReceiveEvent(const CommonEven } } -FormProviderInfo FormStServiceAbilityA1::OnCreate(const Want &want) +FormProviderInfo FormStServiceAbilityC::OnCreate(const Want &want) { APP_LOGI("%{public}s start", __func__); FormProviderInfo formProviderInfo; - if (!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { - APP_LOGE("%{public}s, formId not exist", __func__); + if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); return formProviderInfo; } std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); - formProviderInfo.SetFormData(FormProviderData(std::string("{\"city\": \"beijingA\", \"formId\": " + formId + "}"))); + std::string jsonData = std::string("{\"city\":\"beijingC\"}"); + FormProviderData formProviderData = FormProviderData(jsonData); + formProviderInfo.SetFormData(formProviderData); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCreate"); APP_LOGI("%{public}s end, formId: %{public}s", __func__, formId.c_str()); return formProviderInfo; } -REGISTER_AA(FormStServiceAbilityA1); +void FormStServiceAbilityC::OnUpdate(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityC::OnTriggerEvent(const int64_t formId, const std::string &message) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); + APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); +} + +void FormStServiceAbilityC::OnDelete(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityC::OnCastTemptoNormal(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityC::OnVisibilityChanged(const std::map &formEventsMap) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); +} + +REGISTER_AA(FormStServiceAbilityC); } // namespace AppExecFwk } // namespace OHOS diff --git a/test/resource/formsystemtestability/formSystemTestServiceD/BUILD.gn b/test/resource/formsystemtestability/formSystemTestServiceD/BUILD.gn new file mode 100644 index 0000000000..56303e43cb --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceD/BUILD.gn @@ -0,0 +1,58 @@ +# Copyright (c) 2021 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. + +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") +subdemosystem_path = "${appexecfwk_path}/test/resource/formsystemtestability/formSystemTestServiceD" +config("formSystemTestDConfig") { + visibility = [ ":*" ] + include_dirs = [ + "${subdemosystem_path}/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/services/bundlemgr/include", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "//foundation/distributedschedule/services/dtbschedmgr/include", + "${even_path}/cesfwk/innerkits/include", + "${even_path}/cesfwk/kits/native/include", + ] + defines = [ + "APP_LOG_TAG = \"formSystemTestServiceD\"", + "LOG_DOMAIN = 0xD002200", + ] +} +ohos_shared_library("formSystemTestServiceD") { + sources = [ "${subdemosystem_path}/src/form_st_service_ability_D.cpp" ] + configs = [ ":formSystemTestDConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/want:want", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/formSystemTestServiceD/config.json b/test/resource/formsystemtestability/formSystemTestServiceD/config.json new file mode 100644 index 0000000000..bda4f9975f --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceD/config.json @@ -0,0 +1,87 @@ +{ + "app": { + "bundleName": "com.form.formsystemtestserviced", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 5, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.form.formsystemtestserviced", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "formmodule001", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "visible": true, + "name": "FormStServiceAbilityD", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", + "type": "service", + "launchType": "standard", + "formsEnabled": true, + "srcLanguage": "c++", + "forms": [ + { + "name": "Form_Js001", + "description": "form_description", + "isDefault": true, + "type": "JS", + "colorMode": "auto", + "supportDimensions":[ "1*2", "2*2" ], + "defaultDimension": "1*2", + "updateEnabled": true, + "scheduledUpdateTime": "10:30", + "updateDuration": 1, + "jsComponentName": "card", + "formVisibleNotify" : false, + "metaData": { + "customizeData": [ + { + "name": "originWidgetName", + "value": "myTest" + } + ] + } + } + ] + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": true + } + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h b/test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h new file mode 100644 index 0000000000..d7acc7d827 --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef FORM_ST_SERVICE_ABILITY_D_ +#define FORM_ST_SERVICE_ABILITY_D_ +#include +#include +#include "ability_connect_callback_stub.h" +#include "ability_connect_callback_proxy.h" +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "form_provider_info.h" + +namespace OHOS { +namespace AppExecFwk { +using AbilityConnectionStub = OHOS::AAFwk::AbilityConnectionStub; +using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; +const std::string APP_A_RESP_EVENT_NAME = "resp_com_ohos_formst_service_app_b"; +const std::string APP_A_REQ_EVENT_NAME = "req_com_ohos_formst_service_app_b"; +const std::string COMMON_EVENT_TEST_ACTION1 = "usual.event.test1"; +/** + * Form event trigger result + */ +typedef enum { + FORM_EVENT_TRIGGER_RESULT_NG = 0, + FORM_EVENT_TRIGGER_RESULT_OK = 1, +} FORM_EVENT_TRIGGER_RESULT; + +class FormStServiceAbilityD : public Ability { +public: + ~FormStServiceAbilityD(); + +protected: + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; + virtual void OnNewWant(const Want &want) override; + virtual void OnCommand(const AAFwk::Want &want, bool restart, int startId) override; + virtual sptr OnConnect(const Want &want) override; + virtual void OnDisconnect(const Want &want) override; + virtual FormProviderInfo OnCreate(const Want &want) override; + virtual void OnUpdate(const int64_t formId) override; + virtual void OnTriggerEvent(const int64_t formId, const std::string &message) override; + virtual void OnDelete(const int64_t formId) override; + virtual void OnCastTemptoNormal(const int64_t formId) override; + virtual void OnVisibilityChanged(const std::map &formEventsMap) override; + +private: + void Clear(); + void GetWantInfo(const Want &want); + std::vector Split(std::string str, const std::string &token); + bool SubscribeEvent(); + static bool PublishEvent(const std::string &eventName, const int &code, const std::string &data); + void StartOtherAbility(); + void ConnectOtherAbility(); + void DisConnectOtherAbility(); + void StopSelfAbility(); + + std::string shouldReturn_ = {}; + std::string targetBundle_ = {}; + std::string targetAbility_ = {}; + std::string nextTargetBundle_ = {}; + std::string nextTargetAbility_ = {}; + std::string targetBundleConn_ = {}; + std::string targetAbilityConn_ = {}; + std::string nextTargetBundleConn_ = {}; + std::string nextTargetAbilityConn_ = {}; + std::string zombie_ = {}; + + typedef void (FormStServiceAbilityD::*func)(); + static std::map funcMap_; + class AbilityConnectCallback; + sptr stub_ = {}; + sptr connCallback_ = {}; + class AppEventSubscriber; + std::shared_ptr subscriber_ = {}; + + class AbilityConnectCallback : public AbilityConnectionStub { + public: + sptr AsObject() override + { + return nullptr; + } + /** + * OnAbilityConnectDone, AbilityMs notify caller ability the result of connect. + * + * @param element,.service ability's ElementName. + * @param remoteObject,.the session proxy of service ability. + * @param resultCode, ERR_OK on success, others on failure. + */ + void OnAbilityConnectDone( + const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) override + { + if (resultCode == 0) { + onAbilityConnectDoneCount++; + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityConnectDone"); + } + } + + /** + * OnAbilityDisconnectDone, AbilityMs notify caller ability the result of disconnect. + * + * @param element,.service ability's ElementName. + * @param resultCode, ERR_OK on success, others on failure. + */ + void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override + { + if (resultCode == 0) { + onAbilityConnectDoneCount--; + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityDisconnectDone"); + } + } + + static int onAbilityConnectDoneCount; + }; + class AppEventSubscriber : public EventFwk::CommonEventSubscriber { + public: + AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + ~AppEventSubscriber() = default; + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + + FormStServiceAbilityD *mainAbility_ = nullptr; + }; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // FORM_ST_SERVICE_ABILITY_D_ diff --git a/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp b/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp new file mode 100644 index 0000000000..6c059a1938 --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2021 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. + */ + +#include "form_st_service_ability_D.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "form_provider_client.h" + +using namespace OHOS::EventFwk; + +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; + +namespace OHOS { +namespace AppExecFwk { +using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; + +int FormStServiceAbilityD::AbilityConnectCallback::onAbilityConnectDoneCount = 0; +std::map FormStServiceAbilityD::funcMap_ = { + {"StartOtherAbility", &FormStServiceAbilityD::StartOtherAbility}, + {"ConnectOtherAbility", &FormStServiceAbilityD::ConnectOtherAbility}, + {"DisConnectOtherAbility", &FormStServiceAbilityD::DisConnectOtherAbility}, + {"StopSelfAbility", &FormStServiceAbilityD::StopSelfAbility}, +}; + +FormStServiceAbilityD::~FormStServiceAbilityD() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +std::vector FormStServiceAbilityD::Split(std::string str, const std::string &token) +{ + APP_LOGI("FormStServiceAbilityD::Split"); + + std::vector splitString; + while (str.size()) { + size_t index = str.find(token); + if (index != std::string::npos) { + splitString.push_back(str.substr(0, index)); + str = str.substr(index + token.size()); + if (str.size() == 0) { + splitString.push_back(str); + } + } else { + splitString.push_back(str); + str = ""; + } + } + return splitString; +} +void FormStServiceAbilityD::StartOtherAbility() +{ + APP_LOGI("FormStServiceAbilityD::StartOtherAbility begin targetBundle=%{public}s, targetAbility=%{public}s", + targetBundle_.c_str(), + targetAbility_.c_str()); + APP_LOGI("FormStServiceAbilityD::StartOtherAbility begin nextTargetBundleConn=%{public}s, " + "nextTargetAbilityConn=%{public}s", + nextTargetBundleConn_.c_str(), + nextTargetAbilityConn_.c_str()); + + if (!targetBundle_.empty() && !targetAbility_.empty()) { + std::vector strtargetBundles = Split(targetBundle_, ","); + std::vector strTargetAbilitys = Split(targetAbility_, ","); + for (size_t i = 0; i < strtargetBundles.size() && i < strTargetAbilitys.size(); i++) { + Want want; + want.SetElementName(strtargetBundles[i], strTargetAbilitys[i]); + want.SetParam("shouldReturn", shouldReturn_); + want.SetParam("targetBundle", nextTargetBundle_); + want.SetParam("targetAbility", nextTargetAbility_); + want.SetParam("targetBundleConn", nextTargetBundleConn_); + want.SetParam("targetAbilityConn", nextTargetAbilityConn_); + StartAbility(want); + sleep(1); + } + } +} +void FormStServiceAbilityD::ConnectOtherAbility() +{ + APP_LOGI( + "FormStServiceAbilityD::ConnectOtherAbility begin targetBundleConn=%{public}s, targetAbilityConn=%{public}s", + targetBundleConn_.c_str(), + targetAbilityConn_.c_str()); + APP_LOGI("FormStServiceAbilityD::ConnectOtherAbility begin nextTargetBundleConn=%{public}s, " + "nextTargetAbilityConn=%{public}s", + nextTargetBundleConn_.c_str(), + nextTargetAbilityConn_.c_str()); + + // connect service ability + if (!targetBundleConn_.empty() && !targetAbilityConn_.empty()) { + std::vector strtargetBundles = Split(targetBundleConn_, ","); + std::vector strTargetAbilitys = Split(targetAbilityConn_, ","); + for (size_t i = 0; i < strtargetBundles.size() && i < strTargetAbilitys.size(); i++) { + Want want; + want.SetElementName(strtargetBundles[i], strTargetAbilitys[i]); + want.SetParam("shouldReturn", shouldReturn_); + want.SetParam("targetBundle", nextTargetBundle_); + want.SetParam("targetAbility", nextTargetAbility_); + want.SetParam("targetBundleConn", nextTargetBundleConn_); + want.SetParam("targetAbilityConn", nextTargetAbilityConn_); + stub_ = new (std::nothrow) AbilityConnectCallback(); + connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_); + APP_LOGI("FormStServiceAbilityD::ConnectOtherAbility->ConnectAbility"); + bool ret = ConnectAbility(want, connCallback_); + sleep(1); + if (!ret) { + APP_LOGE("FormStServiceAbilityD::ConnectAbility failed!"); + } + } + } +} +void FormStServiceAbilityD::DisConnectOtherAbility() +{ + APP_LOGI("FormStServiceAbilityD::DisConnectOtherAbility begin"); + if (connCallback_ != nullptr) { + DisconnectAbility(connCallback_); + sleep(1); + } + APP_LOGI("FormStServiceAbilityD::DisConnectOtherAbility end"); +} + +void FormStServiceAbilityD::StopSelfAbility() +{ + APP_LOGI("FormStServiceAbilityD::StopSelfAbility"); + + TerminateAbility(); +} + +void FormStServiceAbilityD::OnStart(const Want &want) +{ + APP_LOGI("FormStServiceAbilityD::OnStart"); + + GetWantInfo(want); + Ability::OnStart(want); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnStart"); + SubscribeEvent(); + + // make exception for test + if (!zombie_.empty()) { + std::unique_ptr pWant = nullptr; + pWant->GetScheme(); + } +} +void FormStServiceAbilityD::OnCommand(const AAFwk::Want &want, bool restart, int startId) +{ + APP_LOGI("FormStServiceAbilityD::OnCommand"); + + GetWantInfo(want); + Ability::OnCommand(want, restart, startId); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnCommand"); +} +void FormStServiceAbilityD::OnNewWant(const Want &want) +{ + APP_LOGI("FormStServiceAbilityD::OnNewWant"); + + GetWantInfo(want); + Ability::OnNewWant(want); +} +void FormStServiceAbilityD::OnStop() +{ + APP_LOGI("FormStServiceAbilityD::OnStop"); + + Ability::OnStop(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INITIAL, "OnStop"); +} +void FormStServiceAbilityD::OnActive() +{ + APP_LOGI("FormStServiceAbilityD::OnActive"); + + Ability::OnActive(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnActive"); +} +void FormStServiceAbilityD::OnInactive() +{ + APP_LOGI("FormStServiceAbilityD::OnInactive"); + + Ability::OnInactive(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnInactive"); +} +void FormStServiceAbilityD::OnBackground() +{ + APP_LOGI("FormStServiceAbilityD::OnBackground"); + + Ability::OnBackground(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnBackground"); +} + +void FormStServiceAbilityD::Clear() +{ + shouldReturn_ = ""; + targetBundle_ = ""; + targetAbility_ = ""; + targetBundleConn_ = ""; + targetAbilityConn_ = ""; + nextTargetBundle_ = ""; + nextTargetAbility_ = ""; + nextTargetBundleConn_ = ""; + nextTargetAbilityConn_ = ""; +} +void FormStServiceAbilityD::GetWantInfo(const Want &want) +{ + Want mWant(want); + shouldReturn_ = mWant.GetStringParam("shouldReturn"); + targetBundle_ = mWant.GetStringParam("targetBundle"); + targetAbility_ = mWant.GetStringParam("targetAbility"); + targetBundleConn_ = mWant.GetStringParam("targetBundleConn"); + targetAbilityConn_ = mWant.GetStringParam("targetAbilityConn"); + nextTargetBundle_ = mWant.GetStringParam("nextTargetBundle"); + nextTargetAbility_ = mWant.GetStringParam("nextTargetAbility"); + nextTargetBundleConn_ = mWant.GetStringParam("nextTargetBundleConn"); + nextTargetAbilityConn_ = mWant.GetStringParam("nextTargetAbilityConn"); + zombie_ = mWant.GetStringParam("zombie"); + FormStServiceAbilityD::AbilityConnectCallback::onAbilityConnectDoneCount = 0; +} +bool FormStServiceAbilityD::PublishEvent(const std::string &eventName, const int &code, const std::string &data) +{ + APP_LOGI("FormStServiceAbilityD::PublishEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + code, + data.c_str()); + + Want want; + want.SetAction(eventName); + CommonEventData commonData; + commonData.SetWant(want); + commonData.SetCode(code); + commonData.SetData(data); + return CommonEventManager::PublishCommonEvent(commonData); +} +sptr FormStServiceAbilityD::OnConnect(const Want &want) +{ + APP_LOGI("FormStServiceAbilityD::OnConnect"); + + sptr formProviderClient = new (std::nothrow) FormProviderClient(); + std::shared_ptr thisAbility = this->shared_from_this(); + formProviderClient->SetOwner(thisAbility); + + return formProviderClient; +} +void FormStServiceAbilityD::OnDisconnect(const Want &want) +{ + APP_LOGI("FormStServiceAbilityD::OnDisconnect"); + + Ability::OnDisconnect(want); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnDisconnect"); +} +bool FormStServiceAbilityD::SubscribeEvent() +{ + MatchingSkills matchingSkills; + matchingSkills.AddEvent(APP_A_REQ_EVENT_NAME); + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->mainAbility_ = this; + return CommonEventManager::SubscribeCommonEvent(subscriber_); +} +void FormStServiceAbilityD::AppEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + auto eventName = data.GetWant().GetAction(); + auto dataContent = data.GetData(); + APP_LOGI("FormStServiceAbilityD::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + data.GetCode(), + dataContent.c_str()); + if (APP_A_REQ_EVENT_NAME.compare(eventName) == 0) { + if (funcMap_.find(dataContent) == funcMap_.end()) { + APP_LOGI( + "FormStServiceAbilityD::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + data.GetCode(), + dataContent.c_str()); + } else { + if (mainAbility_ != nullptr) { + (mainAbility_->*funcMap_[dataContent])(); + } + } + } +} + +FormProviderInfo FormStServiceAbilityD::OnCreate(const Want &want) +{ + APP_LOGI("%{public}s start", __func__); + FormProviderInfo formProviderInfo; + if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); + return formProviderInfo; + } + std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); + std::string jsonData = std::string("{\"city\":\"beijingD\"}"); + FormProviderData formProviderData = FormProviderData(jsonData); + formProviderInfo.SetFormData(formProviderData); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCreate"); + APP_LOGI("%{public}s end, formId: %{public}s", __func__, formId.c_str()); + return formProviderInfo; +} + +void FormStServiceAbilityD::OnUpdate(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityD::OnTriggerEvent(const int64_t formId, const std::string &message) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); + APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); +} + +void FormStServiceAbilityD::OnDelete(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityD::OnCastTemptoNormal(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityD::OnVisibilityChanged(const std::map &formEventsMap) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); +} + +REGISTER_AA(FormStServiceAbilityD); +} // namespace AppExecFwk +} // namespace OHOS diff --git a/test/resource/formsystemtestability/formSystemTestServiceE/BUILD.gn b/test/resource/formsystemtestability/formSystemTestServiceE/BUILD.gn new file mode 100644 index 0000000000..dc9ee0a621 --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceE/BUILD.gn @@ -0,0 +1,58 @@ +# Copyright (c) 2021 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. + +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") +subdemosystem_path = "${appexecfwk_path}/test/resource/formsystemtestability/formSystemTestServiceE" +config("formSystemTestEConfig") { + visibility = [ ":*" ] + include_dirs = [ + "${subdemosystem_path}/include", + "${appexecfwk_path}/kits/appkit/native/app", + "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", + "${appexecfwk_path}/services/bundlemgr/include", + "${aafwk_path}/services/abilitymgr/include", + "${appexecfwk_path}/common/log/include", + "//foundation/distributedschedule/services/dtbschedmgr/include", + "${even_path}/cesfwk/innerkits/include", + "${even_path}/cesfwk/kits/native/include", + ] + defines = [ + "APP_LOG_TAG = \"formSystemTestServiceE\"", + "LOG_DOMAIN = 0xD002200", + ] +} +ohos_shared_library("formSystemTestServiceE") { + sources = [ "${subdemosystem_path}/src/form_st_service_ability_E.cpp" ] + configs = [ ":formSystemTestEConfig" ] + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/interfaces/innerkits/want:want", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "${appexecfwk_path}/kits:appkit_native", + "${appexecfwk_path}/services/bundlemgr:libbms", + "//utils/native/base:utilsbase", + ] + external_deps = [ + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + ] + subsystem_name = "formsystemtestability" +} diff --git a/test/resource/formsystemtestability/formSystemTestServiceE/config.json b/test/resource/formsystemtestability/formSystemTestServiceE/config.json new file mode 100644 index 0000000000..9bf48e6472 --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceE/config.json @@ -0,0 +1,87 @@ +{ + "app": { + "bundleName": "com.form.formsystemtestservicee", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 5, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.form.formsystemtestservicee", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "formmodule001", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "visible": true, + "name": "FormStServiceAbilityE", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", + "type": "service", + "launchType": "standard", + "formsEnabled": true, + "srcLanguage": "c++", + "forms": [ + { + "name": "Form_Js001", + "description": "form_description", + "isDefault": true, + "type": "JS", + "colorMode": "auto", + "supportDimensions":[ "1*2", "2*2" ], + "defaultDimension": "1*2", + "updateEnabled": true, + "scheduledUpdateTime": "0:0", + "updateDuration": 1, + "jsComponentName": "card", + "formVisibleNotify" : true, + "metaData": { + "customizeData": [ + { + "name": "originWidgetName", + "value": "myTest" + } + ] + } + } + ] + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": true + } + } + ] + } +} \ No newline at end of file diff --git a/test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h b/test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h new file mode 100644 index 0000000000..66279d06b7 --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef FORM_ST_SERVICE_ABILITY_E_ +#define FORM_ST_SERVICE_ABILITY_E_ +#include +#include +#include "ability_connect_callback_stub.h" +#include "ability_connect_callback_proxy.h" +#include "ability_loader.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "form_provider_info.h" + +namespace OHOS { +namespace AppExecFwk { +using AbilityConnectionStub = OHOS::AAFwk::AbilityConnectionStub; +using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; +const std::string APP_A_RESP_EVENT_NAME = "resp_com_ohos_formst_service_app_b"; +const std::string APP_A_REQ_EVENT_NAME = "req_com_ohos_formst_service_app_b"; +const std::string COMMON_EVENT_TEST_ACTION1 = "usual.event.test1"; +/** + * Form event trigger result + */ +typedef enum { + FORM_EVENT_TRIGGER_RESULT_NG = 0, + FORM_EVENT_TRIGGER_RESULT_OK = 1, +} FORM_EVENT_TRIGGER_RESULT; + +class FormStServiceAbilityE : public Ability { +public: + ~FormStServiceAbilityE(); + +protected: + virtual void OnStart(const Want &want) override; + virtual void OnStop() override; + virtual void OnActive() override; + virtual void OnInactive() override; + virtual void OnBackground() override; + virtual void OnNewWant(const Want &want) override; + virtual void OnCommand(const AAFwk::Want &want, bool restart, int startId) override; + virtual sptr OnConnect(const Want &want) override; + virtual void OnDisconnect(const Want &want) override; + virtual FormProviderInfo OnCreate(const Want &want) override; + virtual void OnUpdate(const int64_t formId) override; + virtual void OnTriggerEvent(const int64_t formId, const std::string &message) override; + virtual void OnDelete(const int64_t formId) override; + virtual void OnCastTemptoNormal(const int64_t formId) override; + virtual void OnVisibilityChanged(const std::map &formEventsMap) override; + +private: + void Clear(); + void GetWantInfo(const Want &want); + std::vector Split(std::string str, const std::string &token); + bool SubscribeEvent(); + static bool PublishEvent(const std::string &eventName, const int &code, const std::string &data); + void StartOtherAbility(); + void ConnectOtherAbility(); + void DisConnectOtherAbility(); + void StopSelfAbility(); + + std::string shouldReturn_ = {}; + std::string targetBundle_ = {}; + std::string targetAbility_ = {}; + std::string nextTargetBundle_ = {}; + std::string nextTargetAbility_ = {}; + std::string targetBundleConn_ = {}; + std::string targetAbilityConn_ = {}; + std::string nextTargetBundleConn_ = {}; + std::string nextTargetAbilityConn_ = {}; + std::string zombie_ = {}; + + typedef void (FormStServiceAbilityE::*func)(); + static std::map funcMap_; + class AbilityConnectCallback; + sptr stub_ = {}; + sptr connCallback_ = {}; + class AppEventSubscriber; + std::shared_ptr subscriber_ = {}; + + class AbilityConnectCallback : public AbilityConnectionStub { + public: + sptr AsObject() override + { + return nullptr; + } + /** + * OnAbilityConnectDone, AbilityMs notify caller ability the result of connect. + * + * @param element,.service ability's ElementName. + * @param remoteObject,.the session proxy of service ability. + * @param resultCode, ERR_OK on success, others on failure. + */ + void OnAbilityConnectDone( + const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) override + { + if (resultCode == 0) { + onAbilityConnectDoneCount++; + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityConnectDone"); + } + } + + /** + * OnAbilityDisconnectDone, AbilityMs notify caller ability the result of disconnect. + * + * @param element,.service ability's ElementName. + * @param resultCode, ERR_OK on success, others on failure. + */ + void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override + { + if (resultCode == 0) { + onAbilityConnectDoneCount--; + PublishEvent(APP_A_RESP_EVENT_NAME, onAbilityConnectDoneCount, "OnAbilityDisconnectDone"); + } + } + + static int onAbilityConnectDoneCount; + }; + class AppEventSubscriber : public EventFwk::CommonEventSubscriber { + public: + AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + ~AppEventSubscriber() = default; + virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; + + FormStServiceAbilityE *mainAbility_ = nullptr; + }; +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // FORM_ST_SERVICE_ABILITY_E_ diff --git a/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp b/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp new file mode 100644 index 0000000000..bce625ae61 --- /dev/null +++ b/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2021 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. + */ + +#include "form_st_service_ability_E.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "form_provider_client.h" + +using namespace OHOS::EventFwk; + +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; + +namespace OHOS { +namespace AppExecFwk { +using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; + +int FormStServiceAbilityE::AbilityConnectCallback::onAbilityConnectDoneCount = 0; +std::map FormStServiceAbilityE::funcMap_ = { + {"StartOtherAbility", &FormStServiceAbilityE::StartOtherAbility}, + {"ConnectOtherAbility", &FormStServiceAbilityE::ConnectOtherAbility}, + {"DisConnectOtherAbility", &FormStServiceAbilityE::DisConnectOtherAbility}, + {"StopSelfAbility", &FormStServiceAbilityE::StopSelfAbility}, +}; + +FormStServiceAbilityE::~FormStServiceAbilityE() +{ + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +std::vector FormStServiceAbilityE::Split(std::string str, const std::string &token) +{ + APP_LOGI("FormStServiceAbilityE::Split"); + + std::vector splitString; + while (str.size()) { + size_t index = str.find(token); + if (index != std::string::npos) { + splitString.push_back(str.substr(0, index)); + str = str.substr(index + token.size()); + if (str.size() == 0) { + splitString.push_back(str); + } + } else { + splitString.push_back(str); + str = ""; + } + } + return splitString; +} +void FormStServiceAbilityE::StartOtherAbility() +{ + APP_LOGI("FormStServiceAbilityE::StartOtherAbility begin targetBundle=%{public}s, targetAbility=%{public}s", + targetBundle_.c_str(), + targetAbility_.c_str()); + APP_LOGI("FormStServiceAbilityE::StartOtherAbility begin nextTargetBundleConn=%{public}s, " + "nextTargetAbilityConn=%{public}s", + nextTargetBundleConn_.c_str(), + nextTargetAbilityConn_.c_str()); + + if (!targetBundle_.empty() && !targetAbility_.empty()) { + std::vector strtargetBundles = Split(targetBundle_, ","); + std::vector strTargetAbilitys = Split(targetAbility_, ","); + for (size_t i = 0; i < strtargetBundles.size() && i < strTargetAbilitys.size(); i++) { + Want want; + want.SetElementName(strtargetBundles[i], strTargetAbilitys[i]); + want.SetParam("shouldReturn", shouldReturn_); + want.SetParam("targetBundle", nextTargetBundle_); + want.SetParam("targetAbility", nextTargetAbility_); + want.SetParam("targetBundleConn", nextTargetBundleConn_); + want.SetParam("targetAbilityConn", nextTargetAbilityConn_); + StartAbility(want); + sleep(1); + } + } +} +void FormStServiceAbilityE::ConnectOtherAbility() +{ + APP_LOGI( + "FormStServiceAbilityE::ConnectOtherAbility begin targetBundleConn=%{public}s, targetAbilityConn=%{public}s", + targetBundleConn_.c_str(), + targetAbilityConn_.c_str()); + APP_LOGI("FormStServiceAbilityE::ConnectOtherAbility begin nextTargetBundleConn=%{public}s, " + "nextTargetAbilityConn=%{public}s", + nextTargetBundleConn_.c_str(), + nextTargetAbilityConn_.c_str()); + + // connect service ability + if (!targetBundleConn_.empty() && !targetAbilityConn_.empty()) { + std::vector strtargetBundles = Split(targetBundleConn_, ","); + std::vector strTargetAbilitys = Split(targetAbilityConn_, ","); + for (size_t i = 0; i < strtargetBundles.size() && i < strTargetAbilitys.size(); i++) { + Want want; + want.SetElementName(strtargetBundles[i], strTargetAbilitys[i]); + want.SetParam("shouldReturn", shouldReturn_); + want.SetParam("targetBundle", nextTargetBundle_); + want.SetParam("targetAbility", nextTargetAbility_); + want.SetParam("targetBundleConn", nextTargetBundleConn_); + want.SetParam("targetAbilityConn", nextTargetAbilityConn_); + stub_ = new (std::nothrow) AbilityConnectCallback(); + connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_); + APP_LOGI("FormStServiceAbilityE::ConnectOtherAbility->ConnectAbility"); + bool ret = ConnectAbility(want, connCallback_); + sleep(1); + if (!ret) { + APP_LOGE("FormStServiceAbilityE::ConnectAbility failed!"); + } + } + } +} +void FormStServiceAbilityE::DisConnectOtherAbility() +{ + APP_LOGI("FormStServiceAbilityE::DisConnectOtherAbility begin"); + if (connCallback_ != nullptr) { + DisconnectAbility(connCallback_); + sleep(1); + } + APP_LOGI("FormStServiceAbilityE::DisConnectOtherAbility end"); +} + +void FormStServiceAbilityE::StopSelfAbility() +{ + APP_LOGI("FormStServiceAbilityE::StopSelfAbility"); + + TerminateAbility(); +} + +void FormStServiceAbilityE::OnStart(const Want &want) +{ + APP_LOGI("FormStServiceAbilityE::OnStart"); + + GetWantInfo(want); + Ability::OnStart(want); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnStart"); + SubscribeEvent(); + + // make exception for test + if (!zombie_.empty()) { + std::unique_ptr pWant = nullptr; + pWant->GetScheme(); + } +} +void FormStServiceAbilityE::OnCommand(const AAFwk::Want &want, bool restart, int startId) +{ + APP_LOGI("FormStServiceAbilityE::OnCommand"); + + GetWantInfo(want); + Ability::OnCommand(want, restart, startId); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnCommand"); +} +void FormStServiceAbilityE::OnNewWant(const Want &want) +{ + APP_LOGI("FormStServiceAbilityE::OnNewWant"); + + GetWantInfo(want); + Ability::OnNewWant(want); +} +void FormStServiceAbilityE::OnStop() +{ + APP_LOGI("FormStServiceAbilityE::OnStop"); + + Ability::OnStop(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INITIAL, "OnStop"); +} +void FormStServiceAbilityE::OnActive() +{ + APP_LOGI("FormStServiceAbilityE::OnActive"); + + Ability::OnActive(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnActive"); +} +void FormStServiceAbilityE::OnInactive() +{ + APP_LOGI("FormStServiceAbilityE::OnInactive"); + + Ability::OnInactive(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnInactive"); +} +void FormStServiceAbilityE::OnBackground() +{ + APP_LOGI("FormStServiceAbilityE::OnBackground"); + + Ability::OnBackground(); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnBackground"); +} + +void FormStServiceAbilityE::Clear() +{ + shouldReturn_ = ""; + targetBundle_ = ""; + targetAbility_ = ""; + targetBundleConn_ = ""; + targetAbilityConn_ = ""; + nextTargetBundle_ = ""; + nextTargetAbility_ = ""; + nextTargetBundleConn_ = ""; + nextTargetAbilityConn_ = ""; +} +void FormStServiceAbilityE::GetWantInfo(const Want &want) +{ + Want mWant(want); + shouldReturn_ = mWant.GetStringParam("shouldReturn"); + targetBundle_ = mWant.GetStringParam("targetBundle"); + targetAbility_ = mWant.GetStringParam("targetAbility"); + targetBundleConn_ = mWant.GetStringParam("targetBundleConn"); + targetAbilityConn_ = mWant.GetStringParam("targetAbilityConn"); + nextTargetBundle_ = mWant.GetStringParam("nextTargetBundle"); + nextTargetAbility_ = mWant.GetStringParam("nextTargetAbility"); + nextTargetBundleConn_ = mWant.GetStringParam("nextTargetBundleConn"); + nextTargetAbilityConn_ = mWant.GetStringParam("nextTargetAbilityConn"); + zombie_ = mWant.GetStringParam("zombie"); + FormStServiceAbilityE::AbilityConnectCallback::onAbilityConnectDoneCount = 0; +} +bool FormStServiceAbilityE::PublishEvent(const std::string &eventName, const int &code, const std::string &data) +{ + APP_LOGI("FormStServiceAbilityE::PublishEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + code, + data.c_str()); + + Want want; + want.SetAction(eventName); + CommonEventData commonData; + commonData.SetWant(want); + commonData.SetCode(code); + commonData.SetData(data); + return CommonEventManager::PublishCommonEvent(commonData); +} +sptr FormStServiceAbilityE::OnConnect(const Want &want) +{ + APP_LOGI("FormStServiceAbilityE::OnConnect"); + + sptr formProviderClient = new (std::nothrow) FormProviderClient(); + std::shared_ptr thisAbility = this->shared_from_this(); + formProviderClient->SetOwner(thisAbility); + + return formProviderClient; +} +void FormStServiceAbilityE::OnDisconnect(const Want &want) +{ + APP_LOGI("FormStServiceAbilityE::OnDisconnect"); + + Ability::OnDisconnect(want); + PublishEvent(APP_A_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnDisconnect"); +} +bool FormStServiceAbilityE::SubscribeEvent() +{ + MatchingSkills matchingSkills; + matchingSkills.AddEvent(APP_A_REQ_EVENT_NAME); + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + subscriber_->mainAbility_ = this; + return CommonEventManager::SubscribeCommonEvent(subscriber_); +} +void FormStServiceAbilityE::AppEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + auto eventName = data.GetWant().GetAction(); + auto dataContent = data.GetData(); + APP_LOGI("FormStServiceAbilityE::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + data.GetCode(), + dataContent.c_str()); + if (APP_A_REQ_EVENT_NAME.compare(eventName) == 0) { + if (funcMap_.find(dataContent) == funcMap_.end()) { + APP_LOGI( + "FormStServiceAbilityE::OnReceiveEvent eventName = %{public}s, code = %{public}d, data = %{public}s", + eventName.c_str(), + data.GetCode(), + dataContent.c_str()); + } else { + if (mainAbility_ != nullptr) { + (mainAbility_->*funcMap_[dataContent])(); + } + } + } +} + +FormProviderInfo FormStServiceAbilityE::OnCreate(const Want &want) +{ + APP_LOGI("%{public}s start", __func__); + FormProviderInfo formProviderInfo; + if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); + return formProviderInfo; + } + std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); + std::string jsonData = std::string("{\"city\":\"beijingE\"}"); + FormProviderData formProviderData = FormProviderData(jsonData); + formProviderInfo.SetFormData(formProviderData); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCreate"); + APP_LOGI("%{public}s end, formId: %{public}s", __func__, formId.c_str()); + return formProviderInfo; +} + +void FormStServiceAbilityE::OnUpdate(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityE::OnTriggerEvent(const int64_t formId, const std::string &message) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); + APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); +} + +void FormStServiceAbilityE::OnDelete(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityE::OnCastTemptoNormal(const int64_t formId) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); +} + +void FormStServiceAbilityE::OnVisibilityChanged(const std::map &formEventsMap) +{ + APP_LOGI("%{public}s start", __func__); + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; + + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); +} + +REGISTER_AA(FormStServiceAbilityE); +} // namespace AppExecFwk +} // namespace OHOS diff --git a/test/resource/formsystemtestability/tool/include/form_test_utils.h b/test/resource/formsystemtestability/tool/include/form_test_utils.h new file mode 100644 index 0000000000..73daabb2d0 --- /dev/null +++ b/test/resource/formsystemtestability/tool/include/form_test_utils.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef _FORM_TEST_UTILS_H_ +#define _FORM_TEST_UTILS_H_ +#include "ability_info.h" +#include "ability_lifecycle.h" +#include "application_info.h" +#include "process_info.h" +#include "want.h" + +namespace OHOS { +namespace AppExecFwk { +const int OnStateChangedEventWant = LifeCycle::Event::UNDEFINED; +const int OnStateChangedEvent = (int)LifeCycle::Event::UNDEFINED + 1; +const int requestCodeForTerminate = 10; +const int requestCodeForResult = 20; + +class FormTestUtils { +public: + FormTestUtils() = default; + virtual ~FormTestUtils() = default; + static bool PublishEvent(const std::string &eventName, const int &code, const std::string &data); + static Want MakeWant(std::string deviceId, std::string abilityName, std::string bundleName, + std::map params); +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif // _FORM_TEST_UTILS_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/tool/src/form_test_utils.cpp b/test/resource/formsystemtestability/tool/src/form_test_utils.cpp new file mode 100644 index 0000000000..4ba7d976ce --- /dev/null +++ b/test/resource/formsystemtestability/tool/src/form_test_utils.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_test_utils.h" +#include "common_event_data.h" +#include "common_event_manager.h" + +namespace OHOS { +namespace AppExecFwk { +using namespace OHOS::EventFwk; +bool FormTestUtils::PublishEvent(const std::string &eventName, const int &code, const std::string &data) +{ + Want want; + want.SetAction(eventName); + CommonEventData commonData; + commonData.SetWant(want); + commonData.SetCode(code); + commonData.SetData(data); + return CommonEventManager::PublishCommonEvent(commonData); +} + +Want FormTestUtils::MakeWant( + std::string deviceId, std::string abilityName, std::string bundleName, std::map params) +{ + ElementName element(deviceId, bundleName, abilityName); + Want want; + want.SetElement(element); + for (const auto ¶m : params) { + want.SetParam(param.first, param.second); + } + return want; +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/BUILD.gn b/test/systemtest/BUILD.gn index 9865e4bf44..ad06723297 100755 --- a/test/systemtest/BUILD.gn +++ b/test/systemtest/BUILD.gn @@ -26,6 +26,7 @@ group("systemtest") { "common/ams:systemtest", "common/bms:systemtest_bms", "common/ems:systemtest_ems", + "common/fms:systemtest", "common/task_dispatcher:systemtest_task", ] } diff --git a/test/systemtest/common/fms/BUILD.gn b/test/systemtest/common/fms/BUILD.gn new file mode 100755 index 0000000000..87e8f30e59 --- /dev/null +++ b/test/systemtest/common/fms/BUILD.gn @@ -0,0 +1,45 @@ +# Copyright (c) 2021 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. + +import("//build/ohos.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +config("form_manager_test_config") { + defines = [ + "APP_LOG_TAG = \"FormManagerTest\"", + "LOG_DOMAIN = 0xD00666F", + ] + + configs = [ + "${aafwk_path}/frameworks/kits/ability/native:ability_config", + "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base_sdk_config", + ] +} + +public_configs = [ ":form_manager_test_config" ] + +group("systemtest") { + testonly = true + + deps = [ + "fms_acquire_form_test:systemtest", + "fms_acquire_form_test_max:systemtest", + "fms_delete_form_test:systemtest", + "fms_fuzz_test:systemtest", + "fms_performance_test:systemtest", + "fms_release_form_test:systemtest", + "fms_self_starting_test:systemtest", + "fms_stress_test:systemtest", + "fms_uninstall_app_test:systemtest", + ] +} diff --git a/test/systemtest/common/fms/common/include/form_event.h b/test/systemtest/common/fms/common/include/form_event.h new file mode 100644 index 0000000000..5609149115 --- /dev/null +++ b/test/systemtest/common/fms/common/include/form_event.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef OHOS_SYSTEM_TEST_FMS_STEVENT_H +#define OHOS_SYSTEM_TEST_FMS_STEVENT_H + +#include +#include +#include +#include +#include +#include +#include "hilog_wrapper.h" +namespace OHOS { +namespace STtools { +class FormEvent { +public: + FormEvent(); + ~FormEvent(); + bool Compare(); + int WaitingMessage(const std::string &message, int timeout_ms, bool locked); + void CompleteMessage(const std::string &message); + void Clean(); + std::string GetData(const std::string &message); + void CompleteMessage(const std::string &message, const std::string &data); + +private: + std::mutex mutex_; + std::condition_variable cv_; + std::string waiting_message_; + std::vector complete_message_; + std::unordered_map message_data_; +}; +} // namespace STtools +} // namespace OHOS +#endif // OHOS_SYSTEM_TEST_FMS_STEVENT_H \ No newline at end of file diff --git a/test/systemtest/common/fms/common/include/form_st_common_info.h b/test/systemtest/common/fms/common/include/form_st_common_info.h new file mode 100644 index 0000000000..703f29eae9 --- /dev/null +++ b/test/systemtest/common/fms/common/include/form_st_common_info.h @@ -0,0 +1,428 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef FORM_ST_COMMON_INFO_H +#define FORM_ST_COMMON_INFO_H + +namespace OHOS { +namespace AppExecFwk { +const std::string PERMISSION_NAME_REQUIRE_FORM = "ohos.permission.REQUIRE_FORM"; +const std::string FORM_TEST_DEVICEID = "0"; + +const std::string FORM_ABILITY_STATE_ONACTIVE = ":OnActive"; +const std::string FORM_EVENT_ABILITY_ONACTIVED = "fms_req_acquireForm_ability_actived"; + +const int FORM_DIMENSION_1 = 1; +const bool FORM_TEMP_FORM_FLAG_FALSE = false; +const bool FORM_TEMP_FORM_FLAG_TRUE = true; + +// provider ability +const std::string FORM_PROVIDER_BUNDLE_NAME1 = "com.form.formsystemtestservicea"; +const std::string PARAM_PROVIDER_MODULE_NAME1 = "formmodule001"; +const std::string FORM_PROVIDER_ABILITY_NAME1 = "FormStServiceAbilityA"; +const std::string PARAM_FORM_NAME1 = "Form_Js001"; + +const std::string FORM_PROVIDER_BUNDLE_NAME2 = "com.form.formsystemtestserviceb"; +const std::string PARAM_PROVIDER_MODULE_NAME2 = "formmodule001"; +const std::string FORM_PROVIDER_ABILITY_NAME2 = "FormStServiceAbilityB"; +const std::string PARAM_FORM_NAME2 = "Form_Js001"; + +// add Form +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_TEMP = "fms_req_acquireForm_temp"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_TEMP = "fms_recv_acquireForm_temp"; +const std::string FORM_EVENT_REQ_DELETE_FORM_COMMON = "fms_req_deleteForm_common"; +const std::string FORM_EVENT_RECV_DELETE_FORM_COMMON = "fms_recv_deleteForm_common"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_0100 = "fms_req_acquireForm_0100"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_0100 = "fms_recv_acquireForm_0100"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_0200 = "fms_req_acquireForm_0200"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_0200 = "fms_recv_acquireForm_0200"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_0300 = "fms_req_acquireForm_0300"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_0300 = "fms_recv_acquireForm_0300"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_0400 = "fms_req_acquireForm_0400"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_0400 = "fms_recv_acquireForm_0400"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_0500 = "fms_req_acquireForm_0500"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_0500 = "fms_recv_acquireForm_0500"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_0600 = "fms_req_acquireForm_0600"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_0600 = "fms_recv_acquireForm_0600"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_0700 = "fms_req_acquireForm_0700"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_0700 = "fms_recv_acquireForm_0700"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1000 = "fms_req_acquireForm_1000"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1000 = "fms_recv_acquireForm_1000"; + +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1100 = "fms_req_acquireForm_1100"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1100 = "fms_recv_acquireForm_1100"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1200 = "fms_req_acquireForm_1200"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1200 = "fms_recv_acquireForm_1200"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1400 = "fms_req_acquireForm_1400"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1400 = "fms_recv_acquireForm_1400"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1400_1 = "fms_req_acquireForm_1400_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1400_1 = "fms_recv_acquireForm_1400_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1500 = "fms_req_acquireForm_1500"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1500 = "fms_recv_acquireForm_1500"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1500_1 = "fms_req_acquireForm_1500_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1500_1 = "fms_recv_acquireForm_1500_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1600 = "fms_req_acquireForm_1600"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1600 = "fms_recv_acquireForm_1600"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1600_1 = "fms_req_acquireForm_1600_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1600_1 = "fms_recv_acquireForm_1600_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1800 = "fms_req_acquireForm_1800"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1800 = "fms_recv_acquireForm_1800"; + + +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1800_1 = "fms_req_acquireForm_1800_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1800_1 = "fms_recv_acquireForm_1800_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1800_2 = "fms_req_acquireForm_1800_2"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1800_2 = "fms_recv_acquireForm_1800_2"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1800_3 = "fms_req_acquireForm_1800_3"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1800_3 = "fms_recv_acquireForm_1800_3"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_1900 = "fms_req_acquireForm_1900"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_1900 = "fms_recv_acquireForm_1900"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2100 = "fms_req_acquireForm_2100"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2100 = "fms_recv_acquireForm_2100"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2100_1 = "fms_req_acquireForm_2100_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2100_1 = "fms_recv_acquireForm_2100_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2200 = "fms_req_acquireForm_2200"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2200 = "fms_recv_acquireForm_2200"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2300 = "fms_req_acquireForm_2300"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2300 = "fms_recv_acquireForm_2300"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2400 = "fms_req_acquireForm_2400"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2400 = "fms_recv_acquireForm_2400"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2400_1 = "fms_req_acquireForm_2400_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2400_1 = "fms_recv_acquireForm_2400_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2500 = "fms_req_acquireForm_2500"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2500 = "fms_recv_acquireForm_2500"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2600 = "fms_req_acquireForm_2600"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2600 = "fms_recv_acquireForm_2600"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2600_1 = "fms_req_acquireForm_2600_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2600_1 = "fms_recv_acquireForm_2600_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2700 = "fms_req_acquireForm_2700"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2700 = "fms_recv_acquireForm_2700"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2800 = "fms_req_acquireForm_2800"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2800 = "fms_recv_acquireForm_2800"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2900 = "fms_req_acquireForm_2900"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2900 = "fms_recv_acquireForm_2900"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_2900_1 = "fms_req_acquireForm_2900_1"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_2900_1 = "fms_recv_acquireForm_2900_1"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_3000 = "fms_req_acquireForm_3000"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_3000 = "fms_recv_acquireForm_3000"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_3100 = "fms_req_acquireForm_3100"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_3100 = "fms_recv_acquireForm_3100"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_3200 = "fms_req_acquireForm_3200"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_3200 = "fms_recv_acquireForm_3200"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_3300 = "fms_req_acquireForm_3300"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_3300 = "fms_recv_acquireForm_3300"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_BATCH = "fms_req_acquireForm_batch"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_BATCH = "fms_recv_acquireForm_batch"; +const std::string FORM_EVENT_REQ_ACQUIRE_FORM_BATCH_B = "fms_req_acquireForm_batch_b"; +const std::string FORM_EVENT_RECV_ACQUIRE_FORM_BATCH_B = "fms_recv_acquireForm_batch_b"; +const std::string FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH = "fms_req_acquireFormTemp_batch"; +const std::string FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH = "fms_recv_acquireFormTemp_batch"; +const std::string FORM_EVENT_REQ_CLEAR_FORM_BATCH = "fms_req_clearForm_batch"; +const std::string FORM_EVENT_RECV_CLEAR_FORM_BATCH = "fms_recv_clearForm_batch"; + + +// Delete Form +const std::string FORM_EVENT_REQ_DELETE_FORM_0100 = "fms_req_deleteForm_0100"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0100 = "fms_recv_deleteForm_0100"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0200 = "fms_req_deleteForm_0200"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0200 = "fms_recv_deleteForm_0200"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0300 = "fms_req_deleteForm_0300"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0300 = "fms_recv_deleteForm_0300"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0400 = "fms_req_deleteForm_0400"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0400 = "fms_recv_deleteForm_0400"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0500 = "fms_req_deleteForm_0500"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0500 = "fms_recv_deleteForm_0500"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0600 = "fms_req_deleteForm_0600"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0600 = "fms_recv_deleteForm_0600"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0700 = "fms_req_deleteForm_0700"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0700 = "fms_recv_deleteForm_0700"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0800 = "fms_req_deleteForm_0800"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0800 = "fms_recv_deleteForm_0800"; +const std::string FORM_EVENT_REQ_DELETE_FORM_0900 = "fms_req_deleteForm_0900"; +const std::string FORM_EVENT_RECV_DELETE_FORM_0900 = "fms_recv_deleteForm_0900"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1000 = "fms_req_deleteForm_1000"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1000 = "fms_recv_deleteForm_1000"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1100 = "fms_req_deleteForm_1100"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1100 = "fms_recv_deleteForm_1100"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1200 = "fms_req_deleteForm_1200"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1200 = "fms_recv_deleteForm_1200"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1201 = "fms_req_deleteForm_1201"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1201 = "fms_recv_deleteForm_1201"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1400 = "fms_req_deleteForm_1400"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1400 = "fms_recv_deleteForm_1400"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1401 = "fms_req_deleteForm_1401"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1401 = "fms_recv_deleteForm_1401"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1500 = "fms_req_deleteForm_1500"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1500 = "fms_recv_deleteForm_1500"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1501 = "fms_req_deleteForm_1501"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1501 = "fms_recv_deleteForm_1501"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1502 = "fms_req_deleteForm_1502"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1502 = "fms_recv_deleteForm_1502"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1600 = "fms_req_deleteForm_1600"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1600 = "fms_recv_deleteForm_1600"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1601 = "fms_req_deleteForm_1601"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1601 = "fms_recv_deleteForm_1601"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1602 = "fms_req_deleteForm_1602"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1602 = "fms_recv_deleteForm_1602"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1700 = "fms_req_deleteForm_1700"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1700 = "fms_recv_deleteForm_1700"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1701 = "fms_req_deleteForm_1701"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1701 = "fms_recv_deleteForm_1701"; +const std::string FORM_EVENT_REQ_DELETE_FORM_1702 = "fms_req_deleteForm_1702"; +const std::string FORM_EVENT_RECV_DELETE_FORM_1702 = "fms_recv_deleteForm_1702"; +// OnDelete +const std::string COMMON_EVENT_ON_DELETE = "usual.event.ondelete"; +typedef enum { + FORM_EVENT_TRIGGER_RESULT_NG = 0, + FORM_EVENT_TRIGGER_RESULT_OK = 1, +} FORM_EVENT_TRIGGER_RESULT; + +// Release Form +const std::string FORM_EVENT_REQ_RELEASE_FORM_0100 = "fms_req_releaseForm_0100"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0100 = "fms_recv_releaseForm_0100"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0200 = "fms_req_releaseForm_0200"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0200 = "fms_recv_releaseForm_0200"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0300 = "fms_req_releaseForm_0300"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0300 = "fms_recv_releaseForm_0300"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0400 = "fms_req_releaseForm_0400"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0400 = "fms_recv_releaseForm_0400"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0500 = "fms_req_releaseForm_0500"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0500 = "fms_recv_releaseForm_0500"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0600 = "fms_req_releaseForm_0600"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0600 = "fms_recv_releaseForm_0600"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0700 = "fms_req_releaseForm_0700"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0700 = "fms_recv_releaseForm_0700"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0800 = "fms_req_releaseForm_0800"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0800 = "fms_recv_releaseForm_0800"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_0900 = "fms_req_releaseForm_0900"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_0900 = "fms_recv_releaseForm_0900"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_1000 = "fms_req_releaseForm_1000"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_1000 = "fms_recv_releaseForm_1000"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_1100 = "fms_req_releaseForm_1100"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_1100 = "fms_recv_releaseForm_1100"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_1200 = "fms_req_releaseForm_1200"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_1200 = "fms_recv_releaseForm_1200"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_1300 = "fms_req_releaseForm_1300"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_1300 = "fms_recv_releaseForm_1300"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_1400 = "fms_req_releaseForm_1400"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_1400 = "fms_recv_releaseForm_1400"; +const std::string FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL = "fms_req_releaseForm_common_del"; +const std::string FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL = "fms_recv_releaseForm_common_del"; + +// Stress Test +const std::string FORM_EVENT_REQ_STRESS_TEST_0100 = "fms_req_stressTest_0100"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0100 = "fms_recv_stressTest_0100"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0100_01 = "fms_req_stressTest_0100_01"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0100_01 = "fms_recv_stressTest_0100_01"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0200 = "fms_req_stressTest_0200"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0200 = "fms_recv_stressTest_0200"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0200_01 = "fms_req_stressTest_0200_01"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0200_01 = "fms_recv_stressTest_0200_01"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0200_02 = "fms_req_stressTest_0200_02"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0200_02 = "fms_recv_stressTest_0200_02"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0200_03 = "fms_req_stressTest_0200_03"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0200_03 = "fms_recv_stressTest_0200_03"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0300 = "fms_req_stressTest_0300"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0300 = "fms_recv_stressTest_0300"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0300_01 = "fms_req_stressTest_0300_01"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0300_01 = "fms_recv_stressTest_0300_01"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0300_02 = "fms_req_stressTest_0300_02"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0300_02 = "fms_recv_stressTest_0300_02"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0400 = "fms_req_stressTest_0400"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0400 = "fms_recv_stressTest_0400"; +const std::string FORM_EVENT_REQ_STRESS_TEST_0500 = "fms_req_stressTest_0500"; +const std::string FORM_EVENT_RECV_STRESS_TEST_0500 = "fms_recv_stressTest_0500"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1100 = "fms_req_stressTest_1100"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1100 = "fms_recv_stressTest_1100"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1100_01 = "fms_req_stressTest_1100_01"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1100_01 = "fms_recv_stressTest_1100_01"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1100_02 = "fms_req_stressTest_1100_02"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1100_02 = "fms_recv_stressTest_1100_02"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1100_03 = "fms_req_stressTest_1100_03"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1100_03 = "fms_recv_stressTest_1100_03"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1300 = "fms_req_stressTest_1300"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1300 = "fms_recv_stressTest_1300"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1300_01 = "fms_req_stressTest_1300_01"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1300_01 = "fms_recv_stressTest_1300_01"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1300_02 = "fms_req_stressTest_1300_02"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1300_02 = "fms_recv_stressTest_1300_02"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1300_03 = "fms_req_stressTest_1300_03"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1300_03 = "fms_recv_stressTest_1300_03"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1700 = "fms_req_stressTest_1700"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1700 = "fms_recv_stressTest_1700"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1700_01 = "fms_req_stressTest_1700_01"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1700_01 = "fms_recv_stressTest_1700_01"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1700_02 = "fms_req_stressTest_1700_02"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1700_02 = "fms_recv_stressTest_1700_02"; +const std::string FORM_EVENT_REQ_STRESS_TEST_1800 = "fms_req_stressTest_1800"; +const std::string FORM_EVENT_RECV_STRESS_TEST_1800 = "fms_recv_stressTest_1800"; + +// CommonA(acquire one normal form) +const std::string FORM_EVENT_REQ_ONE_NORMAL_FORM = "fms_req_one_normal_form"; +const std::string FORM_EVENT_RECV_ONE_NORMAL_FORM = "fms_recv_one_normal_form"; +const std::string FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL = "fms_req_one_normal_form_del"; +const std::string FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL = "fms_recv_one_normal_form_del"; + +// CommonB(acquire one normal form) +const std::string FORM_EVENT_REQ_ONE_NORMAL_FORM_B = "fms_req_one_normal_form_b"; +const std::string FORM_EVENT_RECV_ONE_NORMAL_FORM_B = "fms_recv_one_normal_form_b"; +const std::string FORM_EVENT_REQ_ONE_NORMAL_FORM_B_DEL = "fms_req_one_normal_form_b_del"; +const std::string FORM_EVENT_RECV_ONE_NORMAL_FORM_B_DEL = "fms_recv_one_normal_form_b_del"; + +// Performance Test +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_0100 = "fms_req_performanceTest_0100"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_0100 = "fms_recv_performanceTest_0100"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_0200 = "fms_req_performanceTest_0200"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_0200 = "fms_recv_performanceTest_0200"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_0300 = "fms_req_performanceTest_0300"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_0300 = "fms_recv_performanceTest_0300"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_0400 = "fms_req_performanceTest_0400"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_0400 = "fms_recv_performanceTest_0400"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_0500 = "fms_req_performanceTest_0500"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_0500 = "fms_recv_performanceTest_0500"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_0600 = "fms_req_performanceTest_0600"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_0600 = "fms_recv_performanceTest_0600"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_0700 = "fms_req_performanceTest_0700"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_0700 = "fms_recv_performanceTest_0700"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_1300 = "fms_req_performanceTest_1300"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_1300 = "fms_recv_performanceTest_1300"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_1400 = "fms_req_performanceTest_1400"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_1400 = "fms_recv_performanceTest_1400"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_1500 = "fms_req_performanceTest_1500"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_1500 = "fms_recv_performanceTest_1500"; +const std::string FORM_EVENT_REQ_PERFORMANCE_TEST_1600 = "fms_req_performanceTest_1600"; +const std::string FORM_EVENT_RECV_PERFORMANCE_TEST_1600 = "fms_recv_performanceTest_1600"; + +// Self-Starting Test +const std::string FORM_EVENT_REQ_SELF_STARTING_TEST_0100 = "fms_req_selfStartingTest_0100"; +const std::string FORM_EVENT_RECV_SELF_STARTING_TEST_0100 = "fms_recv_selfStartingTest_0100"; +const std::string FORM_EVENT_REQ_SELF_STARTING_TEST_0200 = "fms_req_selfStartingTest_0200"; +const std::string FORM_EVENT_RECV_SELF_STARTING_TEST_0200 = "fms_recv_selfStartingTest_0200"; +const std::string FORM_EVENT_REQ_SELF_STARTING_TEST_0300 = "fms_req_selfStartingTest_0300"; +const std::string FORM_EVENT_RECV_SELF_STARTING_TEST_0300 = "fms_recv_selfStartingTest_0300"; + +// Uninstall App Test +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0100 = "fms_req_uninstallTest_0100"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0100 = "fms_recv_uninstallTest_0100"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0200 = "fms_req_uninstallTest_0200"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0200 = "fms_recv_uninstallTest_0200"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0300 = "fms_req_uninstallTest_0300"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0300 = "fms_recv_uninstallTest_0300"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0400 = "fms_req_uninstallTest_0400"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0400 = "fms_recv_uninstallTest_0400"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0500 = "fms_req_uninstallTest_0500"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0500 = "fms_recv_uninstallTest_0500"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0600 = "fms_req_uninstallTest_0600"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0600 = "fms_recv_uninstallTest_0600"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0700 = "fms_req_uninstallTest_0700"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0700 = "fms_recv_uninstallTest_0700"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0800 = "fms_req_uninstallTest_0800"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0800 = "fms_recv_uninstallTest_0800"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_0900 = "fms_req_uninstallTest_0900"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_0900 = "fms_recv_uninstallTest_0900"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1000 = "fms_req_uninstallTest_1000"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1000 = "fms_recv_uninstallTest_1000"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1100 = "fms_req_uninstallTest_1100"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1100 = "fms_recv_uninstallTest_1100"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1200 = "fms_req_uninstallTest_1200"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1200 = "fms_recv_uninstallTest_1200"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1300 = "fms_req_uninstallTest_1300"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1300 = "fms_recv_uninstallTest_1300"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1400 = "fms_req_uninstallTest_1400"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1400 = "fms_recv_uninstallTest_1400"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1500 = "fms_req_uninstallTest_1500"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1500 = "fms_recv_uninstallTest_1500"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1600 = "fms_req_uninstallTest_1600"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1600 = "fms_recv_uninstallTest_1600"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1700 = "fms_req_uninstallTest_1700"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1700 = "fms_recv_uninstallTest_1700"; +const std::string FORM_EVENT_REQ_UNINSTALL_TEST_1800 = "fms_req_uninstallTest_1800"; +const std::string FORM_EVENT_RECV_UNINSTALL_TEST_1800 = "fms_recv_uninstallTest_1800"; + +// common event data code +const int EVENT_CODE_100 = 100; +const int EVENT_CODE_101 = 101; +const int EVENT_CODE_200 = 200; +const int EVENT_CODE_300 = 300; +const int EVENT_CODE_400 = 400; +const int EVENT_CODE_500 = 500; +const int EVENT_CODE_600 = 600; +const int EVENT_CODE_700 = 700; +const int EVENT_CODE_800 = 800; +const int EVENT_CODE_900 = 900; +const int EVENT_CODE_999 = 999; +const int EVENT_CODE_1000 = 1000; +const int EVENT_CODE_1100 = 1100; +const int EVENT_CODE_1101 = 1101; +const int EVENT_CODE_1200 = 1200; +const int EVENT_CODE_1201 = 1201; +const int EVENT_CODE_1234 = 1234; +const int EVENT_CODE_1300 = 1300; +const int EVENT_CODE_1400 = 1400; +const int EVENT_CODE_1401 = 1401; +const int EVENT_CODE_1500 = 1500; +const int EVENT_CODE_1510 = 1510; +const int EVENT_CODE_1511 = 1511; +const int EVENT_CODE_1600 = 1600; +const int EVENT_CODE_1601 = 1601; +const int EVENT_CODE_1610 = 1610; +const int EVENT_CODE_1611 = 1611; +const int EVENT_CODE_1700 = 1700; +const int EVENT_CODE_1701 = 1701; +const int EVENT_CODE_1702 = 1702; +const int EVENT_CODE_1800 = 1800; +const int EVENT_CODE_1801 = 1801; +const int EVENT_CODE_1810 = 1810; +const int EVENT_CODE_1811 = 1811; +const int EVENT_CODE_1820 = 1820; +const int EVENT_CODE_1821 = 1821; +const int EVENT_CODE_1830 = 1830; +const int EVENT_CODE_1831 = 1831; +const int EVENT_CODE_1900 = 1900; +const int EVENT_CODE_1901 = 1901; +const int EVENT_CODE_2000 = 2000; +const int EVENT_CODE_2100 = 2100; +const int EVENT_CODE_2200 = 2200; +const int EVENT_CODE_2300 = 2300; +const int EVENT_CODE_2400 = 2400; +const int EVENT_CODE_2401 = 2401; +const int EVENT_CODE_2410 = 2410; +const int EVENT_CODE_2500 = 2500; +const int EVENT_CODE_2600 = 2600; +const int EVENT_CODE_2610 = 2610; +const int EVENT_CODE_2611 = 2611; +const int EVENT_CODE_2700 = 2700; +const int EVENT_CODE_2800 = 2800; +const int EVENT_CODE_2900 = 2900; +const int EVENT_CODE_2901 = 2901; +const int EVENT_CODE_2910 = 2910; +const int EVENT_CODE_2911 = 2911; +const int EVENT_CODE_3000 = 3000; +const int EVENT_CODE_3100 = 3100; +const int EVENT_CODE_3101 = 3101; +const int EVENT_CODE_3200 = 3200; +const int EVENT_CODE_3300 = 3300; +const int EVENT_CODE_3301 = 3301; + +const int EVENT_CODE_BATCH = 9000; +const int EVENT_CODE_BATCH_B = 9010; +const int EVENT_CODE_TEMP_BATCH = 9020; +const int EVENT_CODE_CLEAR_BATCH = 9030; + +const int EVENT_CODE_TEMP = 9900; +const int EVENT_CODE_TEMP_1 = 9901; +} // namespace AppExecFwk +} // namespace OHOS +#endif // FORM_ST_COMMON_INFO_H \ No newline at end of file diff --git a/test/systemtest/common/fms/common/include/install_tool_status_receiver.h b/test/systemtest/common/fms/common/include/install_tool_status_receiver.h new file mode 100644 index 0000000000..549613b3d6 --- /dev/null +++ b/test/systemtest/common/fms/common/include/install_tool_status_receiver.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef INSTALL_TOOL_STATUS_RECEIVER_H +#define INSTALL_TOOL_STATUS_RECEIVER_H + +#include "form_event.h" + +namespace OHOS { +namespace STtools { +using namespace OHOS::AppExecFwk; +class InstallToolStatusReceiver : public StatusReceiverHost { +public: + InstallToolStatusReceiver(); + virtual ~InstallToolStatusReceiver() override; + virtual void OnStatusNotify(const int progress) override; + virtual void OnFinished(const int32_t resultCode, const std::string &resultMsg) override; + static int TestWaitCompleted(FormEvent &event, const std::string eventName, const int code, const int timeout = 10); + static void TestCompleted(FormEvent &event, const std::string &eventName, const int code); + FormEvent event_ = STtools::FormEvent(); + +private: + int iProgress_ = 0; + DISALLOW_COPY_AND_MOVE(InstallToolStatusReceiver); +}; +InstallToolStatusReceiver::InstallToolStatusReceiver() +{ + std::cout << "create status receiver instance" << std::endl; +} + +InstallToolStatusReceiver::~InstallToolStatusReceiver() +{ + std::cout << "destroy status receiver instance" << std::endl; +} + +void InstallToolStatusReceiver::OnStatusNotify(const int progress) +{ + iProgress_ = progress; + std::cout << "destroy status receiver instance" << progress << std::endl; +} + +void InstallToolStatusReceiver::OnFinished(const int32_t resultCode, const std::string &resultMsg) +{ + std::cout << "on finished result is " << resultCode << " " << resultMsg << std::endl; + TestCompleted(event_, resultMsg, resultCode); +} + +int InstallToolStatusReceiver::TestWaitCompleted( + FormEvent &event, const std::string eventName, const int code, const int timeout) +{ + std::cout << "TestWaitCompleted " << eventName << std::endl; + return SystemTestFormUtil::WaitCompleted(event, eventName, code, timeout); +} +void InstallToolStatusReceiver::TestCompleted(FormEvent &event, const std::string &eventName, const int code) +{ + std::cout << "TestCompleted " << eventName << std::endl; + SystemTestFormUtil::Completed(event, eventName, code); + return; +} +} // namespace AppExecFwk +} // namespace OHOS +#endif // INSTALL_TOOL_STATUS_RECEIVER_H \ No newline at end of file diff --git a/test/systemtest/common/fms/common/include/system_test_form_util.h b/test/systemtest/common/fms/common/include/system_test_form_util.h new file mode 100644 index 0000000000..2e4f801581 --- /dev/null +++ b/test/systemtest/common/fms/common/include/system_test_form_util.h @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef SYSTEM_TEST_FORM_UTIL_H +#define SYSTEM_TEST_FORM_UTIL_H + +#include +#include +#include +#include + +#include "ability_manager_service.h" +#include "ability_manager_errors.h" +#include "app_mgr_service.h" +#include "bundle_installer_interface.h" +#include "bundle_mgr_interface.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "form_event.h" +#include "form_mgr_interface.h" +#include "hilog_wrapper.h" +#include "iremote_proxy.h" +#include "sa_mgr_client.h" +#include "system_ability_definition.h" + +namespace OHOS { +namespace STtools { +namespace { +using vector_str = std::vector; +using MAP_STR_STR = std::map; +} // namespace +class SystemTestFormUtil { +public: + SystemTestFormUtil() = default; + ~SystemTestFormUtil() = default; + + static std::shared_ptr GetInstance(); + static void DestroyInstance(); + + /** + * + * @param {string} eventName : Sent FormEvent Name + * @param {int} code : Sent Code + * @param {string} data : Sent Data + * @Introduction: Sent FormEvent + */ + static bool PublishEvent(const std::string &eventName, const int &code, const std::string &data); + + /** + * + * @param {vector} hapNames : container containing multiple hap names + * @Introduction: use bm install multiple hap + */ + static void InstallHaps(vector_str &hapNames); + + /** + * + * @param {vector} bundleNames : container containing multiple bundle names + * @Introduction: use bm install multiple bundle + */ + static void UninstallBundle(vector_str &bundleNames); + + /** + * + * @param {string} serviceName : process name + * @Introduction: kill process + */ + static void KillService(const std::string &serviceName); + + /** + * + * @param {string} serviceName : executable file name + * @param {time_t} delay : Waiting time for executable to start(milliseconds) + * @Introduction: start executable file + */ + static void StartService(const std::string &serviceName, const time_t &delay = 0); + + /** + * + * @param {vector} bundleNames : Container Containing Multiple Bundle Names + * @Introduction: start executable file + */ + static void KillBundleProcess(vector_str &bundleNames); + + /** + * + * @Introduction: Get Ability manager Service. + */ + static sptr GetAbilityManagerService(); + + /** + * + * @Introduction: Get App manager Service. + */ + static sptr GetAppMgrService(); + + /** + * + * @param {Want} want : The want of the ability to start. + * @param {sptr} abilityMs : Ability Manager Service ptr + * @param {time_t} delay : Waiting time for ability to start (milliseconds) + * @Introduction: start ability + */ + static ErrCode StartAbility( + const AAFwk::Want &want, sptr &abilityMs, const time_t &delay = 0); + + /** + * + * @param {string} eventName : Sent FormEvent Name + * @param {int} code : Sent Code + * @param {string} data : Sent Data + * @Introduction: Sent FormEvent to terminate app + */ + static bool StopAbility(const std::string &eventName, const int &code, const std::string &data); + /** + * + * @param {string} deviceId : Device ID + * @param {string} abilityName : Ability Name + * @param {string} bundleName : Bundle Name + * @param {MAP_STR_STR} params : Params (SetParam) + * @Introduction: Great Want + */ + static AAFwk::Want MakeWant( + std::string deviceId, std::string abilityName, std::string bundleName, MAP_STR_STR params = {}); + + /** + * + * @param {string} deviceId : Device ID + * @param {string} abilityName : Ability Name + * @param {string} bundleName : Bundle Name + * @param {vector_str} params : Params (SetParam) + * @Introduction: Great Want + */ + static AAFwk::Want MakeWant( + std::string deviceId, std::string abilityName, std::string bundleName, vector_str params = {}); + + /** + * + * @param {int64_t} id : Ability Record ID + * @param {sptr} abilityMs : Ability Manager Service ptr + * @Introduction: Get Top AbilityRecord ID + */ + static ErrCode GetTopAbilityRecordId(int64_t &id, sptr &abilityMs); + + /** + * + * @param {shared_ptr} runningProcessInfo : Process Info + * @param {sptr} appMs : App Manager ptr + * @param {time_t} delay : Waiting time for ability to Get Process Info (milliseconds) + * @Introduction: Get Top AbilityRecord ID + */ + static ErrCode GetRunningProcessInfo(std::vector &runningProcessInfo, + sptr &appMs, const time_t &delay = 0); + + /** + * + * @param {string} appName : app Name + * @param {sptr} appMs : App Manager ptr + * @param {time_t} delay : Waiting time for ability to KillApplication (milliseconds) + * @Introduction: Get Top AbilityRecord ID + */ + static ErrCode KillApplication( + const std::string &appName, sptr &appMs, const time_t &delay = 0); + + /** + * + * @param {string} processName : processName + * @param {sptr} appMs : App Manager ptr + * @param {time_t} delay : Waiting time for ability to GetAppProcessInfo (milliseconds) + * @Introduction: Get Top AbilityRecord ID + */ + static AppExecFwk::RunningProcessInfo GetAppProcessInfoByName( + const std::string &processName, sptr &appMs, const time_t &delay = 0); + + /** + * + * @param {FormEvent} event : FormEvent Class Object + * @param {string} eventName : The name of the event to wait for. + * @param {int} code : The code of the event to wait for. + * @param {int} timeout : Time of wait (seconds) + * @Introduction: Judge whether the event is received in the event queue, if not, wait + */ + static int WaitCompleted( + STtools::FormEvent &event, const std::string &eventName, const int code, const int timeout = 15); + + /** + * + * @param {FormEvent} event : FormEvent Class Object + * @param {string} eventName : The name of the event to wait for. + * @param {int} code : The code of the event to wait for. + * @Introduction: Compare the received events, if not, join the event queue. + */ + static void Completed(STtools::FormEvent &event, const std::string &eventName, const int code); + + /** + * + * @param {FormEvent} event : FormEvent Class Object + * @param {string} eventName : The name of the event to wait for. + * @param {int} code : The code of the event to wait for. + * @param {string} data : The data of the event to wait for. + * @Introduction: Compare the received events, if not, join the event queue. + */ + static void Completed(STtools::FormEvent &event, const std::string &eventName, const int code, + const std::string &data); + + /** + * + * @param {FormEvent} event : FormEvent Class Object + * @Introduction: Clean wait event. + */ + static void CleanMsg(STtools::FormEvent &event); + + /** + * + * @param {FormEvent} event : FormEvent Class Object + * @param {string} eventName : The name of the event to wait for. + * @param {int} code : The code of the event to wait for. + * @Introduction: get the event data. + */ + static std::string GetData(STtools::FormEvent &event, const std::string &eventName, const int code); + + /** + * + * @param {Want} want : The want of the ability to start. + * @param {sptr} connect : Callback + * @param {time_t} delay : Waiting time for ability to start (milliseconds) + * @Introduction: connect ability + */ + static ErrCode ConnectAbility(const AAFwk::Want &want, const sptr &connect, + const sptr &callerToken, unsigned int usec = 0); + + /** + * + * @param {Want} want : The want of the ability to start. + * @param {sptr} connect : Callback + * @param {time_t} delay : Waiting time for ability to start (milliseconds) + * @Introduction: disconnect ability + */ + static ErrCode DisconnectAbility(const sptr &connect, unsigned int usec = 0); + + /** + * + * @param {Want} want : The want of the ability to start. + * @param {time_t} delay : Waiting time for ability to start (milliseconds) + * @Introduction: stop service ability + */ + static ErrCode StopServiceAbility(const AAFwk::Want &want, unsigned int usec = 0); + + /** + * Remove the specified mission stack by stack id + * + * @param id. + * @param {sptr} abilityMs : Ability Manager Service ptr + * @param {time_t} delay : Waiting time for ability to GetAppProcessInfo (milliseconds) + * @return Returns ERR_OK on success, others on failure. + */ + static int RemoveStack(int id, sptr &abilityMs, const time_t &backHmoeDelay = 0, + const time_t &removeDelay = 0); + + /** + * + * @param {string} bundleFilePath : Hap File Name + * @param {AppExecFwk::InstallFlag} installFlag : install flag + * @Introduction: use bms install + */ + static void Install( + const std::string &bundleFilePath, const AppExecFwk::InstallFlag installFlag = AppExecFwk::InstallFlag::NORMAL); + + /** + * + * @param {string} bundleName : bundleName + * @Introduction: use bm uninstall bundleName + */ + static void Uninstall(const std::string &bundleName); + + /** + * @brief Query all of form storage infos. + * @return Returns all of form storage infos. + */ + static std::string QueryStorageFormInfos(); + /** + * @brief Query form infos by bundleName. + * @param bundleName BundleName. + * @return Returns form infos. + */ + static std::string QueryFormInfoByBundleName(const std::string& bundleName); + /** + * @brief Query form infos by form id. + * @param formId The id of the form. + * @return form infos. + */ + static std::string QueryFormInfoByFormId(const std::int64_t formId); + /** + * @brief Query form timer service by form id. + * @param formId The id of the form. + * @return Returns form timer service. + */ + static std::string QueryFormTimerByFormId(const std::int64_t formId); + + /** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns forms count to add. + */ + static int BatchAddFormRecords(const AAFwk::Want &want); + /** + * @brief Clear form records for st limit value test. + * @return Returns forms count to delete. + */ + static int ClearFormRecords(); +private: + /** + * + * @Introduction: get bundleManger object + */ + static sptr GetBundleMgrProxy(); + + /** + * + * @Introduction: get bundleInstaller object + */ + static sptr GetInstallerProxy(); + + /** + * @brief Get form manager service. + * @return Returns form manager servic remoteObject. + */ + static sptr GetFmsService(); + + static bool WriteInterfaceToken(MessageParcel &data); + static int GetStringInfo(AppExecFwk::IFormMgr::Message code, MessageParcel &data, std::string &stringInfo); + static int SendTransactCmd(AppExecFwk::IFormMgr::Message code, MessageParcel &data, MessageParcel &reply); + + static std::shared_ptr instance_; +}; +} // namespace STtools +} // namespace OHOS +#endif // SYSTEM_TEST_FORM_UTIL_H diff --git a/test/systemtest/common/fms/common/src/form_event.cpp b/test/systemtest/common/fms/common/src/form_event.cpp new file mode 100644 index 0000000000..082058567e --- /dev/null +++ b/test/systemtest/common/fms/common/src/form_event.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021 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. + */ +#include "form_event.h" + +namespace OHOS { +namespace STtools { +FormEvent::FormEvent() +{ + waiting_message_ = ""; + complete_message_.clear(); +} + +FormEvent::~FormEvent() +{ + waiting_message_ = ""; + std::vector tmp_vector; + tmp_vector.swap(complete_message_); + complete_message_.clear(); +} + +bool FormEvent::Compare() +{ + if (!waiting_message_.empty()) { + for (size_t i = 0; i < complete_message_.size(); i++) { + if (waiting_message_.compare(complete_message_.at(i)) == 0) { + complete_message_.erase(std::begin(complete_message_) + i, std::begin(complete_message_) + i + 1); + waiting_message_ = ""; + return true; + } + } + } + return false; +} + +int FormEvent::WaitingMessage(const std::string &message, int timeout_ms, bool locked) +{ + std::unique_lock lock(mutex_); + HILOG_INFO(" WaitingMessage: [%{public}s]", message.c_str()); + waiting_message_ = message; + if (Compare()) { + HILOG_INFO(" WaitingMessage: unlock [%{public}s]", message.c_str()); + return 0; + } + + if (locked) { + HILOG_INFO(" WaitingMessage: locked [%{public}s]", message.c_str()); + cv_.wait(lock); + return 0; + } + + if (cv_.wait_for(lock, std::chrono::seconds(timeout_ms)) == std::cv_status::timeout) { + HILOG_INFO("[%{public}s] waiting timeout", waiting_message_.c_str()); + waiting_message_ = ""; + return -1; + } + return 0; +} + +void FormEvent::CompleteMessage(const std::string &message) +{ + std::unique_lock lock(mutex_); + HILOG_INFO("CompleteMessage [%{public}s]", message.c_str()); + if (waiting_message_.compare(message) == 0) { + HILOG_INFO("Completed unlocked: [%{public}s]", message.c_str()); + waiting_message_ = ""; + cv_.notify_all(); + return; + } + HILOG_INFO("completed message: [%{public}s] does not equal waiting message", message.c_str()); + + complete_message_.push_back(message); + return; +} + +void FormEvent::CompleteMessage(const std::string &message, const std::string &data) +{ + std::unique_lock lock(mutex_); + HILOG_INFO("CompleteMessage [%{public}s]", message.c_str()); + message_data_[message] = data; + if (waiting_message_.compare(message) == 0) { + HILOG_INFO("Completed unlocked: [%{public}s]", message.c_str()); + waiting_message_ = ""; + cv_.notify_all(); + return; + } + HILOG_INFO("completed message: [%{public}s] does not equal waiting message", message.c_str()); + + complete_message_.push_back(message); + return; +} + +std::string FormEvent::GetData(const std::string &message) +{ + std::string data; + std::unique_lock lock(mutex_); + if (message_data_.find(message) != message_data_.end()) { + data = message_data_.at(message); + message_data_.erase(message); + } + return data; +} + +void FormEvent::Clean() +{ + HILOG_INFO("FormEvent::Clean()"); + std::unique_lock lock(mutex_); + waiting_message_ = ""; + complete_message_.clear(); + message_data_.clear(); +} +} // namespace STtools +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/common/src/system_test_form_util.cpp b/test/systemtest/common/fms/common/src/system_test_form_util.cpp new file mode 100644 index 0000000000..f9f78d5c7d --- /dev/null +++ b/test/systemtest/common/fms/common/src/system_test_form_util.cpp @@ -0,0 +1,686 @@ +/* + * Copyright (c) 2021 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. + */ +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "status_receiver_host.h" +#include "install_tool_status_receiver.h" + +namespace OHOS { +namespace STtools { +using namespace OHOS; +using namespace OHOS::AAFwk; +using namespace OHOS::AppExecFwk; +using namespace OHOS::EventFwk; + +std::shared_ptr SystemTestFormUtil::instance_ = nullptr; + +bool SystemTestFormUtil::PublishEvent(const std::string &eventName, const int &code, const std::string &data) +{ + Want want; + want.SetAction(eventName); + CommonEventData commonData; + commonData.SetWant(want); + commonData.SetCode(code); + commonData.SetData(data); + return CommonEventManager::PublishCommonEvent(commonData); +} + +void SystemTestFormUtil::InstallHaps(vector_str &hapNames) +{ + for (auto hapName : hapNames) { + Install(hapName); + } +} + +void SystemTestFormUtil::UninstallBundle(vector_str &bundleNames) +{ + for (auto bundleName : bundleNames) { + Uninstall(bundleName); + } +} + +void SystemTestFormUtil::KillService(const std::string &serviceName) +{ + system(("kill -9 $(pidof " + serviceName + ") > /dev/null 2>&1").c_str()); +} + +void SystemTestFormUtil::StartService(const std::string &serviceName, const time_t &delay) +{ + system(("/system/bin/" + serviceName + "& > /dev/null 2>&1").c_str()); + std::this_thread::sleep_for(std::chrono::milliseconds(delay)); +} + +void SystemTestFormUtil::KillBundleProcess(vector_str &bundleNames) +{ + for (std::string bundleName : bundleNames) { + KillService(bundleName); + } +} + +sptr SystemTestFormUtil::GetAbilityManagerService() +{ + sptr abilityMsObj = + OHOS::DelayedSingleton::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID); + if (abilityMsObj == nullptr) { + HILOG_ERROR("failed to get ability manager service"); + return nullptr; + } + return iface_cast(abilityMsObj); +} + +sptr SystemTestFormUtil::GetAppMgrService() +{ + sptr appMsObj = + OHOS::DelayedSingleton::GetInstance()->GetSystemAbility(APP_MGR_SERVICE_ID); + if (appMsObj == nullptr) { + HILOG_ERROR("failed to get app manager service"); + return nullptr; + } + return iface_cast(appMsObj); +} + +ErrCode SystemTestFormUtil::StartAbility(const Want &want, sptr &abilityMs, const time_t &delay) +{ + ErrCode result = OHOS::ERR_OK; + abilityMs = GetAbilityManagerService(); + if (abilityMs == nullptr) { + result = OHOS::ERR_INVALID_VALUE; + HILOG_ERROR("failed to get ability manager service"); + return result; + } + + result = abilityMs->StartAbility(want); + std::this_thread::sleep_for(std::chrono::milliseconds(delay)); + if (result == OHOS::ERR_OK) { + HILOG_INFO("start ability successfully."); + } else { + HILOG_INFO("failed to start ability."); + } + + return result; +} + +bool SystemTestFormUtil::StopAbility(const std::string &eventName, const int &code, const std::string &data) +{ + return PublishEvent(eventName, code, data); +} + +ErrCode SystemTestFormUtil::StopServiceAbility(const Want &want, unsigned int usec) +{ + ErrCode result = OHOS::ERR_OK; + + sptr abilityMs = GetAbilityManagerService(); + if (abilityMs == nullptr) { + result = OHOS::ERR_INVALID_VALUE; + HILOG_ERROR("failed to get ability manager service"); + return result; + } + + result = abilityMs->StopServiceAbility(want); + if (result == OHOS::ERR_OK) { + HILOG_INFO("stop service ability successfully."); + } else { + HILOG_INFO("failed to stop service ability."); + } + + return result; +} + +ErrCode SystemTestFormUtil::ConnectAbility(const Want &want, const sptr &connect, + const sptr &callerToken, unsigned int usec) +{ + ErrCode result = OHOS::ERR_OK; + + sptr abilityMs = GetAbilityManagerService(); + if (abilityMs == nullptr) { + result = OHOS::ERR_INVALID_VALUE; + HILOG_ERROR("failed to get ability manager service"); + return result; + } + + result = abilityMs->ConnectAbility(want, connect, callerToken); + if (result == OHOS::ERR_OK) { + HILOG_INFO("connect ability successfully."); + } else { + HILOG_INFO("failed to connect ability."); + } + + return result; +} + +ErrCode SystemTestFormUtil::DisconnectAbility(const sptr &connect, unsigned int usec) +{ + ErrCode result = OHOS::ERR_OK; + + sptr abilityMs = GetAbilityManagerService(); + if (abilityMs == nullptr) { + result = OHOS::ERR_INVALID_VALUE; + HILOG_ERROR("failed to get ability manager service"); + return result; + } + + result = abilityMs->DisconnectAbility(connect); + if (result == OHOS::ERR_OK) { + HILOG_INFO("StopServiceAbility successfully."); + } else { + HILOG_INFO("failed to StopServiceAbility."); + } + + return result; +} + +Want SystemTestFormUtil::MakeWant(std::string deviceId, std::string abilityName, std::string bundleName, + MAP_STR_STR params) +{ + ElementName element(deviceId, bundleName, abilityName); + Want want; + want.SetElement(element); + for (const auto ¶m : params) { + want.SetParam(param.first, param.second); + } + return want; +} + +Want SystemTestFormUtil::MakeWant(std::string deviceId, std::string abilityName, std::string bundleName, + vector_str params) +{ + ElementName element(deviceId, bundleName, abilityName); + Want want; + want.SetElement(element); + want.SetParam("operator", params); + return want; +} + +ErrCode SystemTestFormUtil::GetTopAbilityRecordId(int64_t &id, sptr &abilityMs) +{ + ErrCode result = OHOS::ERR_OK; + id = -1; + abilityMs = GetAbilityManagerService(); + if (abilityMs == nullptr) { + result = OHOS::ERR_INVALID_VALUE; + HILOG_ERROR("failed to get ability manager service"); + return result; + } + StackInfo stackInfo; + abilityMs->GetAllStackInfo(stackInfo); + MissionStackInfo defaultMissionStack; + for (const auto &stackInfo : stackInfo.missionStackInfos) { + if (stackInfo.id == 1) { // DEFAULT_MISSION_STACK_ID = 1 + defaultMissionStack = stackInfo; + break; + } + } + if (!defaultMissionStack.missionRecords.empty() && + !defaultMissionStack.missionRecords.begin()->abilityRecordInfos.empty()) { + id = defaultMissionStack.missionRecords.begin()->abilityRecordInfos.begin()->id; + } + return result; +} + +ErrCode SystemTestFormUtil::GetRunningProcessInfo( + std::vector &runningProcessInfo, sptr &appMs, const time_t &delay) +{ + ErrCode result = ERR_OK; + appMs = GetAppMgrService(); + if (appMs == nullptr) { + result = OHOS::ERR_INVALID_VALUE; + HILOG_ERROR("failed to get app manager service"); + return result; + } + std::this_thread::sleep_for(std::chrono::milliseconds(delay)); + result = appMs->GetAllRunningProcesses(runningProcessInfo); + if (result == ERR_OK) { + HILOG_INFO("get running process info successfully."); + } else { + HILOG_INFO("failed to get running process info."); + } + return result; +} + +ErrCode SystemTestFormUtil::KillApplication(const std::string &appName, sptr &appMs, const time_t &delay) +{ + ErrCode result = ERR_OK; + appMs = GetAppMgrService(); + if (appMs == nullptr) { + result = OHOS::ERR_INVALID_VALUE; + HILOG_ERROR("failed to get app manager service"); + return result; + } + result = appMs->GetAmsMgr()->KillApplication(appName); + std::this_thread::sleep_for(std::chrono::milliseconds(delay)); + if (result == ERR_OK) { + HILOG_INFO("kill application:%{public}s successfully.", appName.c_str()); + } else { + HILOG_INFO("failed to kill application:%{public}s.", appName.c_str()); + } + return result; +} + +RunningProcessInfo SystemTestFormUtil::GetAppProcessInfoByName( + const std::string &processName, sptr &appMs, const time_t &delay) +{ + RunningProcessInfo appProcessInfo; + appProcessInfo.pid_ = 0; + std::vector runningProcessInfo; + if (ERR_OK == GetRunningProcessInfo(runningProcessInfo, appMs, delay)) { + for (const auto &info : runningProcessInfo) { + if (processName == info.processName_) { + appProcessInfo = info; + } + } + } + return appProcessInfo; +} + +int SystemTestFormUtil::WaitCompleted(FormEvent &event, const std::string &eventName, const int code, const int timeout) +{ + HILOG_INFO("WaitCompleted"); + return event.WaitingMessage(std::to_string(code) + eventName, timeout, false); +} + +void SystemTestFormUtil::Completed(FormEvent &event, const std::string &eventName, const int code) +{ + HILOG_INFO("Completed"); + return event.CompleteMessage(std::to_string(code) + eventName); +} + +void SystemTestFormUtil::Completed(FormEvent &event, const std::string &eventName, const int code, + const std::string &data) +{ + HILOG_INFO("SystemTestFormUtil::Completed"); + return event.CompleteMessage(std::to_string(code) + eventName, data); +} + +std::string SystemTestFormUtil::GetData(FormEvent &event, const std::string &eventName, const int code) +{ + HILOG_INFO("SystemTestFormUtil::GetData"); + return event.GetData(std::to_string(code) + eventName); +} + +void SystemTestFormUtil::CleanMsg(FormEvent &event) +{ + HILOG_INFO("CleanMsg"); + return event.Clean(); +} + +int SystemTestFormUtil::RemoveStack( + int id, sptr &abilityMs, const time_t &backHmoeDelay, const time_t &removeDelay) +{ + Want wantEntity; + wantEntity.AddEntity(Want::FLAG_HOME_INTENT_FROM_SYSTEM); + StartAbility(wantEntity, abilityMs); + std::this_thread::sleep_for(std::chrono::milliseconds(backHmoeDelay)); + if (!abilityMs) { + HILOG_INFO("RemoveStack abilityMs nullptr"); + return OHOS::ERR_INVALID_VALUE; + } + int result = abilityMs->RemoveStack(id); + std::this_thread::sleep_for(std::chrono::milliseconds(removeDelay)); + return result; +} + +const std::string MSG_SUCCESS = "[SUCCESS]"; +void SystemTestFormUtil::Install(const std::string &bundleFilePath, const InstallFlag installFlag) +{ + std::string bundlePath = "/system/vendor/" + bundleFilePath + ".hap"; + std::string installMsg = ""; + sptr installerProxy = GetInstallerProxy(); + if (!installerProxy) { + std::cout << "get bundle installer Failure." << std::endl; + installMsg = "Failure"; + return; + } + + InstallParam installParam; + installParam.installFlag = installFlag; + sptr statusReceiver(new (std::nothrow) InstallToolStatusReceiver()); + if (statusReceiver == nullptr) { + std::cout << "get statusReceiver Failure." << std::endl; + return; + } + bool installResult = installerProxy->Install(bundlePath, installParam, statusReceiver); + if (!installResult) { + installMsg = "Failure"; + return; + } + if (InstallToolStatusReceiver::TestWaitCompleted(statusReceiver->event_, MSG_SUCCESS, 0) == 0) { + installMsg = "Success"; + } else { + installMsg = "Failure"; + } +} + +void SystemTestFormUtil::Uninstall(const std::string &bundleName) +{ + std::string uninstallMsg = ""; + sptr installerProxy = GetInstallerProxy(); + if (!installerProxy) { + std::cout << "get bundle installer Failure." << std::endl; + uninstallMsg = "Failure"; + return; + } + if (bundleName.empty()) { + std::cout << "bundelname is null." << std::endl; + uninstallMsg = "Failure"; + } else { + sptr statusReceiver(new (std::nothrow) InstallToolStatusReceiver()); + if (statusReceiver == nullptr) { + std::cout << "get statusReceiver Failure." << std::endl; + uninstallMsg = "Failure"; + return; + } + InstallParam installParam; + bool uninstallResult = installerProxy->Uninstall(bundleName, installParam, statusReceiver); + if (!uninstallResult) { + std::cout << "Uninstall Failure." << std::endl; + uninstallMsg = "Failure"; + return; + } + if (InstallToolStatusReceiver::TestWaitCompleted(statusReceiver->event_, MSG_SUCCESS, 0) == 0) { + uninstallMsg = "Success"; + } else { + uninstallMsg = "Failure"; + } + } +} + +sptr SystemTestFormUtil::GetInstallerProxy() +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + if (!bundleMgrProxy) { + std::cout << "bundle mgr proxy is nullptr." << std::endl; + return nullptr; + } + + sptr installerProxy = bundleMgrProxy->GetBundleInstaller(); + if (!installerProxy) { + std::cout << "fail to get bundle installer proxy" << std::endl; + return nullptr; + } + std::cout << "get bundle installer proxy success." << std::endl; + return installerProxy; +} + +sptr SystemTestFormUtil::GetBundleMgrProxy() +{ + sptr systemAbilityManager = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (!systemAbilityManager) { + std::cout << "fail to get system ability mgr." << std::endl; + return nullptr; + } + + sptr remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); + if (!remoteObject) { + std::cout << "fail to get bundle manager proxy." << std::endl; + return nullptr; + } + + std::cout << "get bundle manager proxy success." << std::endl; + return iface_cast(remoteObject); +} + +/** + * @brief Query all of form storage infos. + * @return Returns all of form storage infos. + */ +std::string SystemTestFormUtil::QueryStorageFormInfos() +{ + std::cout << "QueryStorageFormInfos called." << std::endl; + + std::string formInfos = ""; + MessageParcel data; + if (!WriteInterfaceToken(data)) { + std::cout << "QueryStorageFormInfos, failed to write interface token." << std::endl; + return "QueryStorageFormInfos, failed to write interface token."; + } + + int result = GetStringInfo(AppExecFwk::IFormMgr::Message::FORM_MGR_STORAGE_FORM_INFOS, data, formInfos); + if (result != ERR_OK) { + std::cout << "QueryStorageFormInfos, failed to query form info." << std::endl; + } + + std::cout << "QueryStorageFormInfos end." << std::endl; + + return formInfos; +} +/** + * @brief Query form infos by bundleName. + * @param bundleName BundleName. + * @return Returns form infos. + */ +std::string SystemTestFormUtil::QueryFormInfoByBundleName(const std::string& bundleName) +{ + std::cout << "QueryFormInfoByBundleName called." << std::endl; + + std::string formInfos = ""; + MessageParcel data; + if (!WriteInterfaceToken(data)) { + std::cout << "QueryFormInfoByBundleName, failed to write interface token." << std::endl; + return "QueryFormInfoByBundleName, failed to write interface token."; + } + + if (!data.WriteString(bundleName)) { + std::cout << "QueryFormInfoByBundleName, failed to write bundleName." << std::endl; + return "QueryFormInfoByBundleName, failed to write bundleName."; + } + + int result = GetStringInfo(AppExecFwk::IFormMgr::Message::FORM_MGR_FORM_INFOS_BY_NAME, data, formInfos); + if (result != ERR_OK) { + std::cout << "QueryFormInfoByBundleName, failed to query form info." << std::endl; + } + + std::cout << "QueryFormInfoByBundleName end." << std::endl; + + return formInfos; +} +/** + * @brief Query form infos by form id. + * @param formId The id of the form. + * @return Returns form infos. + */ +std::string SystemTestFormUtil::QueryFormInfoByFormId(const std::int64_t formId) +{ + std::cout << "QueryFormInfoByFormId called." << std::endl; + + std::string formInfo = ""; + MessageParcel data; + if (!WriteInterfaceToken(data)) { + std::cout << "QueryFormInfoByFormId, failed to write interface token." << std::endl; + return "QueryFormInfoByFormId, failed to write interface token."; + } + if (!data.WriteInt64(formId)) { + std::cout << "QueryFormInfoByFormId, failed to write formId." << std::endl; + return "QueryFormInfoByFormId, failed to write formId."; + } + + int result = GetStringInfo(AppExecFwk::IFormMgr::Message::FORM_MGR_FORM_INFOS_BY_ID, data, formInfo); + if (result != ERR_OK) { + std::cout << "QueryFormInfoByFormId, failed to query form info." << std::endl; + } + + std::cout << "QueryFormInfoByFormId end." << std::endl; + + return formInfo; +} +/** + * @brief Query form timer service by form id. + * @param formId The id of the form. + * @return Returns form timer service. + */ +std::string SystemTestFormUtil::QueryFormTimerByFormId(const std::int64_t formId) +{ + std::cout << "QueryFormTimerByFormId called." << std::endl; + + std::string isTimingService; + MessageParcel data; + if (!WriteInterfaceToken(data)) { + std::cout << "QueryFormTimerByFormId, failed to write interface token." << std::endl; + return "QueryFormTimerByFormId, failed to write interface token."; + } + if (!data.WriteInt64(formId)) { + std::cout << "QueryFormTimerByFormId, failed to write formId." << std::endl; + return "QueryFormTimerByFormId, failed to write formId."; + } + + int result = GetStringInfo(AppExecFwk::IFormMgr::Message::FORM_MGR_FORM_TIMER_INFO_BY_ID, data, isTimingService); + if (result != ERR_OK) { + std::cout << "QueryFormTimerByFormId, failed to query timer info." << std::endl; + } + + std::cout << "QueryFormTimerByFormId end." << std::endl; + + return isTimingService; +} + +/** + * @brief Batch add forms to form records for st limit value test. + * @param want The want of the form to add. + * @return Returns forms count to add. + */ +int SystemTestFormUtil::BatchAddFormRecords(const AAFwk::Want &want) +{ + sptr remoteObject = GetFmsService(); + if (!remoteObject) { + std::cout << "SendTransactCmd, failed to get remote object." << std::endl; + return ERR_APPEXECFWK_SERVICE_NOT_CONNECTED; + } + + MessageParcel data; + if (!WriteInterfaceToken(data)) { + std::cout << "BatchAddFormRecords, failed to write interface token." << std::endl; + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteParcelable(&want)) { + std::cout << "BatchAddFormRecords, failed to write want." << std::endl; + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + MessageParcel reply; + MessageOption option; + int error = remoteObject->SendRequest( + static_cast(IFormMgr::Message::FORM_MGR_BATCH_ADD_FORM_RECORDS_ST), + data, + reply, + option); + if (error != ERR_OK) { + std::cout << "BatchAddFormRecords, failed to SendRequest." << std::endl; + return ERR_APPEXECFWK_FORM_SEND_FMS_MSG; + } + return reply.ReadInt32(); +} + +/** + * @brief Clear form records for st limit value test. + * @return Returns forms count to delete. + */ +int SystemTestFormUtil::ClearFormRecords() +{ + sptr remoteObject = GetFmsService(); + if (!remoteObject) { + std::cout << "SendTransactCmd, failed to get remote object." << std::endl; + return ERR_APPEXECFWK_SERVICE_NOT_CONNECTED; + } + + MessageParcel data; + if (!WriteInterfaceToken(data)) { + std::cout << "BatchAddFormRecords, failed to write interface token." << std::endl; + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + MessageParcel reply; + MessageOption option; + int error = remoteObject->SendRequest( + static_cast(IFormMgr::Message::FORM_MGR_CLEAR_FORM_RECORDS_ST), + data, + reply, + option); + if (error != ERR_OK) { + std::cout << "ClearFormRecords, failed to SendRequest." << std::endl; + return ERR_APPEXECFWK_FORM_SEND_FMS_MSG; + } + return reply.ReadInt32(); +} +bool SystemTestFormUtil::WriteInterfaceToken(MessageParcel &data) +{ + if (!data.WriteInterfaceToken(AppExecFwk::IFormMgr::GetDescriptor())) { + std::cout << "WriteInterfaceToken, failed to write interface token." << std::endl; + return false; + } + return true; +} +int SystemTestFormUtil::GetStringInfo(AppExecFwk::IFormMgr::Message code, MessageParcel &data, std::string &stringInfo) +{ + int error; + MessageParcel reply; + error = SendTransactCmd(code, data, reply); + if (error != ERR_OK) { + return error; + } + + error = reply.ReadInt32(); + if (error != ERR_OK) { + std::cout << "GetStringInfo, failed to read reply result." << std::endl; + return error; + } + std::vector stringInfoList; + if (!reply.ReadStringVector(&stringInfoList)) { + std::cout << "GetStringInfo, failed to read string vector from reply." << std::endl; + return ERR_APPEXECFWK_FORM_NOT_EXIST_ID; + } + if (stringInfoList.empty()) { + std::cout << "GetStringInfo, No string info." << std::endl; + return ERR_APPEXECFWK_FORM_NOT_EXIST_ID; + } + for (auto &info : stringInfoList) { + stringInfo += info; + } + std::cout << "GetStringInfo end." << std::endl; + return ERR_OK; +} +int SystemTestFormUtil::SendTransactCmd(AppExecFwk::IFormMgr::Message code, MessageParcel &data, MessageParcel &reply) +{ + sptr remoteObject = GetFmsService(); + if (!remoteObject) { + std::cout << "SendTransactCmd, failed to get remote object." << std::endl; + return ERR_APPEXECFWK_SERVICE_NOT_CONNECTED; + } + + MessageOption option(MessageOption::TF_SYNC); + int32_t result = remoteObject->SendRequest(static_cast(code), data, reply, option); + if (result != ERR_OK) { + std::cout << "SendTransactCmd, failed to SendRequest." << std::endl; + return result; + } + return ERR_OK; +} +/** + * @brief Get form manager service. + * @return Returns form manager servic remoteObject. + */ +sptr SystemTestFormUtil::GetFmsService() +{ + sptr systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (systemManager == nullptr) { + std::cout << "SendTransactCmd, failed to get system ability manager." << std::endl; + return nullptr; + } + sptr remoteObject = systemManager->GetSystemAbility(FORM_MGR_SERVICE_ID); + + std::cout << "SendTransactCmd end." << std::endl; + return remoteObject; +} +} // namespace STtools +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_acquire_form_test/BUILD.gn b/test/systemtest/common/fms/fms_acquire_form_test/BUILD.gn new file mode 100644 index 0000000000..9a529de62f --- /dev/null +++ b/test/systemtest/common/fms/fms_acquire_form_test/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("FmsAcquireFormTest") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "fms_acquire_form_test.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"FMSAcquireFormTest\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":FmsAcquireFormTest" ] +} diff --git a/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp b/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp new file mode 100644 index 0000000000..e441ba6153 --- /dev/null +++ b/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp @@ -0,0 +1,1202 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_handler.h" +#include "ability_info.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +std::vector bundleNameList = { + "com.ohos.form.manager.notsystemapp", + "com.form.formsystemtestservicea", + "com.form.formsystemtestserviceb", +}; +std::vector hapNameList = { + "fmsSystemTestHostNotSys-signed", + "formSystemTestServiceA-signed", + "formSystemTestServiceB-signed", +}; + +std::string catchFormId; // FormId when creating a cached form +} // namespace + +namespace OHOS { +namespace AppExecFwk { +class FmsAcquireFormTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityMs; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber; + + void FmsAcquireFormCatched1500(std::string strFormId); + void FmsAcquireForm1600(); + void FmsAcquireForm1600A(); + void FmsAcquireForm1800(); + void FmsAcquireForm1800A(); + void FmsAcquireForm1800B(); + void FmsAcquireForm1800C(); + std::string FmsAcquireForm2400(); + void FmsAcquireForm2400_1(std::string strFormId); + void FmsAcquireFormDeleteA(std::string strFormId); +}; + +std::vector FmsAcquireFormTest::eventList = { + FORM_EVENT_RECV_DELETE_FORM_COMMON, + FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_ACQUIRE_FORM_0100, FORM_EVENT_RECV_ACQUIRE_FORM_0200, + FORM_EVENT_RECV_ACQUIRE_FORM_0300, FORM_EVENT_RECV_ACQUIRE_FORM_0400, FORM_EVENT_RECV_ACQUIRE_FORM_0500, + FORM_EVENT_RECV_ACQUIRE_FORM_0600, FORM_EVENT_RECV_ACQUIRE_FORM_0700, FORM_EVENT_RECV_ACQUIRE_FORM_1000, + FORM_EVENT_RECV_ACQUIRE_FORM_1100, FORM_EVENT_RECV_ACQUIRE_FORM_1200, FORM_EVENT_RECV_ACQUIRE_FORM_1400, + FORM_EVENT_RECV_ACQUIRE_FORM_1500, FORM_EVENT_RECV_ACQUIRE_FORM_1600, FORM_EVENT_RECV_ACQUIRE_FORM_1600_1, + FORM_EVENT_RECV_ACQUIRE_FORM_1800, FORM_EVENT_RECV_ACQUIRE_FORM_1800_1, FORM_EVENT_RECV_ACQUIRE_FORM_1800_2, + FORM_EVENT_RECV_ACQUIRE_FORM_1800_3, FORM_EVENT_RECV_ACQUIRE_FORM_1900, FORM_EVENT_RECV_ACQUIRE_FORM_2100, + FORM_EVENT_RECV_ACQUIRE_FORM_2200, FORM_EVENT_RECV_ACQUIRE_FORM_2300, FORM_EVENT_RECV_ACQUIRE_FORM_2500, + FORM_EVENT_RECV_ACQUIRE_FORM_1500_1, FORM_EVENT_RECV_ACQUIRE_FORM_2600, FORM_EVENT_RECV_ACQUIRE_FORM_2600_1, + FORM_EVENT_RECV_ACQUIRE_FORM_2400, FORM_EVENT_RECV_ACQUIRE_FORM_2400_1, +}; + + +FormEvent FmsAcquireFormTest::event = FormEvent(); +sptr FmsAcquireFormTest::abilityMs = nullptr; +std::shared_ptr FmsAcquireFormTest::subscriber = nullptr; +void FmsAcquireFormTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +void FmsAcquireFormTest::SetUpTestCase() +{ + // SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } +} + +void FmsAcquireFormTest::TearDownTestCase() +{ + // SystemTestFormUtil::UninstallBundle(bundleNameList); + GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; + CommonEventManager::UnSubscribeCommonEvent(subscriber); +} + +void FmsAcquireFormTest::SetUp() +{ +} + +void FmsAcquireFormTest::TearDown() +{ + GTEST_LOG_(INFO) << "CleanMsg calld"; + SystemTestFormUtil::CleanMsg(event); +} +bool FmsAcquireFormTest::SubscribeEvent() +{ + GTEST_LOG_(INFO) << "SubscribeEvent calld"; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber); +} + +/** + * @tc.number: FMS_acquireForm_1100 + * @tc.name: When the formId is set to 0, a non cached form is added. + * @tc.desc: Verify that the non cache form can be successfully created. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1100, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_1100" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1100, EVENT_CODE_1100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1100, EVENT_CODE_1100)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1100, EVENT_CODE_1100); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1100, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1100, formId:" << strFormId; + } + + catchFormId = strFormId; + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1100, EVENT_CODE_1101)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1100, EVENT_CODE_1101); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1100, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1100, formData:" << data2; + } + int64_t formId = std::stoll(strFormId); + std::string cachedData = SystemTestFormUtil::QueryFormInfoByFormId(formId); + GTEST_LOG_(INFO) << "FMS_acquireForm_1100, cachedData:" << cachedData; + + std::cout << "END FMS_acquireForm_1100" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_1200 + * @tc.name: When the formId is set to 0, a non cached form is added. + * @tc.desc: Verify that the non cache form can be successfully created. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1200, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_1200" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1200, EVENT_CODE_1200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1200, EVENT_CODE_1200)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1200, EVENT_CODE_1200); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1200, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1200, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1200, EVENT_CODE_1201)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1200, EVENT_CODE_1201); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1200, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1200, formData:" << data2; + } + + int64_t formId = std::stoll(strFormId); + std::string cachedData = SystemTestFormUtil::QueryFormInfoByFormId(formId); + GTEST_LOG_(INFO) << "FMS_acquireForm_1200, cachedData:" << cachedData; + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result3 = data3 == "true"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FMS_acquireForm_1200, delete form, result:" << result3; + + std::cout << "END FMS_acquireForm_1200" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_1500 + * @tc.name: Add a cached form. + * @tc.desc: Verify that the cached form can be successfully created. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1500, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_1500" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, add no catch form start"; + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1500_1; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1500_1, EVENT_CODE_1510, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1500_1, EVENT_CODE_1510)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1500_1, EVENT_CODE_1510); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, formId:" << strFormId; + } + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1500_1, EVENT_CODE_1511)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1500_1, EVENT_CODE_1511); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, formData:" << data2; + } + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, add no catch form end"; + + sleep(1); + FmsAcquireFormCatched1500(strFormId); + + sleep(1); + FmsAcquireFormDeleteA(strFormId); + std::cout << "END FMS_acquireForm_1500" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_1600 + * @tc.name: A single form host (using a single thread) continuously creates 2 normal and 2 temporary forms. + * @tc.desc: Verify that a single host (using a single thread) can successfully create multiple normal + * and temporary forms continuously. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1600, Function | MediumTest | Level1) +{ + sleep(1); + int normalCount = 0; + int tempCount = 0; + for (int iCount = 0; iCount < 2; iCount++) { + sleep(1); + FmsAcquireForm1600(); + normalCount++; + std::cout << "END FMS_acquireForm_1600, normal form end, count:" << normalCount << std::endl; + sleep(1); + FmsAcquireForm1600A(); + tempCount++; + std::cout << "END FMS_acquireForm_1600_1, temp form end, count:" << tempCount << std::endl; + } +} + +/** + * @tc.number: FMS_acquireForm_1800 + * @tc.name: Multiple form hosts create one normal form and one temporary form respectively. + * @tc.desc: Verify that multiple hosts can successfully create multiple normal and temporary forms respectively. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1800, Function | MediumTest | Level1) +{ + sleep(1); + FmsAcquireForm1800(); + sleep(1); + FmsAcquireForm1800A(); + sleep(1); + FmsAcquireForm1800B(); + sleep(1); + FmsAcquireForm1800C(); +} + +/** + * @tc.number: FMS_acquireForm_1900 + * @tc.name: Add a temporary form when the formId is set to 0. + * @tc.desc: When the verification formId is set to 0, the temporary form is created successfully. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1900, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_1900" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1900; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1900, EVENT_CODE_1900, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1900, EVENT_CODE_1900)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1900, EVENT_CODE_1900); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1900, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1900, normal, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1900, EVENT_CODE_1901)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1900, EVENT_CODE_1901); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1900, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1900, normal, formData:" << data2; + } + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result3 = data3 == "true"; + EXPECT_TRUE(result3); + if (!result3) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1900, delete form, result:" << result3; + } + + std::cout << "END FMS_acquireForm_1900" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2400 + * @tc.name: FormId does not match other parameters when adding a cached form. + * @tc.desc: Failed to create a cached form when verifying that FormId does not match other parameters. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_2400, Function | MediumTest | Level1) +{ + sleep(1); + std::string strFormId = FmsAcquireForm2400(); + sleep(1); + FmsAcquireForm2400_1(strFormId); + sleep(1); + FmsAcquireFormDeleteA(strFormId); +} + +/** + * @tc.number: FMS_acquireForm_2600 + * @tc.name: When the normal form does not reach the maximum value created by the form + * (the single host is 256 and the FMS is 512), the temporary form changes to the normal form. + * @tc.desc: Verify that when the normal form does not reach the maximum value created by the form. + * (the single host is 256 and the FMS is 512), the temporary form can be successfully + * casted to the normal form. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_2600, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_2600" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2600_1; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2600_1, EVENT_CODE_2610, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2600_1, EVENT_CODE_2610)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2600_1, EVENT_CODE_2610); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_2600, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_2600, formId:" << strFormId; + } + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2600_1, EVENT_CODE_2611)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2600_1, EVENT_CODE_2611); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_2600, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_2600, formData:" << data2; + } + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData1 = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2600, EVENT_CODE_2600, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2600, EVENT_CODE_2600)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2600, EVENT_CODE_2600); + bool result3 = data3 == "true"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FMS_acquireForm_2600, result:" << result3; + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result4 = data4 == "true"; + EXPECT_TRUE(result4); + GTEST_LOG_(INFO) << "FMS_acquireForm_2600, delete form, result:" << result4; + std::cout << "END FMS_acquireForm_2600" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_0100 + * @tc.name: Form host is not a system application + * @tc.desc: Failed to create form when verifying that the form host is not a system application. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_0100, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_0100" << std::endl; + + std::string bundleName = "com.ohos.form.manager.notsystemapp"; + std::string abilityName = "FormAbilityNotSys"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_0100, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_0100, EVENT_CODE_100)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_0100, EVENT_CODE_100); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_0100, result:" << result; + + std::cout << "END FMS_acquireForm_0100" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_0200 + * @tc.name: The form host does not have permission to use the form + * @tc.desc: Failed to create a form when verifying that the form host does not have form permission. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_0200, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_0200" << std::endl; + + std::string bundleName = "com.ohos.form.manager.nopermission"; + std::string abilityName = "FormAbilityNoPerm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_0200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_0200, EVENT_CODE_200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_0200, EVENT_CODE_200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_0200, EVENT_CODE_200); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_0200, result:" << result; + + std::cout << "END FMS_acquireForm_0200" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_0300 + * @tc.name: Failed to add form when parameter formId is wrong. + * @tc.desc: Failed to create form when verifying that the parameter (formId) of creating form is wrong. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_0300, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_0300" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_0300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_0300, EVENT_CODE_300, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_0300, EVENT_CODE_300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_0300, EVENT_CODE_300); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_0300, result:" << result; + std::cout << "END FMS_acquireForm_0300" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_0400 + * @tc.name: Failed to add form when parameter bundlename is wrong. + * @tc.desc: Form creation failed when verifying the wrong parameter (bundlename) of form creation. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_0400, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_0400" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_0400; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_0400, EVENT_CODE_400, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_0400, EVENT_CODE_400)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_0400, EVENT_CODE_400); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_0400, result:" << result; + std::cout << "END FMS_acquireForm_0400" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_0500 + * @tc.name: Failed to add form when parameter moduleName is wrong. + * @tc.desc: Form creation failed when verifying the wrong parameter (moduleName) of form creation. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_0500, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_0500" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_0500; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_0500, EVENT_CODE_500, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_0500, EVENT_CODE_500)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_0500, EVENT_CODE_500); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_0500, result:" << result; + std::cout << "END FMS_acquireForm_0500" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_0600 + * @tc.name: Failed to add form when parameter formName is wrong. + * @tc.desc: Form creation failed when verifying the wrong parameter (formName) of form creation. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_0600, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_0600" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_0600; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_0600, EVENT_CODE_600, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_0600, EVENT_CODE_600)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_0600, EVENT_CODE_600); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_0600, result:" << result; + + std::cout << "END FMS_acquireForm_0600" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_0700 + * @tc.name: Failed to add form when parameter abilityName is wrong. + * @tc.desc: Form creation failed when verifying the wrong parameter (abilityName) of form creation. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_0700, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_0700" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_0700; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_0700, EVENT_CODE_700, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_0700, EVENT_CODE_700)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_0700, EVENT_CODE_700); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_0700, result:" << result; + } + std::cout << "END FMS_acquireForm_0700" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_1000 + * @tc.name: Failed to add form when parameter form dimension is wrong. + * @tc.desc: Form creation failed when verifying the wrong parameter (form dimension) of form creation. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1000, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_1000" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1000; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1000, EVENT_CODE_1000, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1000, EVENT_CODE_1000)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1000, EVENT_CODE_1000); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_1000, result:" << result; + + std::cout << "END FMS_acquireForm_1000" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_1400 + * @tc.name: FormId does not match other parameters when adding a cached form. + * @tc.desc: Failed to create a cached form when verifying that FormId does not match other parameters. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_1400, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_1400" << std::endl; + std::string bundleName = "com.ohos.form.manager.normalb"; + std::string abilityName = "FormAbilityB"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = catchFormId; + GTEST_LOG_(INFO) << "FMS_acquireForm_1400, formId:" << eventData; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1400, EVENT_CODE_1400, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1400, EVENT_CODE_1400)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1400, EVENT_CODE_1400); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_1400, result:" << result; + + std::cout << "END FMS_acquireForm_1400" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2100 + * @tc.name: When creating a temporary form, the formId is specified as the created normal formId. + * @tc.desc: Failed to create a temporary form when verifying that the formId is set to create a normal formId. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_2100, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_2100" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = catchFormId; + GTEST_LOG_(INFO) << "FMS_acquireForm_2100, formId:" << eventData; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2100, EVENT_CODE_2100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2100, EVENT_CODE_2100)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2100, EVENT_CODE_2100); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_2100, result:" << result; + sleep(1); + FmsAcquireFormDeleteA(catchFormId); + std::cout << "END FMS_acquireForm_2100" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2200 + * @tc.name: Cast to normal form when the temporary formId is set to negative. + * @tc.desc: Failed to Cast to normal form when the temporary formId is set to negative + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_2200, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_2200" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2200, EVENT_CODE_2200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2200, EVENT_CODE_2200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2200, EVENT_CODE_2200); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_2200, result:" << result; + + std::cout << "END FMS_acquireForm_2200" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2300 + * @tc.name: Cast to normal form when the temporary formIdis set to 0. + * @tc.desc: Failed to convert to normal form when verifying that the temporary formIdis set to 0 + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_2300, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_2300" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2300, EVENT_CODE_2300, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2300, EVENT_CODE_2300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2300, EVENT_CODE_2300); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_2300, result:" << result; + + std::cout << "END FMS_acquireForm_2300" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2500 + * @tc.name: cast non-existent temporary formId to normal form. + * @tc.desc: Failed to verify that the temporary formId that does not exist is casted to normal form. + */ +HWTEST_F(FmsAcquireFormTest, FMS_acquireForm_2500, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_2500" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2500; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2500, EVENT_CODE_2500, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2500, EVENT_CODE_2500)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2500, EVENT_CODE_2500); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_acquireForm_2500, result:" << result; + + std::cout << "END FMS_acquireForm_2500" << std::endl; +} + +void FmsAcquireFormTest::FmsAcquireFormCatched1500(std::string strFormId) +{ + std::string bundleName1 = "com.ohos.form.manager.normalb"; + std::string abilityName1 = "FormAbilityB"; + MAP_STR_STR params1; + Want want1 = SystemTestFormUtil::MakeWant("device", abilityName1, bundleName1, params1); + SystemTestFormUtil::StartAbility(want1, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, add catched form start"; + std::string eventData2 = strFormId; + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, formId:" << eventData2; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1500, EVENT_CODE_1500, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1500, EVENT_CODE_1500)); + std::string strFormId2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1500, EVENT_CODE_1500); + bool result3 = !strFormId2.empty(); + EXPECT_TRUE(result3); + if (!result3) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, result:" << result3; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, formId:" << strFormId2; + } + + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, add catched form end"; + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data5 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result5 = data5 == "true"; + EXPECT_TRUE(result5); + GTEST_LOG_(INFO) << "FMS_acquireForm_1500, delete form, result:" << result5; +} + +void FmsAcquireFormTest::FmsAcquireForm1600() +{ + std::cout << "START FMS_acquireForm_1600, normal form start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1600; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1600, EVENT_CODE_1600, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600, EVENT_CODE_1600)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600, EVENT_CODE_1600); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600, EVENT_CODE_1601)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600, EVENT_CODE_1601); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600, formData:" << data2; + } + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result3 = data3 == "true"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FMS_acquireForm_1600, delete form, result:" << result3; +} + +void FmsAcquireFormTest::FmsAcquireForm1600A() +{ + std::cout << "START FMS_acquireForm_1600_1, temp form start." << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData1 = FORM_EVENT_REQ_ACQUIRE_FORM_1600_1; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1600_1, EVENT_CODE_1610, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600_1, EVENT_CODE_1610)); + std::string strFormId1 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600_1, EVENT_CODE_1610); + bool result4 = !strFormId1.empty(); + EXPECT_TRUE(result4); + if (!result4) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600_1, result:" << result4; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600_1 formId:" << strFormId1; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600_1, EVENT_CODE_1611)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1600_1, EVENT_CODE_1611); + bool result5 = !data4.empty(); + EXPECT_TRUE(result5); + if (!result5) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600_1, result:" << result5; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1600_1, formData:" << data4; + } + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data5 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result6 = data5 == "true"; + EXPECT_TRUE(result6); + GTEST_LOG_(INFO) << "FMS_acquireForm_1600_1, delete form, result:" << result6; +} +void FmsAcquireFormTest::FmsAcquireForm1800() +{ + int normalCount = 0; + std::cout << "START FMS_acquireForm_1800, normal form start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + std::cout << "START FMS_acquireForm_1800, bundleName: "<< bundleName << std::endl; + std::cout << "START FMS_acquireForm_1800, abilityName: "<< abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1800; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1800, EVENT_CODE_1800, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800, EVENT_CODE_1800)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800, EVENT_CODE_1800); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800, EVENT_CODE_1801)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800, EVENT_CODE_1801); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800, formData:" << data2; + } + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result3 = data3 == "true"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FMS_acquireForm_1800, delete form, result:" << result3; + + normalCount++; + std::cout << "END FMS_acquireForm_1800, normal form end, count:" << normalCount << std::endl; +} +void FmsAcquireFormTest::FmsAcquireForm1800A() +{ + int tempCount = 0; + std::cout << "START FMS_acquireForm_1800_1, temp form start." << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + std::cout << "START FMS_acquireForm_1800_1, bundleName: "<< bundleName << std::endl; + std::cout << "START FMS_acquireForm_1800_1, abilityName: "<< abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData1 = FORM_EVENT_REQ_ACQUIRE_FORM_1800_1; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1800_1, EVENT_CODE_1810, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_1, EVENT_CODE_1810)); + std::string strFormId1 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_1, EVENT_CODE_1810); + bool result4 = !strFormId1.empty(); + EXPECT_TRUE(result4); + if (!result4) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_1, result:" << result4; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_1 formId:" << strFormId1; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_1, EVENT_CODE_1811)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_1, EVENT_CODE_1811); + bool result5 = !data4.empty(); + EXPECT_TRUE(result5); + if (!result5) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_1, result:" << result5; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_1, formData:" << data4; + } + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data5 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result6 = data5 == "true"; + EXPECT_TRUE(result6); + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_1, delete form, result:" << result6; + + tempCount++; + std::cout << "END FMS_acquireForm_1800_1, temp form end, count:" << tempCount << std::endl; +} +void FmsAcquireFormTest::FmsAcquireForm1800B() +{ + int normalCount = 0; + std::cout << "START FMS_acquireForm_1800_2, normal form start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normalb"; + std::string abilityName = "FormAbilityB"; + std::cout << "START FMS_acquireForm_1800_2, bundleName: "<< bundleName << std::endl; + std::cout << "START FMS_acquireForm_1800_2, abilityName: "<< abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_1800_2; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1800_2, EVENT_CODE_1820, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_2, EVENT_CODE_1820)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_2, EVENT_CODE_1820); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_2, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_2, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_2, EVENT_CODE_1821)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_2, EVENT_CODE_1821); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_2, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_2, formData:" << data2; + } + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result3 = data3 == "true"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_2, delete form, result:" << result3; + + normalCount++; + std::cout << "END FMS_acquireForm_1800_2, normal form end, count:" << normalCount << std::endl; +} +void FmsAcquireFormTest::FmsAcquireForm1800C() +{ + int tempCount = 0; + std::cout << "START FMS_acquireForm_1800_3, temp form start." << std::endl; + + std::string bundleName = "com.ohos.form.manager.normalb"; + std::string abilityName = "FormAbilityB"; + std::cout << "START FMS_acquireForm_1800_3, bundleName: "<< bundleName << std::endl; + std::cout << "START FMS_acquireForm_1800_3, abilityName: "<< abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData1 = FORM_EVENT_REQ_ACQUIRE_FORM_1800_3; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_1800_3, EVENT_CODE_1830, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_3, EVENT_CODE_1830)); + std::string strFormId1 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_3, EVENT_CODE_1830); + bool result4 = !strFormId1.empty(); + EXPECT_TRUE(result4); + if (!result4) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_3, result:" << result4; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_3 formId:" << strFormId1; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_3, EVENT_CODE_1831)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_1800_3, EVENT_CODE_1831); + bool result5 = !data4.empty(); + EXPECT_TRUE(result5); + if (!result5) { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_3, result:" << result5; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_3, formData:" << data4; + } + + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data5 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result6 = data5 == "true"; + EXPECT_TRUE(result6); + GTEST_LOG_(INFO) << "FMS_acquireForm_1800_3, delete form, result:" << result6; + + tempCount++; + std::cout << "END FMS_acquireForm_1800_3, temp form end, count:" << tempCount << std::endl; +} + +std::string FmsAcquireFormTest::FmsAcquireForm2400() +{ + int normalCount = 0; + std::cout << "START FMS_acquireForm_2400, temp form start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + std::cout << "START FMS_acquireForm_2400, bundleName: "<< bundleName << std::endl; + std::cout << "START FMS_acquireForm_2400, abilityName: "<< abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2400; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2400, EVENT_CODE_2400, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2400, EVENT_CODE_2400)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2400, EVENT_CODE_2400); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_acquireForm_2400, result:" << result; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_2400, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2400, EVENT_CODE_2401)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2400, EVENT_CODE_2401); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_acquireForm_2400, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FMS_acquireForm_2400, formData:" << data2; + } + + normalCount++; + std::cout << "END FMS_acquireForm_2400, temp form end, count:" << normalCount << std::endl; + + return strFormId; +} + +void FmsAcquireFormTest::FmsAcquireForm2400_1(std::string strFormId) +{ + std::cout << "START FMS_acquireForm_2400_1, cast temp start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normalb"; + std::string abilityName = "FormAbilityB"; + std::cout << "START FmsAcquireForm2400_1, bundleName: "<< bundleName << std::endl; + std::cout << "START FmsAcquireForm2400_1, abilityName: "<< abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData1 = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2400_1, EVENT_CODE_2410, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2400_1, EVENT_CODE_2410)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2400_1, EVENT_CODE_2410); + bool result3 = data3 == "false"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FmsAcquireForm2400_1, result:" << result3; + + std::cout << "END FmsAcquireForm2400_1 cast temp end" << std::endl; +} + +void FmsAcquireFormTest::FmsAcquireFormDeleteA(std::string strFormId) +{ + std::cout << "START FmsAcquireFormDeleteA, start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + std::cout << "START FmsAcquireFormDeleteA, bundleName: " << bundleName << std::endl; + std::cout << "START FmsAcquireFormDeleteA, abilityName: " << abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_COMMON, EVENT_CODE_999, eventData); + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormDeleteA, delete form, result:" << result; + + std::cout << "END FmsAcquireFormDeleteA end" << std::endl; +} + +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/BUILD.gn b/test/systemtest/common/fms/fms_acquire_form_test_max/BUILD.gn new file mode 100644 index 0000000000..d0f26980f7 --- /dev/null +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("FmsAcquireFormTestMax") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "fms_acquire_form_test_batch.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"FMSAcquireFormTestMax\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":FmsAcquireFormTestMax" ] +} diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp new file mode 100644 index 0000000000..f12571baf5 --- /dev/null +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp @@ -0,0 +1,846 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_handler.h" +#include "ability_info.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +const int FORM_COUNT_200 = 200; +const int FORM_COUNT_111 = 111; +const int FORM_COUNT_112 = 112; +const int TEMP_FORM_COUNT_256 = 256; +const int TEMP_FORM_COUNT_128 = 128; + +std::vector bundleNameList = { + "com.form.formsystemtestservicea", + "com.form.formsystemtestserviceb", +}; +std::vector hapNameList = { + "formSystemTestServiceA-signed", + "formSystemTestServiceB-signed", +}; + +std::vector normalFormsMaxA; +std::vector normalFormsMaxB; +std::vector normalFormsMaxC; + +std::vector tempFormsMaxA; +std::vector tempFormsMaxB; +} // namespace + +namespace OHOS { +namespace AppExecFwk { +class FmsAcquireFormTestBatch : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityMs; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber; + + void FmsAcquireForm2700(std::string); + std::string FmsAcquireForm2900A(); + std::string FmsAcquireForm2900B(); + void FmsAcquireForm3000(); + std::string FmsAcquireForm3100(const std::string &bundleName, const std::string &abilityName); + void FmsAcquireForm2800(std::string); + void FmsAcquireForm3200(); + + void FmsAcquireFormDeleteA(const std::string &strFormId); + void FmsAcquireFormDeleteB(const std::string &strFormId); + void FmsAcquireFormDeleteC(const std::string &strFormId); + std::string FmsAcquireFormTemp(const std::string &bundleName, const std::string &abilityName); + bool FmsAcquireFormTempForFailed(const std::string &bundleName, const std::string &abilityName); + + void FMS_acquireFormBatchA(const std::string &bundleName, const std::string &abilityName, const int count); + void FMS_acquireFormBatchB(const std::string &bundleName, const std::string &abilityName, const int count); + + void FMS_acquireTempFormBatch(const std::string &bundleName, const std::string &abilityName, const int count); + void FMS_deleteFormBatch(); +}; +std::vector FmsAcquireFormTestBatch::eventList = { + FORM_EVENT_RECV_DELETE_FORM_COMMON, FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, + FORM_EVENT_RECV_ACQUIRE_FORM_2700, FORM_EVENT_RECV_ACQUIRE_FORM_2800, FORM_EVENT_RECV_ACQUIRE_FORM_2900, + FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, FORM_EVENT_RECV_ACQUIRE_FORM_3000, FORM_EVENT_RECV_ACQUIRE_FORM_3100, + FORM_EVENT_RECV_ACQUIRE_FORM_3200, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH_B, + FORM_EVENT_RECV_CLEAR_FORM_BATCH, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, +}; + + +FormEvent FmsAcquireFormTestBatch::event = FormEvent(); +sptr FmsAcquireFormTestBatch::abilityMs = nullptr; +std::shared_ptr FmsAcquireFormTestBatch::subscriber = nullptr; +void FmsAcquireFormTestBatch::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +void FmsAcquireFormTestBatch::SetUpTestCase() +{ + // SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } +} + +void FmsAcquireFormTestBatch::TearDownTestCase() +{ + // SystemTestFormUtil::UninstallBundle(bundleNameList); + GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; + CommonEventManager::UnSubscribeCommonEvent(subscriber); +} + +void FmsAcquireFormTestBatch::SetUp() +{ +} + +void FmsAcquireFormTestBatch::TearDown() +{ + GTEST_LOG_(INFO) << "CleanMsg calld"; + SystemTestFormUtil::CleanMsg(event); +} +bool FmsAcquireFormTestBatch::SubscribeEvent() +{ + GTEST_LOG_(INFO) << "SubscribeEvent calld"; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber); +} + +/** + * @tc.number: FMS_acquireForm_2900 + * @tc.name: A single host creates 256 different provider forms. + * @tc.desc: The single host can successfully create 256 different provider forms. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_2900, Function | MediumTest | Level1) +{ + std::cout << "START FMS_acquireForm_2900" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + int countA = Constants::MAX_RECORD_PER_APP/2; + int countB = Constants::MAX_RECORD_PER_APP/2 - 1; + sleep(1); + FMS_acquireFormBatchA(bundleName, abilityName, countA); + sleep(1); + FMS_acquireFormBatchB(bundleName, abilityName, countB); + int count = Constants::MAX_RECORD_PER_APP - 1; + std::cout << "FMS_acquireForm_2900, form size of the host A:" << count << std::endl; + + sleep(1); + std::string strFormId = FmsAcquireForm2900A(); + normalFormsMaxA.emplace_back(strFormId); + std::cout << "END FMS_acquireForm_2900" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_3000 + * @tc.name: Create limit value verification using single party form. + * @tc.desc: Failed to create the 257th host form. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3000, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_3000" << std::endl; + std::cout << "FMS_acquireForm_3000, form size of the host A:" << normalFormsMaxA.size() << std::endl; + FmsAcquireForm3000(); + std::cout << "END FMS_acquireForm_3000" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2700 + * @tc.name: When the normal form reaches the maximum value (256) created by the host, + * the temporary form is transferred to the normal form. + * @tc.desc: Verify that when the normal form reaches the maximum value (256) created by the single host, + * the conversion of the temporary form to the normal form fails. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_2700, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_2700" << std::endl; + std::cout << "FMS_acquireForm_2700, form size of the host A:" << normalFormsMaxA.size() << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); + + sleep(1); + FmsAcquireForm2700(strFormId); + std::cout << "END FMS_acquireForm_2700" << std::endl; + + std::cout << "the host A, delete form start" << std::endl; + if(normalFormsMaxA.size() > 0) { + for (int count = 0; count < normalFormsMaxA.size(); count++) { + FmsAcquireFormDeleteA(normalFormsMaxA[count]); + } + } + sleep(1); + FMS_deleteFormBatch(); + std::cout << "the host A, delete form end" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_3100 + * @tc.name: Multiple hosts create 512 forms respectively. + * @tc.desc: Verify that multiple hosts can create 512 forms. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3100, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_3100" << std::endl; + + std::cout << "START add form to the host A" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::cout << "bundleName: " << bundleNameA << std::endl; + std::cout << "abilityName: " << abilityNameA << std::endl; + FMS_acquireFormBatchA(bundleNameA, abilityNameA, FORM_COUNT_200); + std::cout << "count:" << FORM_COUNT_200 << std::endl; + std::cout << "END add form to the host A" << std::endl; + + sleep(1); + std::cout << "START add form to the host B" << std::endl; + std::string bundleNameB = "com.ohos.form.manager.normalb"; + std::string abilityNameB = "FormAbilityB"; + std::cout << "bundleName: " << bundleNameB << std::endl; + std::cout << "abilityName: " << abilityNameB << std::endl; + FMS_acquireFormBatchA(bundleNameB, abilityNameB, FORM_COUNT_200); + std::cout << "count:" << FORM_COUNT_200 << std::endl; + std::cout << "END add form to the host B" << std::endl; + + sleep(1); + std::cout << "START add form to the host C" << std::endl; + std::string bundleNameC = "com.ohos.form.manager.normalc"; + std::string abilityNameC = "FormAbilityC"; + std::cout << "bundleName: " << bundleNameC << std::endl; + std::cout << "abilityName: " << abilityNameC << std::endl; + FMS_acquireFormBatchA(bundleNameC, abilityNameC, FORM_COUNT_111); + std::cout << "count:" << FORM_COUNT_111 << std::endl; + std::cout << "END add form to the host C" << std::endl; + + sleep(1); + std::string formId = FmsAcquireForm3100(bundleNameC, abilityNameC); + normalFormsMaxC.emplace_back(formId); + std::cout << "END FMS_acquireForm_3100" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2800 + * @tc.name: When the normal form reaches the maximum value (512) of the form created by FMS, + * the temporary form will be transferred to the normal form. + * @tc.desc: When the normal form reaches the maximum value (512) created by FMS, + * the conversion of temporary form to normal form fails. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_2800, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_2800" << std::endl; + std::cout << "FMS_acquireForm_2800, form size of the host A:" << FORM_COUNT_200 << std::endl; + std::cout << "FMS_acquireForm_2800, form size of the host B:" << FORM_COUNT_200 << std::endl; + std::cout << "FMS_acquireForm_2800, form size of the host C:" << FORM_COUNT_112 << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + + std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); + + sleep(1); + FmsAcquireForm2800(strFormId); + + std::cout << "END FMS_acquireForm_2800" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_3200 + * @tc.name: FMS create form limit value (512) verification. + * @tc.desc: Verify that 512 forms can be successfully created by creating forms with different users + * (the number of single user forms is less than 256), and the 513rd form fails to be created. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3200, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_3200" << std::endl; + std::cout << "FMS_acquireForm_3200, form size of the host A:" << FORM_COUNT_200 << std::endl; + std::cout << "FMS_acquireForm_3200, form size of the host B:" << FORM_COUNT_200 << std::endl; + std::cout << "FMS_acquireForm_3200, form size of the host C:" << FORM_COUNT_112 << std::endl; + FmsAcquireForm3200(); + std::cout << "END FMS_acquireForm_3200" << std::endl; + + std::cout << "dlete form start" << std::endl; + if(normalFormsMaxC.size() > 0) { + for (int count = 0; count < normalFormsMaxC.size(); count++) { + sleep(1); + FmsAcquireFormDeleteC(normalFormsMaxC[count]); + } + } + sleep(1); + FMS_deleteFormBatch(); + std::cout << "dlete form end" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_3300 + * @tc.name: A single host can create 256 temporary forms. + * @tc.desc: The host of the verification form can successfully create 256 temporary forms. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3300, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_3300" << std::endl; + + std::cout << "START add temp form to the host A" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::cout << "bundleName: " << bundleNameA << std::endl; + std::cout << "abilityName: " << abilityNameA << std::endl; + FMS_acquireTempFormBatch(bundleNameA, abilityNameA, TEMP_FORM_COUNT_256 - 1); + std::cout << "FMS_acquireForm_3300, temp form size of the host A:" << (TEMP_FORM_COUNT_256 - 1)<< std::endl; + + sleep(1); + std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); + std::cout << "FMS_acquireForm_3300, temp form size of the host A:" << TEMP_FORM_COUNT_256 << std::endl; + std::cout << "END add temp form to the host A" << std::endl; + std::cout << "END FMS_acquireForm_3300" << std::endl; + + sleep(1); + std::cout << "the host A, dlete temp form start" << std::endl; + FmsAcquireFormDeleteA(strFormId); + sleep(1); + FMS_deleteFormBatch(); + std::cout << "the host A, dlete temp form end" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_3400 + * @tc.name: 256 temporary forms can be created by multiple hosts. + * @tc.desc: Verify that multiple hosts can successfully create 256 temporary forms. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3400, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_3400" << std::endl; + + std::cout << "START add temp form to the host A" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::cout << "bundleName: " << bundleNameA << std::endl; + std::cout << "abilityName: " << abilityNameA << std::endl; + FMS_acquireTempFormBatch(bundleNameA, abilityNameA, TEMP_FORM_COUNT_128); + std::cout << "FMS_acquireForm_3400, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; + std::cout << "END add temp form to the host A" << std::endl; + + sleep(1); + std::cout << "START add temp form to the host B" << std::endl; + std::string bundleNameB = "com.ohos.form.manager.normalb"; + std::string abilityNameB = "FormAbilityB"; + std::cout << "bundleName: " << bundleNameB << std::endl; + std::cout << "abilityName: " << abilityNameB << std::endl; + FMS_acquireTempFormBatch(bundleNameB, abilityNameB, TEMP_FORM_COUNT_128 - 1); + std::cout << "FMS_acquireForm_3400, temp form size:" << (TEMP_FORM_COUNT_128 - 1) << std::endl; + sleep(1); + std::string strFormId = FmsAcquireFormTemp(bundleNameB, abilityNameB); + std::cout << "FMS_acquireForm_3400, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; + std::cout << "END add temp form to the host B" << std::endl; + + sleep(1); + std::cout << "FMS_acquireForm_3400, dlete temp form start" << std::endl; + FmsAcquireFormDeleteB(strFormId); + sleep(1); + FMS_deleteFormBatch(); + std::cout << "FMS_acquireForm_3400, dlete temp form end" << std::endl; + + std::cout << "END FMS_acquireForm_3400" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_3500 + * @tc.name: Create temporary form limit value (256) verification. + * @tc.desc: Failed to create the 257th temporary form for multiple users. + */ +HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3500, Function | MediumTest | Level1) +{ + sleep(1); + std::cout << "START FMS_acquireForm_3500" << std::endl; + std::cout << "START add temp form to the host A" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::cout << "bundleName: " << bundleNameA << std::endl; + std::cout << "abilityName: " << abilityNameA << std::endl; + FMS_acquireTempFormBatch(bundleNameA, abilityNameA, TEMP_FORM_COUNT_128); + std::cout << "FMS_acquireForm_3500, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; + std::cout << "END add temp form to the host A" << std::endl; + sleep(1); + std::cout << "START add temp form to the host B" << std::endl; + std::string bundleNameB = "com.ohos.form.manager.normalb"; + std::string abilityNameB = "FormAbilityB"; + std::cout << "bundleName: " << bundleNameB << std::endl; + std::cout << "abilityName: " << abilityNameB << std::endl; + FMS_acquireTempFormBatch(bundleNameB, abilityNameB, TEMP_FORM_COUNT_128); + std::cout << "FMS_acquireForm_3500, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; + std::cout << "END add temp form to the host B" << std::endl; + sleep(1); + bool result = FmsAcquireFormTempForFailed(bundleNameB, abilityNameB); + EXPECT_TRUE(result); + if (result) { + std::cout << "END add temp form to the host B, Failed to create the 257th temporary form." << std::endl; + } + sleep(1); + std::cout << "FMS_acquireForm_3500, dlete temp form start" << std::endl; + FMS_deleteFormBatch(); + std::cout << "FMS_acquireForm_3500, dlete temp form end" << std::endl; + + std::cout << "END FMS_acquireForm_3500" << std::endl; +} + +std::string FmsAcquireFormTestBatch::FmsAcquireForm3100(const std::string &bundleName, const std::string &abilityName) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_3100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_3100, EVENT_CODE_3100, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FmsAcquireForm3100, result:" << result; + } else { + GTEST_LOG_(INFO) << "FmsAcquireForm3100, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3101)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3101); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + GTEST_LOG_(INFO) << "FmsAcquireForm3100, result:" << result2; + + return strFormId; +} + +void FmsAcquireFormTestBatch::FmsAcquireForm2700(std::string strFormId) +{ + std::cout << "START FmsAcquireForm2700, cast temp form" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData1 = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2700, EVENT_CODE_2700, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2700, EVENT_CODE_2700)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2700, EVENT_CODE_2700); + bool result3 = data3 == "false"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FmsAcquireForm2700, result:" << result3; + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result4 = data4 == "true"; + EXPECT_TRUE(result4); + GTEST_LOG_(INFO) << "FmsAcquireForm2700, delete form, result:" << result4; + std::cout << "END FmsAcquireForm2700, cast temp form" << std::endl; +} +void FmsAcquireFormTestBatch::FmsAcquireForm3200() +{ + std::cout << "START FmsAcquireForm3200" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normalc"; + std::string abilityName = "FormAbilityC"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_3200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_3200, EVENT_CODE_3200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3200, EVENT_CODE_3200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3200, EVENT_CODE_3200); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireForm3200, result:" << result; + + std::cout << "END FmsAcquireForm3200" << std::endl; +} +void FmsAcquireFormTestBatch::FmsAcquireForm2800(std::string strFormId) +{ + std::cout << "START FmsAcquireForm2800, cast temp form" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData1 = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2800, EVENT_CODE_2800, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2800, EVENT_CODE_2800)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2800, EVENT_CODE_2800); + bool result3 = data3 == "false"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FmsAcquireForm2800, result:" << result3; + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result4 = data4 == "true"; + EXPECT_TRUE(result4); + GTEST_LOG_(INFO) << "FmsAcquireForm2800, delete form, result:" << result4; + std::cout << "END FmsAcquireForm2800, cast temp form" << std::endl; +} + +std::string FmsAcquireFormTestBatch::FmsAcquireForm2900A() +{ + std::cout << "START FmsAcquireForm2900A, Provider A" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2900; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2900, EVENT_CODE_2900, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2900)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2900); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FmsAcquireForm2900A, result:" << result; + } else { + GTEST_LOG_(INFO) << "FmsAcquireForm2900A, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2901)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2901); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + GTEST_LOG_(INFO) << "FmsAcquireForm2900A, result:" << result2; + + std::cout << "END FmsAcquireForm2900A, Provider A" << std::endl; + return strFormId; +} +// std::string FmsAcquireFormTestBatch::FmsAcquireForm2900B() +// { +// std::cout << "START FmsAcquireForm2900B, Provider B" << std::endl; +// std::string bundleName = "com.ohos.form.manager.normal"; +// std::string abilityName = "FormAbilityA"; +// MAP_STR_STR params; +// Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); +// SystemTestFormUtil::StartAbility(want, abilityMs); +// EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + +// std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2900_1; +// SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2900_1, EVENT_CODE_2910, eventData); + +// EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910)); +// std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910); +// bool result = !strFormId.empty(); +// EXPECT_TRUE(result); +// if (!result) { +// GTEST_LOG_(INFO) << "FmsAcquireForm2900B, result:" << result; +// } else { +// GTEST_LOG_(INFO) << "FmsAcquireForm2900B, formId:" << strFormId; +// } + +// EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2911)); +// std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2911); +// bool result2 = !data2.empty(); +// EXPECT_TRUE(result2); +// GTEST_LOG_(INFO) << "FmsAcquireForm2900B, result:" << result2; + +// std::cout << "END FmsAcquireForm2900B, Provider B" << std::endl; +// return strFormId; +// } +void FmsAcquireFormTestBatch::FmsAcquireForm3000() +{ + std::cout << "START FmsAcquireForm3000" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_3000; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_3000, EVENT_CODE_3000, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3000, EVENT_CODE_3000)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3000, EVENT_CODE_3000); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireForm3000, result:" << result; + + std::cout << "END FmsAcquireForm3000" << std::endl; +} + +void FmsAcquireFormTestBatch::FMS_acquireFormBatchA(const std::string &bundleName, const std::string &abilityName, + const int count) +{ + std::cout << "START FMS_acquireFormBatchA" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = std::to_string(count); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_acquireFormBatchA, for provider A, count: " << eventData; + } else { + GTEST_LOG_(INFO) << "FMS_acquireFormBatchA, result:" << result; + } + std::cout << "END FMS_acquireFormBatchA" << std::endl; +} + +void FmsAcquireFormTestBatch::FMS_acquireFormBatchB(const std::string &bundleName, const std::string &abilityName, + const int count) +{ + std::cout << "START FMS_acquireFormBatchB" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = std::to_string(count); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_BATCH_B, EVENT_CODE_BATCH_B, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH_B, EVENT_CODE_BATCH_B)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH_B, EVENT_CODE_BATCH_B); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_acquireFormBatchB, for provider B, count: " << eventData; + } else { + GTEST_LOG_(INFO) << "FMS_acquireFormBatchB, result:" << result; + } + + std::cout << "END FMS_acquireFormBatchB" << std::endl; +} +void FmsAcquireFormTestBatch::FMS_acquireTempFormBatch(const std::string &bundleName, const std::string &abilityName, const int count) +{ + std::cout << "START FMS_acquireTempFormBatch" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = std::to_string(count); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, + EVENT_CODE_TEMP_BATCH)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, + EVENT_CODE_TEMP_BATCH); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_acquireTempFormBatch, count: " << eventData; + } else { + GTEST_LOG_(INFO) << "FMS_acquireTempFormBatch, result:" << result; + } + + std::cout << "END FMS_acquireTempFormBatch" << std::endl; +} + +std::string FmsAcquireFormTestBatch::FmsAcquireFormTemp(const std::string &bundleName, const std::string &abilityName) +{ + std::cout << "START FmsAcquireFormTemp, add temp form" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_TEMP; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, result:" << result; + } else { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, formId:" << strFormId; + } + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP_1)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP_1); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, formData:" << data2; + } + std::cout << "END FmsAcquireFormTemp, add temp form" << std::endl; + + return strFormId; +} +bool FmsAcquireFormTestBatch::FmsAcquireFormTempForFailed(const std::string &bundleName, const std::string &abilityName) +{ + std::cout << "START FmsAcquireFormTempForFailed, add temp form" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_TEMP; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); + bool result = strFormId.empty(); + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormTempForFailed, result:" << result; + + std::cout << "END FmsAcquireFormTempForFailed, add temp form" << std::endl; + + return result; +} + +void FmsAcquireFormTestBatch::FmsAcquireFormDeleteA(const std::string &strFormId) +{ + std::cout << "START FmsAcquireFormDeleteA, start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + std::cout << "START FmsAcquireFormDeleteA, bundleName: " << bundleName << std::endl; + std::cout << "START FmsAcquireFormDeleteA, abilityName: " << abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_COMMON, EVENT_CODE_999, eventData); + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormDeleteA, delete form, result:" << result; + + std::cout << "END FmsAcquireFormDeleteA end" << std::endl; +} + +void FmsAcquireFormTestBatch::FmsAcquireFormDeleteB(const std::string &strFormId) +{ + std::cout << "START FmsAcquireFormDeleteB, start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normalb"; + std::string abilityName = "FormAbilityB"; + std::cout << "START FmsAcquireFormDeleteB, bundleName: " << bundleName << std::endl; + std::cout << "START FmsAcquireFormDeleteB, abilityName: " << abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_COMMON, EVENT_CODE_999, eventData); + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormDeleteB, delete form, result:" << result; + + std::cout << "END FmsAcquireFormDeleteB end" << std::endl; +} +void FmsAcquireFormTestBatch::FmsAcquireFormDeleteC(const std::string &strFormId) +{ + std::cout << "START FmsAcquireFormDeleteC, start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normalc"; + std::string abilityName = "FormAbilityC"; + std::cout << "START FmsAcquireFormDeleteC, bundleName: " << bundleName << std::endl; + std::cout << "START FmsAcquireFormDeleteC, abilityName: " << abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_COMMON, EVENT_CODE_999, eventData); + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormDeleteC, delete form, result:" << result; + + std::cout << "END FmsAcquireFormDeleteC end" << std::endl; +} + +void FmsAcquireFormTestBatch::FMS_deleteFormBatch() +{ + std::cout << "START FMS_deleteFormBatch, delete forms" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_CLEAR_FORM_BATCH; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_CLEAR_FORM_BATCH, EVENT_CODE_TEMP, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_deleteFormBatch, result:" << result; + + std::cout << "END FMS_deleteFormBatch, delete forms" << std::endl; +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp new file mode 100644 index 0000000000..1caf28c139 --- /dev/null +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp @@ -0,0 +1,766 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_handler.h" +#include "ability_info.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +const int FORM_COUNT_200 = 200; +const int FORM_COUNT_112 = 112; +const int TEMP_FORM_COUNT_256 = 256; +const int TEMP_FORM_COUNT_128 = 128; + +std::vector bundleNameList = { + "com.form.formsystemtestservicea", + "com.form.formsystemtestserviceb", +}; +std::vector hapNameList = { + "formSystemTestServiceA-signed", + "formSystemTestServiceB-signed", +}; + +std::vector normalFormsMaxA; +std::vector normalFormsMaxB; +std::vector normalFormsMaxC; + +std::vector tempFormsMaxA; +std::vector tempFormsMaxB; +} // namespace + +namespace OHOS { +namespace AppExecFwk { +class FmsAcquireFormTestMax : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityMs; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber; + + void FmsAcquireForm2700(std::string); + std::string FmsAcquireForm2900A(); + std::string FmsAcquireForm2900B(); + void FmsAcquireForm3000(); + std::string FmsAcquireForm3100(const std::string &bundleName, const std::string &abilityName); + void FmsAcquireForm2800(std::string); + void FmsAcquireForm3200(); + + void FmsAcquireFormDeleteA(const std::string &strFormId); + void FmsAcquireFormDeleteB(const std::string &strFormId); + void FmsAcquireFormDeleteC(const std::string &strFormId); + std::string FmsAcquireFormTemp(const std::string &bundleName, const std::string &abilityName); + bool FmsAcquireFormTempForFailed(const std::string &bundleName, const std::string &abilityName); +}; +std::vector FmsAcquireFormTestMax::eventList = { + FORM_EVENT_RECV_DELETE_FORM_COMMON, FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, + FORM_EVENT_RECV_ACQUIRE_FORM_2700, FORM_EVENT_RECV_ACQUIRE_FORM_2800, FORM_EVENT_RECV_ACQUIRE_FORM_2900, + FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, FORM_EVENT_RECV_ACQUIRE_FORM_3000, FORM_EVENT_RECV_ACQUIRE_FORM_3100, + FORM_EVENT_RECV_ACQUIRE_FORM_3200, +}; + + +FormEvent FmsAcquireFormTestMax::event = FormEvent(); +sptr FmsAcquireFormTestMax::abilityMs = nullptr; +std::shared_ptr FmsAcquireFormTestMax::subscriber = nullptr; +void FmsAcquireFormTestMax::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +void FmsAcquireFormTestMax::SetUpTestCase() +{ + // SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } +} + +void FmsAcquireFormTestMax::TearDownTestCase() +{ + // SystemTestFormUtil::UninstallBundle(bundleNameList); + GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; + CommonEventManager::UnSubscribeCommonEvent(subscriber); +} + +void FmsAcquireFormTestMax::SetUp() +{ +} + +void FmsAcquireFormTestMax::TearDown() +{ + GTEST_LOG_(INFO) << "CleanMsg calld"; + SystemTestFormUtil::CleanMsg(event); +} +bool FmsAcquireFormTestMax::SubscribeEvent() +{ + GTEST_LOG_(INFO) << "SubscribeEvent calld"; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber); +} + +/** + * @tc.number: FMS_acquireForm_2900 + * @tc.name: A single host creates 256 different provider forms. + * @tc.desc: The single host can successfully create 256 different provider forms. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_2900, Function | MediumTest | Level1) +{ + std::cout << "START FMS_acquireForm_2900" << std::endl; + for (int count = 0; count < Constants::MAX_RECORD_PER_APP/2; count++) { + sleep(7); + std::string strFormId1 = FmsAcquireForm2900A(); + normalFormsMaxA.emplace_back(strFormId1); + std::cout << "FMS_acquireForm_2900, form size of the host A:" << normalFormsMaxA.size() << std::endl; + sleep(7); + std::string strFormId2 = FmsAcquireForm2900B(); + normalFormsMaxA.emplace_back(strFormId2); + std::cout << "FMS_acquireForm_2900, form size of the host A:" << normalFormsMaxA.size() << std::endl; + } + + std::cout << "END FMS_acquireForm_2900" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_3000 + * @tc.name: Create limit value verification using single party form. + * @tc.desc: Failed to create the 257th host form. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3000, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_3000" << std::endl; + std::cout << "FMS_acquireForm_3000, form size of the host A:" << normalFormsMaxA.size() << std::endl; + FmsAcquireForm3000(); + std::cout << "END FMS_acquireForm_3000" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2700 + * @tc.name: When the normal form reaches the maximum value (256) created by the host, + * the temporary form is transferred to the normal form. + * @tc.desc: Verify that when the normal form reaches the maximum value (256) created by the single host, + * the conversion of the temporary form to the normal form fails. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_2700, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_2700" << std::endl; + std::cout << "FMS_acquireForm_2700, form size of the host A:" << normalFormsMaxA.size() << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); + + sleep(7); + FmsAcquireForm2700(strFormId); + std::cout << "END FMS_acquireForm_2700" << std::endl; + + std::cout << "the host A, dlete form start" << std::endl; + for (int count = 0; count < normalFormsMaxA.size(); count++) { + sleep(7); + FmsAcquireFormDeleteA(normalFormsMaxA[count]); + std::cout << "delete form count:" << count + 1 << std::endl; + } + normalFormsMaxA.clear(); + std::cout << "the host A, dlete form end" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_3100 + * @tc.name: Multiple hosts create 512 forms respectively. + * @tc.desc: Verify that multiple hosts can create 512 forms. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3100, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_3100" << std::endl; + + std::cout << "START add form to the host A" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::cout << "bundleName: " << bundleNameA << std::endl; + std::cout << "abilityName: " << abilityNameA << std::endl; + for (int count = 0; count < FORM_COUNT_200; count++) { + sleep(7); + std::string strFormId = FmsAcquireForm3100(bundleNameA, abilityNameA); + normalFormsMaxA.emplace_back(strFormId); + std::cout << "add form count:" << count + 1 << std::endl; + } + std::cout << "END add form to the host A" << std::endl; + + std::cout << "START add form to the host B" << std::endl; + std::string bundleNameB = "com.ohos.form.manager.normalb"; + std::string abilityNameB = "FormAbilityB"; + std::cout << "bundleName: " << bundleNameB << std::endl; + std::cout << "abilityName: " << abilityNameB << std::endl; + for (int count = 0; count < FORM_COUNT_200; count++) { + sleep(7); + std::string strFormId = FmsAcquireForm3100(bundleNameB, abilityNameB); + normalFormsMaxB.emplace_back(strFormId); + std::cout << "add form count:" << count + 1 << std::endl; + } + std::cout << "END add form to the host B" << std::endl; + + std::cout << "START add form to the host C" << std::endl; + std::string bundleNameC = "com.ohos.form.manager.normalc"; + std::string abilityNameC = "FormAbilityC"; + std::cout << "bundleName: " << bundleNameC << std::endl; + std::cout << "abilityName: " << abilityNameC << std::endl; + for (int count = 0; count < FORM_COUNT_112; count++) { + sleep(7); + std::string strFormId = FmsAcquireForm3100(bundleNameC, abilityNameC); + normalFormsMaxC.emplace_back(strFormId); + std::cout << "add form count:" << count + 1 << std::endl; + } + std::cout << "END add form to the host C" << std::endl; + + std::cout << "END FMS_acquireForm_3100" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2800 + * @tc.name: When the normal form reaches the maximum value (512) of the form created by FMS, + * the temporary form will be transferred to the normal form. + * @tc.desc: When the normal form reaches the maximum value (512) created by FMS, + * the conversion of temporary form to normal form fails. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_2800, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_2800" << std::endl; + std::cout << "FMS_acquireForm_2800, form size of the host A:" << normalFormsMaxA.size() << std::endl; + std::cout << "FMS_acquireForm_2800, form size of the host B:" << normalFormsMaxB.size() << std::endl; + std::cout << "FMS_acquireForm_2800, form size of the host C:" << normalFormsMaxC.size() << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + + std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); + + sleep(7); + FmsAcquireForm2800(strFormId); + std::cout << "END FMS_acquireForm_2800" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_2800 + * @tc.name: When the normal form reaches the maximum value (512) of the form created by FMS, + * the temporary form will be transferred to the normal form. + * @tc.desc: When the normal form reaches the maximum value (512) created by FMS, + * the conversion of temporary form to normal form fails. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3200, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_3200" << std::endl; + std::cout << "FMS_acquireForm_3200, form size of the host A:" << normalFormsMaxA.size() << std::endl; + std::cout << "FMS_acquireForm_3200, form size of the host B:" << normalFormsMaxB.size() << std::endl; + std::cout << "FMS_acquireForm_3200, form size of the host C:" << normalFormsMaxC.size() << std::endl; + FmsAcquireForm3200(); + std::cout << "END FMS_acquireForm_3200" << std::endl; + + std::cout << "the host A, dlete form start" << std::endl; + for (int count = 0; count < normalFormsMaxA.size(); count++) { + sleep(7); + FmsAcquireFormDeleteA(normalFormsMaxA[count]); + std::cout << "delete form count:" << count + 1 << std::endl; + } + normalFormsMaxA.clear(); + std::cout << "the host A, dlete form end" << std::endl; + + std::cout << "the host B, dlete form start" << std::endl; + for (int count = 0; count < normalFormsMaxB.size(); count++) { + sleep(7); + FmsAcquireFormDeleteB(normalFormsMaxB[count]); + std::cout << "delete form count:" << count + 1 << std::endl; + } + normalFormsMaxB.clear(); + std::cout << "the host B, dlete form end" << std::endl; + + std::cout << "the host C, dlete form start" << std::endl; + for (int count = 0; count < normalFormsMaxC.size(); count++) { + sleep(7); + FmsAcquireFormDeleteC(normalFormsMaxC[count]); + std::cout << "delete form count:" << count + 1 << std::endl; + } + normalFormsMaxC.clear(); + std::cout << "the host C, dlete form end" << std::endl; + +} +/** + * @tc.number: FMS_acquireForm_3300 + * @tc.name: A single host can create 256 temporary forms. + * @tc.desc: The host of the verification form can successfully create 256 temporary forms. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3300, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_3300" << std::endl; + + std::cout << "START add temp form to the host A" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::cout << "bundleName: " << bundleNameA << std::endl; + std::cout << "abilityName: " << abilityNameA << std::endl; + for (int count = 0; count < TEMP_FORM_COUNT_256; count++) { + sleep(7); + std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); + tempFormsMaxA.emplace_back(strFormId); + std::cout << "FMS_acquireForm_3300, form size of the host A:" << tempFormsMaxA.size() << std::endl; + } + std::cout << "END add temp form to the host A" << std::endl; + + std::cout << "END FMS_acquireForm_3300" << std::endl; + + std::cout << "the host A, dlete temp form start" << std::endl; + for (int count = 0; count < tempFormsMaxA.size(); count++) { + sleep(7); + FmsAcquireFormDeleteA(tempFormsMaxA[count]); + std::cout << "delete temp form count:" << count + 1 << std::endl; + } + tempFormsMaxA.clear(); + std::cout << "the host A, dlete temp form end" << std::endl; +} +/** + * @tc.number: FMS_acquireForm_3400 + * @tc.name: 256 temporary forms can be created by multiple hosts. + * @tc.desc: Verify that multiple hosts can successfully create 256 temporary forms. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3400, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_3400" << std::endl; + + std::cout << "START add temp form to the host A" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.normal"; + std::string abilityNameA = "FormAbilityA"; + std::cout << "bundleName: " << bundleNameA << std::endl; + std::cout << "abilityName: " << abilityNameA << std::endl; + for (int count = 0; count < TEMP_FORM_COUNT_128; count++) { + sleep(7); + std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); + tempFormsMaxA.emplace_back(strFormId); + std::cout << "FMS_acquireForm_3400, temp form size of the host A:" << tempFormsMaxA.size() << std::endl; + } + std::cout << "END add temp form to the host A" << std::endl; + + std::cout << "START add temp form to the host B" << std::endl; + std::string bundleNameB = "com.ohos.form.manager.normalb"; + std::string abilityNameB = "FormAbilityB"; + std::cout << "bundleName: " << bundleNameB << std::endl; + std::cout << "abilityName: " << abilityNameB << std::endl; + for (int count = 0; count < TEMP_FORM_COUNT_128; count++) { + sleep(7); + std::string strFormId = FmsAcquireFormTemp(bundleNameB, abilityNameB); + tempFormsMaxB.emplace_back(strFormId); + std::cout << "FMS_acquireForm_3400, temp form size of the host B:" << tempFormsMaxB.size() << std::endl; + } + std::cout << "END add temp form to the host B" << std::endl; + + std::cout << "END FMS_acquireForm_3400" << std::endl; +} + +/** + * @tc.number: FMS_acquireForm_3500 + * @tc.name: Create temporary form limit value (256) verification. + * @tc.desc: Failed to create the 257th temporary form for multiple users. + */ +HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3500, Function | MediumTest | Level1) +{ + sleep(7); + std::cout << "START FMS_acquireForm_3500" << std::endl; + + std::cout << "START add temp form to the host B" << std::endl; + std::string bundleNameB = "com.ohos.form.manager.normalb"; + std::string abilityNameB = "FormAbilityB"; + std::cout << "bundleName: " << bundleNameB << std::endl; + std::cout << "abilityName: " << abilityNameB << std::endl; + + bool result = FmsAcquireFormTempForFailed(bundleNameB, abilityNameB); + EXPECT_TRUE(result); + if (result) { + std::cout << "END add temp form to the host B, Failed to create the 257th temporary form." << std::endl; + } + std::cout << "END FMS_acquireForm_3500" << std::endl; + + std::cout << "the host A, dlete temp form start" << std::endl; + for (int count = 0; count < tempFormsMaxA.size(); count++) { + sleep(7); + FmsAcquireFormDeleteA(tempFormsMaxA[count]); + std::cout << "delete temp form count:" << count + 1 << std::endl; + } + tempFormsMaxA.clear(); + std::cout << "the host A, dlete temp form end" << std::endl; + + std::cout << "the host B, dlete temp form start" << std::endl; + for (int count = 0; count < tempFormsMaxB.size(); count++) { + sleep(7); + FmsAcquireFormDeleteB(tempFormsMaxB[count]); + std::cout << "delete temp form count:" << count + 1 << std::endl; + } + tempFormsMaxB.clear(); + std::cout << "the host B, dlete temp form end" << std::endl; +} + +std::string FmsAcquireFormTestMax::FmsAcquireForm3100(const std::string &bundleName, const std::string &abilityName) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_3100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_3100, EVENT_CODE_3100, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3100); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FmsAcquireForm3100, result:" << result; + } else { + GTEST_LOG_(INFO) << "FmsAcquireForm3100, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3101)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3100, EVENT_CODE_3101); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + GTEST_LOG_(INFO) << "FmsAcquireForm3100, result:" << result2; + + return strFormId; +} + +void FmsAcquireFormTestMax::FmsAcquireForm2700(std::string strFormId) +{ + std::cout << "START FmsAcquireForm2700, cast temp form" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData1 = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2700, EVENT_CODE_2700, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2700, EVENT_CODE_2700)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2700, EVENT_CODE_2700); + bool result3 = data3 == "false"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FmsAcquireForm2700, result:" << result3; + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result4 = data4 == "true"; + EXPECT_TRUE(result4); + GTEST_LOG_(INFO) << "FmsAcquireForm2700, delete form, result:" << result4; + std::cout << "END FmsAcquireForm2700, cast temp form" << std::endl; +} +void FmsAcquireFormTestMax::FmsAcquireForm3200() +{ + std::cout << "START FmsAcquireForm3200" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normalc"; + std::string abilityName = "FormAbilityC"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_3200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_3200, EVENT_CODE_3200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3200, EVENT_CODE_3200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3200, EVENT_CODE_3200); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireForm3200, result:" << result; + + std::cout << "END FmsAcquireForm3200" << std::endl; +} +void FmsAcquireFormTestMax::FmsAcquireForm2800(std::string strFormId) +{ + std::cout << "START FmsAcquireForm2800, cast temp form" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData1 = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2800, EVENT_CODE_2800, eventData1); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2800, EVENT_CODE_2800)); + std::string data3 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2800, EVENT_CODE_2800); + bool result3 = data3 == "false"; + EXPECT_TRUE(result3); + GTEST_LOG_(INFO) << "FmsAcquireForm2800, result:" << result3; + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data4 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result4 = data4 == "true"; + EXPECT_TRUE(result4); + GTEST_LOG_(INFO) << "FmsAcquireForm2800, delete form, result:" << result4; + std::cout << "END FmsAcquireForm2800, cast temp form" << std::endl; +} + +std::string FmsAcquireFormTestMax::FmsAcquireForm2900A() +{ + std::cout << "START FmsAcquireForm2900A, Provider A" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2900; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2900, EVENT_CODE_2900, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2900)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2900); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FmsAcquireForm2900A, result:" << result; + } else { + GTEST_LOG_(INFO) << "FmsAcquireForm2900A, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2901)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900, EVENT_CODE_2901); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + GTEST_LOG_(INFO) << "FmsAcquireForm2900A, result:" << result2; + + std::cout << "END FmsAcquireForm2900A, Provider A" << std::endl; + return strFormId; +} +std::string FmsAcquireFormTestMax::FmsAcquireForm2900B() +{ + std::cout << "START FmsAcquireForm2900B, Provider B" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2900_1; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2900_1, EVENT_CODE_2910, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FmsAcquireForm2900B, result:" << result; + } else { + GTEST_LOG_(INFO) << "FmsAcquireForm2900B, formId:" << strFormId; + } + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2911)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2911); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + GTEST_LOG_(INFO) << "FmsAcquireForm2900B, result:" << result2; + + std::cout << "END FmsAcquireForm2900B, Provider B" << std::endl; + return strFormId; +} +void FmsAcquireFormTestMax::FmsAcquireForm3000() +{ + std::cout << "START FmsAcquireForm3000" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_3000; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_3000, EVENT_CODE_3000, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_3000, EVENT_CODE_3000)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_3000, EVENT_CODE_3000); + bool result = data == "false"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireForm3000, result:" << result; + + std::cout << "END FmsAcquireForm3000" << std::endl; +} +std::string FmsAcquireFormTestMax::FmsAcquireFormTemp(const std::string &bundleName, const std::string &abilityName) +{ + std::cout << "START FmsAcquireFormTemp, add temp form" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_TEMP; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); + bool result = !strFormId.empty(); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, result:" << result; + } else { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, formId:" << strFormId; + } + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP_1)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP_1); + bool result2 = !data2.empty(); + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, result:" << result2; + } else { + GTEST_LOG_(INFO) << "FmsAcquireFormTemp, formData:" << data2; + } + std::cout << "END FmsAcquireFormTemp, add temp form" << std::endl; + + return strFormId; +} + +bool FmsAcquireFormTestMax::FmsAcquireFormTempForFailed(const std::string &bundleName, const std::string &abilityName) +{ + std::cout << "START FmsAcquireFormTempForFailed, add temp form" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_TEMP; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP)); + std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); + bool result = strFormId.empty(); + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormTempForFailed, result:" << result; + + std::cout << "END FmsAcquireFormTempForFailed, add temp form" << std::endl; + + return result; +} + +void FmsAcquireFormTestMax::FmsAcquireFormDeleteA(const std::string &strFormId) +{ + std::cout << "START FmsAcquireFormDeleteA, start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityA"; + std::cout << "START FmsAcquireFormDeleteA, bundleName: " << bundleName << std::endl; + std::cout << "START FmsAcquireFormDeleteA, abilityName: " << abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_COMMON, EVENT_CODE_999, eventData); + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormDeleteA, delete form, result:" << result; + + std::cout << "END FmsAcquireFormDeleteA end" << std::endl; +} + +void FmsAcquireFormTestMax::FmsAcquireFormDeleteB(const std::string &strFormId) +{ + std::cout << "START FmsAcquireFormDeleteB, start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normalb"; + std::string abilityName = "FormAbilityB"; + std::cout << "START FmsAcquireFormDeleteB, bundleName: " << bundleName << std::endl; + std::cout << "START FmsAcquireFormDeleteB, abilityName: " << abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_COMMON, EVENT_CODE_999, eventData); + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormDeleteB, delete form, result:" << result; + + std::cout << "END FmsAcquireFormDeleteB end" << std::endl; +} +void FmsAcquireFormTestMax::FmsAcquireFormDeleteC(const std::string &strFormId) +{ + std::cout << "START FmsAcquireFormDeleteC, start." << std::endl; + std::string bundleName = "com.ohos.form.manager.normalc"; + std::string abilityName = "FormAbilityC"; + std::cout << "START FmsAcquireFormDeleteC, bundleName: " << bundleName << std::endl; + std::cout << "START FmsAcquireFormDeleteC, abilityName: " << abilityName << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = strFormId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_COMMON, EVENT_CODE_999, eventData); + // wait delete form + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_COMMON, EVENT_CODE_999); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FmsAcquireFormDeleteC, delete form, result:" << result; + + std::cout << "END FmsAcquireFormDeleteC end" << std::endl; +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_delete_form_test/BUILD.gn b/test/systemtest/common/fms/fms_delete_form_test/BUILD.gn new file mode 100644 index 0000000000..08ed2ad2d4 --- /dev/null +++ b/test/systemtest/common/fms/fms_delete_form_test/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("FormDeleteFormTest") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "fms_delete_form_test.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"FMSDeleteFormTest\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":FormDeleteFormTest" ] +} diff --git a/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp new file mode 100644 index 0000000000..fa32d57ea5 --- /dev/null +++ b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp @@ -0,0 +1,1210 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_handler.h" +#include "ability_info.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +std::vector bundleNameList = { + "com.ohos.form.manager.notsystemapp", +}; +std::vector hapNameList = { + "fmsSystemTestHostNotSys-signed", +}; +} // namespace + +namespace OHOS { +namespace AppExecFwk { +class FmsDeleteFormTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityManager; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber; + bool FmsGetCacheInfoByFormId(std::int64_t formId); + bool FmsGetHostInfoByFormId(std::int64_t formId, std::string hostBundleName); + bool FmsGetStorageFormInfos(std::int64_t formId); + bool FmsGetFormTimerTask(std::int64_t formId); + void FMS_deleteForm_1400_A(); + void FMS_deleteForm_1400_B(); + void FMS_deleteForm_1500_acquireForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId); + void FMS_deleteForm_1500_clearForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId); + void FMS_deleteForm_1500_Create_Delete(std::string delFormId, std::string &createFormId); + void FMS_deleteForm_1600_acquireForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId); + void FMS_deleteForm_1600_clearForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId); + void FMS_deleteForm_1600_Delete_Create(std::string delFormId, std::string &createFormId); + void FMS_deleteForm_1700_acquireForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId); + void FMS_deleteForm_1700_clearForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId); + void FMS_deleteForm_1700_Delete_Create(std::string delFormId, std::string &createFormId); + void FMS_acquireTempFormBatch(const std::string &bundleName, const std::string &abilityName, + const int count); + void FMS_acquireNormalFormBatch(const std::string &bundleName, const std::string &abilityName, + const int count); + void FMS_deleteFormBatch(const std::string &bundleName, const std::string &abilityName); +}; + +std::vector FmsDeleteFormTest::eventList = { + FORM_EVENT_ABILITY_ONACTIVED, + FORM_EVENT_RECV_DELETE_FORM_0100, + FORM_EVENT_RECV_DELETE_FORM_0200, + FORM_EVENT_RECV_DELETE_FORM_0300, + FORM_EVENT_RECV_DELETE_FORM_0400, + FORM_EVENT_RECV_DELETE_FORM_0500, + FORM_EVENT_RECV_DELETE_FORM_0600, + FORM_EVENT_RECV_DELETE_FORM_0700, + FORM_EVENT_RECV_DELETE_FORM_0800, + FORM_EVENT_RECV_DELETE_FORM_0900, + FORM_EVENT_RECV_DELETE_FORM_1000, + FORM_EVENT_RECV_DELETE_FORM_1100, + FORM_EVENT_RECV_DELETE_FORM_1200, + FORM_EVENT_RECV_DELETE_FORM_1201, + FORM_EVENT_RECV_DELETE_FORM_1400, + FORM_EVENT_RECV_DELETE_FORM_1401, + FORM_EVENT_RECV_DELETE_FORM_1500, + FORM_EVENT_RECV_DELETE_FORM_1501, + FORM_EVENT_RECV_DELETE_FORM_1502, + FORM_EVENT_RECV_DELETE_FORM_1600, + FORM_EVENT_RECV_DELETE_FORM_1601, + FORM_EVENT_RECV_DELETE_FORM_1602, + FORM_EVENT_RECV_DELETE_FORM_1700, + FORM_EVENT_RECV_DELETE_FORM_1701, + FORM_EVENT_RECV_DELETE_FORM_1702, + FORM_EVENT_RECV_ONE_NORMAL_FORM, + FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, + FORM_EVENT_RECV_ONE_NORMAL_FORM_B, + FORM_EVENT_RECV_ONE_NORMAL_FORM_B_DEL, + COMMON_EVENT_ON_DELETE, + FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, + FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, + FORM_EVENT_RECV_CLEAR_FORM_BATCH +}; + +FormEvent FmsDeleteFormTest::event = FormEvent(); +sptr FmsDeleteFormTest::abilityManager = nullptr; +std::shared_ptr FmsDeleteFormTest::subscriber = nullptr; +void FmsDeleteFormTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +void FmsDeleteFormTest::SetUpTestCase() +{ + std::cout << "START Install============" << std::endl; + SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } +} + +void FmsDeleteFormTest::TearDownTestCase() +{ + std::cout << "START Uninstall============" << std::endl; + SystemTestFormUtil::UninstallBundle(bundleNameList); + CommonEventManager::UnSubscribeCommonEvent(subscriber); +} + +void FmsDeleteFormTest::SetUp() +{ +} + +void FmsDeleteFormTest::TearDown() +{ + SystemTestFormUtil::CleanMsg(event); +} +bool FmsDeleteFormTest::SubscribeEvent() +{ + std::vector eventList = { + FORM_EVENT_ABILITY_ONACTIVED, + FORM_EVENT_RECV_DELETE_FORM_0100, + FORM_EVENT_RECV_DELETE_FORM_0200, + FORM_EVENT_RECV_DELETE_FORM_0300, + FORM_EVENT_RECV_DELETE_FORM_0400, + FORM_EVENT_RECV_DELETE_FORM_0500, + FORM_EVENT_RECV_DELETE_FORM_0600, + FORM_EVENT_RECV_DELETE_FORM_0700, + FORM_EVENT_RECV_DELETE_FORM_0800, + FORM_EVENT_RECV_DELETE_FORM_0900, + FORM_EVENT_RECV_DELETE_FORM_1000, + FORM_EVENT_RECV_DELETE_FORM_1100, + FORM_EVENT_RECV_DELETE_FORM_1200, + FORM_EVENT_RECV_DELETE_FORM_1201, + FORM_EVENT_RECV_DELETE_FORM_1400, + FORM_EVENT_RECV_DELETE_FORM_1401, + FORM_EVENT_RECV_DELETE_FORM_1500, + FORM_EVENT_RECV_DELETE_FORM_1501, + FORM_EVENT_RECV_DELETE_FORM_1502, + FORM_EVENT_RECV_DELETE_FORM_1600, + FORM_EVENT_RECV_DELETE_FORM_1601, + FORM_EVENT_RECV_DELETE_FORM_1602, + FORM_EVENT_RECV_DELETE_FORM_1700, + FORM_EVENT_RECV_DELETE_FORM_1701, + FORM_EVENT_RECV_DELETE_FORM_1702, + FORM_EVENT_RECV_ONE_NORMAL_FORM, + FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, + FORM_EVENT_RECV_ONE_NORMAL_FORM_B, + FORM_EVENT_RECV_ONE_NORMAL_FORM_B_DEL, + COMMON_EVENT_ON_DELETE, + FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, + FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, + FORM_EVENT_RECV_CLEAR_FORM_BATCH + }; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber); +} + +/** + * @tc.number: FMS_deleteForm_0100 + * @tc.name: host is not a system app + * @tc.desc: 1.delete the form that formID is 1 + * 2.Verify the result is false + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0100, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_deleteForm_0100" << std::endl; + + std::string bundleName = "com.ohos.form.manager.notsystemapp"; + std::string abilityName = "FormAbilityNotSys"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0100, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0100, EVENT_CODE_100)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0100, EVENT_CODE_100); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0100, result:" << result; + } + + std::cout << "============END FMS_deleteForm_0100" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0200 + * @tc.name: host does not have permission + * @tc.desc: 1.delete the form that formID is 1 + * 2.Verify the result is false + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0200, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_deleteForm_0200" << std::endl; + + std::string bundleName = "com.ohos.form.manager.nopermission"; + std::string abilityName = "FormAbilityNoPerm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_0200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0200, EVENT_CODE_200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0200, EVENT_CODE_200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0200, EVENT_CODE_200); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0200, result:" << result; + } + + std::cout << "============END FMS_deleteForm_0200" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0300 + * @tc.name: formID id is error(formID < 0) + * @tc.desc: 1.delete the form + * 2.Verify the result is false + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0300, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_deleteForm_0300" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_0300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0300, EVENT_CODE_300, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0300, EVENT_CODE_300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0300, EVENT_CODE_300); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0300, result:" << result; + } + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_0300" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0400 + * @tc.name: formID id is error(formID = 0) + * @tc.desc: 1.delete the form + * 2.Verify the result is false + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0400, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_deleteForm_0400" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_0400; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0400, EVENT_CODE_400, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0400, EVENT_CODE_400)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0400, EVENT_CODE_400); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0400, result:" << result; + } + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_0400" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0500 + * @tc.name: formID id is error because formId is not self + * @tc.desc: 1.host A create a formA + * 2.host B delete the formA + * 2.Verify the result is false + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0500, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_deleteForm_0500" << std::endl; + + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + + GTEST_LOG_(INFO) << "FMS_deleteForm_0500, data:[" << data << "]" << std::endl; + bool result1 = data != ""; + EXPECT_TRUE(result1); + + if (data != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityDeleteForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = data; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0500, EVENT_CODE_500, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0500, EVENT_CODE_500)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0500, EVENT_CODE_500); + bool result2 = data2 == "false"; + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0500, result2:" << result2; + } + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, data); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + } + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_deleteForm_0500" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0600 + * @tc.name: Delete a normal form and the form reference is not 0 after deletion + * @tc.desc: 1.host A create a normal formA + * 2.host B create a form with formA's ID + * 3.delete formA, and verify the result is true + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0600, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_deleteForm_0600" << std::endl; + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string formOne = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + GTEST_LOG_(INFO) << "FMS_deleteForm_0600, formOne:[" << formOne << "]" << std::endl; + if (formOne != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityDeleteForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = formOne; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0600, EVENT_CODE_600, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0600, EVENT_CODE_600)); + std::string formTwo = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0600, EVENT_CODE_600); + bool result = formTwo == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0600, result:" << result; + } + // can't receive onDelete + EXPECT_EQ(-1, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + + bool cacheRes = FmsGetCacheInfoByFormId(atoll(formOne.c_str())); + bool hostRes = FmsGetHostInfoByFormId(atoll(formOne.c_str()), "com.ohos.form.manager.normal"); + bool storageRes = FmsGetStorageFormInfos(atoll(formOne.c_str())); + EXPECT_TRUE(cacheRes); + EXPECT_FALSE(hostRes); + EXPECT_TRUE(storageRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_0600" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0700 + * @tc.name: After deleting a normal form, the form reference is 0. + * After deleting a form, there are still created normal forms in FMS. + * @tc.desc: 1.host A an host B create one normal card respectively + * 2.host A delete the form and verify the result is true + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0700, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_deleteForm_0700" << std::endl; + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string formOne = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + GTEST_LOG_(INFO) << "FMS_deleteForm_0700, formOne:[" << formOne << "]" << std::endl; + EXPECT_TRUE(formOne != ""); + if (formOne != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityDeleteForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = formOne; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0700, EVENT_CODE_700, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0700, EVENT_CODE_700)); + std::string formTwo = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0700, EVENT_CODE_700); + GTEST_LOG_(INFO) << "FMS_deleteForm_0700, formTwo:[" << formTwo << "]" << std::endl; + bool result = (formTwo != "false" && formTwo != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0700, result:" << result; + } + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + std::string onDeleteData = SystemTestFormUtil::GetData(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK); + EXPECT_TRUE(onDeleteData == formTwo); + bool cacheRes = FmsGetCacheInfoByFormId(atoll(formTwo.c_str())); + bool storageRes = FmsGetStorageFormInfos(atoll(formTwo.c_str())); + bool timerRes = FmsGetFormTimerTask(atoll(formTwo.c_str())); + EXPECT_FALSE(cacheRes); + EXPECT_FALSE(storageRes); + EXPECT_FALSE(timerRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_0700" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0800 + * @tc.name: After deleting a normal form, there is no created normal form in FMS. + * @tc.desc: 1.host create one normal card + * 2.host delete the form and verify the result is true + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0800, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_deleteForm_0800" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_0800; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0800, EVENT_CODE_800, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0800, EVENT_CODE_800)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0800, EVENT_CODE_800); + bool result = (data != "false" && data != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0800, result:" << result; + } + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + std::string onDeleteData = SystemTestFormUtil::GetData(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK); + EXPECT_TRUE(onDeleteData == data); + bool cacheRes = FmsGetCacheInfoByFormId(atoll(data.c_str())); + bool storageRes = FmsGetStorageFormInfos(atoll(data.c_str())); + bool timerRes = FmsGetFormTimerTask(atoll(data.c_str())); + EXPECT_FALSE(cacheRes); + EXPECT_FALSE(storageRes); + EXPECT_FALSE(timerRes); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_0800" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_0900 + * @tc.name: Form ID error (FormID does not exist) + * @tc.desc: 1.host create one normal card + * 2.host delete the form + * 3.host delete the form again and verify the result is false + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_0900, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_deleteForm_0900" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_0900; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_0900, EVENT_CODE_900, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_0900, EVENT_CODE_900)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_0900, EVENT_CODE_900); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_0900, result:" << result; + } + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_deleteForm_0900" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_1000 + * @tc.name: You can delete a card after releasing it + * @tc.desc: 1.host create one normal card + * 2.host release the form + * 3.host delete the form and verify the result is true + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1000, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_deleteForm_1000" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_1000; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1000, EVENT_CODE_1000, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1000, EVENT_CODE_1000)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1000, EVENT_CODE_1000); + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1000, result:" << result; + } + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_deleteForm_1000" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_1100 + * @tc.name: When deleting a temporary form, cache data is deleted. + * @tc.desc: 1.host a and b create one temporary card respectively + * 2.host a delete the form and verify the result is true + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1100, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_deleteForm_1100" << std::endl; + + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "true"; // temp form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string formOne = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + + GTEST_LOG_(INFO) << "FMS_deleteForm_1100, formOne:[" << formOne << "]" << std::endl; + if (formOne != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityDeleteForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = formOne; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1100, EVENT_CODE_1100, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1100, EVENT_CODE_1100)); + std::string formTwo = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1100, EVENT_CODE_1100); + GTEST_LOG_(INFO) << "FMS_deleteForm_1100, formTwo:[" << formTwo << "]" << std::endl; + bool result = (formTwo != "false" && formTwo != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1100, result:" << result; + } + // can receive onDelete + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + std::string onDeleteData = SystemTestFormUtil::GetData(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK); + GTEST_LOG_(INFO) << "00000, onDeleteData:[" << onDeleteData << "]" << std::endl; + EXPECT_TRUE(onDeleteData == formTwo); + + bool cacheRes = FmsGetCacheInfoByFormId(atoll(formTwo.c_str())); + EXPECT_FALSE(cacheRes); + bool cacheRes2 = FmsGetCacheInfoByFormId(atoll(formOne.c_str())); + EXPECT_TRUE(cacheRes2); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + } + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_deleteForm_1100" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_1200 + * @tc.name: single host (using a single thread) continuously deletes multiple normal and temporary forms + * @tc.desc: 1.There are 5 normal forms and 5 temporary forms created by the single host + * 2.single host (using a single thread) deletes 10 deletes successfully + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1200, Function | MediumTest | Level2) +{ + int createFormCount = 10; + std::string formIds[10] = {""}; + std::cout << "============START FMS_deleteForm_1200" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + + for (int i=0; i>index:" << i; + bool result = (formIds[i] != "false" && formIds[i] != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1200, result:" << result; + } + } + for (int i=0; i>index:" << i; + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1201, result:" << result; + } + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_1200" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_1400 + * @tc.name: Multiple hosts delete normal and temporary forms respectively + * @tc.desc: 1.host A and B have 5 normal forms and 5 temporary forms respectively. + * 2.host A and B delete their forms successively. + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1400, Function | MediumTest | Level2) +{ + std::cout << "============START FMS_deleteForm_1400" << std::endl; + FMS_deleteForm_1400_A(); + FMS_deleteForm_1400_B(); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_1400" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_1500 + * @tc.name: create 256 temporary forms and delete one + * @tc.desc: 1.create 256 temporary forms and delete one + * 2.create one temporary form successfully . + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1500, Function | MediumTest | Level2) +{ + std::cout << "============START FMS_deleteForm_1500" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + int count = Constants::MAX_RECORD_PER_APP - 1; + FMS_acquireTempFormBatch(bundleName, abilityName, count); + std::string formId = ""; + FMS_deleteForm_1500_acquireForm(bundleName, abilityName, formId); + FMS_deleteForm_1500_clearForm(bundleName, abilityName, formId); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_1500" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_1600 + * @tc.name: create 256 normal forms and delete one + * @tc.desc: 1.create 256 normal forms and delete one + * 2.create one normal form successfully . + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1600, Function | MediumTest | Level2) +{ + std::cout << "============START FMS_deleteForm_1600" << std::endl; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + int count = Constants::MAX_RECORD_PER_APP - 1; + FMS_acquireNormalFormBatch(bundleName, abilityName, count); + std::string formId = ""; + FMS_deleteForm_1600_acquireForm(bundleName, abilityName, formId); + FMS_deleteForm_1600_clearForm(bundleName, abilityName, formId); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_1600" << std::endl; +} + +/** + * @tc.number: FMS_deleteForm_1700 + * @tc.name: When the number of normal forms of multiple hosts reaches 512, + * you can delete forms and create forms + * @tc.desc: 1.host A create 200 normal forms + * 2.host B create 200 normal forms + * 3.host C create 112 normal forms + * 4.host C delete one normal form and create one normal form successfully . + */ +HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1700, Function | MediumTest | Level2) +{ + std::cout << "============START FMS_deleteForm_1700" << std::endl; + std::string bundleNameA = "com.ohos.form.manager.commona"; + std::string abilityNameA = "FormAbilityCommonA"; + int countA = 200; + FMS_acquireNormalFormBatch(bundleNameA, abilityNameA, countA); + + std::string bundleNameB = "com.ohos.form.manager.commonb"; + std::string abilityNameB = "FormAbilityCommonB"; + int countB = 200; + FMS_acquireNormalFormBatch(bundleNameB, abilityNameB, countB); + + std::string bundleNameC = "com.ohos.form.manager.normal"; + std::string abilityNameC = "FormAbilityDeleteForm"; + int countC = 111; + FMS_acquireNormalFormBatch(bundleNameC, abilityNameC, countC); + + std::string formId = ""; + FMS_deleteForm_1700_acquireForm(bundleNameC, abilityNameC, formId); + FMS_deleteForm_1700_clearForm(bundleNameC, abilityNameC, formId); + FMS_deleteFormBatch(bundleNameA, abilityNameA); + FMS_deleteFormBatch(bundleNameB, abilityNameB); + FMS_deleteFormBatch(bundleNameC, abilityNameC); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_deleteForm_1700" << std::endl; +} + +bool FmsDeleteFormTest::FmsGetCacheInfoByFormId(std::int64_t formId) +{ + std::string cachedData = SystemTestFormUtil::QueryFormInfoByFormId(formId); + bool cacheRes = false; + std::string formIdStr = std::to_string(formId); + std::string::size_type pos = cachedData.find(formIdStr); + if (pos != cachedData.npos) { + std::cout << "######### formId is found in cache" << std::endl; + cacheRes = true; + } else { + std::cout << "######### Can't find formId in cache!" << std::endl; + cacheRes = false; + } + return cacheRes; +} +bool FmsDeleteFormTest::FmsGetHostInfoByFormId(std::int64_t formId, std::string hostBundleName) +{ + std::string hostData = SystemTestFormUtil::QueryFormInfoByFormId(formId); + bool hostRes = false; + std::string::size_type pos = hostData.find(hostBundleName); + if (pos != hostData.npos) { + std::cout << "######### hostBundleName is found in cache" << std::endl; + hostRes = true; + } else { + std::cout << "######### Can't find hostBundleName in cache!" << std::endl; + hostRes = false; + } + return hostRes; +} +bool FmsDeleteFormTest::FmsGetStorageFormInfos(std::int64_t formId) +{ + std::string storageData = SystemTestFormUtil::QueryStorageFormInfos(); + bool storageRes = false; + std::string formIdStr = std::to_string(formId); + std::string::size_type pos = storageData.find(formIdStr); + if (pos != storageData.npos) { + std::cout << "######### formId is found in storage" << std::endl; + storageRes = true; + } else { + std::cout << "######### Can't find formId in storage!" << std::endl; + storageRes = false; + } + return storageRes; +} +bool FmsDeleteFormTest::FmsGetFormTimerTask(std::int64_t formId) +{ + std::string timerRes = SystemTestFormUtil::QueryFormTimerByFormId(formId); + if (timerRes == "true") { + std::cout << "######### formId is found in TimerTask" << std::endl; + return true; + } else { + std::cout << "######### Can't find formId in TimerTask!" << std::endl; + return false; + } +} +void FmsDeleteFormTest::FMS_deleteForm_1400_A() +{ + int createFormCount = 10; + std::string formIds[10] = {""}; + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + + for (int i=0; i>index:" << i; + bool result = (formIds[i] != "false" && formIds[i] != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1400[A], result:" << result; + } + } + for (int i=0; i>index:" << i; + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1401[A], result:" << result; + } + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + } +} +void FmsDeleteFormTest::FMS_deleteForm_1400_B() +{ + int createFormCount = 10; + std::string formIds[10] = {""}; + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + + for (int i=0; i>index:" << i; + bool result = (formIds[i] != "false" && formIds[i] != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1400[B], result:" << result; + } + } + for (int i=0; i>index:" << i; + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1401[B], result:" << result; + } + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_ON_DELETE, + FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK)); + } +} +void FmsDeleteFormTest::FMS_deleteForm_1500_Create_Delete(std::string delFormId, std::string &createFormId) +{ + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // delete one and create one + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1501, EVENT_CODE_1510, delFormId); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1501, EVENT_CODE_1510)); + createFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1501, EVENT_CODE_1510); + bool result = (createFormId != "deleteError" && createFormId != "acquireError" && createFormId != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1501, result:" << result; + } +} +void FmsDeleteFormTest::FMS_deleteForm_1600_Delete_Create(std::string delFormId, std::string &createFormId) +{ + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // delete one and create one + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1601, EVENT_CODE_1610, delFormId); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1601, EVENT_CODE_1610)); + createFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1601, EVENT_CODE_1610); + bool result = (createFormId != "deleteError" && createFormId != "acquireError" && createFormId != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1601, result:" << result; + } +} +void FmsDeleteFormTest::FMS_deleteForm_1700_Delete_Create(std::string delFormId, std::string &createFormId) +{ + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityDeleteForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // delete one and create one + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1701, EVENT_CODE_1701, delFormId); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1701, EVENT_CODE_1701)); + createFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1701, EVENT_CODE_1701); + bool result = (createFormId != "deleteError" && createFormId != "acquireError" && createFormId != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1701, result:" << result; + } +} +void FmsDeleteFormTest::FMS_deleteForm_1500_acquireForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_1500; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1500, EVENT_CODE_1500, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1500, EVENT_CODE_1500)); + std::string formId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1500, EVENT_CODE_1500); + GTEST_LOG_(INFO) << "========FMS_deleteForm_1500 [#Create#]formId:[" << formId << "]"; + bool result = (formId != "false" && formId != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1500, result:" << result; + } + FMS_deleteForm_1500_Create_Delete(formId, outformId); +} +void FmsDeleteFormTest::FMS_deleteForm_1500_clearForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = outformId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1502, EVENT_CODE_1511, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1502, EVENT_CODE_1511)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1502, EVENT_CODE_1511); + GTEST_LOG_(INFO) << "========FMS_deleteForm_1500_clearForm [#Delete#]formId:[" << outformId << "]"; + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1500_clearForm, result:" << result; + } + FMS_deleteFormBatch(bundleName, abilityName); +} +void FmsDeleteFormTest::FMS_deleteForm_1600_acquireForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_1600; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1600, EVENT_CODE_1600, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1600, EVENT_CODE_1600)); + std::string formId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1600, EVENT_CODE_1600); + GTEST_LOG_(INFO) << "========FMS_deleteForm_1600 [#Create#]formId:[" << formId << "]"; + bool result = (formId != "false" && formId != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1600, result:" << result; + } + FMS_deleteForm_1600_Delete_Create(formId, outformId); +} +void FmsDeleteFormTest::FMS_deleteForm_1600_clearForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = outformId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1602, EVENT_CODE_1611, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1602, EVENT_CODE_1611)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1602, EVENT_CODE_1611); + GTEST_LOG_(INFO) << "========FMS_deleteForm_1600 [#Delete#]formId:[" << outformId << "]"; + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1600, result:" << result; + } + FMS_deleteFormBatch(bundleName, abilityName); +} +void FmsDeleteFormTest::FMS_deleteForm_1700_acquireForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_DELETE_FORM_1700; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1700, EVENT_CODE_1700, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1700, EVENT_CODE_1700)); + std::string formId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1700, EVENT_CODE_1700); + GTEST_LOG_(INFO) << "========FMS_deleteForm_1700 [#Create#]formId:[" << formId << "]"; + bool result = (formId != "false" && formId != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1700, result:" << result; + } + FMS_deleteForm_1700_Delete_Create(formId, outformId); +} +void FmsDeleteFormTest::FMS_deleteForm_1700_clearForm(const std::string &bundleName, const std::string &abilityName, + std::string &outformId) +{ + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = outformId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1702, EVENT_CODE_1702, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1702, EVENT_CODE_1702)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1702, EVENT_CODE_1702); + GTEST_LOG_(INFO) << "========FMS_deleteForm_1700 [#Delete#]formId:[" << outformId << "]"; + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_deleteForm_1700, result:" << result; + } +} +void FmsDeleteFormTest::FMS_acquireTempFormBatch(const std::string &bundleName, const std::string &abilityName, + const int count) +{ + std::cout << "START FMS_acquireTempFormBatch" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = std::to_string(count); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_acquireTempFormBatch, count: " << eventData; + } else { + GTEST_LOG_(INFO) << "FMS_acquireTempFormBatch, result:" << result; + } + std::cout << "END FMS_acquireTempFormBatch" << std::endl; +} +void FmsDeleteFormTest::FMS_acquireNormalFormBatch(const std::string &bundleName, const std::string &abilityName, + const int count) +{ + std::cout << "START FMS_acquireNormalFormBatch" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = std::to_string(count); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH, eventData); + + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_BATCH, EVENT_CODE_BATCH); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_acquireNormalFormBatch, count: " << eventData; + } else { + GTEST_LOG_(INFO) << "FMS_acquireNormalFormBatch, result:" << result; + } + std::cout << "END FMS_acquireNormalFormBatch" << std::endl; +} +void FmsDeleteFormTest::FMS_deleteFormBatch(const std::string &bundleName, const std::string &abilityName) +{ + std::cout << "START FMS_deleteFormBatch, delete forms" << std::endl; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + std::string eventData = FORM_EVENT_REQ_CLEAR_FORM_BATCH; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_CLEAR_FORM_BATCH, EVENT_CODE_TEMP, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_CLEAR_FORM_BATCH, EVENT_CODE_CLEAR_BATCH); + bool result = data == "true"; + EXPECT_TRUE(result); + GTEST_LOG_(INFO) << "FMS_deleteFormBatch, result:" << result; + std::cout << "END FMS_deleteFormBatch, delete forms" << std::endl; +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_fuzz_test/BUILD.gn b/test/systemtest/common/fms/fms_fuzz_test/BUILD.gn new file mode 100644 index 0000000000..4258e11b0d --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("formManagerFuzzTest") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/fms_fuzz_test/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "src/fms_fuzz_test.cpp", + "src/fuzz_test_manager.cpp", + "src/get_param.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"formManagerFuzzTest\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":formManagerFuzzTest" ] +} diff --git a/test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json b/test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json new file mode 100644 index 0000000000..cddf5115eb --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json @@ -0,0 +1,29 @@ +{ + "ExecutionTimes": 10, + "FormManagerAbility": { + "ReleaseForm": [], + "DeleteForm": [], + "AcquireForm": [], + "UpdateForm": [], + "CastTempForm": [], + "NotifyVisibleForms": [], + "NotifyInvisibleForms": [], + "SetFormNextRefreshTime": [], + "RequestForm":[], + "EnableUpdateForm": [], + "DisableUpdateForm": [], + "CheckFMSReady": [], + "GetAllFormsInfo":[], + "GetFormsInfoByApp": [], + "GetFormsInfoByModule": [], + "ProcessFormUpdate": [], + "ProcessFormUninstall": [], + "OnDeathReceived":[], + "OnCreate": [], + "OnDelete": [], + "OnCastTemptoNormal":[], + "OnUpdate": [], + "OnVisibilityChanged": [], + "OnTriggerEvent": [] + } +} diff --git a/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h b/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h new file mode 100644 index 0000000000..bbb46bcb13 --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef FUZZ_CONFIG_PARSER_H +#define FUZZ_CONFIG_PARSER_H + +#include +#include +#include +#include + +#include "nlohmann/json.hpp" + +namespace OHOS { + +const std::string FUZZ_TEST_CONFIG_FILE_PATH{"./config.json"}; + +const std::string FUZZ_TEST_MAIN_LOOP_KEY{"ExecutionTimes"}; + +struct FuzzTestData { + int32_t mainLoopFlag{0}; + std::vector methodVec{}; +}; + +class FuzzTestConfigParser { +public: + void ParseForFuzzTest(const std::string &path, FuzzTestData &ftd) + { + std::cout << __func__ << std::endl; + if (path.empty()) { + std::cout << __FUNCTION__ << " invalid file path, check!" << std::endl; + return; + } + + nlohmann::json jsonObj; + std::ifstream(path) >> jsonObj; + std::cout << path; + for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) { + if (!it.key().compare(FUZZ_TEST_MAIN_LOOP_KEY)) { + ftd.mainLoopFlag = it.value(); + continue; + } + + auto className = it.key(); + if (it->is_structured()) { + for (auto itm = it->begin(); itm != it->end(); ++itm) { + auto methodName = itm.key(); + + if (!(it->is_structured() && (it->size() != 0))) { + ftd.methodVec.push_back(className + methodName); + continue; + } + + std::string param{}; + for (auto itp = itm->begin(); itp != itm->end(); ++itp) { + auto tp = itp.value(); + param += tp; + } + ftd.methodVec.push_back(className + methodName + param); + } + } + } + } +}; + +} // namespace OHOS + +#endif // FUZZ_CONFIG_PARSER_H diff --git a/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h b/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h new file mode 100644 index 0000000000..dc04216757 --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef FormManagerFuzzTest_H +#define FormManagerFuzzTest_H + +#include +#include +#include +#include + +#include "nlohmann/json.hpp" +namespace OHOS { +namespace AppExecFwk { + +class FormManagerFuzzTest { +public: + typedef std::shared_ptr Ptr; + ~FormManagerFuzzTest() + {} + static Ptr GetInstance() + { + if (fuzzTestInstance == nullptr) { + fuzzTestInstance = std::shared_ptr(new FormManagerFuzzTest); + } + return fuzzTestInstance; + } + + void StartFuzzTest(); + +private: + void SetJsonFunction(std::string); + void SetExecutionTimes(uint16_t executionTimes); + FormManagerFuzzTest(); + FormManagerFuzzTest(FormManagerFuzzTest &) = delete; + FormManagerFuzzTest &operator=(const FormManagerFuzzTest &) = delete; + static Ptr fuzzTestInstance; + uint16_t m_executionTimes{}; + std::unordered_map remainderMap_{}; + std::unordered_map> callFunctionMap_{}; + + void RegisterFormManagerAbility(); +}; +} // namespace AppExecFwk +} // namespace OHOS + +#endif \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_fuzz_test/include/get_param.h b/test/systemtest/common/fms/fms_fuzz_test/include/get_param.h new file mode 100644 index 0000000000..5702abff80 --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/include/get_param.h @@ -0,0 +1,394 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef GET_PARAM_H +#define GET_PARAM_H +#include +#include +#include +#include + +#include "ability.h" +#include "form_info.h" +#include "form_js_info.h" +#include "pac_map.h" +#include "parcel.h" +#include "patterns_matcher.h" +#include "uri.h" +#include "want.h" + +namespace OHOS { +namespace AppExecFwk { +//class TestDumper; +bool GetBoolParam(); +uint8_t GetU8Param(); +unsigned int GetUIntParam(); +uint16_t GetU16Param(); +uint32_t GetU32Param(); +uint64_t GetU64Param(); +int8_t GetS8Param(); +int16_t GetS16Param(); +int32_t GetS32Param(); +int64_t GetS64Param(); +char32_t GetChar32Param(); + +short GetShortParam(); +long GetLongParam(); +int GetIntParam(); +double GetDoubleParam(); +float GetFloatParam(); +char GetCharParam(); +char *GetCharArryParam(); +std::string GetStringParam(); +std::map GetS64S32MapParam(); +std::vector GetBoolVectorParam(); +std::vector GetShortVectorParam(); +std::vector GetLongVectorParam(); +std::vector GetIntVectorParam(); +std::vector GetFloatVectorParam(); +std::vector GetDoubleVectorParam(); +std::vector GetCharVectorParam(); +std::vector GetChar32VectorParam(); +std::vector GetStringVectorParam(); +template +std::vector GetUnsignVectorParam(); +std::vector GetS8VectorParam(); +std::vector GetS16VectorParam(); +std::vector GetS32VectorParam(); +std::vector GetS64VectorParam(); +std::shared_ptr GetParamAbility(); +OHOS::AppExecFwk::Want GetParamWant(); +OHOS::AppExecFwk::FormInfo GetParamFormInfo(); +std::vector GetmFormInfoVectorParam(); +OHOS::AppExecFwk::FormJsInfo GetParamFormJsInfo(); +std::shared_ptr GetParamFormCallback(); +sptr GetParamSptrAbility(); +OHOS::AppExecFwk::FormProviderData GetParamFormProviderData(); + +class FormManagerAbilityTest : public Ability { +public: + FormManagerAbilityTest(); + ~FormManagerAbilityTest(); + + bool ReleaseForm(const int64_t formId); + + /** + * @brief Releases an obtained form by its ID. + * + *

    After this method is called, the form won't be available for use by the application, if isReleaseCache is + * false, this method is same as {@link #releaseForm(int)}, otherwise the Form Manager Service still store this + * form in the cache.

    + *

    Permission: {@link ohos.security.SystemPermission#REQUIRE_FORM}

    + * + * @param formId Indicates the form ID. + * @param isReleaseCache Indicates whether to clear cache in service. + * @return Returns {@code true} if the form is successfully released; returns {@code false} otherwise. + * + *
      + *
    • The passed {@code formId} is invalid. Its value must be larger than 0.
    • + *
    • The specified form has not been added by the application.
    • + *
    • An error occurred when connecting to the Form Manager Service.
    • + *
    • The application is not granted with the {@link ohos.security.SystemPermission#REQUIRE_FORM} permission.
    • + *
    • The form has been obtained by another application and cannot be released by the current application.
    • + *
    • The form is being restored.
    • + *
    + */ + bool ReleaseForm(const int64_t formId, const bool isReleaseCache); + + /** + * @brief Deletes an obtained form by its ID. + * + *

    After this method is called, the form won't be available for use by the application and the Form Manager + * Service no longer keeps the cache information about the form.

    + *

    Permission: {@link ohos.security.SystemPermission#REQUIRE_FORM}

    + * + * @param formId Indicates the form ID. + * @return Returns {@code true} if the form is successfully deleted; returns {@code false} otherwise. + * + *
      + *
    • The passed {@code formId} is invalid. Its value must be larger than 0.
    • + *
    • The specified form has not been added by the application.
    • + *
    • An error occurred when connecting to the Form Manager Service.
    • + *
    • The application is not granted with the {@link ohos.security.SystemPermission#REQUIRE_FORM} permission.
    • + *
    • The form has been obtained by another application and cannot be deleted by the current application.
    • + *
    • The form is being restored.
    • + *
    + */ + bool DeleteForm(const int64_t formId); + + /** + * @brief The form callback. + */ + class FormCallback { + public: + + /** + * @brief Called to notify the application that the {@code FormJsInfo} instance has been obtained after + * the application called the asynchronous method {@link Ability#acquireForm(Want, FormCallback)}. + * The application must present the form information on a specific page in this callback. + * + * @param result Specifies whether the asynchronous form acquisition process is successful. + * {@link FormCallback#OHOS_FORM_ACQUIRE_SUCCESS} indicates that the form + * is successfully obtained, and other values indicate that the process fails. + * @param formJsInfo Indicates the obtained {@code FormJsInfo} instance. + */ + virtual void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const = 0; + + /** + * @brief Called to notify the application that the {@code FormJsInfo} instance has been obtained after + * the application called the asynchronous method {@link Ability#acquireForm(Want, FormCallback)}. + * The application must present the form information on a specific page in this callback. + * + * @param result Specifies whether the asynchronous form acquisition process is successful. + * {@link FormCallback#OHOS_FORM_UPDATE_SUCCESS} indicates that the form is + * successfully obtained, and other values indicate that the process fails. + * @param formJsInfo Indicates the obtained {@code FormJsInfo} instance. + */ + virtual void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const = 0; + + /** + * @brief Called to notify the application that the {@code Form} provider has been uninstalled and the + * corresponding + * {@code Form} instance is no longer available. + * + * @param formId Indicates the ID of the {@code Form} instance provided by the uninstalled form provider. + */ + virtual void OnFormUninstall(const int64_t formId) const = 0; + }; + + /** + * @brief Obtains a specified form that matches the application bundle name, module name, form name, and + * other related information specified in the passed {@code Want}. + * + *

    This method is asynchronous. After the {@link FormJsInfo} instance is obtained. + * + * @param formId Indicates the form ID. + * @param want Indicates the detailed information about the form to be obtained, including the bundle name, + * module name, ability name, form name, form id, tempForm flag, form dimension, and form customize data. + * @param callback Indicates the callback to be invoked whenever the {@link FormJsInfo} instance is obtained. + * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. + */ + bool AcquireForm(const int64_t formId, const Want &want, const std::shared_ptr callback); + + /** + * @brief Updates the content of a specified JS form. + * + *

    This method is called by a form provider to update JS form data as needed. + * + * @param formId Indicates the form ID. + * @param formProviderData The data used to update the JS form displayed on the client. + * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. + */ + bool UpdateForm(const int64_t formId, const FormProviderData &formProviderData); + + /** + * @brief Cast temp form with formId. + * + * @param formId Indicates the form's ID. + * + * @return Returns {@code true} if the form is successfully casted; returns {@code false} otherwise. + */ + bool CastTempForm(const int64_t formId); + + /** + * @brief Sends a notification to the form framework to make the specified forms visible. + * + *

    After this method is successfully called, {@link Ability#OnVisibilityChanged(std::map)} + * will be called to notify the form provider of the form visibility change event.

    + * + * @param formIds Indicates the IDs of the forms to be made visible. + * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. + */ + bool NotifyVisibleForms(const std::vector &formIds); + + /** + * @brief Sends a notification to the form framework to make the specified forms invisible. + * + *

    After this method is successfully called, {@link Ability#OnVisibilityChanged(std::map)} + * will be called to notify the form provider of the form visibility change event.

    + * + * @param formIds Indicates the IDs of the forms to be made invisible. + * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. + */ + bool NotifyInvisibleForms(const std::vector &formIds); + + /** + * @brief Set form next refresh time. + * + *

    This method is called by a form provider to set refresh time. + * + * @param formId Indicates the ID of the form to set refresh time. + * @param nextTime Indicates the next time gap now in seconds, can not be litter than 300 seconds. + * @return Returns {@code true} if seting succeed; returns {@code false} otherwise. + */ + + bool SetFormNextRefreshTime(const int64_t formId, const int64_t nextTime); + + /** + * @brief Update form. + * + * @param formJsInfo Indicates the obtained {@code FormJsInfo} instance. + */ + void ProcessFormUpdate(const FormJsInfo &formJsInfo) override; + + /** + * @brief Uninstall form. + * + * @param formId Indicates the ID of the form to uninstall. + */ + void ProcessFormUninstall(const int64_t formId) override; + + /** + * @brief Called to reacquire form and update the form host after the death callback is received. + * + */ + void OnDeathReceived() override; + + /** + * @brief Called to return a FormProviderInfo object. + * + *

    You must override this method if your ability will serve as a form provider to provide a form for clients. + * The default implementation returns nullptr.

    + * + * @param want Indicates the detailed information for creating a FormProviderInfo. + * The Want object must include the form ID, form name of the form, + * which can be obtained from Ability#PARAM_FORM_IDENTITY_KEY, + * Ability#PARAM_FORM_NAME_KEY, and Ability#PARAM_FORM_DIMENSION_KEY, + * respectively. Such form information must be managed as persistent data for further form + * acquisition, update, and deletion. + * + * @return Returns the created FormProviderInfo object. + */ + virtual FormProviderInfo OnCreate(const Want &want) override; + + /** + * @brief Called to notify the form provider that a specified form has been deleted. Override this method if + * you want your application, as the form provider, to be notified of form deletion. + * + * @param formId Indicates the ID of the deleted form. + * @return None. + */ + virtual void OnDelete(const int64_t formId) override; + + /** + * @brief Called when the form provider is notified that a temporary form is successfully converted to + * a normal form. + * + * @param formId Indicates the ID of the form. + * @return None. + */ + virtual void OnCastTemptoNormal(const int64_t formId) override; + + /** + * @brief Called to notify the form provider to update a specified form. + * + * @param formId Indicates the ID of the form to update. + * @return none. + */ + virtual void OnUpdate(const int64_t formId) override; + + /** + * @brief Called when the form provider receives form events from the fms. + * + * @param formEventsMap Indicates the form events occurred. The key in the Map object indicates the form ID, + * and the value indicates the event type, which can be either FORM_VISIBLE + * or FORM_INVISIBLE. FORM_VISIBLE means that the form becomes visible, + * and FORM_INVISIBLE means that the form becomes invisible. + * @return none. + */ + virtual void OnVisibilityChanged(const std::map &formEventsMap) override; + /** + * @brief Called to notify the form provider to update a specified form. + * + * @param formId Indicates the ID of the form to update. + * @param message Form event message. + */ + virtual void OnTriggerEvent(const int64_t formId, const std::string &message) override; + /** + * @brief Requests for form data update. + * + * This method must be called when the application has detected that a system setting item (such as the language, + * resolution, or screen orientation) being listened for has changed. Upon receiving the update request, the form + * provider automatically updates the form data (if there is any update) through the form framework, with the update + * process being unperceivable by the application. + * + * @param formId Indicates the ID of the form to update. + * @return Returns true if the update request is successfully initiated, returns false otherwise. + */ + bool RequestForm(const int64_t formId); + + /** + * @brief Requests for form data update, by passing a set of parameters (using Want) to the form provider. + * + * This method must be called when the application has detected that a system setting item (such as the language, + * resolution, or screen orientation) being listened for has changed. Upon receiving the update request, the form + * provider automatically updates the form data (if there is any update) through the form framework, with the update + * process being unperceivable by the application. + * + * @param formId Indicates the ID of the form to update. + * @param want Indicates a set of parameters to be transparently passed to the form provider. + * @return Returns true if the update request is successfully initiated, returns false otherwise. + */ + bool RequestForm(const int64_t formId, const Want &want); + /** + * @brief Enable form update. + * + * @param formIds formIds of hostclient. + */ + bool EnableUpdateForm(const std::vector &formIds); + + /** + * @brief Disable form update. + * + * @param formIds formIds of hostclient. + */ + bool DisableUpdateForm(const std::vector &formIds); + + /** + * @brief Check form manager service ready. + * + * @return Returns true if form manager service ready; returns false otherwise. + */ + bool CheckFMSReady(); + + /** + * @brief Get All FormsInfo. + * + * @param formInfos Returns the forms' information of all forms provided. + * @return Returns true if the request is successfully initiated; returns false otherwise. + */ + bool GetAllFormsInfo(std::vector &formInfos); + + /** + * @brief Get forms info by application name. + * + * @param bundleName Application name. + * @param formInfos Returns the forms' information of the specify application name. + * @return Returns true if the request is successfully initiated; returns false otherwise. + */ + bool GetFormsInfoByApp(std::string &bundleName, std::vector &formInfos); + + /** + * @brief Get forms info by application name and module name. + * + * @param bundleName Application name. + * @param moduleName Module name of hap. + * @param formInfos Returns the forms' information of the specify application name and module name. + * @return Returns true if the request is successfully initiated; returns false otherwise. + */ + bool GetFormsInfoByModule(std::string &bundleName, std::string &moduleName, std::vector &formInfos); +}; +} // namespace AppExecFwk +} // namespace OHOS +#endif \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp b/test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp new file mode 100644 index 0000000000..103664ba4f --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "app_log_wrapper.h" +#include "../include/fuzz_test_manager.h" +#include "../include/get_param.h" +#include "nlohmann/json.hpp" + +using namespace testing::ext; + +namespace OHOS { +namespace AppExecFwk { +class FormFuzzTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void FormFuzzTest::SetUpTestCase() +{ + std::cout << "FormFuzzTest SetUpTestCase" << std::endl; +} + +void FormFuzzTest::TearDownTestCase() +{ + std::cout << "FormFuzzTest TearDownTestCase" << std::endl; +} + +void FormFuzzTest::SetUp() +{ + std::cout << "FormFuzzTest SetUp" << std::endl; +} + +void FormFuzzTest::TearDown() +{ + std::cout << "FormFuzzTest TearDown" << std::endl; +} + +/** + * @tc.number: FMS_fuzztest_0100 + * @tc.name: form manager service stress test + * @tc.desc: 1.under root,there is a config.json + * 2../FormManagerFuzzTest; hilog > xxxx.log + */ +HWTEST_F(FormFuzzTest, FMS_fuzztest_0100, Function | MediumTest | Level1) +{ + std::cout << "Begin FMS_fuzztest_0100" << std::endl; + + FormManagerFuzzTest::GetInstance()->StartFuzzTest(); + + std::cout << "End FMS_fuzztest_0100" << std::endl; +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp b/test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp new file mode 100644 index 0000000000..ce4b98658b --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2021 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 +#define protected public + +#include +#include + +#include "ability.h" +#include "hilog_wrapper.h" +#include "../include/fuzz_test_manager.h" +#include "../include/fuzz_test_config_parser.h" +#include "../include/get_param.h" + +#undef private +#undef protected +using namespace OHOS::AppExecFwk; +namespace OHOS { +namespace AppExecFwk { +std::shared_ptr FormManagerFuzzTest::fuzzTestInstance = nullptr; +const std::string formManagerAbilityKitName = "FormManagerAbility"; + +// RegisterFormManagerAbility +void FormManagerFuzzTest::RegisterFormManagerAbility() +{ + callFunctionMap_[formManagerAbilityKitName + "ReleaseForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->ReleaseForm(GetS64Param(), GetBoolParam()); + }; + callFunctionMap_[formManagerAbilityKitName + "DeleteForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->DeleteForm(GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "AcquireForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->AcquireForm(GetS64Param(), GetParamWant(), GetParamFormCallback()); + }; + callFunctionMap_[formManagerAbilityKitName + "UpdateForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->UpdateForm(GetS64Param(), GetParamFormProviderData()); + }; + callFunctionMap_[formManagerAbilityKitName + "CastTempForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->CastTempForm(GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "NotifyVisibleForms"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->NotifyVisibleForms(GetS64VectorParam()); + }; + callFunctionMap_[formManagerAbilityKitName + "NotifyInvisibleForms"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->NotifyInvisibleForms(GetS64VectorParam()); + }; + callFunctionMap_[formManagerAbilityKitName + "SetFormNextRefreshTime"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->SetFormNextRefreshTime(GetS64Param(), GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "RequestForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->RequestForm(GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "EnableUpdateForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->EnableUpdateForm(GetS64VectorParam()); + }; + callFunctionMap_[formManagerAbilityKitName + "DisableUpdateForm"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->DisableUpdateForm(GetS64VectorParam()); + }; + callFunctionMap_[formManagerAbilityKitName + "CheckFMSReady"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->CheckFMSReady(); + }; + callFunctionMap_[formManagerAbilityKitName + "GetAllFormsInfo"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + std::vector formInfos; + formManagerAbility->GetAllFormsInfo(formInfos); + }; + callFunctionMap_[formManagerAbilityKitName + "GetFormsInfoByApp"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + string bundleName = GetStringParam(); + std::vector formInfos; + formManagerAbility->GetFormsInfoByApp(bundleName, formInfos); + }; + callFunctionMap_[formManagerAbilityKitName + "GetFormsInfoByModule"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + string bundleName = GetStringParam(); + string moduleName = GetStringParam(); + std::vector formInfos; + formManagerAbility->GetFormsInfoByModule(bundleName, moduleName, formInfos); + }; + callFunctionMap_[formManagerAbilityKitName + "ProcessFormUpdate"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->ProcessFormUpdate(GetParamFormJsInfo()); + }; + callFunctionMap_[formManagerAbilityKitName + "ProcessFormUninstall"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->ProcessFormUninstall(GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "OnDeathReceived"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->OnDeathReceived(); + }; + callFunctionMap_[formManagerAbilityKitName + "OnCreate"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->OnCreate(GetParamWant()); + }; + callFunctionMap_[formManagerAbilityKitName + "OnDelete"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->OnDelete(GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "OnCastTemptoNormal"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->OnCastTemptoNormal(GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "OnUpdate"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->OnUpdate(GetS64Param()); + }; + callFunctionMap_[formManagerAbilityKitName + "OnVisibilityChanged"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->OnVisibilityChanged(GetS64S32MapParam()); + }; + callFunctionMap_[formManagerAbilityKitName + "OnTriggerEvent"] = []() { + std::shared_ptr formManagerAbility = GetParamAbility(); + formManagerAbility->OnTriggerEvent(GetS64Param(), GetStringParam()); + }; +} + +FormManagerFuzzTest::FormManagerFuzzTest() +{ + RegisterFormManagerAbility(); +} + +void FormManagerFuzzTest::SetJsonFunction(std::string functionName) +{ + remainderMap_.emplace(functionName, m_executionTimes); +} + +void FormManagerFuzzTest::SetExecutionTimes(uint16_t executionTimes) +{ + m_executionTimes = executionTimes; + for_each(remainderMap_.begin(), remainderMap_.end(), + [executionTimes](std::unordered_map::reference executionTimesTemp) { + executionTimesTemp.second = executionTimes; + }); +} + +int GetRandomInt(int minNum, int maxNum) +{ + return GetU16Param() % (maxNum - minNum + 1) + minNum; +} + +void action(int a) +{ + std::cout << "Interrupt signal (" << a << ") received.\n"; +} + +void FormManagerFuzzTest::StartFuzzTest() +{ + std::cout << __func__ << std::endl; + OHOS::FuzzTestConfigParser jsonParser; + OHOS::FuzzTestData tempData; + + std::cout << "parseFromFile start" << std::endl; + jsonParser.ParseForFuzzTest(FUZZ_TEST_CONFIG_FILE_PATH, tempData); + std::cout << " ExecutionTimes :" << tempData.mainLoopFlag << std::endl; + for_each(tempData.methodVec.begin(), tempData.methodVec.end(), [this](std::vector::reference s) { + SetJsonFunction(s); + }); + SetExecutionTimes(tempData.mainLoopFlag); + + std::vector index; + std::unordered_map::iterator it = remainderMap_.begin(); + while (it != remainderMap_.end()) { + if (it->second <= 0) { + it = remainderMap_.erase(it); + } else { + index.push_back(it->first); + it++; + } + } + + std::cout << remainderMap_.size() << "--------fuzz test start--------" << callFunctionMap_.size() << std::endl; + for (; remainderMap_.size() > 0; ) { + std::string functionName; + int offset = GetRandomInt(0, index.size() - 1); + functionName = index[offset]; + if (callFunctionMap_.find(functionName) != callFunctionMap_.end()) { + std::cout << "call function : " << functionName << std::endl; + callFunctionMap_[functionName](); + std::cout << "function end :" << functionName << std::endl; + } else { + std::cout << "can't find function : " << functionName << std::endl; + } + remainderMap_[functionName]--; + if (remainderMap_[functionName] <= 0) { + remainderMap_.erase(functionName); + index.erase(index.begin() + offset); + }; + } + std::cout << remainderMap_.size() << "--------fuzz test end--------" << std::endl; +} +} // namespace AppExecFwk +} // namespace OHOS diff --git a/test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp b/test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp new file mode 100644 index 0000000000..43f9e47337 --- /dev/null +++ b/test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp @@ -0,0 +1,477 @@ +/* + * Copyright (c) 2021 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. + */ +#include +#include +#include +#include +#include + +#include "ability.h" +#include "../include/get_param.h" +#include "values_bucket.h" + +using namespace std; +using namespace OHOS::AppExecFwk; +using Uri = OHOS::Uri; +namespace OHOS { +namespace AppExecFwk { +bool GetBoolParam() +{ + bool param; + if (GetIntParam() % 2 == 0) { + param = true; + } else { + param = false; + } + cout << "Bool param is: " << param << endl; + return param; +} + +size_t GenRandom(size_t min, size_t max) +{ + std::random_device rd; + static uniform_int_distribution u(min, max); + static default_random_engine e(rd()); + size_t param = u(e); + return param; +} + +int8_t GetS8Param() +{ + std::random_device rd; + static uniform_int_distribution u(INT8_MIN, INT8_MAX); + static default_random_engine e(rd()); + int8_t param = u(e); + cout << "Int8_t param is: " << param << endl; + return param; +} +int16_t GetS16Param() +{ + std::random_device rd; + static uniform_int_distribution u(INT16_MIN, INT16_MAX); + static default_random_engine e(rd()); + int16_t param = u(e); + cout << "Int16_t param is: " << param << endl; + return param; +} +int32_t GetS32Param() +{ + std::random_device rd; + static uniform_int_distribution u(INT32_MIN, INT32_MAX); + static default_random_engine e(rd()); + int32_t param = u(e); + cout << "Int32_t param is: " << param << endl; + return param; +} + +int64_t GetS64Param() +{ + std::random_device rd; + static uniform_int_distribution u(INT64_MIN, INT64_MAX); + static default_random_engine e(rd()); + int64_t param = u(e); + cout << "Int64_t param is: " << param << endl; + return param; +} + +template +T GetUnsignParam() +{ + std::random_device rd; + static uniform_int_distribution u; + static default_random_engine e(rd()); + T param = u(e); + return param; +} + +size_t GetSizeTParam() +{ + size_t param = GetUnsignParam(); + return param; +} + +uint8_t GetU8Param() +{ + uint8_t param = GetUnsignParam(); + cout << "Uint8_t param is: " << param << endl; + return param; +} + +unsigned int GetUIntParam() +{ + unsigned int param = GetUnsignParam(); + cout << "Unsigned int param is: " << param << endl; + return param; +} + +uint16_t GetU16Param() +{ + uint16_t param = GetUnsignParam(); + cout << "Uint16_t param is: " << param << endl; + return param; +} + +uint32_t GetU32Param() +{ + uint32_t param = GetUnsignParam(); + cout << "Uint32_t param is: " << param << endl; + return param; +} + +uint64_t GetU64Param() +{ + uint64_t param = GetUnsignParam(); + cout << "Uint64_t param is: " << param << endl; + return param; +} + +short GetShortParam() +{ + std::random_device rd; + static uniform_int_distribution u(SHRT_MIN, SHRT_MAX); + static default_random_engine e(rd()); + short param = u(e); + cout << "Short param is: " << param << endl; + return param; +} + +long GetLongParam() +{ + std::random_device rd; + static uniform_int_distribution u(LONG_MIN, LONG_MAX); + static default_random_engine e(rd()); + long param = u(e); + cout << "Long param is: " << param << endl; + return param; +} + +int GetIntParam() +{ + std::random_device rd; + static uniform_int_distribution<> u(INT_MIN, INT_MAX); + static default_random_engine e(rd()); + int param = u(e); + cout << "Int param is: " << param << endl; + return param; +} + +double GetDoubleParam() +{ + double param = 0; + std::random_device rd; + static uniform_real_distribution u(DBL_MIN, DBL_MAX); + static default_random_engine e(rd()); + param = u(e); + cout << "double param is: " << param << endl; + return param; +} + +float GetFloatParam() +{ + float param = 0; + std::random_device rd; + static uniform_real_distribution u(FLT_MIN, FLT_MAX); + static default_random_engine e(rd()); + param = u(e); + cout << "Float param is: " << param << endl; + return param; +} + +char GetCharParam() +{ + std::random_device rd; + static uniform_int_distribution<> u(-128, 127); + static default_random_engine e(rd()); + char param = u(e); + return param; +} + +char32_t GetChar32Param() +{ + char32_t param = ' '; + std::random_device rd; + static uniform_int_distribution u; + static default_random_engine e(rd()); + param = u(e); + return param; +} + +char *GetCharArryParam() +{ + static char param[256]; + size_t len = 0; + string strparam = GetStringParam(); + if (!strparam.empty()) { + len = strparam.size() + 1; + if (len > sizeof(param)) { + len = sizeof(param) - 1; + } + + int ret = strcpy_s(param, len, strparam.c_str()); + if (ret == 0) { + return param; + } else { + return nullptr; + } + } else { + return nullptr; + } +} + +string GetStringParam() +{ + string param = ""; + char ch = GetCharParam(); + size_t len = GenRandom(0, 255); + while (len--) { + ch = GetCharParam(); + param += ch; + } + cout << "String param length is: " << param.length() << endl; + return param; +} + +std::map GetS64S32MapParam() +{ + map param; + size_t len = GenRandom(0, 255); + while (len--) { + int64_t int64Value = GetS64Param(); + int32_t int32Value = GetS32Param(); + param.insert(pair(int64Value, int32Value)); + } + cout << "int64_t, int32_t map param length is: " << param.size() << endl; + return param; +} + +template +vector GetUnsignVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + T t = GetUnsignParam(); + param.push_back(t); + } + cout << "Uint vector param length is: " << param.size() << endl; + return param; +} + +template +T GetClassParam() +{ + T param; + return param; +} + +std::vector GetBoolVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + int t = GetBoolParam(); + param.push_back(t); + } + cout << "Bool vector param length is: " << param.size() << endl; + return param; +} + +std::vector GetShortVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + short t = GetShortParam(); + param.push_back(t); + } + cout << "Short vector param length is: " << param.size() << endl; + return param; +} + +std::vector GetLongVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + long t = GetLongParam(); + param.push_back(t); + } + cout << "Long vector param length is: " << param.size() << endl; + return param; +} + +vector GetIntVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + int t = GetIntParam(); + param.push_back(t); + } + cout << "Int vector param length is: " << param.size() << endl; + return param; +} + +std::vector GetFloatVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + float t = GetIntParam(); + param.push_back(t); + } + cout << "Float vector param length is: " << param.size() << endl; + return param; +} + +std::vector GetDoubleVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + double t = GetIntParam(); + param.push_back(t); + } + cout << "Double vector param length is: " << param.size() << endl; + return param; +} + +vector GetCharVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + char t = GetCharParam(); + param.push_back(t); + } + cout << "Char vector param length is: " << param.size() << endl; + return param; +} + +vector GetChar32VectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + char32_t t = GetChar32Param(); + param.push_back(t); + } + cout << "Char32_t vector param length is: " << param.size() << endl; + return param; +} + +vector GetStringVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + string t = GetStringParam(); + param.push_back(t); + } + cout << "String vector param length is: " << param.size() << endl; + return param; +} + +vector GetS8VectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + int8_t temp = GetS8Param(); + param.push_back(temp); + } + cout << "Int8_t vector param length is: " << param.size() << endl; + return param; +} + +vector GetS16VectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + int16_t temp = GetS16Param(); + param.push_back(temp); + } + cout << "Int16_t vector param length is: " << param.size() << endl; + return param; +} + +vector GetS32VectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + int32_t temp = GetS32Param(); + param.push_back(temp); + } + cout << "Int32_t vector param length is: " << param.size() << endl; + return param; +} + +vector GetS64VectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + int64_t temp = GetS64Param(); + param.push_back(temp); + } + cout << "Int32_t vector param length is: " << param.size() << endl; + return param; +} + +std::shared_ptr GetParamAbility() +{ + return make_shared(); +} + +OHOS::AppExecFwk::Want GetParamWant() +{ + return OHOS::AppExecFwk::Want(); +} + +OHOS::AppExecFwk::FormInfo GetParamFormInfo() +{ + return OHOS::AppExecFwk::FormInfo(); +} + +OHOS::AppExecFwk::FormJsInfo GetParamFormJsInfo() +{ + return OHOS::AppExecFwk::FormJsInfo(); +} + +std::shared_ptr GetParamFormCallback() +{ + return shared_ptr(); +} + +OHOS::AppExecFwk::FormProviderData GetParamFormProviderData() +{ + return OHOS::AppExecFwk::FormProviderData(); +} + +std::vector GetmFormInfoVectorParam() +{ + vector param; + size_t len = GenRandom(0, 255); + while (len--) { + OHOS::AppExecFwk::FormInfo t = GetParamFormInfo(); + param.push_back(t); + } + cout << "FormInfo vector param length is: " << param.size() << endl; + return param; +} +} // namespace AppExecFwk +} // namespace OHOS diff --git a/test/systemtest/common/fms/fms_fuzz_test/test_lib/formManagerFuzzTest b/test/systemtest/common/fms/fms_fuzz_test/test_lib/formManagerFuzzTest new file mode 100644 index 0000000000000000000000000000000000000000..dab3f2bc86df074aa25c6b7e49d22f8cdaedd700 GIT binary patch literal 246288 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

    After this method is called, the form won't be available for use by the application, if isReleaseCache is - * false, this method is same as {@link #releaseForm(int)}, otherwise the Form Manager Service still store this - * form in the cache.

    - *

    Permission: {@link ohos.security.SystemPermission#REQUIRE_FORM}

    - * - * @param formId Indicates the form ID. - * @param isReleaseCache Indicates whether to clear cache in service. - * @return Returns {@code true} if the form is successfully released; returns {@code false} otherwise. - * - *
      - *
    • The passed {@code formId} is invalid. Its value must be larger than 0.
    • - *
    • The specified form has not been added by the application.
    • - *
    • An error occurred when connecting to the Form Manager Service.
    • - *
    • The application is not granted with the {@link ohos.security.SystemPermission#REQUIRE_FORM} permission.
    • - *
    • The form has been obtained by another application and cannot be released by the current application.
    • - *
    • The form is being restored.
    • - *
    - */ - bool ReleaseForm(const int64_t formId, const bool isReleaseCache); - - /** - * @brief Deletes an obtained form by its ID. - * - *

    After this method is called, the form won't be available for use by the application and the Form Manager - * Service no longer keeps the cache information about the form.

    - *

    Permission: {@link ohos.security.SystemPermission#REQUIRE_FORM}

    - * - * @param formId Indicates the form ID. - * @return Returns {@code true} if the form is successfully deleted; returns {@code false} otherwise. - * - *
      - *
    • The passed {@code formId} is invalid. Its value must be larger than 0.
    • - *
    • The specified form has not been added by the application.
    • - *
    • An error occurred when connecting to the Form Manager Service.
    • - *
    • The application is not granted with the {@link ohos.security.SystemPermission#REQUIRE_FORM} permission.
    • - *
    • The form has been obtained by another application and cannot be deleted by the current application.
    • - *
    • The form is being restored.
    • - *
    - */ - bool DeleteForm(const int64_t formId); - - /** - * @brief The form callback. - */ - class FormCallback { - public: - - /** - * @brief Called to notify the application that the {@code FormJsInfo} instance has been obtained after - * the application called the asynchronous method {@link Ability#acquireForm(Want, FormCallback)}. - * The application must present the form information on a specific page in this callback. - * - * @param result Specifies whether the asynchronous form acquisition process is successful. - * {@link FormCallback#OHOS_FORM_ACQUIRE_SUCCESS} indicates that the form - * is successfully obtained, and other values indicate that the process fails. - * @param formJsInfo Indicates the obtained {@code FormJsInfo} instance. - */ - virtual void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const = 0; - - /** - * @brief Called to notify the application that the {@code FormJsInfo} instance has been obtained after - * the application called the asynchronous method {@link Ability#acquireForm(Want, FormCallback)}. - * The application must present the form information on a specific page in this callback. - * - * @param result Specifies whether the asynchronous form acquisition process is successful. - * {@link FormCallback#OHOS_FORM_UPDATE_SUCCESS} indicates that the form is - * successfully obtained, and other values indicate that the process fails. - * @param formJsInfo Indicates the obtained {@code FormJsInfo} instance. - */ - virtual void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const = 0; - - /** - * @brief Called to notify the application that the {@code Form} provider has been uninstalled and the - * corresponding - * {@code Form} instance is no longer available. - * - * @param formId Indicates the ID of the {@code Form} instance provided by the uninstalled form provider. - */ - virtual void OnFormUninstall(const int64_t formId) const = 0; - }; - - /** - * @brief Obtains a specified form that matches the application bundle name, module name, form name, and - * other related information specified in the passed {@code Want}. - * - *

    This method is asynchronous. After the {@link FormJsInfo} instance is obtained. - * - * @param formId Indicates the form ID. - * @param want Indicates the detailed information about the form to be obtained, including the bundle name, - * module name, ability name, form name, form id, tempForm flag, form dimension, and form customize data. - * @param callback Indicates the callback to be invoked whenever the {@link FormJsInfo} instance is obtained. - * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. - */ - bool AcquireForm(const int64_t formId, const Want &want, const std::shared_ptr callback); - - /** - * @brief Updates the content of a specified JS form. - * - *

    This method is called by a form provider to update JS form data as needed. - * - * @param formId Indicates the form ID. - * @param formProviderData The data used to update the JS form displayed on the client. - * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. - */ - bool UpdateForm(const int64_t formId, const FormProviderData &formProviderData); - - /** - * @brief Cast temp form with formId. - * - * @param formId Indicates the form's ID. - * - * @return Returns {@code true} if the form is successfully casted; returns {@code false} otherwise. - */ - bool CastTempForm(const int64_t formId); - - /** - * @brief Sends a notification to the form framework to make the specified forms visible. - * - *

    After this method is successfully called, {@link Ability#OnVisibilityChanged(std::map)} - * will be called to notify the form provider of the form visibility change event.

    - * - * @param formIds Indicates the IDs of the forms to be made visible. - * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. - */ - bool NotifyVisibleForms(const std::vector &formIds); - - /** - * @brief Sends a notification to the form framework to make the specified forms invisible. - * - *

    After this method is successfully called, {@link Ability#OnVisibilityChanged(std::map)} - * will be called to notify the form provider of the form visibility change event.

    - * - * @param formIds Indicates the IDs of the forms to be made invisible. - * @return Returns {@code true} if the request is successfully initiated; returns {@code false} otherwise. - */ - bool NotifyInvisibleForms(const std::vector &formIds); - - /** - * @brief Set form next refresh time. - * - *

    This method is called by a form provider to set refresh time. - * - * @param formId Indicates the ID of the form to set refresh time. - * @param nextTime Indicates the next time gap now in seconds, can not be litter than 300 seconds. - * @return Returns {@code true} if seting succeed; returns {@code false} otherwise. - */ - - bool SetFormNextRefreshTime(const int64_t formId, const int64_t nextTime); - - /** - * @brief Update form. - * - * @param formJsInfo Indicates the obtained {@code FormJsInfo} instance. - */ - void ProcessFormUpdate(const FormJsInfo &formJsInfo) override; - - /** - * @brief Uninstall form. - * - * @param formId Indicates the ID of the form to uninstall. - */ - void ProcessFormUninstall(const int64_t formId) override; - - /** - * @brief Called to reacquire form and update the form host after the death callback is received. - * - */ - void OnDeathReceived() override; - - /** - * @brief Called to return a FormProviderInfo object. - * - *

    You must override this method if your ability will serve as a form provider to provide a form for clients. - * The default implementation returns nullptr.

    - * - * @param want Indicates the detailed information for creating a FormProviderInfo. - * The Want object must include the form ID, form name of the form, - * which can be obtained from Ability#PARAM_FORM_IDENTITY_KEY, - * Ability#PARAM_FORM_NAME_KEY, and Ability#PARAM_FORM_DIMENSION_KEY, - * respectively. Such form information must be managed as persistent data for further form - * acquisition, update, and deletion. - * - * @return Returns the created FormProviderInfo object. - */ - virtual FormProviderInfo OnCreate(const Want &want) override; - - /** - * @brief Called to notify the form provider that a specified form has been deleted. Override this method if - * you want your application, as the form provider, to be notified of form deletion. - * - * @param formId Indicates the ID of the deleted form. - * @return None. - */ - virtual void OnDelete(const int64_t formId) override; - - /** - * @brief Called when the form provider is notified that a temporary form is successfully converted to - * a normal form. - * - * @param formId Indicates the ID of the form. - * @return None. - */ - virtual void OnCastTemptoNormal(const int64_t formId) override; - - /** - * @brief Called to notify the form provider to update a specified form. - * - * @param formId Indicates the ID of the form to update. - * @return none. - */ - virtual void OnUpdate(const int64_t formId) override; - - /** - * @brief Called when the form provider receives form events from the fms. - * - * @param formEventsMap Indicates the form events occurred. The key in the Map object indicates the form ID, - * and the value indicates the event type, which can be either FORM_VISIBLE - * or FORM_INVISIBLE. FORM_VISIBLE means that the form becomes visible, - * and FORM_INVISIBLE means that the form becomes invisible. - * @return none. - */ - virtual void OnVisibilityChanged(const std::map &formEventsMap) override; - /** - * @brief Called to notify the form provider to update a specified form. - * - * @param formId Indicates the ID of the form to update. - * @param message Form event message. - */ - virtual void OnTriggerEvent(const int64_t formId, const std::string &message) override; - /** - * @brief Requests for form data update. - * - * This method must be called when the application has detected that a system setting item (such as the language, - * resolution, or screen orientation) being listened for has changed. Upon receiving the update request, the form - * provider automatically updates the form data (if there is any update) through the form framework, with the update - * process being unperceivable by the application. - * - * @param formId Indicates the ID of the form to update. - * @return Returns true if the update request is successfully initiated, returns false otherwise. - */ - bool RequestForm(const int64_t formId); - - /** - * @brief Requests for form data update, by passing a set of parameters (using Want) to the form provider. - * - * This method must be called when the application has detected that a system setting item (such as the language, - * resolution, or screen orientation) being listened for has changed. Upon receiving the update request, the form - * provider automatically updates the form data (if there is any update) through the form framework, with the update - * process being unperceivable by the application. - * - * @param formId Indicates the ID of the form to update. - * @param want Indicates a set of parameters to be transparently passed to the form provider. - * @return Returns true if the update request is successfully initiated, returns false otherwise. - */ - bool RequestForm(const int64_t formId, const Want &want); - /** - * @brief Enable form update. - * - * @param formIds formIds of hostclient. - */ - bool EnableUpdateForm(const std::vector &formIds); - - /** - * @brief Disable form update. - * - * @param formIds formIds of hostclient. - */ - bool DisableUpdateForm(const std::vector &formIds); - - /** - * @brief Check form manager service ready. - * - * @return Returns true if form manager service ready; returns false otherwise. - */ - bool CheckFMSReady(); - - /** - * @brief Get All FormsInfo. - * - * @param formInfos Returns the forms' information of all forms provided. - * @return Returns true if the request is successfully initiated; returns false otherwise. - */ - bool GetAllFormsInfo(std::vector &formInfos); - - /** - * @brief Get forms info by application name. - * - * @param bundleName Application name. - * @param formInfos Returns the forms' information of the specify application name. - * @return Returns true if the request is successfully initiated; returns false otherwise. - */ - bool GetFormsInfoByApp(std::string &bundleName, std::vector &formInfos); - - /** - * @brief Get forms info by application name and module name. - * - * @param bundleName Application name. - * @param moduleName Module name of hap. - * @param formInfos Returns the forms' information of the specify application name and module name. - * @return Returns true if the request is successfully initiated; returns false otherwise. - */ - bool GetFormsInfoByModule(std::string &bundleName, std::string &moduleName, std::vector &formInfos); -}; -} // namespace AppExecFwk -} // namespace OHOS -#endif \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp b/test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp deleted file mode 100644 index 103664ba4f..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -#include -#include -#include -#include - -#include "app_log_wrapper.h" -#include "../include/fuzz_test_manager.h" -#include "../include/get_param.h" -#include "nlohmann/json.hpp" - -using namespace testing::ext; - -namespace OHOS { -namespace AppExecFwk { -class FormFuzzTest : public testing::Test { -public: - static void SetUpTestCase(); - static void TearDownTestCase(); - void SetUp(); - void TearDown(); -}; - -void FormFuzzTest::SetUpTestCase() -{ - std::cout << "FormFuzzTest SetUpTestCase" << std::endl; -} - -void FormFuzzTest::TearDownTestCase() -{ - std::cout << "FormFuzzTest TearDownTestCase" << std::endl; -} - -void FormFuzzTest::SetUp() -{ - std::cout << "FormFuzzTest SetUp" << std::endl; -} - -void FormFuzzTest::TearDown() -{ - std::cout << "FormFuzzTest TearDown" << std::endl; -} - -/** - * @tc.number: FMS_fuzztest_0100 - * @tc.name: form manager service stress test - * @tc.desc: 1.under root,there is a config.json - * 2../FormManagerFuzzTest; hilog > xxxx.log - */ -HWTEST_F(FormFuzzTest, FMS_fuzztest_0100, Function | MediumTest | Level1) -{ - std::cout << "Begin FMS_fuzztest_0100" << std::endl; - - FormManagerFuzzTest::GetInstance()->StartFuzzTest(); - - std::cout << "End FMS_fuzztest_0100" << std::endl; -} -} // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp b/test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp deleted file mode 100644 index ce4b98658b..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2021 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 -#define protected public - -#include -#include - -#include "ability.h" -#include "hilog_wrapper.h" -#include "../include/fuzz_test_manager.h" -#include "../include/fuzz_test_config_parser.h" -#include "../include/get_param.h" - -#undef private -#undef protected -using namespace OHOS::AppExecFwk; -namespace OHOS { -namespace AppExecFwk { -std::shared_ptr FormManagerFuzzTest::fuzzTestInstance = nullptr; -const std::string formManagerAbilityKitName = "FormManagerAbility"; - -// RegisterFormManagerAbility -void FormManagerFuzzTest::RegisterFormManagerAbility() -{ - callFunctionMap_[formManagerAbilityKitName + "ReleaseForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->ReleaseForm(GetS64Param(), GetBoolParam()); - }; - callFunctionMap_[formManagerAbilityKitName + "DeleteForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->DeleteForm(GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "AcquireForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->AcquireForm(GetS64Param(), GetParamWant(), GetParamFormCallback()); - }; - callFunctionMap_[formManagerAbilityKitName + "UpdateForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->UpdateForm(GetS64Param(), GetParamFormProviderData()); - }; - callFunctionMap_[formManagerAbilityKitName + "CastTempForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->CastTempForm(GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "NotifyVisibleForms"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->NotifyVisibleForms(GetS64VectorParam()); - }; - callFunctionMap_[formManagerAbilityKitName + "NotifyInvisibleForms"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->NotifyInvisibleForms(GetS64VectorParam()); - }; - callFunctionMap_[formManagerAbilityKitName + "SetFormNextRefreshTime"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->SetFormNextRefreshTime(GetS64Param(), GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "RequestForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->RequestForm(GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "EnableUpdateForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->EnableUpdateForm(GetS64VectorParam()); - }; - callFunctionMap_[formManagerAbilityKitName + "DisableUpdateForm"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->DisableUpdateForm(GetS64VectorParam()); - }; - callFunctionMap_[formManagerAbilityKitName + "CheckFMSReady"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->CheckFMSReady(); - }; - callFunctionMap_[formManagerAbilityKitName + "GetAllFormsInfo"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - std::vector formInfos; - formManagerAbility->GetAllFormsInfo(formInfos); - }; - callFunctionMap_[formManagerAbilityKitName + "GetFormsInfoByApp"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - string bundleName = GetStringParam(); - std::vector formInfos; - formManagerAbility->GetFormsInfoByApp(bundleName, formInfos); - }; - callFunctionMap_[formManagerAbilityKitName + "GetFormsInfoByModule"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - string bundleName = GetStringParam(); - string moduleName = GetStringParam(); - std::vector formInfos; - formManagerAbility->GetFormsInfoByModule(bundleName, moduleName, formInfos); - }; - callFunctionMap_[formManagerAbilityKitName + "ProcessFormUpdate"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->ProcessFormUpdate(GetParamFormJsInfo()); - }; - callFunctionMap_[formManagerAbilityKitName + "ProcessFormUninstall"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->ProcessFormUninstall(GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "OnDeathReceived"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->OnDeathReceived(); - }; - callFunctionMap_[formManagerAbilityKitName + "OnCreate"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->OnCreate(GetParamWant()); - }; - callFunctionMap_[formManagerAbilityKitName + "OnDelete"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->OnDelete(GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "OnCastTemptoNormal"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->OnCastTemptoNormal(GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "OnUpdate"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->OnUpdate(GetS64Param()); - }; - callFunctionMap_[formManagerAbilityKitName + "OnVisibilityChanged"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->OnVisibilityChanged(GetS64S32MapParam()); - }; - callFunctionMap_[formManagerAbilityKitName + "OnTriggerEvent"] = []() { - std::shared_ptr formManagerAbility = GetParamAbility(); - formManagerAbility->OnTriggerEvent(GetS64Param(), GetStringParam()); - }; -} - -FormManagerFuzzTest::FormManagerFuzzTest() -{ - RegisterFormManagerAbility(); -} - -void FormManagerFuzzTest::SetJsonFunction(std::string functionName) -{ - remainderMap_.emplace(functionName, m_executionTimes); -} - -void FormManagerFuzzTest::SetExecutionTimes(uint16_t executionTimes) -{ - m_executionTimes = executionTimes; - for_each(remainderMap_.begin(), remainderMap_.end(), - [executionTimes](std::unordered_map::reference executionTimesTemp) { - executionTimesTemp.second = executionTimes; - }); -} - -int GetRandomInt(int minNum, int maxNum) -{ - return GetU16Param() % (maxNum - minNum + 1) + minNum; -} - -void action(int a) -{ - std::cout << "Interrupt signal (" << a << ") received.\n"; -} - -void FormManagerFuzzTest::StartFuzzTest() -{ - std::cout << __func__ << std::endl; - OHOS::FuzzTestConfigParser jsonParser; - OHOS::FuzzTestData tempData; - - std::cout << "parseFromFile start" << std::endl; - jsonParser.ParseForFuzzTest(FUZZ_TEST_CONFIG_FILE_PATH, tempData); - std::cout << " ExecutionTimes :" << tempData.mainLoopFlag << std::endl; - for_each(tempData.methodVec.begin(), tempData.methodVec.end(), [this](std::vector::reference s) { - SetJsonFunction(s); - }); - SetExecutionTimes(tempData.mainLoopFlag); - - std::vector index; - std::unordered_map::iterator it = remainderMap_.begin(); - while (it != remainderMap_.end()) { - if (it->second <= 0) { - it = remainderMap_.erase(it); - } else { - index.push_back(it->first); - it++; - } - } - - std::cout << remainderMap_.size() << "--------fuzz test start--------" << callFunctionMap_.size() << std::endl; - for (; remainderMap_.size() > 0; ) { - std::string functionName; - int offset = GetRandomInt(0, index.size() - 1); - functionName = index[offset]; - if (callFunctionMap_.find(functionName) != callFunctionMap_.end()) { - std::cout << "call function : " << functionName << std::endl; - callFunctionMap_[functionName](); - std::cout << "function end :" << functionName << std::endl; - } else { - std::cout << "can't find function : " << functionName << std::endl; - } - remainderMap_[functionName]--; - if (remainderMap_[functionName] <= 0) { - remainderMap_.erase(functionName); - index.erase(index.begin() + offset); - }; - } - std::cout << remainderMap_.size() << "--------fuzz test end--------" << std::endl; -} -} // namespace AppExecFwk -} // namespace OHOS diff --git a/test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp b/test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp deleted file mode 100644 index 43f9e47337..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#include -#include -#include -#include -#include - -#include "ability.h" -#include "../include/get_param.h" -#include "values_bucket.h" - -using namespace std; -using namespace OHOS::AppExecFwk; -using Uri = OHOS::Uri; -namespace OHOS { -namespace AppExecFwk { -bool GetBoolParam() -{ - bool param; - if (GetIntParam() % 2 == 0) { - param = true; - } else { - param = false; - } - cout << "Bool param is: " << param << endl; - return param; -} - -size_t GenRandom(size_t min, size_t max) -{ - std::random_device rd; - static uniform_int_distribution u(min, max); - static default_random_engine e(rd()); - size_t param = u(e); - return param; -} - -int8_t GetS8Param() -{ - std::random_device rd; - static uniform_int_distribution u(INT8_MIN, INT8_MAX); - static default_random_engine e(rd()); - int8_t param = u(e); - cout << "Int8_t param is: " << param << endl; - return param; -} -int16_t GetS16Param() -{ - std::random_device rd; - static uniform_int_distribution u(INT16_MIN, INT16_MAX); - static default_random_engine e(rd()); - int16_t param = u(e); - cout << "Int16_t param is: " << param << endl; - return param; -} -int32_t GetS32Param() -{ - std::random_device rd; - static uniform_int_distribution u(INT32_MIN, INT32_MAX); - static default_random_engine e(rd()); - int32_t param = u(e); - cout << "Int32_t param is: " << param << endl; - return param; -} - -int64_t GetS64Param() -{ - std::random_device rd; - static uniform_int_distribution u(INT64_MIN, INT64_MAX); - static default_random_engine e(rd()); - int64_t param = u(e); - cout << "Int64_t param is: " << param << endl; - return param; -} - -template -T GetUnsignParam() -{ - std::random_device rd; - static uniform_int_distribution u; - static default_random_engine e(rd()); - T param = u(e); - return param; -} - -size_t GetSizeTParam() -{ - size_t param = GetUnsignParam(); - return param; -} - -uint8_t GetU8Param() -{ - uint8_t param = GetUnsignParam(); - cout << "Uint8_t param is: " << param << endl; - return param; -} - -unsigned int GetUIntParam() -{ - unsigned int param = GetUnsignParam(); - cout << "Unsigned int param is: " << param << endl; - return param; -} - -uint16_t GetU16Param() -{ - uint16_t param = GetUnsignParam(); - cout << "Uint16_t param is: " << param << endl; - return param; -} - -uint32_t GetU32Param() -{ - uint32_t param = GetUnsignParam(); - cout << "Uint32_t param is: " << param << endl; - return param; -} - -uint64_t GetU64Param() -{ - uint64_t param = GetUnsignParam(); - cout << "Uint64_t param is: " << param << endl; - return param; -} - -short GetShortParam() -{ - std::random_device rd; - static uniform_int_distribution u(SHRT_MIN, SHRT_MAX); - static default_random_engine e(rd()); - short param = u(e); - cout << "Short param is: " << param << endl; - return param; -} - -long GetLongParam() -{ - std::random_device rd; - static uniform_int_distribution u(LONG_MIN, LONG_MAX); - static default_random_engine e(rd()); - long param = u(e); - cout << "Long param is: " << param << endl; - return param; -} - -int GetIntParam() -{ - std::random_device rd; - static uniform_int_distribution<> u(INT_MIN, INT_MAX); - static default_random_engine e(rd()); - int param = u(e); - cout << "Int param is: " << param << endl; - return param; -} - -double GetDoubleParam() -{ - double param = 0; - std::random_device rd; - static uniform_real_distribution u(DBL_MIN, DBL_MAX); - static default_random_engine e(rd()); - param = u(e); - cout << "double param is: " << param << endl; - return param; -} - -float GetFloatParam() -{ - float param = 0; - std::random_device rd; - static uniform_real_distribution u(FLT_MIN, FLT_MAX); - static default_random_engine e(rd()); - param = u(e); - cout << "Float param is: " << param << endl; - return param; -} - -char GetCharParam() -{ - std::random_device rd; - static uniform_int_distribution<> u(-128, 127); - static default_random_engine e(rd()); - char param = u(e); - return param; -} - -char32_t GetChar32Param() -{ - char32_t param = ' '; - std::random_device rd; - static uniform_int_distribution u; - static default_random_engine e(rd()); - param = u(e); - return param; -} - -char *GetCharArryParam() -{ - static char param[256]; - size_t len = 0; - string strparam = GetStringParam(); - if (!strparam.empty()) { - len = strparam.size() + 1; - if (len > sizeof(param)) { - len = sizeof(param) - 1; - } - - int ret = strcpy_s(param, len, strparam.c_str()); - if (ret == 0) { - return param; - } else { - return nullptr; - } - } else { - return nullptr; - } -} - -string GetStringParam() -{ - string param = ""; - char ch = GetCharParam(); - size_t len = GenRandom(0, 255); - while (len--) { - ch = GetCharParam(); - param += ch; - } - cout << "String param length is: " << param.length() << endl; - return param; -} - -std::map GetS64S32MapParam() -{ - map param; - size_t len = GenRandom(0, 255); - while (len--) { - int64_t int64Value = GetS64Param(); - int32_t int32Value = GetS32Param(); - param.insert(pair(int64Value, int32Value)); - } - cout << "int64_t, int32_t map param length is: " << param.size() << endl; - return param; -} - -template -vector GetUnsignVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - T t = GetUnsignParam(); - param.push_back(t); - } - cout << "Uint vector param length is: " << param.size() << endl; - return param; -} - -template -T GetClassParam() -{ - T param; - return param; -} - -std::vector GetBoolVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - int t = GetBoolParam(); - param.push_back(t); - } - cout << "Bool vector param length is: " << param.size() << endl; - return param; -} - -std::vector GetShortVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - short t = GetShortParam(); - param.push_back(t); - } - cout << "Short vector param length is: " << param.size() << endl; - return param; -} - -std::vector GetLongVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - long t = GetLongParam(); - param.push_back(t); - } - cout << "Long vector param length is: " << param.size() << endl; - return param; -} - -vector GetIntVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - int t = GetIntParam(); - param.push_back(t); - } - cout << "Int vector param length is: " << param.size() << endl; - return param; -} - -std::vector GetFloatVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - float t = GetIntParam(); - param.push_back(t); - } - cout << "Float vector param length is: " << param.size() << endl; - return param; -} - -std::vector GetDoubleVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - double t = GetIntParam(); - param.push_back(t); - } - cout << "Double vector param length is: " << param.size() << endl; - return param; -} - -vector GetCharVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - char t = GetCharParam(); - param.push_back(t); - } - cout << "Char vector param length is: " << param.size() << endl; - return param; -} - -vector GetChar32VectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - char32_t t = GetChar32Param(); - param.push_back(t); - } - cout << "Char32_t vector param length is: " << param.size() << endl; - return param; -} - -vector GetStringVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - string t = GetStringParam(); - param.push_back(t); - } - cout << "String vector param length is: " << param.size() << endl; - return param; -} - -vector GetS8VectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - int8_t temp = GetS8Param(); - param.push_back(temp); - } - cout << "Int8_t vector param length is: " << param.size() << endl; - return param; -} - -vector GetS16VectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - int16_t temp = GetS16Param(); - param.push_back(temp); - } - cout << "Int16_t vector param length is: " << param.size() << endl; - return param; -} - -vector GetS32VectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - int32_t temp = GetS32Param(); - param.push_back(temp); - } - cout << "Int32_t vector param length is: " << param.size() << endl; - return param; -} - -vector GetS64VectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - int64_t temp = GetS64Param(); - param.push_back(temp); - } - cout << "Int32_t vector param length is: " << param.size() << endl; - return param; -} - -std::shared_ptr GetParamAbility() -{ - return make_shared(); -} - -OHOS::AppExecFwk::Want GetParamWant() -{ - return OHOS::AppExecFwk::Want(); -} - -OHOS::AppExecFwk::FormInfo GetParamFormInfo() -{ - return OHOS::AppExecFwk::FormInfo(); -} - -OHOS::AppExecFwk::FormJsInfo GetParamFormJsInfo() -{ - return OHOS::AppExecFwk::FormJsInfo(); -} - -std::shared_ptr GetParamFormCallback() -{ - return shared_ptr(); -} - -OHOS::AppExecFwk::FormProviderData GetParamFormProviderData() -{ - return OHOS::AppExecFwk::FormProviderData(); -} - -std::vector GetmFormInfoVectorParam() -{ - vector param; - size_t len = GenRandom(0, 255); - while (len--) { - OHOS::AppExecFwk::FormInfo t = GetParamFormInfo(); - param.push_back(t); - } - cout << "FormInfo vector param length is: " << param.size() << endl; - return param; -} -} // namespace AppExecFwk -} // namespace OHOS diff --git a/test/systemtest/common/fms/fms_fuzz_test/test_lib/formManagerFuzzTest b/test/systemtest/common/fms/fms_fuzz_test/test_lib/formManagerFuzzTest deleted file mode 100644 index dab3f2bc86df074aa25c6b7e49d22f8cdaedd700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246288 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 -#include -#include -#include -#include -#include - -#include "app_log_wrapper.h" -#include "ability_handler.h" -#include "ability_info.h" -#include "ability_local_record.h" -#include "ability_start_setting.h" -#include "common_event.h" -#include "common_event_manager.h" -#include "context_deal.h" -#include "form_event.h" -#include "form_st_common_info.h" -#include "system_test_form_util.h" -#include "iservice_registry.h" -#include "nlohmann/json.hpp" -#include "performance_config_parser.h" -#include "system_ability_definition.h" - -using OHOS::AAFwk::Want; -using namespace testing::ext; -using namespace std::chrono_literals; -using namespace OHOS::STtools; - -namespace { -std::vector bundleNameList = { - "com.form.formsystemtestservicea", - "com.form.formsystemtestserviceb" -}; -std::vector hapNameList = { - "ActsFormSystemTestServiceA", - "ActsFormSystemTestServiceB" -}; -} // namespace - -namespace OHOS { -namespace AppExecFwk { -static PerformanceLevel pLevel_; -static int64_t totalTime = 0; -const std::string TEST_RESULT_PATH = "./performance_test_result.txt"; - -class FormPerformanceTest : public testing::Test { -public: - static void SetUpTestCase(); - static void TearDownTestCase(); - static bool SubscribeEvent(); - static bool SavePerformanceTestResult(const std::string &testcase, const int64_t &timeValue); - - void SetUp(); - void TearDown(); - void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); - void TerminateAbility(const std::string &eventName, const std::string &abilityName); - - // Test case - static void PerformanceTest_0100(); - static void PerformanceTest_0200(); - static void PerformanceTest_0300(); - static void PerformanceTest_0400(); - static void PerformanceTest_0500(); - static void PerformanceTest_0600(); - static void PerformanceTest_0700(); - static void PerformanceTest_1300(); - static void PerformanceTest_1400(); - static void PerformanceTest_1500(); - static void PerformanceTest_1600(); - - class FormEventSubscriber : public CommonEventSubscriber { - public: - explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; - virtual void OnReceiveEvent(const CommonEventData &data) override; - ~FormEventSubscriber() = default; - }; - - static sptr abilityMs; - static FormEvent event; - static std::vector eventList; - static std::shared_ptr subscriber_; -}; - -std::vector FormPerformanceTest::eventList = { - FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, FORM_EVENT_RECV_PERFORMANCE_TEST_0200, - FORM_EVENT_RECV_PERFORMANCE_TEST_0300, FORM_EVENT_RECV_PERFORMANCE_TEST_0400, FORM_EVENT_RECV_PERFORMANCE_TEST_0500, - FORM_EVENT_RECV_PERFORMANCE_TEST_0600, FORM_EVENT_RECV_PERFORMANCE_TEST_0700, FORM_EVENT_RECV_PERFORMANCE_TEST_1300, - FORM_EVENT_RECV_PERFORMANCE_TEST_1400, FORM_EVENT_RECV_PERFORMANCE_TEST_1500, FORM_EVENT_RECV_PERFORMANCE_TEST_1600, -}; - -FormEvent FormPerformanceTest::event = FormEvent(); -sptr FormPerformanceTest::abilityMs = nullptr; -std::shared_ptr FormPerformanceTest::subscriber_ = nullptr; -void FormPerformanceTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) -{ - GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); - GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); - GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); - SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); -} - -bool FormPerformanceTest::SavePerformanceTestResult(const std::string &testcase, const int64_t &timeValue) -{ - std::ofstream o(TEST_RESULT_PATH, std::ios::app); - o.close(); - - std::fstream f(TEST_RESULT_PATH, std::ios::app); - if (f.good() == false) { - return false; - } - - f << std::setw(4) << testcase << " consuming:" << timeValue << " ms" << std::endl; - - f.close(); - return true; -} - -void FormPerformanceTest::SetUpTestCase() -{ - SystemTestFormUtil::InstallHaps(hapNameList); - if (!SubscribeEvent()) { - GTEST_LOG_(INFO) << "SubscribeEvent error"; - } - - PerformanceConfigParser pcp; - pcp.ParseForPerformance(PERFORMANCE_CONFIG_FILE_PATH, pLevel_); - std::cout << "performance test level : " - << "executionTimes : " << pLevel_.executionTimesLevel << std::endl; -} - -void FormPerformanceTest::TearDownTestCase() -{ - GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; - SystemTestFormUtil::UninstallBundle(bundleNameList); - CommonEventManager::UnSubscribeCommonEvent(subscriber_); - std::cout << "========performance test level : " - << "case execution Times : " << pLevel_.executionTimesLevel << std::endl; -} - -void FormPerformanceTest::SetUp() -{ - std::ofstream o(TEST_RESULT_PATH); - o.close(); - std::fstream f(TEST_RESULT_PATH); - if (f.good() == false) { - return; - } - f << std::setw(4) << "total execution times:" << pLevel_.executionTimesLevel << std::endl; - - f.close(); -} - -void FormPerformanceTest::TearDown() -{ - SystemTestFormUtil::CleanMsg(event); - - std::ofstream o(TEST_RESULT_PATH, std::ios::app); - o.close(); - std::fstream f(TEST_RESULT_PATH, std::ios::app); - if (f.good() == false) { - return; - } - f << std::setw(4) << "total time:" << totalTime << " ms" << std::endl; - - f.close(); -} -bool FormPerformanceTest::SubscribeEvent() -{ - MatchingSkills matchingSkills; - for (const auto &e : eventList) { - matchingSkills.AddEvent(e); - } - CommonEventSubscribeInfo subscribeInfo(matchingSkills); - subscribeInfo.SetPriority(1); - subscriber_ = std::make_shared(subscribeInfo); - return CommonEventManager::SubscribeCommonEvent(subscriber_); -} - -void FormPerformanceTest::PerformanceTest_0100() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // AcquireForm - std::string eventData = FORM_EVENT_REQ_PERFORMANCE_TEST_0100; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_PERFORMANCE_TEST_0100, 100, eventData); - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 101)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 101); - std::string formId = data; - - // OnUpdate - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 102)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 102); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0100", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_0100 AcquireForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_0200() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // DeleteForm - std::string eventData = FORM_EVENT_REQ_PERFORMANCE_TEST_0100; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200, eventData); - - // DeleteForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0200", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_0200 DeleteForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_0300() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // ReleaseForm - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0300; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300, eventData); - - // ReleaseForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0300", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_0300 ReleaseForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_0400() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // CastTempForm - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0400; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400, eventData); - - // CastTempForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0400", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_0400 CastTempForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_0500() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // NotifyVisibleForms - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0500; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500, eventData); - - // NotifyVisibleForms Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0500", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_0500 NotifyVisibleForms, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_0600() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // NotifyInvisibleForms - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0600; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600, eventData); - - // NotifyInvisibleForms Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0600", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_0600 NotifyInvisibleForms, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_0700() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // RequestForm - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0700; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700, eventData); - - // RequestForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0700", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_0700 RequestForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_1300() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // GetAllFormsInfo - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1300; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300, eventData); - - // GetAllFormsInfo Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1300", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_1300 RequestForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_1400() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // GetAllFormsInfo - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1300; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400, eventData); - - // GetAllFormsInfo Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1400", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_1400 RequestForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_1500() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // GetAllFormsInfo - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1500; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500, eventData); - - // GetAllFormsInfo Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1500", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_1500 RequestForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormPerformanceTest::PerformanceTest_1600() -{ - struct timespec time1 = {0}; - struct timespec time2 = {0}; - int64_t usecTimesA = 1000000000; - int64_t usecTimesB = 1000000; - int64_t consuming = 0; - - clock_gettime(CLOCK_REALTIME, &time1); - - std::string bundleName = "com.ohos.form.manager.performance"; - std::string abilityName = "FormAbilityPerformance"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // GetAllFormsInfo - std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1600; - SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600, eventData); - - // GetAllFormsInfo Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - clock_gettime(CLOCK_REALTIME, &time2); - consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) - / usecTimesB; - totalTime += consuming; - bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1600", consuming); - std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; - GTEST_LOG_(INFO) << "FMS_performanceTest_1600 RequestForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -/** - * @tc.number : FMS_performanceTest_0100 - * @tc.name : AcquireForm performance test - * @tc.desc : Test the time required to AcquireForm - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_0100, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_0100" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_0100(); - std::cout << "FMS_performanceTest_0100 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_0100" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_0400 - * @tc.name : CastTempForm performance test - * @tc.desc : Test the time required to CastTempForm - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_0400, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_0400" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_0400(); - std::cout << "FMS_performanceTest_0400 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_0400" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_0300 - * @tc.name : ReleaseForm performance test - * @tc.desc : Test the time required to ReleaseForm - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_0300, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_0300" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_0300(); - std::cout << "FMS_performanceTest_0300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_0300" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_0200 - * @tc.name : DeleteForm performance test - * @tc.desc : Test the time required to DeleteForm - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_0200, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_0200" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_0200(); - std::cout << "FMS_performanceTest_0200 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_0200" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_0500 - * @tc.name : NotifyVisibleForms performance test - * @tc.desc : Test the time required to NotifyVisibleForms - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_0500, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_0500" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_0500(); - std::cout << "FMS_performanceTest_0500 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_0500" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_0600 - * @tc.name : NotifyInvisibleForms performance test - * @tc.desc : Test the time required to NotifyInvisibleForms - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_0600, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_0600" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_0600(); - std::cout << "FMS_performanceTest_0600 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_0600" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_0700 - * @tc.name : RequestForm performance test - * @tc.desc : Test the time required to RequestForm - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_0700, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_0700" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_0700(); - std::cout << "FMS_performanceTest_0700 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_0700" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_1300 - * @tc.name : GetAllFormsInfo performance test - * @tc.desc : Test the time required to GetAllFormsInfo - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_1300, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_1300" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_1300(); - std::cout << "FMS_performanceTest_1300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_1300" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_1400 - * @tc.name : GetFormsInfoByApp performance test - * @tc.desc : Test the time required to GetFormsInfoByApp - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_1400, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_1400" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_1400(); - std::cout << "FMS_performanceTest_1400 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_1400" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_1500 - * @tc.name : GetFormsInfoByModule performance test - * @tc.desc : Test the time required to GetFormsInfoByModule - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_1500, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_1500" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_1500(); - std::cout << "FMS_performanceTest_1500 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_1500" << std::endl; -} - -/** - * @tc.number : FMS_performanceTest_1600 - * @tc.name : CheckFMSReady performance test - * @tc.desc : Test the time required to CheckFMSReady - */ -HWTEST_F(FormPerformanceTest, FMS_performanceTest_1600, Function | MediumTest | Level3) -{ - std::cout << "START FMS_performanceTest_1600" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { - FormPerformanceTest::PerformanceTest_1600(); - std::cout << "FMS_performanceTest_1600 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_performanceTest_1600" << std::endl; -} - -} // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_performance_test/performance_config_parser.h b/test/systemtest/common/fms/fms_performance_test/performance_config_parser.h deleted file mode 100644 index a72528f902..0000000000 --- a/test/systemtest/common/fms/fms_performance_test/performance_config_parser.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#ifndef PERFORMANCE_CONFIG_PARSER_H -#define PERFORMANCE_CONFIG_PARSER_H - -#include -#include -#include - -#include "nlohmann/json.hpp" - -namespace OHOS { -namespace AppExecFwk { -const std::string PERFORMANCE_CONFIG_FILE_PATH{"./fms_performance_config.json"}; - -const std::string PERFORMANCE_EXECUTION_TIMES_KEY{"ExecutionTimes"}; - -struct PerformanceLevel { - int32_t executionTimesLevel{1}; -}; - -class PerformanceConfigParser { -public: - void ParseForPerformance(const std::string &path, PerformanceLevel &stlevel) - { - std::ifstream jf(path); - if (!jf.is_open()) { - std::cout << "json file can not open!" << std::endl; - return; - } - nlohmann::json jsonObj; - jf >> jsonObj; - const auto &jsonObjEnd = jsonObj.end(); - if (jsonObj.find(PERFORMANCE_EXECUTION_TIMES_KEY) != jsonObjEnd) { - jsonObj.at(PERFORMANCE_EXECUTION_TIMES_KEY).get_to(stlevel.executionTimesLevel); - if (stlevel.executionTimesLevel == 0) { - stlevel.executionTimesLevel = 1; - } - } - } -}; -} // namespace AppExecFwk -} // namespace OHOS - -#endif // PERFORMANCE_CONFIG_PARSER_H diff --git a/test/systemtest/common/fms/fms_stress_test/BUILD.gn b/test/systemtest/common/fms/fms_stress_test/BUILD.gn deleted file mode 100644 index d50c87e644..0000000000 --- a/test/systemtest/common/fms/fms_stress_test/BUILD.gn +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) 2021 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. - -import("//build/test.gni") -import("//foundation/appexecfwk/standard/appexecfwk.gni") - -module_output_path = "appexecfwk_standard/formmanagerst" - -ohos_systemtest("FormStressTest") { - module_out_path = module_output_path - include_dirs = [ - "${aafwk_path}/interfaces/innerkits/ability_manager/include", - "${appexecfwk_path}/test/systemtest/common/fms/common/include", - "//base/notification/ces_standard/test/systemtest/common/resource", - "//foundation/distributedschedule/safwk/services/safwk/include", - ] - - sources = [ - "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", - "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", - "fms_stress_test.cpp", - ] - - cflags = [] - if (target_cpu == "arm") { - cflags += [ "-DBINDER_IPC_32BIT" ] - } - - configs = [ - "${aafwk_path}/services/abilitymgr:abilityms_config", - "${appexecfwk_path}/services/appmgr:appmgr_config", - ] - - deps = [ - "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", - "${aafwk_path}/services/abilitymgr:abilityms", - "${appexecfwk_path}/common:libappexecfwk_common", - "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", - "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", - "//third_party/googletest:gtest_main", - ] - - defines = [ "APP_LOG_TAG = \"formManagerStressTest\"" ] - - external_deps = [ - "aafwk_standard:base", - "aafwk_standard:want", - "appexecfwk_standard:appexecfwk_base", - "appexecfwk_standard:appexecfwk_core", - "ces_standard:cesfwk_core", - "ces_standard:cesfwk_innerkits", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_core", - "safwk:system_ability_fwk", - "samgr_L2:samgr_proxy", - ] -} - -group("systemtest") { - testonly = true - - deps = [ ":FormStressTest" ] -} diff --git a/test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp b/test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp deleted file mode 100644 index 54b42cb0d8..0000000000 --- a/test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp +++ /dev/null @@ -1,627 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -#include -#include -#include -#include - -#include "ability_info.h" -#include "ability_handler.h" -#include "ability_local_record.h" -#include "ability_start_setting.h" -#include "app_log_wrapper.h" -#include "common_event.h" -#include "common_event_manager.h" -#include "context_deal.h" -#include "form_event.h" -#include "form_st_common_info.h" -#include "system_test_form_util.h" -#include "iservice_registry.h" -#include "nlohmann/json.hpp" -#include "stress_test_config_parser.h" -#include "system_ability_definition.h" - -using OHOS::AAFwk::Want; -using namespace testing::ext; -using namespace std::chrono_literals; -using namespace OHOS::STtools; - -namespace { -std::vector bundleNameList = { - "com.form.formsystemtestservicea", - "com.form.formsystemtestserviceb" -}; -std::vector hapNameList = { - "ActsFormSystemTestServiceA", - "ActsFormSystemTestServiceB" -}; -} // namespace - -namespace OHOS { -namespace AppExecFwk { -static StressTestLevel stLevel_; -static int g_iSuccessfulTimes = 0; -class FormStressTest : public testing::Test { -public: - static void SetUpTestCase(); - static void TearDownTestCase(); - static bool SubscribeEvent(); - - void SetUp(); - void TearDown(); - void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); - void TerminateAbility(const std::string &eventName, const std::string &abilityName); - - // Test case - static void StressTest_0100(); - static void StressTest_0200(); - static void StressTest_0300(); - static void StressTest_1100(); - static void StressTest_1300(); - static void StressTest_1700(); - static void StressTest_1800(); - - class FormEventSubscriber : public CommonEventSubscriber { - public: - explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; - virtual void OnReceiveEvent(const CommonEventData &data) override; - ~FormEventSubscriber() = default; - }; - - static sptr abilityMs; - static FormEvent event; - static std::vector eventList; - static std::shared_ptr subscriber_; -}; - -std::vector FormStressTest::eventList = { - FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_STRESS_TEST_0100, - FORM_EVENT_RECV_STRESS_TEST_0100_01, FORM_EVENT_RECV_STRESS_TEST_0200, - FORM_EVENT_RECV_STRESS_TEST_0200_01, FORM_EVENT_RECV_STRESS_TEST_0200_02, FORM_EVENT_RECV_STRESS_TEST_0200_03, - FORM_EVENT_RECV_STRESS_TEST_0300, FORM_EVENT_RECV_STRESS_TEST_0300_01, FORM_EVENT_RECV_STRESS_TEST_0300_02, - FORM_EVENT_RECV_STRESS_TEST_0400, FORM_EVENT_RECV_STRESS_TEST_0500, - FORM_EVENT_RECV_STRESS_TEST_1100, FORM_EVENT_RECV_STRESS_TEST_1100_01, FORM_EVENT_RECV_STRESS_TEST_1100_02, - FORM_EVENT_RECV_STRESS_TEST_1100_03, FORM_EVENT_RECV_STRESS_TEST_1300, FORM_EVENT_RECV_STRESS_TEST_1300_01, - FORM_EVENT_RECV_STRESS_TEST_1300_02, FORM_EVENT_RECV_STRESS_TEST_1300_03, - FORM_EVENT_RECV_STRESS_TEST_1700, FORM_EVENT_RECV_STRESS_TEST_1700_01, FORM_EVENT_RECV_STRESS_TEST_1700_02, - FORM_EVENT_RECV_STRESS_TEST_1800, -}; - -FormEvent FormStressTest::event = FormEvent(); -sptr FormStressTest::abilityMs = nullptr; -std::shared_ptr FormStressTest::subscriber_ = nullptr; -void FormStressTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) -{ - GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); - GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); - GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); - SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); -} - -void FormStressTest::SetUpTestCase() -{ - SystemTestFormUtil::InstallHaps(hapNameList); - if (!SubscribeEvent()) { - GTEST_LOG_(INFO) << "SubscribeEvent error"; - } - - StressTestConfigParser stcp; - stcp.ParseForStressTest(STRESS_TEST_CONFIG_FILE_PATH, stLevel_); - std::cout << "stress test level : " - << "executionTimes : " << stLevel_.executionTimesLevel << ", time:" << stLevel_.sleepTime << std::endl; -} - -void FormStressTest::TearDownTestCase() -{ - GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; - SystemTestFormUtil::UninstallBundle(bundleNameList); - CommonEventManager::UnSubscribeCommonEvent(subscriber_); - std::cout << "========stress test level : " - << "case execution Times : " << stLevel_.executionTimesLevel << ", time:" << stLevel_.sleepTime << std::endl; -} - -void FormStressTest::SetUp() -{ - g_iSuccessfulTimes = 0; -} - -void FormStressTest::TearDown() -{ - std::cout << "========Stress test: " - << "Current case Successful Times : " << g_iSuccessfulTimes++ << "=========" << std::endl; - GTEST_LOG_(INFO) << "CleanMsg calld"; - SystemTestFormUtil::CleanMsg(event); -} -bool FormStressTest::SubscribeEvent() -{ - GTEST_LOG_(INFO) << "SubscribeEvent calld"; - MatchingSkills matchingSkills; - for (const auto &e : eventList) { - matchingSkills.AddEvent(e); - } - CommonEventSubscribeInfo subscribeInfo(matchingSkills); - subscribeInfo.SetPriority(1); - subscriber_ = std::make_shared(subscribeInfo); - return CommonEventManager::SubscribeCommonEvent(subscriber_); -} - -void FormStressTest::StressTest_0100() -{ - std::string bundleName = "com.ohos.form.manager.stress"; - std::string abilityName = "FormAbilityStress"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // AcquireForm - std::string eventData = FORM_EVENT_REQ_STRESS_TEST_0100; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_0100, 100, eventData); - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0100, 101)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0100, 101); - std::string formId = data; - - // OnUpdate - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0100, 102)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0100, 102); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_0100 AcquireForm, result:" << result; - } - - // DeleteForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0100_01, 103)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0100_01, 103); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - g_iSuccessfulTimes++; - GTEST_LOG_(INFO) << "FMS_stressTest_0100 DeleteForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormStressTest::StressTest_0200() -{ - std::string bundleName = "com.ohos.form.manager.stress"; - std::string abilityName = "FormAbilityStress"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // AcquireForm - std::string eventData = FORM_EVENT_REQ_STRESS_TEST_0200; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_0200, 200, eventData); - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200, 201)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200, 201); - std::string formId = data; - GTEST_LOG_(INFO) << "FMS_stressTest_0200 AcquireForm, formId:" << formId; - - // OnUpdate - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200, 202)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200, 202); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_0200 AcquireForm 001, result:" << result; - } - - // ReleaseForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200_01, 203)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200_01, 203); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_0200 ReleaseForm, result:" << result; - } - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200_02, 204)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200_02, 204); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_0200 AcquireForm 002, result:" << result; - } - - // DeleteForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200_03, 205)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200_03, 205); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - g_iSuccessfulTimes++; - GTEST_LOG_(INFO) << "FMS_stressTest_0200 DeleteForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormStressTest::StressTest_0300() -{ - std::string bundleName = "com.ohos.form.manager.stress"; - std::string abilityName = "FormAbilityStress"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // AcquireForm - std::string eventData = FORM_EVENT_REQ_STRESS_TEST_0300; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_0300, 300, eventData); - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300, 301)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300, 301); - std::string formId = data; - - // OnUpdate - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300, 302)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300, 302); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_0300 AcquireForm, result:" << result; - } - - // CastTempForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300_01, 303)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300_01, 303); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_0300 CastTempForm, result:" << result; - } - - // DeleteForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300_02, 304)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300_02, 304); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - g_iSuccessfulTimes++; - GTEST_LOG_(INFO) << "FMS_stressTest_0300 DeleteForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormStressTest::StressTest_1100() -{ - std::string bundleName = "com.ohos.form.manager.stress"; - std::string abilityName = "FormAbilityStress"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // AcquireForm - std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1100; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1100, 1100, eventData); - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1101)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1101); - std::string formId = data; - - // OnUpdate - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1102)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1102); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1100 AcquireForm, result:" << result; - } - - // NotifyInvisibleForms Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1100 NotifyInvisibleForms, result:" << result; - } - - // NotifyVisibleForms Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1100 notifyVisibleForms, result:" << result; - } - - // DeleteForm - eventData = formId; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1100_03, 1105, eventData); - - // DeleteForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - g_iSuccessfulTimes++; - GTEST_LOG_(INFO) << "FMS_stressTest_1100 DeleteForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormStressTest::StressTest_1300() -{ - std::string bundleName = "com.ohos.form.manager.stress"; - std::string abilityName = "FormAbilityStress"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // AcquireForm - std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1300; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1300, 1300, eventData); - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1301)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1301); - std::string formId = data; - - // OnUpdate - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1302)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1302); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1300 AcquireForm, result:" << result; - } - - // EnableUpdateForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1300 EnableUpdateForm, result:" << result; - } - - // DisableUpdateForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1300 DisableUpdateForm, result:" << result; - } - - // DeleteForm - eventData = formId; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1300_03, 1305, eventData); - - // DeleteForm Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - g_iSuccessfulTimes++; - GTEST_LOG_(INFO) << "FMS_stressTest_1300 DeleteForm, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormStressTest::StressTest_1700() -{ - std::string bundleName = "com.ohos.form.manager.stress"; - std::string abilityName = "FormAbilityStress"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // GetAllFormsInfo - std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1700; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1700, 1700, eventData); - - // GetAllFormsInfo Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1700, 1700)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1700, 1700); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1700 GetAllFormsInfo, result:" << result; - } - - // GetFormsInfoByApp Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_stressTest_1700 GetFormsInfoByApp, result:" << result; - } - - // GetFormsInfoByModule Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702); - result = data == "true"; - EXPECT_TRUE(result); - if (result) { - g_iSuccessfulTimes++; - GTEST_LOG_(INFO) << "FMS_stressTest_1700 GetFormsInfoByModule, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormStressTest::StressTest_1800() -{ - std::string bundleName = "com.ohos.form.manager.stress"; - std::string abilityName = "FormAbilityStress"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // CheckFMSReady - std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1800; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1800, 1800, eventData); - - // CheckFMSReady Result - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1800, 1800)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1800, 1800); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - g_iSuccessfulTimes++; - GTEST_LOG_(INFO) << "FMS_stressTest_1800 CheckFMSReady, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -/** - * @tc.number : FMS_stressTest_0100 - * @tc.name : AcquireForm/DeleteForm stress test - * @tc.desc : AcquireForm successfully/DeleteForm successfully - */ -HWTEST_F(FormStressTest, FMS_stressTest_0100, Function | MediumTest | Level2) -{ - std::cout << "START FMS_stressTest_0100" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { - sleep(stLevel_.sleepTime); - FormStressTest::StressTest_0100(); - std::cout << "FMS_stressTest_0100 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_stressTest_0100" << std::endl; -} - -/** - * @tc.number : FMS_stressTest_0200 - * @tc.name : AcquireForm、ReleaseForm/DeleteForm stress test - * @tc.desc : AcquireForm successfully/ReleaseForm successfully/DeleteForm successfully - */ -HWTEST_F(FormStressTest, FMS_stressTest_0200, Function | MediumTest | Level2) -{ - std::cout << "START FMS_stressTest_0200" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { - sleep(stLevel_.sleepTime); - FormStressTest::StressTest_0200(); - std::cout << "FMS_stressTest_0200 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_stressTest_0200" << std::endl; -} - -/** - * @tc.number : FMS_stressTest_0300 - * @tc.name : AcquireForm/CastTempForm/DeleteForm stress test - * @tc.desc : AcquireForm successfully/CastTempForm successfully/DeleteForm successfully - */ -HWTEST_F(FormStressTest, FMS_stressTest_0300, Function | MediumTest | Level2) -{ - std::cout << "START FMS_stressTest_0300" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { - sleep(stLevel_.sleepTime); - FormStressTest::StressTest_0300(); - std::cout << "FMS_stressTest_0300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_stressTest_0300" << std::endl; -} - -/** - * @tc.number : FMS_stressTest_1100 - * @tc.name : NotifyInvisibleForms/NotifyVisibleForms stress test - * @tc.desc : NotifyInvisibleForms successfully/NotifyVisibleForms successfully - */ -HWTEST_F(FormStressTest, FMS_stressTest_1100, Function | MediumTest | Level2) -{ - std::cout << "START FMS_stressTest_1100" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { - sleep(stLevel_.sleepTime); - FormStressTest::StressTest_1100(); - std::cout << "FMS_stressTest_1100 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_stressTest_1100" << std::endl; -} - -/** - * @tc.number : FMS_stressTest_1300 - * @tc.name : EnableUpdateForm/DisableUpdateForm stress test - * @tc.desc : EnableUpdateForm successfully/DisableUpdateForm successfully - */ -HWTEST_F(FormStressTest, FMS_stressTest_1300, Function | MediumTest | Level2) -{ - std::cout << "START FMS_stressTest_1300" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { - sleep(stLevel_.sleepTime); - FormStressTest::StressTest_1300(); - std::cout << "FMS_stressTest_1300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_stressTest_1300" << std::endl; -} - -/** - * @tc.number : FMS_stressTest_1700 - * @tc.name : GetAllFormsInfo/GetFormsInfoByApp/GetFormsInfoByModule stress test - * @tc.desc : GetAllFormsInfo successfully/GetFormsInfoByApp successfully/GetFormsInfoByModule successfully - */ -HWTEST_F(FormStressTest, FMS_stressTest_1700, Function | MediumTest | Level2) -{ - std::cout << "START FMS_stressTest_1700" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { - FormStressTest::StressTest_1700(); - std::cout << "FMS_stressTest_1700 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_stressTest_1700" << std::endl; -} - -/** - * @tc.number : FMS_stressTest_1800 - * @tc.name : CheckFMSReady stress test - * @tc.desc : CheckFMSReady successfully - */ -HWTEST_F(FormStressTest, FMS_stressTest_1800, Function | MediumTest | Level2) -{ - std::cout << "START FMS_stressTest_1800" << std::endl; - - for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { - FormStressTest::StressTest_1800(); - std::cout << "FMS_stressTest_1800 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; - } - - std::cout << "END FMS_stressTest_1800" << std::endl; -} -} // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json b/test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json deleted file mode 100644 index c52dcc61af..0000000000 --- a/test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "ExecutionTimes": 5, - "SleepTime": 3 -} diff --git a/test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h b/test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h deleted file mode 100644 index c561309652..0000000000 --- a/test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#ifndef STRESS_TEST_CONFIG_PARSER_H -#define STRESS_TEST_CONFIG_PARSER_H - -#include -#include -#include - -#include "nlohmann/json.hpp" - -namespace OHOS { -namespace AppExecFwk { -const std::string STRESS_TEST_CONFIG_FILE_PATH{"./fms_stress_test_config.json"}; - -const std::string STRESS_TEST_EXECUTION_TIMES_KEY{"ExecutionTimes"}; -const std::string STRESS_TEST_SLEEP_TIME_KEY{"SleepTime"}; - -struct StressTestLevel { - int32_t executionTimesLevel{1}; - int32_t sleepTime{3}; -}; - -class StressTestConfigParser { -public: - void ParseForStressTest(const std::string &path, StressTestLevel &stlevel) - { - std::ifstream jf(path); - if (!jf.is_open()) { - std::cout << "json file can not open!" << std::endl; - return; - } - nlohmann::json jsonObj; - jf >> jsonObj; - const auto &jsonObjEnd = jsonObj.end(); - if (jsonObj.find(STRESS_TEST_EXECUTION_TIMES_KEY) != jsonObjEnd) { - jsonObj.at(STRESS_TEST_EXECUTION_TIMES_KEY).get_to(stlevel.executionTimesLevel); - if (stlevel.executionTimesLevel == 0) { - stlevel.executionTimesLevel = 1; - } - } - - if (jsonObj.find(STRESS_TEST_SLEEP_TIME_KEY) != jsonObjEnd) { - jsonObj.at(STRESS_TEST_SLEEP_TIME_KEY).get_to(stlevel.sleepTime); - } - } -}; -} // namespace AppExecFwk -} // namespace OHOS - -#endif // STRESS_TEST_CONFIG_PARSER_H diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn b/test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn deleted file mode 100644 index 5e137851a0..0000000000 --- a/test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) 2021 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. - -import("//build/test.gni") -import("//foundation/appexecfwk/standard/appexecfwk.gni") - -module_output_path = "appexecfwk_standard/formmanagerst" - -ohos_systemtest("FormUninstallAppTest") { - module_out_path = module_output_path - include_dirs = [ - "${aafwk_path}/interfaces/innerkits/ability_manager/include", - "${appexecfwk_path}/test/systemtest/common/fms/common/include", - "//base/notification/ces_standard/test/systemtest/common/resource", - "//foundation/distributedschedule/safwk/services/safwk/include", - ] - - sources = [ - "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", - "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", - "fms_uninstall_app_test.cpp", - ] - - cflags = [] - if (target_cpu == "arm") { - cflags += [ "-DBINDER_IPC_32BIT" ] - } - - configs = [ - "${aafwk_path}/services/abilitymgr:abilityms_config", - "${appexecfwk_path}/services/appmgr:appmgr_config", - ] - - deps = [ - "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", - "${aafwk_path}/services/abilitymgr:abilityms", - "${appexecfwk_path}/common:libappexecfwk_common", - "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", - "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", - "//third_party/googletest:gtest_main", - ] - - defines = [ "APP_LOG_TAG = \"formManagerUninstallAppTest\"" ] - - external_deps = [ - "aafwk_standard:base", - "aafwk_standard:want", - "appexecfwk_standard:appexecfwk_base", - "appexecfwk_standard:appexecfwk_core", - "ces_standard:cesfwk_core", - "ces_standard:cesfwk_innerkits", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_core", - "safwk:system_ability_fwk", - "samgr_L2:samgr_proxy", - ] -} - -group("systemtest") { - testonly = true - - deps = [ ":FormUninstallAppTest" ] -} diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp b/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp deleted file mode 100644 index 53de9abe35..0000000000 --- a/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -#include -#include -#include -#include - -#include "ability_info.h" -#include "ability_handler.h" -#include "ability_local_record.h" -#include "ability_start_setting.h" -#include "app_log_wrapper.h" -#include "common_event.h" -#include "common_event_manager.h" -#include "context_deal.h" -#include "form_event.h" -#include "form_st_common_info.h" -#include "system_test_form_util.h" -#include "iservice_registry.h" -#include "nlohmann/json.hpp" -#include "uninstall_app_test_config_parser.h" -#include "system_ability_definition.h" - -using OHOS::AAFwk::Want; -using namespace testing::ext; -using namespace std::chrono_literals; -using namespace OHOS::STtools; - -namespace { -std::vector bundleNameList = { - "com.form.formsystemtestservicea", - //"com.form.formsystemtestserviceb" -}; -std::vector hapNameList = { - "ActsFormSystemTestServiceA", - //"ActsFormSystemTestServiceB" -}; -} // namespace - -namespace OHOS { -namespace AppExecFwk { - -//static UninstallAPPTestLevel unLevel_; -static std::string uninstallBundleName = ""; -const std::string COMMON_EVENT_PACKAGE_REMOVED = "usual.event.PACKAGE_REMOVED"; - -class FormUninstallAppTest : public testing::Test { -public: - static void SetUpTestCase(); - static void TearDownTestCase(); - static bool SubscribeEvent(); - - void SetUp(); - void TearDown(); - void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); - void TerminateAbility(const std::string &eventName, const std::string &abilityName); - - // Test case - static void UninstallTest_0100(); - static void UninstallTest_0200(); - static void UninstallTest_0300(); - static void UninstallTest_1100(); - static void UninstallTest_1300(); - static void UninstallTest_1700(); - static void UninstallTest_1800(); - - class FormEventSubscriber : public CommonEventSubscriber { - public: - explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; - virtual void OnReceiveEvent(const CommonEventData &data) override; - ~FormEventSubscriber() = default; - }; - - static sptr abilityMs; - static FormEvent event; - static std::vector eventList; - static std::shared_ptr subscriber_; -}; - -std::vector FormUninstallAppTest::eventList = { - FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_UNINSTALL_TEST_0100, FORM_EVENT_RECV_UNINSTALL_TEST_0200, - FORM_EVENT_RECV_UNINSTALL_TEST_0300, FORM_EVENT_RECV_UNINSTALL_TEST_0400, FORM_EVENT_RECV_UNINSTALL_TEST_0500, - FORM_EVENT_RECV_UNINSTALL_TEST_0600, FORM_EVENT_RECV_UNINSTALL_TEST_0700, FORM_EVENT_RECV_UNINSTALL_TEST_0800, - FORM_EVENT_RECV_UNINSTALL_TEST_0900, FORM_EVENT_RECV_UNINSTALL_TEST_1000, FORM_EVENT_RECV_UNINSTALL_TEST_1100, - FORM_EVENT_RECV_UNINSTALL_TEST_1200, FORM_EVENT_RECV_UNINSTALL_TEST_1300, FORM_EVENT_RECV_UNINSTALL_TEST_1400, - FORM_EVENT_RECV_UNINSTALL_TEST_1500, FORM_EVENT_RECV_UNINSTALL_TEST_1600, FORM_EVENT_RECV_UNINSTALL_TEST_1700, - FORM_EVENT_RECV_UNINSTALL_TEST_1800, COMMON_EVENT_PACKAGE_REMOVED -}; - -FormEvent FormUninstallAppTest::event = FormEvent(); -sptr FormUninstallAppTest::abilityMs = nullptr; -std::shared_ptr FormUninstallAppTest::subscriber_ = nullptr; -void FormUninstallAppTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) -{ - GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); - GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); - GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); - SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); - - if (data.GetWant().GetAction() == COMMON_EVENT_PACKAGE_REMOVED) { - GTEST_LOG_(INFO) << "OnReceiveEvent: bundleName =" << data.GetWant().GetElement().GetBundleName(); - uninstallBundleName = data.GetWant().GetElement().GetBundleName(); - } -} - -void FormUninstallAppTest::SetUpTestCase() -{ - SystemTestFormUtil::InstallHaps(hapNameList); - if (!SubscribeEvent()) { - GTEST_LOG_(INFO) << "SubscribeEvent error"; - } -} - -void FormUninstallAppTest::TearDownTestCase() -{ - GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; - //SystemTestFormUtil::UninstallBundle(bundleNameList); - CommonEventManager::UnSubscribeCommonEvent(subscriber_); -} - -void FormUninstallAppTest::SetUp() -{ -} - -void FormUninstallAppTest::TearDown() -{ - GTEST_LOG_(INFO) << "CleanMsg calld"; - SystemTestFormUtil::CleanMsg(event); -} -bool FormUninstallAppTest::SubscribeEvent() -{ - GTEST_LOG_(INFO) << "SubscribeEvent calld"; - MatchingSkills matchingSkills; - for (const auto &e : eventList) { - matchingSkills.AddEvent(e); - } - CommonEventSubscribeInfo subscribeInfo(matchingSkills); - subscribeInfo.SetPriority(1); - subscriber_ = std::make_shared(subscribeInfo); - return CommonEventManager::SubscribeCommonEvent(subscriber_); -} - -void FormUninstallAppTest::UninstallTest_0100() -{ - std::string bundleName = "com.ohos.form.manager.Uninstall"; - std::string abilityName = "FormAbilityUninstallApp"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - // AcquireForm - std::string eventData = FORM_EVENT_REQ_UNINSTALL_TEST_0100; - SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_UNINSTALL_TEST_0100, 100, eventData); - - // OnAcquired - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 101)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 101); - std::string formId = data; - - // OnUpdate - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 102)); - data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 102); - bool result = data == "true"; - EXPECT_TRUE(result); - if (result) { - GTEST_LOG_(INFO) << "FMS_uninstallAPP_0100 AcquireForm, result:" << result; - } - - // Uninstall app - SystemTestFormUtil::UninstallBundle(bundleNameList); - - // Uninstall app event - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_PACKAGE_REMOVED, 0)); - result = uninstallBundleName == "com.form.formsystemtestservicea"; - EXPECT_TRUE(result); - if (result) { - uninstallBundleName = ""; - GTEST_LOG_(INFO) << "FMS_uninstallAPP_0100 Uninstall app, result:" << result; - } - - SystemTestFormUtil::CleanMsg(event); -} - -void FormUninstallAppTest::UninstallTest_0200() -{ - std::string bundleName = "com.ohos.form.manager.uninstall"; - std::string abilityName = "FormAbilityUninstallApp"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - SystemTestFormUtil::CleanMsg(event); -} - -void FormUninstallAppTest::UninstallTest_0300() -{ - std::string bundleName = "com.ohos.form.manager.uninstall"; - std::string abilityName = "FormAbilityUninstallApp"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - SystemTestFormUtil::CleanMsg(event); -} - -void FormUninstallAppTest::UninstallTest_1100() -{ - std::string bundleName = "com.ohos.form.manager.uninstall"; - std::string abilityName = "FormAbilityUninstallApp"; - MAP_STR_STR params; - Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); - SystemTestFormUtil::StartAbility(want, abilityMs); - EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - - SystemTestFormUtil::CleanMsg(event); -} - -void FormUninstallAppTest::UninstallTest_1300() -{ -} - -void FormUninstallAppTest::UninstallTest_1700() -{ -} - -void FormUninstallAppTest::UninstallTest_1800() -{ -} - -/** - * @tc.number : FMS_uninstallAPP_0100 - * @tc.name : AcquireForm. then uninstall the service app - * @tc.desc : uninstall the service app successfully - */ -HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_0100, Function | MediumTest | Level2) -{ - std::cout << "START FMS_uninstallAPP_0100" << std::endl; - - FormUninstallAppTest::UninstallTest_0100(); - - std::cout << "END FMS_uninstallAPP_0100" << std::endl; -} - -/** - * @tc.number : FMS_uninstallAPP_0200 - * @tc.name : AcquireForm、ReleaseForm/DeleteForm uninstall test - * @tc.desc : AcquireForm successfully/ReleaseForm successfully/DeleteForm successfully - */ -HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_0200, Function | MediumTest | Level2) -{ - std::cout << "START FMS_uninstallAPP_0200" << std::endl; - - std::cout << "END FMS_uninstallAPP_0200" << std::endl; -} - -/** - * @tc.number : FMS_uninstallAPP_0300 - * @tc.name : AcquireForm/CastTempForm/DeleteForm uninstall test - * @tc.desc : AcquireForm successfully/CastTempForm successfully/DeleteForm successfully - */ -HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_0300, Function | MediumTest | Level2) -{ - std::cout << "START FMS_uninstallAPP_0300" << std::endl; - std::cout << "END FMS_uninstallAPP_0300" << std::endl; -} - -/** - * @tc.number : FMS_uninstallAPP_1100 - * @tc.name : NotifyInvisibleForms/NotifyVisibleForms uninstall test - * @tc.desc : NotifyInvisibleForms successfully/NotifyVisibleForms successfully - */ -HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1100, Function | MediumTest | Level2) -{ - std::cout << "START FMS_uninstallAPP_1100" << std::endl; - - std::cout << "END FMS_uninstallAPP_1100" << std::endl; -} - -/** - * @tc.number : FMS_uninstallAPP_1300 - * @tc.name : EnableUpdateForm/DisableUpdateForm uninstall test - * @tc.desc : EnableUpdateForm successfully/DisableUpdateForm successfully - */ -HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1300, Function | MediumTest | Level2) -{ - std::cout << "START FMS_uninstallAPP_1300" << std::endl; - - std::cout << "END FMS_uninstallAPP_1300" << std::endl; -} - -/** - * @tc.number : FMS_uninstallAPP_1700 - * @tc.name : GetAllFormsInfo/GetFormsInfoByApp/GetFormsInfoByModule uninstall test - * @tc.desc : GetAllFormsInfo successfully/GetFormsInfoByApp successfully/GetFormsInfoByModule successfully - */ -HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1700, Function | MediumTest | Level2) -{ - std::cout << "START FMS_uninstallAPP_1700" << std::endl; - - std::cout << "END FMS_uninstallAPP_1700" << std::endl; -} - -/** - * @tc.number : FMS_uninstallAPP_1800 - * @tc.name : CheckFMSReady uninstall test - * @tc.desc : CheckFMSReady successfully - */ -HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1800, Function | MediumTest | Level2) -{ - std::cout << "START FMS_uninstallAPP_1800" << std::endl; - - std::cout << "END FMS_uninstallAPP_1800" << std::endl; -} -} // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json b/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json deleted file mode 100644 index c52dcc61af..0000000000 --- a/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "ExecutionTimes": 5, - "SleepTime": 3 -} diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h b/test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h deleted file mode 100644 index b65cf84d84..0000000000 --- a/test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#ifndef UNINSTALL_APP_TEST_CONFIG_PARSER_H -#define UNINSTALL_APP_TEST_CONFIG_PARSER_H - -#include -#include -#include - -#include "nlohmann/json.hpp" - -namespace OHOS { -namespace AppExecFwk { -const std::string UNINSTALL_TEST_CONFIG_FILE_PATH{"./fms_uninstall_app_test_config.json"}; - -const std::string UNINSTALL_TEST_EXECUTION_TIMES_KEY{"ExecutionTimes"}; -const std::string UNINSTALL_TEST_SLEEP_TIME_KEY{"SleepTime"}; - -struct UninstallAPPTestLevel { - int32_t executionTimesLevel{1}; - int32_t sleepTime{3}; -}; - -class UninstallAPPTestConfigParser { -public: - void ParseForUninstallAPPTest(const std::string &path, UninstallAPPTestLevel &stlevel) - { - std::ifstream jf(path); - if (!jf.is_open()) { - std::cout << "json file can not open!" << std::endl; - return; - } - nlohmann::json jsonObj; - jf >> jsonObj; - const auto &jsonObjEnd = jsonObj.end(); - if (jsonObj.find(UNINSTALL_TEST_EXECUTION_TIMES_KEY) != jsonObjEnd) { - jsonObj.at(UNINSTALL_TEST_EXECUTION_TIMES_KEY).get_to(stlevel.executionTimesLevel); - if (stlevel.executionTimesLevel == 0) { - stlevel.executionTimesLevel = 1; - } - } - - if (jsonObj.find(UNINSTALL_TEST_SLEEP_TIME_KEY) != jsonObjEnd) { - jsonObj.at(UNINSTALL_TEST_SLEEP_TIME_KEY).get_to(stlevel.sleepTime); - } - } -}; -} // namespace AppExecFwk -} // namespace OHOS - -#endif // UNINSTALL_APP_TEST_CONFIG_PARSER_H -- Gitee From 06b87d11200c9b5bd3a583b156fc54042a08bb14 Mon Sep 17 00:00:00 2001 From: "zhaoyuan17@huawei.com" Date: Mon, 18 Oct 2021 15:12:07 +0800 Subject: [PATCH 3/7] fms st patch Signed-off-by: zhaoyuan17@huawei.com --- test/resource/formsystemtestability/BUILD.gn | 3 - .../fmsSystemPerformance/BUILD.gn | 70 -- .../fmsSystemPerformance/config.json | 80 --- .../include/form_ability_performance.h | 98 --- .../src/form_ability_performance.cpp | 373 ----------- .../fmsSystemStress/BUILD.gn | 70 -- .../fmsSystemStress/config.json | 80 --- .../include/form_ability_stress.h | 119 ---- .../src/form_ability_stress.cpp | 630 ------------------ .../fmsSystemTestUninstallApp/BUILD.gn | 70 -- .../fmsSystemTestUninstallApp/config.json | 80 --- .../include/form_ability_uninstall_app.h | 105 --- .../src/form_ability_uninstall_app.cpp | 388 ----------- 13 files changed, 2166 deletions(-) delete mode 100755 test/resource/formsystemtestability/fmsSystemPerformance/BUILD.gn delete mode 100644 test/resource/formsystemtestability/fmsSystemPerformance/config.json delete mode 100644 test/resource/formsystemtestability/fmsSystemPerformance/include/form_ability_performance.h delete mode 100644 test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp delete mode 100755 test/resource/formsystemtestability/fmsSystemStress/BUILD.gn delete mode 100644 test/resource/formsystemtestability/fmsSystemStress/config.json delete mode 100644 test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h delete mode 100644 test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp delete mode 100755 test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn delete mode 100644 test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json delete mode 100644 test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h delete mode 100644 test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp diff --git a/test/resource/formsystemtestability/BUILD.gn b/test/resource/formsystemtestability/BUILD.gn index 9144ad2add..0105b328bb 100644 --- a/test/resource/formsystemtestability/BUILD.gn +++ b/test/resource/formsystemtestability/BUILD.gn @@ -13,8 +13,6 @@ group("fms_system_test_app") { deps = [ - "fmsSystemPerformance:fmsSystemPerformance", - "fmsSystemStress:fmsSystemStress", "fmsSystemTestHostCommonA:fmsSystemTestHostCommonA", "fmsSystemTestHostCommonB:fmsSystemTestHostCommonB", "fmsSystemTestHostNoPerm:fmsSystemTestHostNoPerm", @@ -24,7 +22,6 @@ group("fms_system_test_app") { "fmsSystemTestHostNotSys:fmsSystemTestHostNotSys", "fmsSystemTestSelfStarting/selfStartingTestHostA:selfStartingTestHostA", "fmsSystemTestSelfStarting/selfStartingTestHostB:selfStartingTestHostB", - "fmsSystemTestUninstallApp:fmsSystemTestUninstallApp", "formSystemTestServiceA:formSystemTestServiceA", "formSystemTestServiceB:formSystemTestServiceB", "formSystemTestServiceC:formSystemTestServiceC", diff --git a/test/resource/formsystemtestability/fmsSystemPerformance/BUILD.gn b/test/resource/formsystemtestability/fmsSystemPerformance/BUILD.gn deleted file mode 100755 index 2dabcfa7c3..0000000000 --- a/test/resource/formsystemtestability/fmsSystemPerformance/BUILD.gn +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) 2021 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. -import("//build/ohos.gni") -import("//foundation/appexecfwk/standard/appexecfwk.gni") - -config("fmsSystemPerformanceConfig") { - visibility = [ ":*" ] - include_dirs = [ - "include", - "../tool/include", - "${appexecfwk_path}/test/systemtest/common/fms/common/include", - "${aafwk_path}/interfaces/innerkits/ability_manager/include", - "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", - "${aafwk_path}/services/abilitymgr/include", - "${appexecfwk_path}/common/log/include", - "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", - "${appexecfwk_path}/kits/appkit/native/app", - "${appexecfwk_path}/services/bundlemgr/include", - "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", - "//utils/system/safwk/native/include", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", - "//third_party/jsoncpp/include", - ] - defines = [ - "APP_LOG_TAG = \"formManagerSystemTest\"", - "LOG_DOMAIN = 0xD002666", - ] -} -ohos_shared_library("fmsSystemPerformance") { - sources = [ - "../tool/src/form_test_utils.cpp", - "src/form_ability_performance.cpp", - ] - cflags = [] - if (target_cpu == "arm") { - cflags += [ "-DBINDER_IPC_32BIT" ] - } - configs = [ ":fmsSystemPerformanceConfig" ] - deps = [ - "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", - "${aafwk_path}/interfaces/innerkits/base:base", - "${aafwk_path}/interfaces/innerkits/want:want", - "${appexecfwk_path}/common:libappexecfwk_common", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", - "${appexecfwk_path}/kits:appkit_native", - "${appexecfwk_path}/services/bundlemgr:libbms", - "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", - "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", - "//third_party/jsoncpp:jsoncpp", - "//utils/native/base:utilsbase", - ] - external_deps = [ - "ces_standard:cesfwk_core", - "ces_standard:cesfwk_innerkits", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_core", - ] - subsystem_name = "formsystemtestability" -} diff --git a/test/resource/formsystemtestability/fmsSystemPerformance/config.json b/test/resource/formsystemtestability/fmsSystemPerformance/config.json deleted file mode 100644 index 09e073e97b..0000000000 --- a/test/resource/formsystemtestability/fmsSystemPerformance/config.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "app":{ - "bundleName": "com.ohos.form.manager.performance", - "vendor": "ix", - "version": { - "code": 1, - "name": "1.0" - }, - "apiVersion": { - "compatible": 3, - "target": 3 - } - }, - "deviceConfig": { - "default": { - } - }, - "module": { - "package":"com.ohos.form.manager.performance.FormAbility", - "name":"FormAbility", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "FormAbility", - "moduleType": "entry" - }, - "abilities": [{ - "name": "FormAbilityPerformance", - "icon": "$media:snowball", - "srcLanguage": "c++", - "label": "Form Ability Performance", - "launchType": "standard", - "orientation": "unspecified", - "type": "page", - "visible": true, - "skills": [ - { - "actions": [ - "ohos.aafwk.content.Want.ACTION_HOME" - ], - "entities": [ - "ohos.aafwk.content.Want.ENTITY_HOME" - ], - "attributes": [] - } - ] - }], - "defPermissions": [ - { - "name": "ohos.permission.REQUIRE_FORM", - "grantMode": "system_grant", - "label": "$string:entry_MainAbility", - "description": "REQUIRE_FORM permission in detail" - } - ], - "reqPermissions": [ - { - "name": "ohos.permission.REQUIRE_FORM", - "reason": "fmssystemperformance", - "usedScene": { - "ability": [ - ".MainAbility" - ], - "when": "always" - } - } - ], - "js": [ - { - "name": "formDemo", - "pages": [ - "pages/index/index" - ], - "type": "form" - } - ] - } -} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemPerformance/include/form_ability_performance.h b/test/resource/formsystemtestability/fmsSystemPerformance/include/form_ability_performance.h deleted file mode 100644 index 28cab3f96d..0000000000 --- a/test/resource/formsystemtestability/fmsSystemPerformance/include/form_ability_performance.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -#ifndef _FORM_ABILITY_PERFORMANCE_H_ -#define _FORM_ABILITY_PERFORMANCE_H_ -#include "ability_loader.h" -#include "common_event.h" -#include "common_event_manager.h" -#include -#include -#include - -using std::string; - -namespace OHOS { -namespace AppExecFwk { -typedef bool (*FunctionPtr)(); - -class FormEventSubscriber; -class FormAbilityPerformance : public Ability { -public: - void SubscribeEvent(); - void handleEvent(std::string action, std::string data); - - // Test case list - void FMS_performanceTest_0100(std::string data); - void FMS_performanceTest_0200(std::string data); - void FMS_performanceTest_0300(std::string data); - void FMS_performanceTest_0400(std::string data); - void FMS_performanceTest_0500(std::string data); - void FMS_performanceTest_0600(std::string data); - void FMS_performanceTest_0700(std::string data); - void FMS_performanceTest_1300(std::string data); - void FMS_performanceTest_1400(std::string data); - void FMS_performanceTest_1500(std::string data); - void FMS_performanceTest_1600(std::string data); - - std::shared_ptr subscriber_; - - class PerformanceFormCallback : public FormCallback { - public: - PerformanceFormCallback(std::string name, int code):caseName_(name), code_(code) { } - virtual ~PerformanceFormCallback() = default; - void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; - void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; - void OnFormUninstall(const int64_t formId) const override; - - std::string caseName_ = ""; - int code_ = 0; - FormAbilityPerformance *ability_; - }; -protected: - virtual void Init(const std::shared_ptr &abilityInfo, - const std::shared_ptr &application, std::shared_ptr &handler, - const sptr &token) override; - virtual void OnStart(const Want &want) override; - virtual void OnStop() override; - virtual void OnActive() override; - virtual void OnInactive() override; - virtual void OnBackground() override; -private: - void Clear(); - using FormFunc = void (FormAbilityPerformance::*)(std::string data); - std::map memberFuncMap_; - std::map calledFuncMap_; - std::shared_ptr callback_; -}; - -class FormEventSubscriber : public EventFwk::CommonEventSubscriber { -public: - FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) - { - ability_ = nullptr; - } - ~FormEventSubscriber() - { - ability_ = nullptr; - } - virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; - void KitTerminateAbility(); - - FormAbilityPerformance *ability_; -}; -} // namespace AppExecFwk -} // namespace OHOS -#endif // _FORM_ABILITY_PERFORMANCE_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp b/test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp deleted file mode 100644 index 93f5120367..0000000000 --- a/test/resource/formsystemtestability/fmsSystemPerformance/src/form_ability_performance.cpp +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#include -#include -#include - -#include "form_ability_performance.h" -#include "app_log_wrapper.h" -#include "form_test_utils.h" -#include "form_st_common_info.h" - - -namespace { - using namespace OHOS::AAFwk; - using namespace OHOS::EventFwk; -} - -namespace OHOS { -namespace AppExecFwk { -std::vector eventList = { - FORM_EVENT_REQ_PERFORMANCE_TEST_0100, - FORM_EVENT_REQ_PERFORMANCE_TEST_0200, - FORM_EVENT_REQ_PERFORMANCE_TEST_0300, - FORM_EVENT_REQ_PERFORMANCE_TEST_0400, - FORM_EVENT_REQ_PERFORMANCE_TEST_0500, - FORM_EVENT_REQ_PERFORMANCE_TEST_0600, - FORM_EVENT_REQ_PERFORMANCE_TEST_0700, - FORM_EVENT_REQ_PERFORMANCE_TEST_1300, - FORM_EVENT_REQ_PERFORMANCE_TEST_1400, - FORM_EVENT_REQ_PERFORMANCE_TEST_1500, - FORM_EVENT_REQ_PERFORMANCE_TEST_1600, -}; - -static std::string g_formId = 0; -static std::string g_bundleName = "com.form.formsystemtestservicea"; -static std::string g_moduleName = "formmodule001"; -void FormAbilityPerformance::PerformanceFormCallback::OnAcquired( - const int32_t result, const FormJsInfo &formJsInfo) const -{ - APP_LOGI("%{public}s called", __func__); - APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); - APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); - APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); - APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); - APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); - APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); - APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); - APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", - __func__, formJsInfo.formProviderData.GetDataString().c_str()); - - g_formId = std::to_string(formJsInfo.formId); - - if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0100) { - FormTestUtils::PublishEvent(this->caseName_, 101, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0200) { - FormTestUtils::PublishEvent(this->caseName_, 201, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0300) { - FormTestUtils::PublishEvent(this->caseName_, 301, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0400) { - FormTestUtils::PublishEvent(this->caseName_, 401, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0500) { - FormTestUtils::PublishEvent(this->caseName_, 501, std::to_string(formJsInfo.formId)); - } else { - FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, std::to_string(formJsInfo.formId)); - } -} - -void FormAbilityPerformance::PerformanceFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const -{ - APP_LOGI("%{public}s called", __func__); - APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); - APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); - APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); - APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); - APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); - APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); - APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); - APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", - __func__, formJsInfo.formProviderData.GetDataString().c_str()); - - if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0100) { - FormTestUtils::PublishEvent(this->caseName_, 102, "true"); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0200) { - FormTestUtils::PublishEvent(this->caseName_, 202, "true"); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0300) { - FormTestUtils::PublishEvent(this->caseName_, 302, "true"); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0400) { - FormTestUtils::PublishEvent(this->caseName_, 402, "true"); - } else if (this->caseName_ == FORM_EVENT_RECV_PERFORMANCE_TEST_0500) { - FormTestUtils::PublishEvent(this->caseName_, 502, "true"); - } else { - FormTestUtils::PublishEvent(this->caseName_, this->code_ + 2, "true"); - } -} - -void FormAbilityPerformance::PerformanceFormCallback::OnFormUninstall(const int64_t formId) const -{ - APP_LOGI("%{public}s called", __func__); -} - -void FormAbilityPerformance::FMS_performanceTest_0100(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 100); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_performanceTest_0100] AcquireForm end"); - } else { - APP_LOGE("[FMS_performanceTest_0100] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 100, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_0200(std::string data) -{ - bool bResult = DeleteForm(atoll(g_formId.c_str())); - if (bResult) { - APP_LOGI("[FMS_performanceTest_0200] DeleteForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200, "true"); - } else { - APP_LOGE("[FMS_performanceTest_0200] DeleteForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_0300(std::string data) -{ - bool isReleaseCache = false; - bool bResult = ReleaseForm(atoll(g_formId.c_str()), isReleaseCache); - if (bResult) { - APP_LOGI("[FMS_performanceTest_0300] ReleaseForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300, "true"); - } else { - APP_LOGE("[FMS_performanceTest_0300] ReleaseForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_0400(std::string data) -{ - bool bResult = CastTempForm(atoll(g_formId.c_str())); - if (bResult) { - APP_LOGI("[FMS_performanceTest_0400] CastTempForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400, "true"); - } else { - APP_LOGE("[FMS_performanceTest_0400] CastTempForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_0500(std::string data) -{ - std::vector formIds; - formIds.push_back(atoll(g_formId.c_str())); - bool bResult = NotifyVisibleForms(formIds); - if (bResult) { - APP_LOGI("[FMS_performanceTest_0500] NotifyVisibleForms end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500, "true"); - } else { - APP_LOGE("[FMS_performanceTest_0500] NotifyVisibleForms error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_0600(std::string data) -{ - std::vector formIds; - formIds.push_back(atoll(g_formId.c_str())); - bool bResult = NotifyInvisibleForms(formIds); - if (bResult) { - APP_LOGI("[FMS_performanceTest_0600] NotifyInvisibleForms end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600, "true"); - } else { - APP_LOGE("[FMS_performanceTest_0600] NotifyInvisibleForms error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_0700(std::string data) -{ - bool bResult = RequestForm(atoll(g_formId.c_str())); - if (bResult) { - APP_LOGI("[FMS_performanceTest_0700] RequestForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700, "true"); - } else { - APP_LOGE("[FMS_performanceTest_0700] RequestForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 700, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_1300(std::string data) -{ - std::vector formInfos; - bool bResult = GetAllFormsInfo(formInfos); - if (bResult) { - APP_LOGI("[FMS_performanceTest_1300] GetAllFormsInfo end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300, "true"); - } else { - APP_LOGE("[FMS_performanceTest_1300] GetAllFormsInfo error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_1400(std::string data) -{ - std::vector formInfos; - bool bResult = GetFormsInfoByApp(g_bundleName, formInfos); - if (bResult) { - APP_LOGI("[FMS_performanceTest_1400] GetFormsInfoByApp end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400, "true"); - } else { - APP_LOGE("[FMS_performanceTest_1400] GetFormsInfoByApp error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_1500(std::string data) -{ - std::vector formInfos; - bool bResult = GetFormsInfoByModule(g_bundleName, g_moduleName, formInfos); - if (bResult) { - APP_LOGI("[FMS_performanceTest_1500] GetFormsInfoByModule end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500, "true"); - } else { - APP_LOGE("[FMS_performanceTest_1500] GetFormsInfoByModule error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500, "false"); - } -} - -void FormAbilityPerformance::FMS_performanceTest_1600(std::string data) -{ - bool bResult = CheckFMSReady(); - if (bResult) { - APP_LOGI("[FMS_performanceTest_1600] CheckFMSReady end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600, "true"); - } else { - APP_LOGE("[FMS_performanceTest_1600] CheckFMSReady error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600, "false"); - } -} - -void FormAbilityPerformance::OnStart(const Want &want) -{ - APP_LOGI("FormAbilityPerformance::onStart"); - Ability::OnStart(want); -} - -void FormAbilityPerformance::OnActive() -{ - APP_LOGI("FormAbilityPerformance::OnActive"); - Ability::OnActive(); - std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; - FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); -} - -void FormAbilityPerformance::OnStop() -{ - APP_LOGI("FormAbilityPerformance::OnStop"); - - Ability::OnStop(); - CommonEventManager::UnSubscribeCommonEvent(subscriber_); -} - -void FormAbilityPerformance::OnInactive() -{ - APP_LOGI("FormAbilityPerformance::OnInactive"); - - Ability::OnInactive(); -} - -void FormAbilityPerformance::OnBackground() -{ - APP_LOGI("FormAbilityPerformance::OnBackground"); - - Ability::OnBackground(); -} - -void FormAbilityPerformance::SubscribeEvent() -{ - MatchingSkills matchingSkills; - for (const auto &e : eventList) { - matchingSkills.AddEvent(e); - } - CommonEventSubscribeInfo subscribeInfo(matchingSkills); - subscribeInfo.SetPriority(1); - subscriber_ = std::make_shared(subscribeInfo); - subscriber_->ability_ = this; - CommonEventManager::SubscribeCommonEvent(subscriber_); -} - -// KitTest End -void FormAbilityPerformance::Init(const std::shared_ptr &abilityInfo, - const std::shared_ptr &application, std::shared_ptr &handler, - const sptr &token) -{ - APP_LOGI("FormAbilityPerformance::Init"); - Ability::Init(abilityInfo, application, handler, token); - - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0100] = &FormAbilityPerformance::FMS_performanceTest_0100; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0200] = &FormAbilityPerformance::FMS_performanceTest_0200; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0300] = &FormAbilityPerformance::FMS_performanceTest_0300; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0400] = &FormAbilityPerformance::FMS_performanceTest_0400; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0500] = &FormAbilityPerformance::FMS_performanceTest_0500; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0600] = &FormAbilityPerformance::FMS_performanceTest_0600; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_0700] = &FormAbilityPerformance::FMS_performanceTest_0700; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1300] = &FormAbilityPerformance::FMS_performanceTest_1300; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1400] = &FormAbilityPerformance::FMS_performanceTest_1400; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1500] = &FormAbilityPerformance::FMS_performanceTest_1500; - memberFuncMap_[FORM_EVENT_REQ_PERFORMANCE_TEST_1600] = &FormAbilityPerformance::FMS_performanceTest_1600; - - SubscribeEvent(); -} - -void FormAbilityPerformance::handleEvent(std::string action, std::string data) -{ - APP_LOGI("%{public}s called", __func__); - if (calledFuncMap_.find(action) != calledFuncMap_.end()) { - return; - } - calledFuncMap_.emplace(action, 0); - auto itFunc = memberFuncMap_.find(action); - if (itFunc != memberFuncMap_.end()) { - auto memberFunc = itFunc->second; - if (memberFunc != nullptr) { - return (this->*memberFunc)(data); - } - } -} - -void FormAbilityPerformance::Clear() -{ -} - -void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) -{ - APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s, code=%{public}d, data=%{public}s", - data.GetWant().GetAction().c_str(), data.GetCode(), data.GetData().c_str()); - auto eventName = data.GetWant().GetAction(); - ability_->handleEvent(eventName, data.GetData()); - CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); -} - -void FormEventSubscriber::KitTerminateAbility() -{ - if (ability_ != nullptr) { - ability_->TerminateAbility(); - } -} - -REGISTER_AA(FormAbilityPerformance) -} // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemStress/BUILD.gn b/test/resource/formsystemtestability/fmsSystemStress/BUILD.gn deleted file mode 100755 index de3f0bad09..0000000000 --- a/test/resource/formsystemtestability/fmsSystemStress/BUILD.gn +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) 2021 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. -import("//build/ohos.gni") -import("//foundation/appexecfwk/standard/appexecfwk.gni") - -config("fmsSystemStressConfig") { - visibility = [ ":*" ] - include_dirs = [ - "include", - "../tool/include", - "${appexecfwk_path}/test/systemtest/common/fms/common/include", - "${aafwk_path}/interfaces/innerkits/ability_manager/include", - "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", - "${aafwk_path}/services/abilitymgr/include", - "${appexecfwk_path}/common/log/include", - "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", - "${appexecfwk_path}/kits/appkit/native/app", - "${appexecfwk_path}/services/bundlemgr/include", - "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", - "//utils/system/safwk/native/include", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", - "//third_party/jsoncpp/include", - ] - defines = [ - "APP_LOG_TAG = \"formManagerSystemTest\"", - "LOG_DOMAIN = 0xD002666", - ] -} -ohos_shared_library("fmsSystemStress") { - sources = [ - "../tool/src/form_test_utils.cpp", - "src/form_ability_stress.cpp", - ] - cflags = [] - if (target_cpu == "arm") { - cflags += [ "-DBINDER_IPC_32BIT" ] - } - configs = [ ":fmsSystemStressConfig" ] - deps = [ - "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", - "${aafwk_path}/interfaces/innerkits/base:base", - "${aafwk_path}/interfaces/innerkits/want:want", - "${appexecfwk_path}/common:libappexecfwk_common", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", - "${appexecfwk_path}/kits:appkit_native", - "${appexecfwk_path}/services/bundlemgr:libbms", - "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", - "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", - "//third_party/jsoncpp:jsoncpp", - "//utils/native/base:utilsbase", - ] - external_deps = [ - "ces_standard:cesfwk_core", - "ces_standard:cesfwk_innerkits", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_core", - ] - subsystem_name = "formsystemtestability" -} diff --git a/test/resource/formsystemtestability/fmsSystemStress/config.json b/test/resource/formsystemtestability/fmsSystemStress/config.json deleted file mode 100644 index 8124df3ddc..0000000000 --- a/test/resource/formsystemtestability/fmsSystemStress/config.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "app":{ - "bundleName": "com.ohos.form.manager.stress", - "vendor": "ix", - "version": { - "code": 1, - "name": "1.0" - }, - "apiVersion": { - "compatible": 3, - "target": 3 - } - }, - "deviceConfig": { - "default": { - } - }, - "module": { - "package":"com.ohos.form.manager.stress.FormAbility", - "name":"FormAbility", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "FormAbility", - "moduleType": "entry" - }, - "abilities": [{ - "name": "FormAbilityStress", - "icon": "$media:snowball", - "srcLanguage": "c++", - "label": "Form Ability Stress", - "launchType": "standard", - "orientation": "unspecified", - "type": "page", - "visible": true, - "skills": [ - { - "actions": [ - "ohos.aafwk.content.Want.ACTION_HOME" - ], - "entities": [ - "ohos.aafwk.content.Want.ENTITY_HOME" - ], - "attributes": [] - } - ] - }], - "defPermissions": [ - { - "name": "ohos.permission.REQUIRE_FORM", - "grantMode": "system_grant", - "label": "$string:entry_MainAbility", - "description": "REQUIRE_FORM permission in detail" - } - ], - "reqPermissions": [ - { - "name": "ohos.permission.REQUIRE_FORM", - "reason": "fmsstresstest", - "usedScene": { - "ability": [ - ".MainAbility" - ], - "when": "always" - } - } - ], - "js": [ - { - "name": "formDemo", - "pages": [ - "pages/index/index" - ], - "type": "form" - } - ] - } -} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h b/test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h deleted file mode 100644 index 7e1d2dd3d3..0000000000 --- a/test/resource/formsystemtestability/fmsSystemStress/include/form_ability_stress.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -#ifndef _FORM_ABILITY_STRESS_H_ -#define _FORM_ABILITY_STRESS_H_ -#include "ability_loader.h" -#include "common_event.h" -#include "common_event_manager.h" -#include -#include -#include - -using std::string; - -namespace OHOS { -namespace AppExecFwk { -typedef bool (*FunctionPtr)(); - -class FormEventSubscriber; -class FormAbilityStress : public Ability { -public: - void SubscribeEvent(); - void handleEvent(std::string action, std::string data); - - // Test case list - void FMS_stressTest_0100(std::string data); - void FMS_stressTest_0100_sub01(std::string form_id); - void FMS_stressTest_0200(std::string data); - void FMS_stressTest_0200_sub01(std::string form_id); - void FMS_stressTest_0200_sub02(std::string form_id); - void FMS_stressTest_0200_sub03(std::string form_id); - void FMS_stressTest_0300(std::string data); - void FMS_stressTest_0300_sub01(std::string form_id); - void FMS_stressTest_0300_sub02(std::string form_id); - void FMS_stressTest_0400(std::string data); - void FMS_stressTest_0500(std::string data); - void FMS_stressTest_0600(std::string data); - void FMS_stressTest_0700(std::string data); - void FMS_stressTest_0800(std::string data); - void FMS_stressTest_0900(std::string data); - void FMS_stressTest_1000(std::string data); - void FMS_stressTest_1100(std::string data); - void FMS_stressTest_1100_sub01(std::string form_id); - void FMS_stressTest_1100_sub02(std::string form_id); - void FMS_stressTest_1100_sub03(std::string form_id); - void FMS_stressTest_1200(std::string data); - void FMS_stressTest_1300(std::string data); - void FMS_stressTest_1300_sub01(std::string form_id); - void FMS_stressTest_1300_sub02(std::string form_id); - void FMS_stressTest_1300_sub03(std::string form_id); - void FMS_stressTest_1400(std::string data); - void FMS_stressTest_1500(std::string data); - void FMS_stressTest_1600(std::string data); - void FMS_stressTest_1700(std::string data); - void FMS_stressTest_1700_sub01(std::string data); - void FMS_stressTest_1700_sub02(std::string data); - void FMS_stressTest_1800(std::string data); - - std::shared_ptr subscriber_; - - class StressFormCallback : public FormCallback { - public: - StressFormCallback(std::string name, int code):caseName_(name), code_(code) { } - virtual ~StressFormCallback() = default; - void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; - void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; - void OnFormUninstall(const int64_t formId) const override; - - std::string caseName_ = ""; - int code_ = 0; - FormAbilityStress *ability_; - }; -protected: - virtual void Init(const std::shared_ptr &abilityInfo, - const std::shared_ptr &application, std::shared_ptr &handler, - const sptr &token) override; - virtual void OnStart(const Want &want) override; - virtual void OnStop() override; - virtual void OnActive() override; - virtual void OnInactive() override; - virtual void OnBackground() override; -private: - void Clear(); - using FormFunc = void (FormAbilityStress::*)(std::string data); - std::map memberFuncMap_; - std::map calledFuncMap_; - std::shared_ptr callback_; -}; - -class FormEventSubscriber : public EventFwk::CommonEventSubscriber { -public: - FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) - { - ability_ = nullptr; - } - ~FormEventSubscriber() - { - ability_ = nullptr; - } - virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; - void KitTerminateAbility(); - - FormAbilityStress *ability_; -}; -} // namespace AppExecFwk -} // namespace OHOS -#endif // _FORM_ABILITY_STRESS_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp b/test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp deleted file mode 100644 index e4c2aa860e..0000000000 --- a/test/resource/formsystemtestability/fmsSystemStress/src/form_ability_stress.cpp +++ /dev/null @@ -1,630 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#include -#include -#include - -#include "app_log_wrapper.h" -#include "form_ability_stress.h" -#include "form_st_common_info.h" -#include "form_test_utils.h" - -namespace { - using namespace OHOS::AAFwk; - using namespace OHOS::EventFwk; -} - -namespace OHOS { -namespace AppExecFwk { -std::vector eventList = { - FORM_EVENT_REQ_STRESS_TEST_0100, FORM_EVENT_REQ_STRESS_TEST_0100_01, FORM_EVENT_REQ_STRESS_TEST_0200, - FORM_EVENT_REQ_STRESS_TEST_0200_01, FORM_EVENT_REQ_STRESS_TEST_0200_02, FORM_EVENT_REQ_STRESS_TEST_0200_03, - FORM_EVENT_REQ_STRESS_TEST_0300, FORM_EVENT_REQ_STRESS_TEST_0300_01, FORM_EVENT_REQ_STRESS_TEST_0300_02, - FORM_EVENT_REQ_STRESS_TEST_0400, FORM_EVENT_REQ_STRESS_TEST_0500, - FORM_EVENT_REQ_STRESS_TEST_1100, FORM_EVENT_REQ_STRESS_TEST_1100_01, FORM_EVENT_REQ_STRESS_TEST_1100_02, - FORM_EVENT_REQ_STRESS_TEST_1100_03, FORM_EVENT_REQ_STRESS_TEST_1300, FORM_EVENT_REQ_STRESS_TEST_1300_01, - FORM_EVENT_REQ_STRESS_TEST_1300_02, FORM_EVENT_REQ_STRESS_TEST_1300_03, - FORM_EVENT_REQ_STRESS_TEST_1700, FORM_EVENT_REQ_STRESS_TEST_1700_01, FORM_EVENT_REQ_STRESS_TEST_1700_02, - FORM_EVENT_REQ_STRESS_TEST_1800, -}; - -static std::string g_bundleName = "com.form.formsystemtestservicea"; -static std::string g_moduleName = "formmodule001"; -void FormAbilityStress::StressFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const -{ - APP_LOGI("%{public}s called", __func__); - APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); - APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); - APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); - APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); - APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); - APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); - APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); - APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", - __func__, formJsInfo.formProviderData.GetDataString().c_str()); - - APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); - - if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0100) { - FormTestUtils::PublishEvent(this->caseName_, 101, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0200) { - FormTestUtils::PublishEvent(this->caseName_, 201, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0200_02) { - FormTestUtils::PublishEvent(this->caseName_, 204, "true"); - ability_->FMS_stressTest_0200_sub03(std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0300) { - FormTestUtils::PublishEvent(this->caseName_, 301, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0400) { - FormTestUtils::PublishEvent(this->caseName_, 401, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1100) { - FormTestUtils::PublishEvent(this->caseName_, 1101, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1300) { - FormTestUtils::PublishEvent(this->caseName_, 1301, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1700) { - FormTestUtils::PublishEvent(this->caseName_, 1701, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1800) { - FormTestUtils::PublishEvent(this->caseName_, 1801, std::to_string(formJsInfo.formId)); - } else { - FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, std::to_string(formJsInfo.formId)); - } -} - -void FormAbilityStress::StressFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const -{ - APP_LOGI("%{public}s called", __func__); - APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); - APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); - APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); - APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); - APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); - APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); - APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); - APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", - __func__, formJsInfo.formProviderData.GetDataString().c_str()); - - APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); - - if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0100) { - FormTestUtils::PublishEvent(this->caseName_, 102, "true"); - ability_->FMS_stressTest_0100_sub01(std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0200) { - FormTestUtils::PublishEvent(this->caseName_, 202, "true"); - ability_->FMS_stressTest_0200_sub01(std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0300) { - FormTestUtils::PublishEvent(this->caseName_, 302, "true"); - ability_->FMS_stressTest_0300_sub01(std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_0400) { - FormTestUtils::PublishEvent(this->caseName_, 402, "true"); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1100) { - FormTestUtils::PublishEvent(this->caseName_, 1102, "true"); - ability_->FMS_stressTest_1100_sub01(std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1300) { - FormTestUtils::PublishEvent(this->caseName_, 1302, "true"); - ability_->FMS_stressTest_1300_sub01(std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1700) { - FormTestUtils::PublishEvent(this->caseName_, 1702, "true"); - } else if (this->caseName_ == FORM_EVENT_RECV_STRESS_TEST_1800) { - FormTestUtils::PublishEvent(this->caseName_, 1802, "true"); - } else { - FormTestUtils::PublishEvent(this->caseName_, this->code_ + 2, "true"); - } -} - -void FormAbilityStress::StressFormCallback::OnFormUninstall(const int64_t formId) const -{ - APP_LOGI("%{public}s called", __func__); -} - -void FormAbilityStress::FMS_stressTest_0100(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0100, 100); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_stressTest_0100] AcquireForm end"); - } else { - APP_LOGE("[FMS_stressTest_0100] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0100, 100, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_0100_sub01(std::string form_id) -{ - bool bResult = DeleteForm(atoll(form_id.c_str())); - if (bResult) { - APP_LOGI("[FMS_stressTest_0100] DeleteForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0100_01, 103, "true"); - } else { - APP_LOGE("[FMS_stressTest_0100] DeleteForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0100_01, 103, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_0200(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0200, 200); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_stressTest_0200] AcquireForm end"); - } else { - APP_LOGE("[FMS_stressTest_0200] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200, 200, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_0200_sub01(std::string form_id) -{ - bool isReleaseCache = false; - bool bResult = ReleaseForm(atoll(form_id.c_str()), isReleaseCache); - if (bResult) { - APP_LOGI("[FMS_stressTest_0200] ReleaseForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_01, 203, "true"); - } else { - APP_LOGE("[FMS_stressTest_0200] ReleaseForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_01, 203, "false"); - } - - FormAbilityStress::FMS_stressTest_0200_sub02(form_id); -} - -void FormAbilityStress::FMS_stressTest_0200_sub02(std::string form_id) -{ - sleep(3); - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0200_02, 204); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(atoll(form_id.c_str()), want, callback); - if (bResult) { - APP_LOGI("[FMS_stressTest_0200] AcquireForm sub02 end"); - } else { - APP_LOGE("[FMS_stressTest_0200] AcquireForm sub02 error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_02, 204, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_0200_sub03(std::string form_id) -{ - bool bResult = DeleteForm(atoll(form_id.c_str())); - if (bResult) { - APP_LOGI("[FMS_stressTest_0200] DeleteForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_03, 205, "true"); - } else { - APP_LOGE("[FMS_stressTest_0200] DeleteForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0200_03, 205, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_0300(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_STRESS_TEST_0300, 300); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_stressTest_0300] AcquireForm end"); - } else { - APP_LOGE("[FMS_stressTest_0300] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300, 300, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_0300_sub01(std::string form_id) -{ - bool bResult = CastTempForm(atoll(form_id.c_str())); - if (bResult) { - APP_LOGI("[FMS_stressTest_0300] CastTempForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_01, 303, "true"); - } else { - APP_LOGE("[FMS_stressTest_0300] CastTempForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_01, 303, "false"); - } - - FormAbilityStress::FMS_stressTest_0300_sub02(form_id); -} - -void FormAbilityStress::FMS_stressTest_0300_sub02(std::string form_id) -{ - bool bResult = DeleteForm(atoll(form_id.c_str())); - if (bResult) { - APP_LOGI("[FMS_stressTest_0300] DeleteForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_02, 304, "true"); - } else { - APP_LOGE("[FMS_stressTest_0300] DeleteForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_0300_02, 304, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_0400(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_0500(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_0600(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_0700(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_1000(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_1100(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_STRESS_TEST_1100, 1100); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_stressTest_1100] AcquireForm end"); - } else { - APP_LOGE("[FMS_stressTest_1100] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100, 1100, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_1100_sub01(std::string form_id) -{ - std::vector formIds; - formIds.push_back(atoll(form_id.c_str())); - bool bResult = NotifyInvisibleForms(formIds); - if (bResult) { - APP_LOGI("[FMS_stressTest_1100] NotifyInvisibleForms end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103, "true"); - } else { - APP_LOGE("[FMS_stressTest_1100] NotifyInvisibleForms error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103, "false"); - } - - FormAbilityStress::FMS_stressTest_1100_sub02(form_id); -} - -void FormAbilityStress::FMS_stressTest_1100_sub02(std::string form_id) -{ - std::vector formIds; - formIds.push_back(atoll(form_id.c_str())); - bool bResult = NotifyVisibleForms(formIds); - if (bResult) { - APP_LOGI("[FMS_stressTest_1100] NotifyVisibleForms end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104, "true"); - } else { - APP_LOGE("[FMS_stressTest_1100] NotifyVisibleForms error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104, "false"); - } - - FormAbilityStress::FMS_stressTest_1100_sub03(form_id); -} - -void FormAbilityStress::FMS_stressTest_1100_sub03(std::string form_id) -{ - bool bResult = DeleteForm(atoll(form_id.c_str())); - if (bResult) { - APP_LOGI("[FMS_stressTest_1100] DeleteForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105, "true"); - } else { - APP_LOGE("[FMS_stressTest_1100] DeleteForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_1200(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_1300(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_STRESS_TEST_1300, 1300); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_stressTest_1300] AcquireForm end"); - } else { - APP_LOGE("[FMS_stressTest_1300] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300, 1300, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_1300_sub01(std::string form_id) -{ - std::vector formIds; - formIds.push_back(atoll(form_id.c_str())); - bool bResult = EnableUpdateForm(formIds); - if (bResult) { - APP_LOGI("[FMS_stressTest_1300] EnableUpdateForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303, "true"); - } else { - APP_LOGE("[FMS_stressTest_1300] EnableUpdateForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303, "false"); - } - - FormAbilityStress::FMS_stressTest_1300_sub02(form_id); -} - -void FormAbilityStress::FMS_stressTest_1300_sub02(std::string form_id) -{ - std::vector formIds; - formIds.push_back(atoll(form_id.c_str())); - bool bResult = DisableUpdateForm(formIds); - if (bResult) { - APP_LOGI("[FMS_stressTest_1300] DisableUpdateForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304, "true"); - } else { - APP_LOGE("[FMS_stressTest_1300] DisableUpdateForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304, "false"); - } - - FormAbilityStress::FMS_stressTest_1300_sub03(form_id); -} - -void FormAbilityStress::FMS_stressTest_1300_sub03(std::string form_id) -{ - bool bResult = DeleteForm(atoll(form_id.c_str())); - if (bResult) { - APP_LOGI("[FMS_stressTest_1300] DeleteForm end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305, "true"); - } else { - APP_LOGE("[FMS_stressTest_1300] DeleteForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_1400(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_1500(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_1600(std::string data) -{ -} - -void FormAbilityStress::FMS_stressTest_1700(std::string data) -{ - std::vector formInfos; - bool bResult = GetAllFormsInfo(formInfos); - if (bResult) { - APP_LOGI("[FMS_stressTest_1700] GetAllFormsInfo end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700, 1700, "true"); - } else { - APP_LOGE("[FMS_stressTest_1700] GetAllFormsInfo error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700, 1700, "false"); - } - - FormAbilityStress::FMS_stressTest_1700_sub01(data); -} - -void FormAbilityStress::FMS_stressTest_1700_sub01(std::string data) -{ - std::vector formInfos; - bool bResult = GetFormsInfoByApp(g_bundleName, formInfos); - if (bResult) { - APP_LOGI("[FMS_stressTest_1700] GetFormsInfoByApp end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701, "true"); - } else { - APP_LOGE("[FMS_stressTest_1700] GetFormsInfoByApp error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701, "false"); - } - - FormAbilityStress::FMS_stressTest_1700_sub02(data); -} - -void FormAbilityStress::FMS_stressTest_1700_sub02(std::string data) -{ - std::vector formInfos; - bool bResult = GetFormsInfoByModule(g_bundleName, g_moduleName, formInfos); - if (bResult) { - APP_LOGI("[FMS_stressTest_1700] GetFormsInfoByModule end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702, "true"); - } else { - APP_LOGE("[FMS_stressTest_1700] GetFormsInfoByModule error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702, "false"); - } -} - -void FormAbilityStress::FMS_stressTest_1800(std::string data) -{ - bool bResult = CheckFMSReady(); - if (bResult) { - APP_LOGI("[FMS_stressTest_1800] CheckFMSReady end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1800, 1800, "true"); - } else { - APP_LOGE("[FMS_stressTest_1800] CheckFMSReady error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_STRESS_TEST_1800, 1800, "false"); - } -} - -void FormAbilityStress::OnStart(const Want &want) -{ - APP_LOGI("FormAbilityStress::onStart"); - Ability::OnStart(want); -} - -void FormAbilityStress::OnActive() -{ - APP_LOGI("FormAbilityStress::OnActive"); - Ability::OnActive(); - std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; - FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); -} - -void FormAbilityStress::OnStop() -{ - APP_LOGI("FormAbilityStress::OnStop"); - - Ability::OnStop(); - CommonEventManager::UnSubscribeCommonEvent(subscriber_); -} - -void FormAbilityStress::OnInactive() -{ - APP_LOGI("FormAbilityStress::OnInactive"); - - Ability::OnInactive(); -} - -void FormAbilityStress::OnBackground() -{ - APP_LOGI("FormAbilityStress::OnBackground"); - - Ability::OnBackground(); -} - -void FormAbilityStress::SubscribeEvent() -{ - APP_LOGI("FormAbilityStress::SubscribeEvent"); - MatchingSkills matchingSkills; - for (const auto &e : eventList) { - matchingSkills.AddEvent(e); - } - CommonEventSubscribeInfo subscribeInfo(matchingSkills); - subscribeInfo.SetPriority(1); - subscriber_ = std::make_shared(subscribeInfo); - subscriber_->ability_ = this; - CommonEventManager::SubscribeCommonEvent(subscriber_); -} - -// KitTest End -void FormAbilityStress::Init(const std::shared_ptr &abilityInfo, - const std::shared_ptr &application, std::shared_ptr &handler, - const sptr &token) -{ - APP_LOGI("FormAbilityStress::Init"); - Ability::Init(abilityInfo, application, handler, token); - - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0100] = &FormAbilityStress::FMS_stressTest_0100; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0100_01] = &FormAbilityStress::FMS_stressTest_0100_sub01; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200] = &FormAbilityStress::FMS_stressTest_0200; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200_01] = &FormAbilityStress::FMS_stressTest_0200_sub01; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200_02] = &FormAbilityStress::FMS_stressTest_0200_sub02; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0200_03] = &FormAbilityStress::FMS_stressTest_0200_sub03; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0300] = &FormAbilityStress::FMS_stressTest_0300; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0300_01] = &FormAbilityStress::FMS_stressTest_0300_sub01; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0300_02] = &FormAbilityStress::FMS_stressTest_0300_sub02; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0400] = &FormAbilityStress::FMS_stressTest_0400; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_0500] = &FormAbilityStress::FMS_stressTest_0500; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100] = &FormAbilityStress::FMS_stressTest_1100; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100_01] = &FormAbilityStress::FMS_stressTest_1100_sub01; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100_02] = &FormAbilityStress::FMS_stressTest_1100_sub02; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1100_03] = &FormAbilityStress::FMS_stressTest_1100_sub03; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300] = &FormAbilityStress::FMS_stressTest_1300; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300_01] = &FormAbilityStress::FMS_stressTest_1300_sub01; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300_02] = &FormAbilityStress::FMS_stressTest_1300_sub02; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1300_03] = &FormAbilityStress::FMS_stressTest_1300_sub03; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1700] = &FormAbilityStress::FMS_stressTest_1700; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1700_01] = &FormAbilityStress::FMS_stressTest_1700_sub01; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1700_02] = &FormAbilityStress::FMS_stressTest_1700_sub02; - memberFuncMap_[FORM_EVENT_REQ_STRESS_TEST_1800] = &FormAbilityStress::FMS_stressTest_1800; - - SubscribeEvent(); -} - -void FormAbilityStress::handleEvent(std::string action, std::string data) -{ - APP_LOGI("%{public}s called", __func__); - if (calledFuncMap_.find(action) != calledFuncMap_.end()) { - return; - } - calledFuncMap_.emplace(action, 0); - auto itFunc = memberFuncMap_.find(action); - if (itFunc != memberFuncMap_.end()) { - auto memberFunc = itFunc->second; - if (memberFunc != nullptr) { - return (this->*memberFunc)(data); - } - } -} - -void FormAbilityStress::Clear() -{ -} - -void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) -{ - APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s, code=%{public}d, data=%{public}s", - data.GetWant().GetAction().c_str(), data.GetCode(), data.GetData().c_str()); - auto eventName = data.GetWant().GetAction(); - ability_->handleEvent(eventName, data.GetData()); - CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); -} - -void FormEventSubscriber::KitTerminateAbility() -{ - if (ability_ != nullptr) { - ability_->TerminateAbility(); - } -} - -REGISTER_AA(FormAbilityStress) -} // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn deleted file mode 100755 index 8f79639ac6..0000000000 --- a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/BUILD.gn +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) 2021 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. -import("//build/ohos.gni") -import("//foundation/appexecfwk/standard/appexecfwk.gni") - -config("fmsSystemTestUninstallAppConfig") { - visibility = [ ":*" ] - include_dirs = [ - "include", - "../tool/include", - "${appexecfwk_path}/test/systemtest/common/fms/common/include", - "${aafwk_path}/interfaces/innerkits/ability_manager/include", - "${aafwk_path}/interfaces/innerkits/want/include/ohos/aafwk/content", - "${aafwk_path}/services/abilitymgr/include", - "${appexecfwk_path}/common/log/include", - "${appexecfwk_path}/interfaces/innerkits/libeventhandler/include", - "${appexecfwk_path}/kits/appkit/native/app", - "${appexecfwk_path}/services/bundlemgr/include", - "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr/include", - "//utils/system/safwk/native/include", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core/include/appmgr", - "//third_party/jsoncpp/include", - ] - defines = [ - "APP_LOG_TAG = \"formManagerSystemTest\"", - "LOG_DOMAIN = 0xD002666", - ] -} -ohos_shared_library("fmsSystemTestUninstallApp") { - sources = [ - "../tool/src/form_test_utils.cpp", - "src/form_ability_uninstall_app.cpp", - ] - cflags = [] - if (target_cpu == "arm") { - cflags += [ "-DBINDER_IPC_32BIT" ] - } - configs = [ ":fmsSystemTestUninstallAppConfig" ] - deps = [ - "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", - "${aafwk_path}/interfaces/innerkits/base:base", - "${aafwk_path}/interfaces/innerkits/want:want", - "${appexecfwk_path}/common:libappexecfwk_common", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", - "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", - "${appexecfwk_path}/kits:appkit_native", - "${appexecfwk_path}/services/bundlemgr:libbms", - "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", - "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", - "//third_party/jsoncpp:jsoncpp", - "//utils/native/base:utilsbase", - ] - external_deps = [ - "ces_standard:cesfwk_core", - "ces_standard:cesfwk_innerkits", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_core", - ] - subsystem_name = "formsystemtestability" -} diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json deleted file mode 100644 index e3d8e51a72..0000000000 --- a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/config.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "app":{ - "bundleName": "com.ohos.form.manager.Uninstall", - "vendor": "ix", - "version": { - "code": 1, - "name": "1.0" - }, - "apiVersion": { - "compatible": 3, - "target": 3 - } - }, - "deviceConfig": { - "default": { - } - }, - "module": { - "package":"com.ohos.form.manager.Uninstall.FormAbility", - "name":"FormAbility", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "FormAbility", - "moduleType": "entry" - }, - "abilities": [{ - "name": "FormAbilityUninstallApp", - "icon": "$media:snowball", - "srcLanguage": "c++", - "label": "Form Ability Uninstall App", - "launchType": "standard", - "orientation": "unspecified", - "type": "page", - "visible": true, - "skills": [ - { - "actions": [ - "ohos.aafwk.content.Want.ACTION_HOME" - ], - "entities": [ - "ohos.aafwk.content.Want.ENTITY_HOME" - ], - "attributes": [] - } - ] - }], - "defPermissions": [ - { - "name": "ohos.permission.REQUIRE_FORM", - "grantMode": "system_grant", - "label": "$string:entry_MainAbility", - "description": "REQUIRE_FORM permission in detail" - } - ], - "reqPermissions": [ - { - "name": "ohos.permission.REQUIRE_FORM", - "reason": "fmsstresstest", - "usedScene": { - "ability": [ - ".MainAbility" - ], - "when": "always" - } - } - ], - "js": [ - { - "name": "formDemo", - "pages": [ - "pages/index/index" - ], - "type": "form" - } - ] - } -} \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h deleted file mode 100644 index 34626d10c3..0000000000 --- a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/include/form_ability_uninstall_app.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -#ifndef _FORM_ABILITY_UNINSTALL_APP_H_ -#define _FORM_ABILITY_UNINSTALL_APP_H_ -#include "ability_loader.h" -#include "common_event.h" -#include "common_event_manager.h" -#include -#include -#include - -using std::string; - -namespace OHOS { -namespace AppExecFwk { -typedef bool (*FunctionPtr)(); - -class FormEventSubscriber; -class FormAbilityUninstallApp : public Ability { -public: - void SubscribeEvent(); - void handleEvent(std::string action, std::string data); - - // Test case list - void FMS_uninstallTest_0100(std::string data); - void FMS_uninstallTest_0200(std::string data); - void FMS_uninstallTest_0300(std::string data); - void FMS_uninstallTest_0400(std::string data); - void FMS_uninstallTest_0500(std::string data); - void FMS_uninstallTest_0600(std::string data); - void FMS_uninstallTest_0700(std::string data); - void FMS_uninstallTest_0800(std::string data); - void FMS_uninstallTest_0900(std::string data); - void FMS_uninstallTest_1000(std::string data); - void FMS_uninstallTest_1100(std::string data); - void FMS_uninstallTest_1200(std::string data); - void FMS_uninstallTest_1300(std::string data); - void FMS_uninstallTest_1400(std::string data); - void FMS_uninstallTest_1500(std::string data); - void FMS_uninstallTest_1600(std::string data); - void FMS_uninstallTest_1700(std::string data); - void FMS_uninstallTest_1800(std::string data); - - std::shared_ptr subscriber_; - - class UninstallAppFormCallback : public FormCallback { - public: - UninstallAppFormCallback(std::string name, int code):caseName_(name), code_(code) { } - virtual ~UninstallAppFormCallback() = default; - void OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const override; - void OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const override; - void OnFormUninstall(const int64_t formId) const override; - - std::string caseName_ = ""; - int code_ = 0; - FormAbilityUninstallApp *ability_; - }; -protected: - virtual void Init(const std::shared_ptr &abilityInfo, - const std::shared_ptr &application, std::shared_ptr &handler, - const sptr &token) override; - virtual void OnStart(const Want &want) override; - virtual void OnStop() override; - virtual void OnActive() override; - virtual void OnInactive() override; - virtual void OnBackground() override; -private: - void Clear(); - using FormFunc = void (FormAbilityUninstallApp::*)(std::string data); - std::map memberFuncMap_; - std::map calledFuncMap_; - std::shared_ptr callback_; -}; - -class FormEventSubscriber : public EventFwk::CommonEventSubscriber { -public: - FormEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) - { - ability_ = nullptr; - } - ~FormEventSubscriber() - { - ability_ = nullptr; - } - virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; - void KitTerminateAbility(); - - FormAbilityUninstallApp *ability_; -}; -} // namespace AppExecFwk -} // namespace OHOS -#endif // _FORM_ABILITY_UNINSTALL_APP_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp b/test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp deleted file mode 100644 index a0784dce6c..0000000000 --- a/test/resource/formsystemtestability/fmsSystemTestUninstallApp/src/form_ability_uninstall_app.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#include -#include -#include - -#include "app_log_wrapper.h" -#include "form_ability_uninstall_app.h" -#include "form_st_common_info.h" -#include "form_test_utils.h" - -namespace { - using namespace OHOS::AAFwk; - using namespace OHOS::EventFwk; -} - -namespace OHOS { -namespace AppExecFwk { -std::vector eventList = { - FORM_EVENT_REQ_UNINSTALL_TEST_0100, FORM_EVENT_REQ_UNINSTALL_TEST_0200, FORM_EVENT_REQ_UNINSTALL_TEST_0300, - FORM_EVENT_REQ_UNINSTALL_TEST_0400, FORM_EVENT_REQ_UNINSTALL_TEST_0500, FORM_EVENT_REQ_UNINSTALL_TEST_0600, - FORM_EVENT_REQ_UNINSTALL_TEST_0700, FORM_EVENT_REQ_UNINSTALL_TEST_0800, FORM_EVENT_REQ_UNINSTALL_TEST_0900, - FORM_EVENT_REQ_UNINSTALL_TEST_1000, FORM_EVENT_REQ_UNINSTALL_TEST_1100, FORM_EVENT_REQ_UNINSTALL_TEST_1200, - FORM_EVENT_REQ_UNINSTALL_TEST_1300, FORM_EVENT_REQ_UNINSTALL_TEST_1400, FORM_EVENT_REQ_UNINSTALL_TEST_1500, - FORM_EVENT_REQ_UNINSTALL_TEST_1600, FORM_EVENT_REQ_UNINSTALL_TEST_1700, FORM_EVENT_REQ_UNINSTALL_TEST_1800, -}; - -static std::string g_bundleName = "com.form.formsystemtestservicea"; -static std::string g_moduleName = "formmodule001"; -void FormAbilityUninstallApp::UninstallAppFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const -{ - APP_LOGI("%{public}s called", __func__); - APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); - APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); - APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); - APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); - APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); - APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); - APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); - APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", - __func__, formJsInfo.formProviderData.GetDataString().c_str()); - - APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); - - if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0100) { - FormTestUtils::PublishEvent(this->caseName_, 101, std::to_string(formJsInfo.formId)); - } else if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0200) { - FormTestUtils::PublishEvent(this->caseName_, 201, std::to_string(formJsInfo.formId)); - } else { - FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, std::to_string(formJsInfo.formId)); - } -} - -void FormAbilityUninstallApp::UninstallAppFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const -{ - APP_LOGI("%{public}s called", __func__); - APP_LOGI("%{public}s formId: %{public}s", __func__, std::to_string(formJsInfo.formId).c_str()); - APP_LOGI("%{public}s bundleName: %{public}s", __func__, formJsInfo.bundleName.c_str()); - APP_LOGI("%{public}s abilityName: %{public}s", __func__, formJsInfo.abilityName.c_str()); - APP_LOGI("%{public}s formName: %{public}s", __func__, formJsInfo.formName.c_str()); - APP_LOGI("%{public}s formTempFlg: %{public}d", __func__, formJsInfo.formTempFlg); - APP_LOGI("%{public}s jsFormCodePath: %{public}s", __func__, formJsInfo.jsFormCodePath.c_str()); - APP_LOGI("%{public}s formData: %{public}s", __func__, formJsInfo.formData.c_str()); - APP_LOGI("%{public}s formProviderData GetDataString: %{public}s", - __func__, formJsInfo.formProviderData.GetDataString().c_str()); - - APP_LOGI("%{public}s caseName_: %{public}s, code_: %{public}d", __func__, this->caseName_.c_str(), this->code_); - - if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0100) { - FormTestUtils::PublishEvent(this->caseName_, 102, "true"); - } else if (this->caseName_ == FORM_EVENT_RECV_UNINSTALL_TEST_0200) { - FormTestUtils::PublishEvent(this->caseName_, 202, "true"); - } else { - FormTestUtils::PublishEvent(this->caseName_, this->code_ + 2, "true"); - } -} - -void FormAbilityUninstallApp::UninstallAppFormCallback::OnFormUninstall(const int64_t formId) const -{ - APP_LOGI("%{public}s called", __func__); -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0100(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_0100, 100); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_uninstallTest_0100] AcquireForm end"); - } else { - APP_LOGE("[FMS_uninstallTest_0100] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_0100, 100, "false"); - } -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0200(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_0200, 200); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_uninstallTest_0200] AcquireForm end"); - } else { - APP_LOGE("[FMS_uninstallTest_0200] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_0200, 200, "false"); - } -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0300(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_0300, 300); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_TRUE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_uninstallTest_0300] AcquireForm end"); - } else { - APP_LOGE("[FMS_uninstallTest_0300] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_0300, 300, "false"); - } -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0400(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0500(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0600(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0700(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0800(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_0900(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1000(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1100(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_1100, 1100); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_uninstallTest_1100] AcquireForm end"); - } else { - APP_LOGE("[FMS_uninstallTest_1100] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1100, 1100, "false"); - } -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1200(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1300(std::string data) -{ - std::shared_ptr callback = - std::make_shared(FORM_EVENT_RECV_UNINSTALL_TEST_1300, 1300); - callback->ability_ = this; - // Set Want info begin - Want want; - want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); - want.SetParam(Constants::PARAM_FORM_NAME_KEY, PARAM_FORM_NAME1); - want.SetParam(Constants::PARAM_MODULE_NAME_KEY, PARAM_PROVIDER_MODULE_NAME1); - want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, FORM_TEMP_FORM_FLAG_FALSE); - want.SetElementName(FORM_TEST_DEVICEID, FORM_PROVIDER_BUNDLE_NAME1, FORM_PROVIDER_ABILITY_NAME1); - // Set Want info end - bool bResult = AcquireForm(0, want, callback); - if (bResult) { - APP_LOGI("[FMS_uninstallTest_1300] AcquireForm end"); - } else { - APP_LOGE("[FMS_uninstallTest_1300] AcquireForm error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1300, 1300, "false"); - } -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1400(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1500(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1600(std::string data) -{ -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1700(std::string data) -{ - std::vector formInfos; - bool bResult = GetAllFormsInfo(formInfos); - if (bResult) { - APP_LOGI("[FMS_uninstallTest_1700] GetAllFormsInfo end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1700, 1700, "true"); - } else { - APP_LOGE("[FMS_uninstallTest_1700] GetAllFormsInfo error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1700, 1700, "false"); - } -} - -void FormAbilityUninstallApp::FMS_uninstallTest_1800(std::string data) -{ - bool bResult = CheckFMSReady(); - if (bResult) { - APP_LOGI("[FMS_uninstallTest_1800] CheckFMSReady end"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1800, 1800, "true"); - } else { - APP_LOGE("[FMS_uninstallTest_1800] CheckFMSReady error"); - FormTestUtils::PublishEvent(FORM_EVENT_RECV_UNINSTALL_TEST_1800, 1800, "false"); - } -} - -void FormAbilityUninstallApp::OnStart(const Want &want) -{ - APP_LOGI("FormAbilityUninstallApp::onStart"); - Ability::OnStart(want); -} - -void FormAbilityUninstallApp::OnActive() -{ - APP_LOGI("FormAbilityUninstallApp::OnActive"); - Ability::OnActive(); - std::string eventData = GetAbilityName() + FORM_ABILITY_STATE_ONACTIVE; - FormTestUtils::PublishEvent(FORM_EVENT_ABILITY_ONACTIVED, 0, eventData); -} - -void FormAbilityUninstallApp::OnStop() -{ - APP_LOGI("FormAbilityUninstallApp::OnStop"); - - Ability::OnStop(); - CommonEventManager::UnSubscribeCommonEvent(subscriber_); -} - -void FormAbilityUninstallApp::OnInactive() -{ - APP_LOGI("FormAbilityUninstallApp::OnInactive"); - - Ability::OnInactive(); -} - -void FormAbilityUninstallApp::OnBackground() -{ - APP_LOGI("FormAbilityUninstallApp::OnBackground"); - - Ability::OnBackground(); -} - -void FormAbilityUninstallApp::SubscribeEvent() -{ - APP_LOGI("FormAbilityUninstallApp::SubscribeEvent"); - MatchingSkills matchingSkills; - for (const auto &e : eventList) { - matchingSkills.AddEvent(e); - } - CommonEventSubscribeInfo subscribeInfo(matchingSkills); - subscribeInfo.SetPriority(1); - subscriber_ = std::make_shared(subscribeInfo); - subscriber_->ability_ = this; - CommonEventManager::SubscribeCommonEvent(subscriber_); -} - -// KitTest End -void FormAbilityUninstallApp::Init(const std::shared_ptr &abilityInfo, - const std::shared_ptr &application, std::shared_ptr &handler, - const sptr &token) -{ - APP_LOGI("FormAbilityUninstallApp::Init"); - Ability::Init(abilityInfo, application, handler, token); - - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0100] = &FormAbilityUninstallApp::FMS_uninstallTest_0100; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0200] = &FormAbilityUninstallApp::FMS_uninstallTest_0200; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0300] = &FormAbilityUninstallApp::FMS_uninstallTest_0300; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0400] = &FormAbilityUninstallApp::FMS_uninstallTest_0400; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0500] = &FormAbilityUninstallApp::FMS_uninstallTest_0500; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0600] = &FormAbilityUninstallApp::FMS_uninstallTest_0600; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0700] = &FormAbilityUninstallApp::FMS_uninstallTest_0700; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0800] = &FormAbilityUninstallApp::FMS_uninstallTest_0800; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_0900] = &FormAbilityUninstallApp::FMS_uninstallTest_0900; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1000] = &FormAbilityUninstallApp::FMS_uninstallTest_1000; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1100] = &FormAbilityUninstallApp::FMS_uninstallTest_1100; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1300] = &FormAbilityUninstallApp::FMS_uninstallTest_1300; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1700] = &FormAbilityUninstallApp::FMS_uninstallTest_1700; - memberFuncMap_[FORM_EVENT_REQ_UNINSTALL_TEST_1800] = &FormAbilityUninstallApp::FMS_uninstallTest_1800; - - SubscribeEvent(); -} - -void FormAbilityUninstallApp::handleEvent(std::string action, std::string data) -{ - APP_LOGI("%{public}s called", __func__); - if (calledFuncMap_.find(action) != calledFuncMap_.end()) { - return; - } - calledFuncMap_.emplace(action, 0); - auto itFunc = memberFuncMap_.find(action); - if (itFunc != memberFuncMap_.end()) { - auto memberFunc = itFunc->second; - if (memberFunc != nullptr) { - return (this->*memberFunc)(data); - } - } -} - -void FormAbilityUninstallApp::Clear() -{ -} - -void FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) -{ - APP_LOGI("FormEventSubscriber::OnReceiveEvent:event=%{public}s, code=%{public}d, data=%{public}s", - data.GetWant().GetAction().c_str(), data.GetCode(), data.GetData().c_str()); - auto eventName = data.GetWant().GetAction(); - ability_->handleEvent(eventName, data.GetData()); - CommonEventManager::UnSubscribeCommonEvent(ability_->subscriber_); -} - -void FormEventSubscriber::KitTerminateAbility() -{ - if (ability_ != nullptr) { - ability_->TerminateAbility(); - } -} - -REGISTER_AA(FormAbilityUninstallApp) -} // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file -- Gitee From 401e0bafa6efa5e613b36eb0191fb7e05f1cb8ca Mon Sep 17 00:00:00 2001 From: "zhaoyuan17@huawei.com" Date: Mon, 18 Oct 2021 18:14:04 +0800 Subject: [PATCH 4/7] codex Signed-off-by: zhaoyuan17@huawei.com --- .../appexecfwk_base/src/form_info.cpp | 2 +- .../src/formmgr/form_mgr_stub.cpp | 2 +- .../fmskit/native/include/form_mgr.h | 6 +- services/formmgr/include/form_db_info.h | 4 +- services/formmgr/include/form_mgr_adapter.h | 2 +- services/formmgr/src/form_mgr_adapter.cpp | 18 ++--- services/formmgr/src/form_timer_mgr.cpp | 2 +- .../src/form_ability_commona.cpp | 2 +- .../include/form_ability_a.h | 2 - .../src/form_ability_a.cpp | 6 +- .../src/form_ability_deleteform.cpp | 4 +- .../src/form_ability_c.cpp | 4 +- .../src/form_st_service_ability_A.cpp | 3 +- .../include/form_st_service_ability_B.h | 2 +- .../src/form_st_service_ability_B.cpp | 17 +++-- .../src/form_st_service_ability_C.cpp | 22 +++--- .../include/form_st_service_ability_D.h | 2 +- .../src/form_st_service_ability_D.cpp | 22 +++--- .../include/form_st_service_ability_E.h | 2 +- .../src/form_st_service_ability_E.cpp | 22 +++--- .../fms/common/src/system_test_form_util.cpp | 12 ++-- .../fms_acquire_form_test.cpp | 1 - .../fms_acquire_form_test_batch.cpp | 69 +++++-------------- .../fms_acquire_form_test_max.cpp | 25 ++++--- .../fms_delete_form_test.cpp | 18 ++--- .../fms_acquire_forms_and_self_starting.sh | 10 --- .../fms_self_starting_test.cpp | 2 - 27 files changed, 130 insertions(+), 153 deletions(-) diff --git a/interfaces/innerkits/appexecfwk_base/src/form_info.cpp b/interfaces/innerkits/appexecfwk_base/src/form_info.cpp index 50e7730463..75d5a22d8c 100644 --- a/interfaces/innerkits/appexecfwk_base/src/form_info.cpp +++ b/interfaces/innerkits/appexecfwk_base/src/form_info.cpp @@ -181,7 +181,7 @@ bool FormInfo::Marshalling(Parcel &parcel) const void to_json(nlohmann::json &jsonObject, const FormCustomizeData &customizeDatas) { jsonObject = nlohmann::json{ - {JSON_KEY_NAME, customizeDatas.name}, + {JSON_KEY_NAME, customizeDatas.name}, {JSON_KEY_VALUE, customizeDatas.value} }; } diff --git a/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp b/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp index 3066329901..97b6f35620 100644 --- a/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp +++ b/interfaces/innerkits/appexecfwk_core/src/formmgr/form_mgr_stub.cpp @@ -439,7 +439,7 @@ int32_t FormMgrStub::HandleBatchAddFormRecords(MessageParcel &data, MessageParce */ int32_t FormMgrStub::HandleClearFormRecords(MessageParcel &data, MessageParcel &reply) { - APP_LOGI("%{public}s called.", __func__); + APP_LOGI("%{public}s called.", __func__); int32_t result = ClearFormRecords(); reply.WriteInt32(result); return result; diff --git a/interfaces/innerkits/fmskit/native/include/form_mgr.h b/interfaces/innerkits/fmskit/native/include/form_mgr.h index b712589dc5..c4f52f20df 100644 --- a/interfaces/innerkits/fmskit/native/include/form_mgr.h +++ b/interfaces/innerkits/fmskit/native/include/form_mgr.h @@ -51,8 +51,8 @@ public: * @param formInfo Form info. * @return Returns ERR_OK on success, others on failure. */ - int AddForm(const int64_t formId, const Want &want, const sptr &callerToken, - FormJsInfo &formInfo); + int AddForm(const int64_t formId, const Want &want, const sptr &callerToken, + FormJsInfo &formInfo); /** * @brief Delete forms with formIds, send formIds to form manager service. @@ -169,7 +169,7 @@ public: /** * @brief Set the next refresh time - * + * * @param formId The id of the form. * @param nextTime Next refresh time * @return Returns ERR_OK on success, others on failure. diff --git a/services/formmgr/include/form_db_info.h b/services/formmgr/include/form_db_info.h index c60dd01c97..6ec95d79d3 100644 --- a/services/formmgr/include/form_db_info.h +++ b/services/formmgr/include/form_db_info.h @@ -42,7 +42,7 @@ struct FormDBInfo { /** * @brief Constructors - * + * */ FormDBInfo(const int64_t formIdTmp, const FormRecord &formRecord) { @@ -151,7 +151,7 @@ public: } /** * @brief Destructor - * + * */ virtual ~InnerFormInfo(){}; /** diff --git a/services/formmgr/include/form_mgr_adapter.h b/services/formmgr/include/form_mgr_adapter.h index 8370afeee6..d92ecaf888 100644 --- a/services/formmgr/include/form_mgr_adapter.h +++ b/services/formmgr/include/form_mgr_adapter.h @@ -431,7 +431,7 @@ private: * notify the form provider that the current form is visible. * * @param bundleName BundleName - * @return Returns true if the form provider is system app, false if not. + * @return Returns true if the form provider is system app, false if not. */ bool CheckIsSystemAppByBundleName(const sptr &iBundleMgr, const std::string &bundleName); /** diff --git a/services/formmgr/src/form_mgr_adapter.cpp b/services/formmgr/src/form_mgr_adapter.cpp index 80c8c1cb17..7ac4557b40 100644 --- a/services/formmgr/src/form_mgr_adapter.cpp +++ b/services/formmgr/src/form_mgr_adapter.cpp @@ -481,17 +481,17 @@ ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &fo matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId); FormRecord formRecord; // Update provider info to host - if(!UpdateProviderInfoToHost(matchedFormId, callerToken, formVisibleType, formRecord)) { + if (!UpdateProviderInfoToHost(matchedFormId, callerToken, formVisibleType, formRecord)) { continue; } // Check if the form provider is system app - if(!CheckIsSystemAppByBundleName(iBundleMgr, formRecord.bundleName)) { + if (!CheckIsSystemAppByBundleName(iBundleMgr, formRecord.bundleName)) { continue; } // Create eventMaps - if(!CreateHandleEventMap(matchedFormId, formRecord, eventMaps)) { + if (!CreateHandleEventMap(matchedFormId, formRecord, eventMaps)) { continue; } } @@ -679,7 +679,7 @@ int FormMgrAdapter::DumpFormTimerByFormId(const std::int64_t formId, std::string isTimingService = "true"; } else { isTimingService = "false"; - } + } return ERR_OK; } /** @@ -1489,13 +1489,13 @@ int FormMgrAdapter::BatchAddFormRecords(const Want &want) formItemInfo.SetFormId(newFormId); // allot form host record - int callingUid = IPCSkeleton::GetCallingUid(); + int callingUid = IPCSkeleton::GetCallingUid(); // allot form record FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(formItemInfo, callingUid); APP_LOGI("%{public}s, batch add form, formId:" "%{public}" PRId64 ".", __func__, formRecord.formId); APP_LOGI("%{public}s, count: %{public}d", __func__, count + 1); - } + } APP_LOGI("%{public}s end.", __func__); return ERR_OK; } @@ -1548,7 +1548,7 @@ bool FormMgrAdapter::CreateHandleEventMap(const int64_t matchedFormId, const For */ bool FormMgrAdapter::UpdateProviderInfoToHost(const int64_t matchedFormId, const sptr &callerToken, const int32_t formVisibleType, FormRecord &formRecord) -{ +{ if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) { APP_LOGW("%{public}s fail, not exist such form, formId:%{public}" PRId64 ".", __func__, matchedFormId); return false; @@ -1584,7 +1584,7 @@ bool FormMgrAdapter::UpdateProviderInfoToHost(const int64_t matchedFormId, const * notify the form provider that the current form is visible. * * @param bundleName BundleName - * @return Returns true if the form provider is system app, false if not. + * @return Returns true if the form provider is system app, false if not. */ bool FormMgrAdapter::CheckIsSystemAppByBundleName(const sptr &iBundleMgr, const std::string &bundleName) { @@ -1592,7 +1592,7 @@ bool FormMgrAdapter::CheckIsSystemAppByBundleName(const sptr &iBundl if (iBundleMgr->GetBundleInfo(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo)) { APP_LOGD("%{public}s, get bundle uid success", __func__); if (!iBundleMgr->CheckIsSystemAppByUid(bundleInfo.uid)) { - APP_LOGW("%{public}s fail, form provider is not system app, bundleName: %{public}s", + APP_LOGW("%{public}s fail, form provider is not system app, bundleName: %{public}s", __func__, bundleName.c_str()); return false; } diff --git a/services/formmgr/src/form_timer_mgr.cpp b/services/formmgr/src/form_timer_mgr.cpp index bad116ded6..4c7eadcaee 100644 --- a/services/formmgr/src/form_timer_mgr.cpp +++ b/services/formmgr/src/form_timer_mgr.cpp @@ -793,7 +793,7 @@ bool FormTimerMgr::UpdateAtTimerAlarm() /** * @brief Clear update at timer resource. - */ + */ void FormTimerMgr::ClearUpdateAtTimerResource() { APP_LOGI("%{public}s start", __func__); diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp index e13edecc50..401b391d0d 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonA/src/form_ability_commona.cpp @@ -85,7 +85,7 @@ void FormAbilityCommonA::FMS_deleteForm(std::string data) } void FormAbilityCommonA::FMS_acquireForm_batch(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h index 975d137a16..bb63b78c25 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/include/form_ability_a.h @@ -65,8 +65,6 @@ public: void FMS_acquireFormBatchB(std::string data); void FMS_acquireFormTempBatch(std::string data); void FMS_deleteFormBatch(std::string strFormId); - - std::shared_ptr subscriber_; class AcquireFormCallback : public FormCallback { diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp index 7fed60a204..344a14cf92 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_a.cpp @@ -37,7 +37,7 @@ std::vector eventList = { FORM_EVENT_REQ_ACQUIRE_FORM_2700, FORM_EVENT_REQ_ACQUIRE_FORM_2800, FORM_EVENT_REQ_ACQUIRE_FORM_2900, FORM_EVENT_REQ_ACQUIRE_FORM_2900_1, FORM_EVENT_REQ_ACQUIRE_FORM_3000, FORM_EVENT_REQ_ACQUIRE_FORM_3100, FORM_EVENT_REQ_ACQUIRE_FORM_BATCH, FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, FORM_EVENT_REQ_CLEAR_FORM_BATCH, - FORM_EVENT_REQ_ACQUIRE_FORM_BATCH_B, + FORM_EVENT_REQ_ACQUIRE_FORM_BATCH_B, }; void FormAbilityA::AcquireFormCallback::OnAcquired(const int32_t result, const FormJsInfo &formJsInfo) const { @@ -685,7 +685,7 @@ void FormAbilityA::FMS_acquireForm_tempForm(std::string data) } void FormAbilityA::FMS_acquireFormBatch(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); @@ -710,7 +710,7 @@ void FormAbilityA::FMS_acquireFormBatch(std::string data) void FormAbilityA::FMS_acquireFormBatchB(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp index 7c021f2c0f..f50e5b4f7b 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormal/src/form_ability_deleteform.cpp @@ -551,7 +551,7 @@ void FormAbilityDeleteForm::FMS_deleteForm_1702(std::string data) } void FormAbilityDeleteForm::FMS_acquire_tempForm_batch(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); @@ -575,7 +575,7 @@ void FormAbilityDeleteForm::FMS_acquire_tempForm_batch(std::string data) } void FormAbilityDeleteForm::FMS_acquireForm_batch(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp index 173c9a9c73..dad17b4b4b 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/src/form_ability_c.cpp @@ -37,7 +37,7 @@ void FormAbilityC::AcquireFormCallback::OnAcquired(const int32_t result, const F void FormAbilityC::AcquireFormCallback::OnUpdate(const int32_t result, const FormJsInfo &formJsInfo) const { APP_LOGI("%{public}s called", __func__); - FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, formJsInfo.formData); + FormTestUtils::PublishEvent(this->caseName_, this->code_ + 1, formJsInfo.formData); } void FormAbilityC::AcquireFormCallback::OnFormUninstall(const int64_t formId) const @@ -112,7 +112,7 @@ void FormAbilityC::FMS_acquireForm_3200(std::string data) } void FormAbilityC::FMS_acquireFormBatch(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); diff --git a/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp b/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp index adca34c255..bf8dc7f3df 100755 --- a/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceA/src/form_st_service_ability_A.cpp @@ -337,7 +337,8 @@ void FormStServiceAbilityA::OnDelete(const int64_t formId) clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_ON_DELETE, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, std::to_string(formId)); + PublishEvent(COMMON_EVENT_ON_DELETE, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + std::to_string(formId)); APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); } diff --git a/test/resource/formsystemtestability/formSystemTestServiceB/include/form_st_service_ability_B.h b/test/resource/formsystemtestability/formSystemTestServiceB/include/form_st_service_ability_B.h index d3dff856cb..090627c0bd 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceB/include/form_st_service_ability_B.h +++ b/test/resource/formsystemtestability/formSystemTestServiceB/include/form_st_service_ability_B.h @@ -130,7 +130,7 @@ private: }; class AppEventSubscriber : public EventFwk::CommonEventSubscriber { public: - AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; ~AppEventSubscriber() = default; virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; diff --git a/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp b/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp index 07825d77bf..bf09bbace8 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp @@ -293,13 +293,14 @@ FormProviderInfo FormStServiceAbilityB::OnCreate(const Want &want) { APP_LOGI("%{public}s start", __func__); FormProviderInfo formProviderInfo; - if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { - APP_LOGE("%{public}s, formId not exist", __func__); + if (!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); return formProviderInfo; } std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); std::string jsonData = std::string(""); - for (int i = 0; i < 200; i = i + 1) { + int count = 200; + for (int i = 0; i < count; i = i + 1) { jsonData = jsonData + std::string("beijingB" + std::to_string(i)); } std::string formData = std::string("{\"city\":\"") + jsonData + std::string("\"}"); @@ -317,7 +318,8 @@ void FormStServiceAbilityB::OnUpdate(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityB::OnTriggerEvent(const int64_t formId, const std::string &message) @@ -329,7 +331,8 @@ void FormStServiceAbilityB::OnTriggerEvent(const int64_t formId, const std::stri long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); - APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, message: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), message.c_str(), currentTime); } void FormStServiceAbilityB::OnDelete(const int64_t formId) @@ -341,7 +344,7 @@ void FormStServiceAbilityB::OnDelete(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityB::OnCastTemptoNormal(const int64_t formId) @@ -353,7 +356,7 @@ void FormStServiceAbilityB::OnCastTemptoNormal(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityB::OnVisibilityChanged(const std::map &formEventsMap) diff --git a/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp b/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp index b1f2db41c0..ff5bf206d0 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp @@ -293,8 +293,8 @@ FormProviderInfo FormStServiceAbilityC::OnCreate(const Want &want) { APP_LOGI("%{public}s start", __func__); FormProviderInfo formProviderInfo; - if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { - APP_LOGE("%{public}s, formId not exist", __func__); + if (!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); return formProviderInfo; } std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); @@ -314,7 +314,8 @@ void FormStServiceAbilityC::OnUpdate(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityC::OnTriggerEvent(const int64_t formId, const std::string &message) @@ -326,7 +327,8 @@ void FormStServiceAbilityC::OnTriggerEvent(const int64_t formId, const std::stri long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); - APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, message: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), message.c_str(), currentTime); } void FormStServiceAbilityC::OnDelete(const int64_t formId) @@ -338,7 +340,8 @@ void FormStServiceAbilityC::OnDelete(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityC::OnCastTemptoNormal(const int64_t formId) @@ -349,8 +352,10 @@ void FormStServiceAbilityC::OnCastTemptoNormal(const int64_t formId) clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityC::OnVisibilityChanged(const std::map &formEventsMap) @@ -361,7 +366,8 @@ void FormStServiceAbilityC::OnVisibilityChanged(const std::map clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnVisibilityChanged"); APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); } diff --git a/test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h b/test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h index d7acc7d827..a0d8e46a9f 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h +++ b/test/resource/formsystemtestability/formSystemTestServiceD/include/form_st_service_ability_D.h @@ -130,7 +130,7 @@ private: }; class AppEventSubscriber : public EventFwk::CommonEventSubscriber { public: - AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; ~AppEventSubscriber() = default; virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; diff --git a/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp b/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp index 6c059a1938..9715a09ad7 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp @@ -293,8 +293,8 @@ FormProviderInfo FormStServiceAbilityD::OnCreate(const Want &want) { APP_LOGI("%{public}s start", __func__); FormProviderInfo formProviderInfo; - if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { - APP_LOGE("%{public}s, formId not exist", __func__); + if (!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); return formProviderInfo; } std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); @@ -314,7 +314,8 @@ void FormStServiceAbilityD::OnUpdate(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityD::OnTriggerEvent(const int64_t formId, const std::string &message) @@ -326,7 +327,8 @@ void FormStServiceAbilityD::OnTriggerEvent(const int64_t formId, const std::stri long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); - APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, message: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), message.c_str(), currentTime); } void FormStServiceAbilityD::OnDelete(const int64_t formId) @@ -338,7 +340,8 @@ void FormStServiceAbilityD::OnDelete(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityD::OnCastTemptoNormal(const int64_t formId) @@ -349,8 +352,10 @@ void FormStServiceAbilityD::OnCastTemptoNormal(const int64_t formId) clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityD::OnVisibilityChanged(const std::map &formEventsMap) @@ -361,7 +366,8 @@ void FormStServiceAbilityD::OnVisibilityChanged(const std::map clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnVisibilityChanged"); APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); } diff --git a/test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h b/test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h index 66279d06b7..a84bc3862a 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h +++ b/test/resource/formsystemtestability/formSystemTestServiceE/include/form_st_service_ability_E.h @@ -130,7 +130,7 @@ private: }; class AppEventSubscriber : public EventFwk::CommonEventSubscriber { public: - AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; ~AppEventSubscriber() = default; virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; diff --git a/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp b/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp index bce625ae61..8f3591a387 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp @@ -293,8 +293,8 @@ FormProviderInfo FormStServiceAbilityE::OnCreate(const Want &want) { APP_LOGI("%{public}s start", __func__); FormProviderInfo formProviderInfo; - if(!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { - APP_LOGE("%{public}s, formId not exist", __func__); + if (!want.HasParameter(Constants::PARAM_FORM_IDENTITY_KEY)) { + APP_LOGE("%{public}s, formId not exist", __func__); return formProviderInfo; } std::string formId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY); @@ -314,7 +314,8 @@ void FormStServiceAbilityE::OnUpdate(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnUpdate"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityE::OnTriggerEvent(const int64_t formId, const std::string &message) @@ -326,7 +327,8 @@ void FormStServiceAbilityE::OnTriggerEvent(const int64_t formId, const std::stri long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnTriggerEvent"); - APP_LOGI("%{public}s end, formId: %{public}lld, message: %{public}s, current time: %{public}ld", __func__, formId, message.c_str(), currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, message: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), message.c_str(), currentTime); } void FormStServiceAbilityE::OnDelete(const int64_t formId) @@ -338,7 +340,8 @@ void FormStServiceAbilityE::OnDelete(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityE::OnCastTemptoNormal(const int64_t formId) @@ -349,8 +352,10 @@ void FormStServiceAbilityE::OnCastTemptoNormal(const int64_t formId) clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); - APP_LOGI("%{public}s end, formId: %{public}lld, current time: %{public}ld", __func__, formId, currentTime); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityE::OnVisibilityChanged(const std::map &formEventsMap) @@ -361,7 +366,8 @@ void FormStServiceAbilityE::OnVisibilityChanged(const std::map clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnVisibilityChanged"); APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); } diff --git a/test/systemtest/common/fms/common/src/system_test_form_util.cpp b/test/systemtest/common/fms/common/src/system_test_form_util.cpp index f9f78d5c7d..8755d6808b 100644 --- a/test/systemtest/common/fms/common/src/system_test_form_util.cpp +++ b/test/systemtest/common/fms/common/src/system_test_form_util.cpp @@ -571,9 +571,9 @@ int SystemTestFormUtil::BatchAddFormRecords(const AAFwk::Want &want) MessageParcel reply; MessageOption option; int error = remoteObject->SendRequest( - static_cast(IFormMgr::Message::FORM_MGR_BATCH_ADD_FORM_RECORDS_ST), - data, - reply, + static_cast (IFormMgr::Message::FORM_MGR_BATCH_ADD_FORM_RECORDS_ST), + data, + reply, option); if (error != ERR_OK) { std::cout << "BatchAddFormRecords, failed to SendRequest." << std::endl; @@ -603,9 +603,9 @@ int SystemTestFormUtil::ClearFormRecords() MessageParcel reply; MessageOption option; int error = remoteObject->SendRequest( - static_cast(IFormMgr::Message::FORM_MGR_CLEAR_FORM_RECORDS_ST), - data, - reply, + static_cast (IFormMgr::Message::FORM_MGR_CLEAR_FORM_RECORDS_ST), + data, + reply, option); if (error != ERR_OK) { std::cout << "ClearFormRecords, failed to SendRequest." << std::endl; diff --git a/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp b/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp index e441ba6153..afa3d991c0 100644 --- a/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp +++ b/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp @@ -1197,6 +1197,5 @@ void FmsAcquireFormTest::FmsAcquireFormDeleteA(std::string strFormId) std::cout << "END FmsAcquireFormDeleteA end" << std::endl; } - } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp index f12571baf5..320054724c 100644 --- a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp @@ -89,12 +89,12 @@ public: static std::vector eventList; static std::shared_ptr subscriber; - void FmsAcquireForm2700(std::string); + void FmsAcquireForm2700(std::string strFormId); std::string FmsAcquireForm2900A(); std::string FmsAcquireForm2900B(); void FmsAcquireForm3000(); std::string FmsAcquireForm3100(const std::string &bundleName, const std::string &abilityName); - void FmsAcquireForm2800(std::string); + void FmsAcquireForm2800(std::string strFormId); void FmsAcquireForm3200(); void FmsAcquireFormDeleteA(const std::string &strFormId); @@ -172,7 +172,7 @@ bool FmsAcquireFormTestBatch::SubscribeEvent() * @tc.desc: The single host can successfully create 256 different provider forms. */ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_2900, Function | MediumTest | Level1) -{ +{ std::cout << "START FMS_acquireForm_2900" << std::endl; std::string bundleName = "com.ohos.form.manager.normal"; std::string abilityName = "FormAbilityA"; @@ -200,7 +200,7 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3000, Function | MediumTest | sleep(1); std::cout << "START FMS_acquireForm_3000" << std::endl; std::cout << "FMS_acquireForm_3000, form size of the host A:" << normalFormsMaxA.size() << std::endl; - FmsAcquireForm3000(); + FmsAcquireForm3000(); std::cout << "END FMS_acquireForm_3000" << std::endl; } @@ -221,11 +221,11 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_2700, Function | MediumTest | std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); sleep(1); - FmsAcquireForm2700(strFormId); + FmsAcquireForm2700(strFormId); std::cout << "END FMS_acquireForm_2700" << std::endl; std::cout << "the host A, delete form start" << std::endl; - if(normalFormsMaxA.size() > 0) { + if (normalFormsMaxA.size() > 0) { for (int count = 0; count < normalFormsMaxA.size(); count++) { FmsAcquireFormDeleteA(normalFormsMaxA[count]); } @@ -271,7 +271,7 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3100, Function | MediumTest | std::cout << "bundleName: " << bundleNameC << std::endl; std::cout << "abilityName: " << abilityNameC << std::endl; FMS_acquireFormBatchA(bundleNameC, abilityNameC, FORM_COUNT_111); - std::cout << "count:" << FORM_COUNT_111 << std::endl; + std::cout << "count:" << FORM_COUNT_111 << std::endl; std::cout << "END add form to the host C" << std::endl; sleep(1); @@ -308,7 +308,7 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_2800, Function | MediumTest | /** * @tc.number: FMS_acquireForm_3200 * @tc.name: FMS create form limit value (512) verification. - * @tc.desc: Verify that 512 forms can be successfully created by creating forms with different users + * @tc.desc: Verify that 512 forms can be successfully created by creating forms with different users * (the number of single user forms is less than 256), and the 513rd form fails to be created. */ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3200, Function | MediumTest | Level1) @@ -322,7 +322,7 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3200, Function | MediumTest | std::cout << "END FMS_acquireForm_3200" << std::endl; std::cout << "dlete form start" << std::endl; - if(normalFormsMaxC.size() > 0) { + if (normalFormsMaxC.size() > 0) { for (int count = 0; count < normalFormsMaxC.size(); count++) { sleep(1); FmsAcquireFormDeleteC(normalFormsMaxC[count]); @@ -379,7 +379,7 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3400, Function | MediumTest | std::cout << "bundleName: " << bundleNameA << std::endl; std::cout << "abilityName: " << abilityNameA << std::endl; FMS_acquireTempFormBatch(bundleNameA, abilityNameA, TEMP_FORM_COUNT_128); - std::cout << "FMS_acquireForm_3400, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; + std::cout << "FMS_acquireForm_3400, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; std::cout << "END add temp form to the host A" << std::endl; sleep(1); @@ -392,7 +392,7 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3400, Function | MediumTest | std::cout << "FMS_acquireForm_3400, temp form size:" << (TEMP_FORM_COUNT_128 - 1) << std::endl; sleep(1); std::string strFormId = FmsAcquireFormTemp(bundleNameB, abilityNameB); - std::cout << "FMS_acquireForm_3400, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; + std::cout << "FMS_acquireForm_3400, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; std::cout << "END add temp form to the host B" << std::endl; sleep(1); @@ -420,7 +420,7 @@ HWTEST_F(FmsAcquireFormTestBatch, FMS_acquireForm_3500, Function | MediumTest | std::cout << "bundleName: " << bundleNameA << std::endl; std::cout << "abilityName: " << abilityNameA << std::endl; FMS_acquireTempFormBatch(bundleNameA, abilityNameA, TEMP_FORM_COUNT_128); - std::cout << "FMS_acquireForm_3500, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; + std::cout << "FMS_acquireForm_3500, temp form size:" << TEMP_FORM_COUNT_128 << std::endl; std::cout << "END add temp form to the host A" << std::endl; sleep(1); std::cout << "START add temp form to the host B" << std::endl; @@ -475,7 +475,7 @@ std::string FmsAcquireFormTestBatch::FmsAcquireForm3100(const std::string &bundl } void FmsAcquireFormTestBatch::FmsAcquireForm2700(std::string strFormId) -{ +{ std::cout << "START FmsAcquireForm2700, cast temp form" << std::endl; std::string bundleName = "com.ohos.form.manager.normal"; std::string abilityName = "FormAbilityA"; @@ -520,7 +520,7 @@ void FmsAcquireFormTestBatch::FmsAcquireForm3200() std::cout << "END FmsAcquireForm3200" << std::endl; } void FmsAcquireFormTestBatch::FmsAcquireForm2800(std::string strFormId) -{ +{ std::cout << "START FmsAcquireForm2800, cast temp form" << std::endl; std::string bundleName = "com.ohos.form.manager.normal"; std::string abilityName = "FormAbilityA"; @@ -576,38 +576,6 @@ std::string FmsAcquireFormTestBatch::FmsAcquireForm2900A() std::cout << "END FmsAcquireForm2900A, Provider A" << std::endl; return strFormId; } -// std::string FmsAcquireFormTestBatch::FmsAcquireForm2900B() -// { -// std::cout << "START FmsAcquireForm2900B, Provider B" << std::endl; -// std::string bundleName = "com.ohos.form.manager.normal"; -// std::string abilityName = "FormAbilityA"; -// MAP_STR_STR params; -// Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); -// SystemTestFormUtil::StartAbility(want, abilityMs); -// EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - -// std::string eventData = FORM_EVENT_REQ_ACQUIRE_FORM_2900_1; -// SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_FORM_2900_1, EVENT_CODE_2910, eventData); - -// EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910)); -// std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2910); -// bool result = !strFormId.empty(); -// EXPECT_TRUE(result); -// if (!result) { -// GTEST_LOG_(INFO) << "FmsAcquireForm2900B, result:" << result; -// } else { -// GTEST_LOG_(INFO) << "FmsAcquireForm2900B, formId:" << strFormId; -// } - -// EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2911)); -// std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_2900_1, EVENT_CODE_2911); -// bool result2 = !data2.empty(); -// EXPECT_TRUE(result2); -// GTEST_LOG_(INFO) << "FmsAcquireForm2900B, result:" << result2; - -// std::cout << "END FmsAcquireForm2900B, Provider B" << std::endl; -// return strFormId; -// } void FmsAcquireFormTestBatch::FmsAcquireForm3000() { std::cout << "START FmsAcquireForm3000" << std::endl; @@ -678,7 +646,8 @@ void FmsAcquireFormTestBatch::FMS_acquireFormBatchB(const std::string &bundleNam std::cout << "END FMS_acquireFormBatchB" << std::endl; } -void FmsAcquireFormTestBatch::FMS_acquireTempFormBatch(const std::string &bundleName, const std::string &abilityName, const int count) +void FmsAcquireFormTestBatch::FMS_acquireTempFormBatch(const std::string &bundleName, const std::string &abilityName, + const int count) { std::cout << "START FMS_acquireTempFormBatch" << std::endl; MAP_STR_STR params; @@ -689,9 +658,9 @@ void FmsAcquireFormTestBatch::FMS_acquireTempFormBatch(const std::string &bundle std::string eventData = std::to_string(count); SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH, eventData); - EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH)); - std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_TEMP_FORM_BATCH, EVENT_CODE_TEMP_BATCH); bool result = data == "true"; EXPECT_TRUE(result); @@ -748,7 +717,7 @@ bool FmsAcquireFormTestBatch::FmsAcquireFormTempForFailed(const std::string &bun std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); bool result = strFormId.empty(); EXPECT_TRUE(result); - GTEST_LOG_(INFO) << "FmsAcquireFormTempForFailed, result:" << result; + GTEST_LOG_(INFO) << "FmsAcquireFormTempForFailed, result:" << result; std::cout << "END FmsAcquireFormTempForFailed, add temp form" << std::endl; diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp index 1caf28c139..81242d0754 100644 --- a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp @@ -88,12 +88,12 @@ public: static std::vector eventList; static std::shared_ptr subscriber; - void FmsAcquireForm2700(std::string); + void FmsAcquireForm2700(std::string strFormId); std::string FmsAcquireForm2900A(); std::string FmsAcquireForm2900B(); void FmsAcquireForm3000(); std::string FmsAcquireForm3100(const std::string &bundleName, const std::string &abilityName); - void FmsAcquireForm2800(std::string); + void FmsAcquireForm2800(std::string strFormId); void FmsAcquireForm3200(); void FmsAcquireFormDeleteA(const std::string &strFormId); @@ -164,7 +164,7 @@ bool FmsAcquireFormTestMax::SubscribeEvent() * @tc.desc: The single host can successfully create 256 different provider forms. */ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_2900, Function | MediumTest | Level1) -{ +{ std::cout << "START FMS_acquireForm_2900" << std::endl; for (int count = 0; count < Constants::MAX_RECORD_PER_APP/2; count++) { sleep(7); @@ -172,7 +172,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_2900, Function | MediumTest | Le normalFormsMaxA.emplace_back(strFormId1); std::cout << "FMS_acquireForm_2900, form size of the host A:" << normalFormsMaxA.size() << std::endl; sleep(7); - std::string strFormId2 = FmsAcquireForm2900B(); + std::string strFormId2 = FmsAcquireForm2900B(); normalFormsMaxA.emplace_back(strFormId2); std::cout << "FMS_acquireForm_2900, form size of the host A:" << normalFormsMaxA.size() << std::endl; } @@ -210,7 +210,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_2700, Function | MediumTest | Le std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); sleep(7); - FmsAcquireForm2700(strFormId); + FmsAcquireForm2700(strFormId); std::cout << "END FMS_acquireForm_2700" << std::endl; std::cout << "the host A, dlete form start" << std::endl; @@ -265,7 +265,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3100, Function | MediumTest | Le std::cout << "bundleName: " << bundleNameC << std::endl; std::cout << "abilityName: " << abilityNameC << std::endl; for (int count = 0; count < FORM_COUNT_112; count++) { - sleep(7); + sleep(7); std::string strFormId = FmsAcquireForm3100(bundleNameC, abilityNameC); normalFormsMaxC.emplace_back(strFormId); std::cout << "add form count:" << count + 1 << std::endl; @@ -295,7 +295,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_2800, Function | MediumTest | Le std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); sleep(7); - FmsAcquireForm2800(strFormId); + FmsAcquireForm2800(strFormId); std::cout << "END FMS_acquireForm_2800" << std::endl; } @@ -342,7 +342,6 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3200, Function | MediumTest | Le } normalFormsMaxC.clear(); std::cout << "the host C, dlete form end" << std::endl; - } /** * @tc.number: FMS_acquireForm_3300 @@ -363,7 +362,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3300, Function | MediumTest | Le sleep(7); std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); tempFormsMaxA.emplace_back(strFormId); - std::cout << "FMS_acquireForm_3300, form size of the host A:" << tempFormsMaxA.size() << std::endl; + std::cout << "FMS_acquireForm_3300, form size of the host A:" << tempFormsMaxA.size() << std::endl; } std::cout << "END add temp form to the host A" << std::endl; @@ -397,7 +396,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3400, Function | MediumTest | Le sleep(7); std::string strFormId = FmsAcquireFormTemp(bundleNameA, abilityNameA); tempFormsMaxA.emplace_back(strFormId); - std::cout << "FMS_acquireForm_3400, temp form size of the host A:" << tempFormsMaxA.size() << std::endl; + std::cout << "FMS_acquireForm_3400, temp form size of the host A:" << tempFormsMaxA.size() << std::endl; } std::cout << "END add temp form to the host A" << std::endl; @@ -437,7 +436,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3500, Function | MediumTest | Le EXPECT_TRUE(result); if (result) { std::cout << "END add temp form to the host B, Failed to create the 257th temporary form." << std::endl; - } + } std::cout << "END FMS_acquireForm_3500" << std::endl; std::cout << "the host A, dlete temp form start" << std::endl; @@ -489,7 +488,7 @@ std::string FmsAcquireFormTestMax::FmsAcquireForm3100(const std::string &bundleN } void FmsAcquireFormTestMax::FmsAcquireForm2700(std::string strFormId) -{ +{ std::cout << "START FmsAcquireForm2700, cast temp form" << std::endl; std::string bundleName = "com.ohos.form.manager.normal"; std::string abilityName = "FormAbilityA"; @@ -534,7 +533,7 @@ void FmsAcquireFormTestMax::FmsAcquireForm3200() std::cout << "END FmsAcquireForm3200" << std::endl; } void FmsAcquireFormTestMax::FmsAcquireForm2800(std::string strFormId) -{ +{ std::cout << "START FmsAcquireForm2800, cast temp form" << std::endl; std::string bundleName = "com.ohos.form.manager.normal"; std::string abilityName = "FormAbilityA"; diff --git a/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp index fa32d57ea5..68034614ed 100644 --- a/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp +++ b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp @@ -714,7 +714,7 @@ HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1200, Function | MediumTest | Level2) Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); SystemTestFormUtil::StartAbility(want, abilityManager); EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - std::string eventData = (i/5 == 1 ? "true" : "false");// normal form or temp form + std::string eventData = (i/5 == 1 ? "true" : "false"); SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1200, EVENT_CODE_1200, eventData); EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200)); formIds[i] = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200); @@ -899,11 +899,11 @@ void FmsDeleteFormTest::FMS_deleteForm_1400_A() std::string abilityName = "FormAbilityCommonA"; MAP_STR_STR params; - for (int i=0; i Date: Mon, 18 Oct 2021 20:32:29 +0800 Subject: [PATCH 5/7] codex Signed-off-by: zhaoyuan17@huawei.com --- services/formmgr/src/form_mgr_adapter.cpp | 8 +++---- .../src/form_st_service_ability_A.cpp | 12 ++++++---- .../src/form_st_service_ability_B.cpp | 17 +++++++------ .../src/form_st_service_ability_C.cpp | 5 ++-- .../src/form_st_service_ability_D.cpp | 5 ++-- .../src/form_st_service_ability_E.cpp | 5 ++-- .../fms/common/src/system_test_form_util.cpp | 6 ++--- .../fms_acquire_form_test.cpp | 4 +--- .../fms_acquire_form_test_batch.cpp | 4 +--- .../fms_acquire_form_test_max.cpp | 6 ++--- .../fms_delete_form_test.cpp | 24 +++++++------------ .../fms_release_form_test.cpp | 13 +--------- .../fms_acquire_forms_and_self_starting.sh | 2 ++ .../fms_self_starting_test.cpp | 11 +-------- 14 files changed, 46 insertions(+), 76 deletions(-) diff --git a/services/formmgr/src/form_mgr_adapter.cpp b/services/formmgr/src/form_mgr_adapter.cpp index 7ac4557b40..df96413416 100644 --- a/services/formmgr/src/form_mgr_adapter.cpp +++ b/services/formmgr/src/form_mgr_adapter.cpp @@ -219,8 +219,7 @@ ErrCode FormMgrAdapter::HandleDeleteForm(const int64_t formId, const sptr &formEventsMap) diff --git a/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp b/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp index bf09bbace8..a59b6ad449 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceB/src/form_st_service_ability_B.cpp @@ -21,11 +21,10 @@ using namespace OHOS::EventFwk; -constexpr int64_t SEC_TO_MILLISEC = 1000; -constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; - namespace OHOS { namespace AppExecFwk { +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; int FormStServiceAbilityB::AbilityConnectCallback::onAbilityConnectDoneCount = 0; @@ -344,7 +343,8 @@ void FormStServiceAbilityB::OnDelete(const int64_t formId) long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnDelete"); - APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, std::to_string(formId).c_str(), currentTime); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityB::OnCastTemptoNormal(const int64_t formId) @@ -355,8 +355,10 @@ void FormStServiceAbilityB::OnCastTemptoNormal(const int64_t formId) clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnCastTemptoNormal"); - APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, std::to_string(formId).c_str(), currentTime); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnCastTemptoNormal"); + APP_LOGI("%{public}s end, formId: %{public}s, current time: %{public}ld", __func__, + std::to_string(formId).c_str(), currentTime); } void FormStServiceAbilityB::OnVisibilityChanged(const std::map &formEventsMap) @@ -367,7 +369,8 @@ void FormStServiceAbilityB::OnVisibilityChanged(const std::map clock_gettime(CLOCK_REALTIME, &ts); long currentTime = ts.tv_sec * SEC_TO_MILLISEC + ts.tv_nsec / MILLISEC_TO_NANOSEC; - PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, "OnVisibilityChanged"); + PublishEvent(COMMON_EVENT_TEST_ACTION1, FORM_EVENT_TRIGGER_RESULT::FORM_EVENT_TRIGGER_RESULT_OK, + "OnVisibilityChanged"); APP_LOGI("%{public}s end, current time: %{public}ld", __func__, currentTime); } diff --git a/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp b/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp index ff5bf206d0..82ad5b1d65 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceC/src/form_st_service_ability_C.cpp @@ -21,11 +21,10 @@ using namespace OHOS::EventFwk; -constexpr int64_t SEC_TO_MILLISEC = 1000; -constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; - namespace OHOS { namespace AppExecFwk { +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; int FormStServiceAbilityC::AbilityConnectCallback::onAbilityConnectDoneCount = 0; diff --git a/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp b/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp index 9715a09ad7..564a083f8f 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceD/src/form_st_service_ability_D.cpp @@ -21,11 +21,10 @@ using namespace OHOS::EventFwk; -constexpr int64_t SEC_TO_MILLISEC = 1000; -constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; - namespace OHOS { namespace AppExecFwk { +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; int FormStServiceAbilityD::AbilityConnectCallback::onAbilityConnectDoneCount = 0; diff --git a/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp b/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp index 8f3591a387..6dcbaeb598 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp +++ b/test/resource/formsystemtestability/formSystemTestServiceE/src/form_st_service_ability_E.cpp @@ -21,11 +21,10 @@ using namespace OHOS::EventFwk; -constexpr int64_t SEC_TO_MILLISEC = 1000; -constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; - namespace OHOS { namespace AppExecFwk { +constexpr int64_t SEC_TO_MILLISEC = 1000; +constexpr int64_t MILLISEC_TO_NANOSEC = 1000000; using AbilityConnectionProxy = OHOS::AAFwk::AbilityConnectionProxy; int FormStServiceAbilityE::AbilityConnectCallback::onAbilityConnectDoneCount = 0; diff --git a/test/systemtest/common/fms/common/src/system_test_form_util.cpp b/test/systemtest/common/fms/common/src/system_test_form_util.cpp index 8755d6808b..c08b646e9b 100644 --- a/test/systemtest/common/fms/common/src/system_test_form_util.cpp +++ b/test/systemtest/common/fms/common/src/system_test_form_util.cpp @@ -13,9 +13,9 @@ * limitations under the License. */ #include "system_test_form_util.h" +#include "install_tool_status_receiver.h" #include "iservice_registry.h" #include "status_receiver_host.h" -#include "install_tool_status_receiver.h" namespace OHOS { namespace STtools { @@ -571,7 +571,7 @@ int SystemTestFormUtil::BatchAddFormRecords(const AAFwk::Want &want) MessageParcel reply; MessageOption option; int error = remoteObject->SendRequest( - static_cast (IFormMgr::Message::FORM_MGR_BATCH_ADD_FORM_RECORDS_ST), + static_cast(IFormMgr::Message::FORM_MGR_BATCH_ADD_FORM_RECORDS_ST), data, reply, option); @@ -603,7 +603,7 @@ int SystemTestFormUtil::ClearFormRecords() MessageParcel reply; MessageOption option; int error = remoteObject->SendRequest( - static_cast (IFormMgr::Message::FORM_MGR_CLEAR_FORM_RECORDS_ST), + static_cast(IFormMgr::Message::FORM_MGR_CLEAR_FORM_RECORDS_ST), data, reply, option); diff --git a/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp b/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp index afa3d991c0..a623fd2547 100644 --- a/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp +++ b/test/systemtest/common/fms/fms_acquire_form_test/fms_acquire_form_test.cpp @@ -28,10 +28,10 @@ #include "context_deal.h" #include "form_event.h" #include "form_st_common_info.h" -#include "system_test_form_util.h" #include "iservice_registry.h" #include "nlohmann/json.hpp" #include "system_ability_definition.h" +#include "system_test_form_util.h" using OHOS::AAFwk::Want; using namespace testing::ext; @@ -120,7 +120,6 @@ void FmsAcquireFormTest::FormEventSubscriber::OnReceiveEvent(const CommonEventDa void FmsAcquireFormTest::SetUpTestCase() { - // SystemTestFormUtil::InstallHaps(hapNameList); if (!SubscribeEvent()) { GTEST_LOG_(INFO) << "SubscribeEvent error"; } @@ -128,7 +127,6 @@ void FmsAcquireFormTest::SetUpTestCase() void FmsAcquireFormTest::TearDownTestCase() { - // SystemTestFormUtil::UninstallBundle(bundleNameList); GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; CommonEventManager::UnSubscribeCommonEvent(subscriber); } diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp index 320054724c..0e8a711b45 100644 --- a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_batch.cpp @@ -28,10 +28,10 @@ #include "context_deal.h" #include "form_event.h" #include "form_st_common_info.h" -#include "system_test_form_util.h" #include "iservice_registry.h" #include "nlohmann/json.hpp" #include "system_ability_definition.h" +#include "system_test_form_util.h" using OHOS::AAFwk::Want; using namespace testing::ext; @@ -131,7 +131,6 @@ void FmsAcquireFormTestBatch::FormEventSubscriber::OnReceiveEvent(const CommonEv void FmsAcquireFormTestBatch::SetUpTestCase() { - // SystemTestFormUtil::InstallHaps(hapNameList); if (!SubscribeEvent()) { GTEST_LOG_(INFO) << "SubscribeEvent error"; } @@ -139,7 +138,6 @@ void FmsAcquireFormTestBatch::SetUpTestCase() void FmsAcquireFormTestBatch::TearDownTestCase() { - // SystemTestFormUtil::UninstallBundle(bundleNameList); GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; CommonEventManager::UnSubscribeCommonEvent(subscriber); } diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp index 81242d0754..5fa94916a2 100644 --- a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp @@ -28,10 +28,10 @@ #include "context_deal.h" #include "form_event.h" #include "form_st_common_info.h" -#include "system_test_form_util.h" #include "iservice_registry.h" #include "nlohmann/json.hpp" #include "system_ability_definition.h" +#include "system_test_form_util.h" using OHOS::AAFwk::Want; using namespace testing::ext; @@ -123,7 +123,6 @@ void FmsAcquireFormTestMax::FormEventSubscriber::OnReceiveEvent(const CommonEven void FmsAcquireFormTestMax::SetUpTestCase() { - // SystemTestFormUtil::InstallHaps(hapNameList); if (!SubscribeEvent()) { GTEST_LOG_(INFO) << "SubscribeEvent error"; } @@ -131,7 +130,6 @@ void FmsAcquireFormTestMax::SetUpTestCase() void FmsAcquireFormTestMax::TearDownTestCase() { - // SystemTestFormUtil::UninstallBundle(bundleNameList); GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; CommonEventManager::UnSubscribeCommonEvent(subscriber); } @@ -687,7 +685,7 @@ bool FmsAcquireFormTestMax::FmsAcquireFormTempForFailed(const std::string &bundl std::string strFormId = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ACQUIRE_FORM_TEMP, EVENT_CODE_TEMP); bool result = strFormId.empty(); EXPECT_TRUE(result); - GTEST_LOG_(INFO) << "FmsAcquireFormTempForFailed, result:" << result; + GTEST_LOG_(INFO) << "FmsAcquireFormTempForFailed, result:" << result; std::cout << "END FmsAcquireFormTempForFailed, add temp form" << std::endl; diff --git a/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp index 68034614ed..5d68727764 100644 --- a/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp +++ b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp @@ -28,25 +28,16 @@ #include "context_deal.h" #include "form_event.h" #include "form_st_common_info.h" -#include "system_test_form_util.h" #include "iservice_registry.h" #include "nlohmann/json.hpp" #include "system_ability_definition.h" +#include "system_test_form_util.h" using OHOS::AAFwk::Want; using namespace testing::ext; using namespace std::chrono_literals; using namespace OHOS::STtools; -namespace { -std::vector bundleNameList = { - "com.ohos.form.manager.notsystemapp", -}; -std::vector hapNameList = { - "fmsSystemTestHostNotSys-signed", -}; -} // namespace - namespace OHOS { namespace AppExecFwk { class FmsDeleteFormTest : public testing::Test { @@ -151,7 +142,6 @@ void FmsDeleteFormTest::FormEventSubscriber::OnReceiveEvent(const CommonEventDat void FmsDeleteFormTest::SetUpTestCase() { std::cout << "START Install============" << std::endl; - SystemTestFormUtil::InstallHaps(hapNameList); if (!SubscribeEvent()) { GTEST_LOG_(INFO) << "SubscribeEvent error"; } @@ -160,7 +150,6 @@ void FmsDeleteFormTest::SetUpTestCase() void FmsDeleteFormTest::TearDownTestCase() { std::cout << "START Uninstall============" << std::endl; - SystemTestFormUtil::UninstallBundle(bundleNameList); CommonEventManager::UnSubscribeCommonEvent(subscriber); } @@ -714,7 +703,8 @@ HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1200, Function | MediumTest | Level2) Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); SystemTestFormUtil::StartAbility(want, abilityManager); EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - std::string eventData = (i/5 == 1 ? "true" : "false"); + int tmp = 5; + std::string eventData = ((i/tmp == 1) ? "true" : "false"); SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1200, EVENT_CODE_1200, eventData); EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200)); formIds[i] = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200); @@ -903,7 +893,8 @@ void FmsDeleteFormTest::FMS_deleteForm_1400_A() Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); SystemTestFormUtil::StartAbility(want, abilityManager); EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); - std::string eventData = (i/5 == 1 ? "true" : "false"); + int tmp = 5; + std::string eventData = ((i/tmp == 1) ? "true" : "false"); SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_1400, eventData); EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); formIds[i] = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); @@ -914,7 +905,7 @@ void FmsDeleteFormTest::FMS_deleteForm_1400_A() GTEST_LOG_(INFO) << "FMS_deleteForm_1400[A], result:" << result; } } - for (int i=0; i bundleNameList = { - "com.ohos.form.manager.notsystemapp", -}; -std::vector hapNameList = { - "fmsSystemTestHostNotSys-signed", -}; -} // namespace - namespace OHOS { namespace AppExecFwk { class FmsReleaseFormTest : public testing::Test { @@ -114,7 +105,6 @@ void FmsReleaseFormTest::FormEventSubscriber::OnReceiveEvent(const CommonEventDa void FmsReleaseFormTest::SetUpTestCase() { std::cout << "START Install============" << std::endl; - SystemTestFormUtil::InstallHaps(hapNameList); if (!SubscribeEvent()) { GTEST_LOG_(INFO) << "SubscribeEvent error"; } @@ -123,7 +113,6 @@ void FmsReleaseFormTest::SetUpTestCase() void FmsReleaseFormTest::TearDownTestCase() { std::cout << "START Uninstall============" << std::endl; - SystemTestFormUtil::UninstallBundle(bundleNameList); CommonEventManager::UnSubscribeCommonEvent(subscriber); } diff --git a/test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh b/test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh index 3fa87269d0..3e71c7655e 100644 --- a/test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh +++ b/test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh @@ -11,6 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +sleepSeconds=20 + echo "acquire forms" ./FmsSelfStartingTest diff --git a/test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp b/test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp index 50933f77cc..af60e3b914 100644 --- a/test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp +++ b/test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp @@ -28,25 +28,16 @@ #include "context_deal.h" #include "form_event.h" #include "form_st_common_info.h" -#include "system_test_form_util.h" #include "iservice_registry.h" #include "nlohmann/json.hpp" #include "system_ability_definition.h" +#include "system_test_form_util.h" using OHOS::AAFwk::Want; using namespace testing::ext; using namespace std::chrono_literals; using namespace OHOS::STtools; -namespace { -std::vector bundleNameList = { - "com.form.formsystemtestservicea" -}; -std::vector hapNameList = { - "ActsFormSystemTestServiceA" -}; -} // namespace - namespace OHOS { namespace AppExecFwk { class FmsSelfStartingTest : public testing::Test { -- Gitee From 6fd7ccbf31d1829653659785a64e41aaa82521aa Mon Sep 17 00:00:00 2001 From: "zhaoyuan17@huawei.com" Date: Mon, 18 Oct 2021 21:37:37 +0800 Subject: [PATCH 6/7] codex Signed-off-by: zhaoyuan17@huawei.com --- services/formmgr/src/form_mgr_adapter.cpp | 2 +- services/formmgr/src/form_refresh_limiter.cpp | 10 +++++----- services/formmgr/src/form_timer_mgr.cpp | 4 ++-- .../common/fms/common/src/system_test_form_util.cpp | 2 +- .../fms/fms_delete_form_test/fms_delete_form_test.cpp | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/services/formmgr/src/form_mgr_adapter.cpp b/services/formmgr/src/form_mgr_adapter.cpp index df96413416..7a065d01b6 100644 --- a/services/formmgr/src/form_mgr_adapter.cpp +++ b/services/formmgr/src/form_mgr_adapter.cpp @@ -803,7 +803,7 @@ ErrCode FormMgrAdapter::AddExistFormRecord(const FormItemInfo &info, const sptr< // Add new form user uid. FormDataMgr::GetInstance().AddFormUserUid(formId, callingUid); - if(std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(), callingUid) == + if (std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(), callingUid) == newRecord.formUserUids.end()) { newRecord.formUserUids.emplace_back(callingUid); } diff --git a/services/formmgr/src/form_refresh_limiter.cpp b/services/formmgr/src/form_refresh_limiter.cpp index b0c8143501..4b5fb29285 100644 --- a/services/formmgr/src/form_refresh_limiter.cpp +++ b/services/formmgr/src/form_refresh_limiter.cpp @@ -26,14 +26,14 @@ namespace AppExecFwk { * @param formId The id of the form. * @return Returns true on success, false on failure. */ -bool FormRefreshLimiter::AddItem(const int64_t formId) +bool FormRefreshLimiter::AddItem(const int64_t formId) { APP_LOGI("%{public}s start", __func__); std::lock_guard lock(limiterMutex_); auto info = limiterMap_.find(formId); if (info == limiterMap_.end()) { LimitInfo limitInfo; - std::pair::iterator, bool> retVal = + std::pair::iterator, bool> retVal = limiterMap_.emplace(formId, limitInfo); APP_LOGI("%{public}s end", __func__); return retVal.second; @@ -46,7 +46,7 @@ bool FormRefreshLimiter::AddItem(const int64_t formId) * @brief Delete form limit info by formId. * @param formId The form id. */ -void FormRefreshLimiter::DeleteItem(const int64_t formId) +void FormRefreshLimiter::DeleteItem(const int64_t formId) { APP_LOGI("%{public}s start", __func__); std::lock_guard lock(limiterMutex_); @@ -121,7 +121,7 @@ void FormRefreshLimiter::Increase(const int64_t formId) APP_LOGI("%{public}s start", __func__); std::lock_guard lock(limiterMutex_); auto info = limiterMap_.find(formId); - if (info != limiterMap_.end()) { + if (info != limiterMap_.end()) { info->second.refreshCount++; APP_LOGI("increase,formId:%{public}" PRId64 ", count:%{public}d", formId, info->second.refreshCount); if (info->second.refreshCount == Constants::LIMIT_COUNT && !info->second.isReported) { @@ -140,7 +140,7 @@ void FormRefreshLimiter::MarkRemind(const int64_t formId) APP_LOGI("%{public}s start", __func__); std::lock_guard lock(limiterMutex_); auto info = limiterMap_.find(formId); - if (info != limiterMap_.end()) { + if (info != limiterMap_.end()) { if (info->second.refreshCount >= Constants::LIMIT_COUNT) { info->second.remindFlag = true; } diff --git a/services/formmgr/src/form_timer_mgr.cpp b/services/formmgr/src/form_timer_mgr.cpp index 4c7eadcaee..909ac54de3 100644 --- a/services/formmgr/src/form_timer_mgr.cpp +++ b/services/formmgr/src/form_timer_mgr.cpp @@ -665,9 +665,9 @@ bool FormTimerMgr::GetUpdateAtTimer(const int64_t formId, UpdateAtItem &updateAt bool FormTimerMgr::GetDynamicItem(const int64_t formId, DynamicRefreshItem &dynamicItem) { APP_LOGI("%{public}s start", __func__); - std::lock_guard lock(dynamicMutex_); + std::lock_guard lock(dynamicMutex_); std::vector::iterator itItem; - for (itItem = dynamicRefreshTasks_.begin(); itItem != dynamicRefreshTasks_.end();) { + for (itItem = dynamicRefreshTasks_.begin(); itItem != dynamicRefreshTasks_.end(); ) { if (itItem->formId == formId) { dynamicItem.formId = itItem->formId; dynamicItem.settedTime = itItem->settedTime; diff --git a/test/systemtest/common/fms/common/src/system_test_form_util.cpp b/test/systemtest/common/fms/common/src/system_test_form_util.cpp index c08b646e9b..126817d6d1 100644 --- a/test/systemtest/common/fms/common/src/system_test_form_util.cpp +++ b/test/systemtest/common/fms/common/src/system_test_form_util.cpp @@ -13,9 +13,9 @@ * limitations under the License. */ #include "system_test_form_util.h" -#include "install_tool_status_receiver.h" #include "iservice_registry.h" #include "status_receiver_host.h" +#include "install_tool_status_receiver.h" namespace OHOS { namespace STtools { diff --git a/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp index 5d68727764..4aae43bb0d 100644 --- a/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp +++ b/test/systemtest/common/fms/fms_delete_form_test/fms_delete_form_test.cpp @@ -704,7 +704,7 @@ HWTEST_F(FmsDeleteFormTest, FMS_deleteForm_1200, Function | MediumTest | Level2) SystemTestFormUtil::StartAbility(want, abilityManager); EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); int tmp = 5; - std::string eventData = ((i/tmp == 1) ? "true" : "false"); + std::string eventData = ((i / tmp == 1) ? "true" : "false"); SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1200, EVENT_CODE_1200, eventData); EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200)); formIds[i] = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1200, EVENT_CODE_1200); @@ -894,7 +894,7 @@ void FmsDeleteFormTest::FMS_deleteForm_1400_A() SystemTestFormUtil::StartAbility(want, abilityManager); EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); int tmp = 5; - std::string eventData = ((i/tmp == 1) ? "true" : "false"); + std::string eventData = ((i / tmp == 1) ? "true" : "false"); SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_1400, eventData); EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); formIds[i] = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); @@ -936,7 +936,7 @@ void FmsDeleteFormTest::FMS_deleteForm_1400_B() SystemTestFormUtil::StartAbility(want, abilityManager); EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); int tmp = 5; - std::string eventData = ((i/tmp == 1) ? "true" : "false"); + std::string eventData = ((i / tmp == 1) ? "true" : "false"); SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_DELETE_FORM_1400, EVENT_CODE_1400, eventData); EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_DELETE_FORM_1400, EVENT_CODE_1400)); formIds[i] = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_DELETE_FORM_1400, EVENT_CODE_1400); -- Gitee From 4ccb1a5661ff809460d7b18ef0d74048e653fe15 Mon Sep 17 00:00:00 2001 From: "zhaoyuan17@huawei.com" Date: Tue, 19 Oct 2021 09:29:27 +0800 Subject: [PATCH 7/7] codex Signed-off-by: zhaoyuan17@huawei.com --- services/formmgr/src/form_timer_mgr.cpp | 2 +- .../fmsSystemTestHostCommonB/src/form_ability_commonb.cpp | 2 +- .../fmsSystemTestHostNormalB/src/form_ability_b.cpp | 2 +- .../fmsSystemTestHostNormalC/include/form_ability_c.h | 6 +++--- .../include/form_st_service_ability_C.h | 2 +- .../fms_acquire_form_test_max/fms_acquire_form_test_max.cpp | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/services/formmgr/src/form_timer_mgr.cpp b/services/formmgr/src/form_timer_mgr.cpp index 909ac54de3..73b4380a60 100644 --- a/services/formmgr/src/form_timer_mgr.cpp +++ b/services/formmgr/src/form_timer_mgr.cpp @@ -667,7 +667,7 @@ bool FormTimerMgr::GetDynamicItem(const int64_t formId, DynamicRefreshItem &dyna APP_LOGI("%{public}s start", __func__); std::lock_guard lock(dynamicMutex_); std::vector::iterator itItem; - for (itItem = dynamicRefreshTasks_.begin(); itItem != dynamicRefreshTasks_.end(); ) { + for (itItem = dynamicRefreshTasks_.begin(); itItem != dynamicRefreshTasks_.end();) { if (itItem->formId == formId) { dynamicItem.formId = itItem->formId; dynamicItem.settedTime = itItem->settedTime; diff --git a/test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp index 1eb64bf8aa..a8add0eef4 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp +++ b/test/resource/formsystemtestability/fmsSystemTestHostCommonB/src/form_ability_commonb.cpp @@ -73,7 +73,7 @@ void FormAbilityCommonB::FMS_acquireForm(std::string data) } void FormAbilityCommonB::FMS_acquireForm_batch(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp index bbe58b211a..437923559a 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalB/src/form_ability_b.cpp @@ -233,7 +233,7 @@ void FormAbilityB::FMS_acquireForm_tempForm(std::string data) void FormAbilityB::FMS_acquireFormBatch(std::string data) { - APP_LOGI("%{public}s called", __func__); + APP_LOGI("%{public}s called", __func__); // Set Want info begin Want want; want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, FORM_DIMENSION_1); diff --git a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h index 2c6b0b1288..5b13e2e4c3 100644 --- a/test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h +++ b/test/resource/formsystemtestability/fmsSystemTestHostNormalC/include/form_ability_c.h @@ -13,8 +13,8 @@ * limitations under the License. */ -#ifndef _FORM_ABILITY_B_H_ -#define _FORM_ABILITY_B_H_ +#ifndef _FORM_ABILITY_C_H_ +#define _FORM_ABILITY_C_H_ #include "ability_loader.h" #include "common_event.h" #include "common_event_manager.h" @@ -87,4 +87,4 @@ public: }; } // namespace AppExecFwk } // namespace OHOS -#endif // _FORM_ABILITY_B_H_ \ No newline at end of file +#endif // _FORM_ABILITY_C_H_ \ No newline at end of file diff --git a/test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h b/test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h index 1fbfb4d26f..2b0c992999 100644 --- a/test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h +++ b/test/resource/formsystemtestability/formSystemTestServiceC/include/form_st_service_ability_C.h @@ -130,7 +130,7 @@ private: }; class AppEventSubscriber : public EventFwk::CommonEventSubscriber { public: - AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + AppEventSubscriber(const EventFwk::CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; ~AppEventSubscriber() = default; virtual void OnReceiveEvent(const EventFwk::CommonEventData &data) override; diff --git a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp index 5fa94916a2..340d8d8c9c 100644 --- a/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp +++ b/test/systemtest/common/fms/fms_acquire_form_test_max/fms_acquire_form_test_max.cpp @@ -187,7 +187,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3000, Function | MediumTest | Le sleep(7); std::cout << "START FMS_acquireForm_3000" << std::endl; std::cout << "FMS_acquireForm_3000, form size of the host A:" << normalFormsMaxA.size() << std::endl; - FmsAcquireForm3000(); + FmsAcquireForm3000(); std::cout << "END FMS_acquireForm_3000" << std::endl; } @@ -407,7 +407,7 @@ HWTEST_F(FmsAcquireFormTestMax, FMS_acquireForm_3400, Function | MediumTest | Le sleep(7); std::string strFormId = FmsAcquireFormTemp(bundleNameB, abilityNameB); tempFormsMaxB.emplace_back(strFormId); - std::cout << "FMS_acquireForm_3400, temp form size of the host B:" << tempFormsMaxB.size() << std::endl; + std::cout << "FMS_acquireForm_3400, temp form size of the host B:" << tempFormsMaxB.size() << std::endl; } std::cout << "END add temp form to the host B" << std::endl; -- Gitee

    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 +#include +#include +#include +#include +#include + +#include "app_log_wrapper.h" +#include "ability_handler.h" +#include "ability_info.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "performance_config_parser.h" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +std::vector bundleNameList = { + "com.form.formsystemtestservicea", + "com.form.formsystemtestserviceb" +}; +std::vector hapNameList = { + "ActsFormSystemTestServiceA", + "ActsFormSystemTestServiceB" +}; +} // namespace + +namespace OHOS { +namespace AppExecFwk { +static PerformanceLevel pLevel_; +static int64_t totalTime = 0; +const std::string TEST_RESULT_PATH = "./performance_test_result.txt"; + +class FormPerformanceTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + static bool SubscribeEvent(); + static bool SavePerformanceTestResult(const std::string &testcase, const int64_t &timeValue); + + void SetUp(); + void TearDown(); + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + // Test case + static void PerformanceTest_0100(); + static void PerformanceTest_0200(); + static void PerformanceTest_0300(); + static void PerformanceTest_0400(); + static void PerformanceTest_0500(); + static void PerformanceTest_0600(); + static void PerformanceTest_0700(); + static void PerformanceTest_1300(); + static void PerformanceTest_1400(); + static void PerformanceTest_1500(); + static void PerformanceTest_1600(); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityMs; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber_; +}; + +std::vector FormPerformanceTest::eventList = { + FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, FORM_EVENT_RECV_PERFORMANCE_TEST_0200, + FORM_EVENT_RECV_PERFORMANCE_TEST_0300, FORM_EVENT_RECV_PERFORMANCE_TEST_0400, FORM_EVENT_RECV_PERFORMANCE_TEST_0500, + FORM_EVENT_RECV_PERFORMANCE_TEST_0600, FORM_EVENT_RECV_PERFORMANCE_TEST_0700, FORM_EVENT_RECV_PERFORMANCE_TEST_1300, + FORM_EVENT_RECV_PERFORMANCE_TEST_1400, FORM_EVENT_RECV_PERFORMANCE_TEST_1500, FORM_EVENT_RECV_PERFORMANCE_TEST_1600, +}; + +FormEvent FormPerformanceTest::event = FormEvent(); +sptr FormPerformanceTest::abilityMs = nullptr; +std::shared_ptr FormPerformanceTest::subscriber_ = nullptr; +void FormPerformanceTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +bool FormPerformanceTest::SavePerformanceTestResult(const std::string &testcase, const int64_t &timeValue) +{ + std::ofstream o(TEST_RESULT_PATH, std::ios::app); + o.close(); + + std::fstream f(TEST_RESULT_PATH, std::ios::app); + if (f.good() == false) { + return false; + } + + f << std::setw(4) << testcase << " consuming:" << timeValue << " ms" << std::endl; + + f.close(); + return true; +} + +void FormPerformanceTest::SetUpTestCase() +{ + SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } + + PerformanceConfigParser pcp; + pcp.ParseForPerformance(PERFORMANCE_CONFIG_FILE_PATH, pLevel_); + std::cout << "performance test level : " + << "executionTimes : " << pLevel_.executionTimesLevel << std::endl; +} + +void FormPerformanceTest::TearDownTestCase() +{ + GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; + SystemTestFormUtil::UninstallBundle(bundleNameList); + CommonEventManager::UnSubscribeCommonEvent(subscriber_); + std::cout << "========performance test level : " + << "case execution Times : " << pLevel_.executionTimesLevel << std::endl; +} + +void FormPerformanceTest::SetUp() +{ + std::ofstream o(TEST_RESULT_PATH); + o.close(); + std::fstream f(TEST_RESULT_PATH); + if (f.good() == false) { + return; + } + f << std::setw(4) << "total execution times:" << pLevel_.executionTimesLevel << std::endl; + + f.close(); +} + +void FormPerformanceTest::TearDown() +{ + SystemTestFormUtil::CleanMsg(event); + + std::ofstream o(TEST_RESULT_PATH, std::ios::app); + o.close(); + std::fstream f(TEST_RESULT_PATH, std::ios::app); + if (f.good() == false) { + return; + } + f << std::setw(4) << "total time:" << totalTime << " ms" << std::endl; + + f.close(); +} +bool FormPerformanceTest::SubscribeEvent() +{ + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +void FormPerformanceTest::PerformanceTest_0100() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // AcquireForm + std::string eventData = FORM_EVENT_REQ_PERFORMANCE_TEST_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_PERFORMANCE_TEST_0100, 100, eventData); + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 101)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 101); + std::string formId = data; + + // OnUpdate + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 102)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0100, 102); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0100", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_0100 AcquireForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_0200() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // DeleteForm + std::string eventData = FORM_EVENT_REQ_PERFORMANCE_TEST_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200, eventData); + + // DeleteForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0200, 200); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0200", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_0200 DeleteForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_0300() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // ReleaseForm + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300, eventData); + + // ReleaseForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0300, 300); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0300", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_0300 ReleaseForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_0400() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // CastTempForm + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0400; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400, eventData); + + // CastTempForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0400, 400); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0400", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_0400 CastTempForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_0500() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // NotifyVisibleForms + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0500; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500, eventData); + + // NotifyVisibleForms Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0500, 500); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0500", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_0500 NotifyVisibleForms, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_0600() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // NotifyInvisibleForms + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0600; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600, eventData); + + // NotifyInvisibleForms Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0600, 600); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0600", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_0600 NotifyInvisibleForms, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_0700() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // RequestForm + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_0700; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700, eventData); + + // RequestForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_0700, 700); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_0700", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_0700 RequestForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_1300() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // GetAllFormsInfo + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300, eventData); + + // GetAllFormsInfo Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1300, 1300); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1300", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_1300 RequestForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_1400() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // GetAllFormsInfo + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400, eventData); + + // GetAllFormsInfo Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1400, 1400); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1400", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_1400 RequestForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_1500() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // GetAllFormsInfo + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1500; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500, eventData); + + // GetAllFormsInfo Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1500, 1500); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1500", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_1500 RequestForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormPerformanceTest::PerformanceTest_1600() +{ + struct timespec time1 = {0}; + struct timespec time2 = {0}; + int64_t usecTimesA = 1000000000; + int64_t usecTimesB = 1000000; + int64_t consuming = 0; + + clock_gettime(CLOCK_REALTIME, &time1); + + std::string bundleName = "com.ohos.form.manager.performance"; + std::string abilityName = "FormAbilityPerformance"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // GetAllFormsInfo + std::string eventData = FORM_EVENT_RECV_PERFORMANCE_TEST_1600; + SystemTestFormUtil::PublishEvent(FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600, eventData); + + // GetAllFormsInfo Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_PERFORMANCE_TEST_1600, 1600); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + clock_gettime(CLOCK_REALTIME, &time2); + consuming = (time2.tv_sec * usecTimesA + time2.tv_nsec - (time1.tv_sec * usecTimesA + time1.tv_nsec)) + / usecTimesB; + totalTime += consuming; + bool ret = FormPerformanceTest::SavePerformanceTestResult("FMS_performanceTest_1600", consuming); + std::cout << "SavePerformanceTestResult: "<< ret << "consuming:" << consuming << std::endl; + GTEST_LOG_(INFO) << "FMS_performanceTest_1600 RequestForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +/** + * @tc.number : FMS_performanceTest_0100 + * @tc.name : AcquireForm performance test + * @tc.desc : Test the time required to AcquireForm + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_0100, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_0100" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_0100(); + std::cout << "FMS_performanceTest_0100 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_0100" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_0400 + * @tc.name : CastTempForm performance test + * @tc.desc : Test the time required to CastTempForm + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_0400, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_0400" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_0400(); + std::cout << "FMS_performanceTest_0400 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_0400" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_0300 + * @tc.name : ReleaseForm performance test + * @tc.desc : Test the time required to ReleaseForm + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_0300, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_0300" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_0300(); + std::cout << "FMS_performanceTest_0300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_0300" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_0200 + * @tc.name : DeleteForm performance test + * @tc.desc : Test the time required to DeleteForm + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_0200, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_0200" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_0200(); + std::cout << "FMS_performanceTest_0200 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_0200" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_0500 + * @tc.name : NotifyVisibleForms performance test + * @tc.desc : Test the time required to NotifyVisibleForms + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_0500, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_0500" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_0500(); + std::cout << "FMS_performanceTest_0500 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_0500" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_0600 + * @tc.name : NotifyInvisibleForms performance test + * @tc.desc : Test the time required to NotifyInvisibleForms + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_0600, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_0600" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_0600(); + std::cout << "FMS_performanceTest_0600 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_0600" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_0700 + * @tc.name : RequestForm performance test + * @tc.desc : Test the time required to RequestForm + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_0700, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_0700" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_0700(); + std::cout << "FMS_performanceTest_0700 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_0700" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_1300 + * @tc.name : GetAllFormsInfo performance test + * @tc.desc : Test the time required to GetAllFormsInfo + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_1300, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_1300" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_1300(); + std::cout << "FMS_performanceTest_1300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_1300" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_1400 + * @tc.name : GetFormsInfoByApp performance test + * @tc.desc : Test the time required to GetFormsInfoByApp + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_1400, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_1400" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_1400(); + std::cout << "FMS_performanceTest_1400 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_1400" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_1500 + * @tc.name : GetFormsInfoByModule performance test + * @tc.desc : Test the time required to GetFormsInfoByModule + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_1500, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_1500" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_1500(); + std::cout << "FMS_performanceTest_1500 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_1500" << std::endl; +} + +/** + * @tc.number : FMS_performanceTest_1600 + * @tc.name : CheckFMSReady performance test + * @tc.desc : Test the time required to CheckFMSReady + */ +HWTEST_F(FormPerformanceTest, FMS_performanceTest_1600, Function | MediumTest | Level3) +{ + std::cout << "START FMS_performanceTest_1600" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < pLevel_.executionTimesLevel; iExecutionTimes++) { + FormPerformanceTest::PerformanceTest_1600(); + std::cout << "FMS_performanceTest_1600 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_performanceTest_1600" << std::endl; +} + +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_performance_test/performance_config_parser.h b/test/systemtest/common/fms/fms_performance_test/performance_config_parser.h new file mode 100644 index 0000000000..a72528f902 --- /dev/null +++ b/test/systemtest/common/fms/fms_performance_test/performance_config_parser.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef PERFORMANCE_CONFIG_PARSER_H +#define PERFORMANCE_CONFIG_PARSER_H + +#include +#include +#include + +#include "nlohmann/json.hpp" + +namespace OHOS { +namespace AppExecFwk { +const std::string PERFORMANCE_CONFIG_FILE_PATH{"./fms_performance_config.json"}; + +const std::string PERFORMANCE_EXECUTION_TIMES_KEY{"ExecutionTimes"}; + +struct PerformanceLevel { + int32_t executionTimesLevel{1}; +}; + +class PerformanceConfigParser { +public: + void ParseForPerformance(const std::string &path, PerformanceLevel &stlevel) + { + std::ifstream jf(path); + if (!jf.is_open()) { + std::cout << "json file can not open!" << std::endl; + return; + } + nlohmann::json jsonObj; + jf >> jsonObj; + const auto &jsonObjEnd = jsonObj.end(); + if (jsonObj.find(PERFORMANCE_EXECUTION_TIMES_KEY) != jsonObjEnd) { + jsonObj.at(PERFORMANCE_EXECUTION_TIMES_KEY).get_to(stlevel.executionTimesLevel); + if (stlevel.executionTimesLevel == 0) { + stlevel.executionTimesLevel = 1; + } + } + } +}; +} // namespace AppExecFwk +} // namespace OHOS + +#endif // PERFORMANCE_CONFIG_PARSER_H diff --git a/test/systemtest/common/fms/fms_release_form_test/BUILD.gn b/test/systemtest/common/fms/fms_release_form_test/BUILD.gn new file mode 100644 index 0000000000..1bc7de01d7 --- /dev/null +++ b/test/systemtest/common/fms/fms_release_form_test/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("FormReleaseFormTest") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "fms_release_form_test.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"FMSReleaseFormTest\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":FormReleaseFormTest" ] +} diff --git a/test/systemtest/common/fms/fms_release_form_test/fms_release_form_test.cpp b/test/systemtest/common/fms/fms_release_form_test/fms_release_form_test.cpp new file mode 100644 index 0000000000..e6e252a2b2 --- /dev/null +++ b/test/systemtest/common/fms/fms_release_form_test/fms_release_form_test.cpp @@ -0,0 +1,800 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_handler.h" +#include "ability_info.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +std::vector bundleNameList = { + "com.ohos.form.manager.notsystemapp", +}; +std::vector hapNameList = { + "fmsSystemTestHostNotSys-signed", +}; +} // namespace + +namespace OHOS { +namespace AppExecFwk { +class FmsReleaseFormTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityManager; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber; + bool FmsGetCacheInfoByFormId(std::int64_t formId); + bool FmsGetHostInfoByFormId(std::int64_t formId, std::string hostBundleName); + bool FmsGetStorageFormInfos(std::int64_t formId); + bool FmsGetFormTimerTask(std::int64_t formId); +}; + +std::vector FmsReleaseFormTest::eventList = { + FORM_EVENT_ABILITY_ONACTIVED, + FORM_EVENT_RECV_RELEASE_FORM_0100, + FORM_EVENT_RECV_RELEASE_FORM_0200, + FORM_EVENT_RECV_RELEASE_FORM_0300, + FORM_EVENT_RECV_RELEASE_FORM_0400, + FORM_EVENT_RECV_RELEASE_FORM_0500, + FORM_EVENT_RECV_RELEASE_FORM_0600, + FORM_EVENT_RECV_RELEASE_FORM_0700, + FORM_EVENT_RECV_RELEASE_FORM_0800, + FORM_EVENT_RECV_RELEASE_FORM_0900, + FORM_EVENT_RECV_RELEASE_FORM_1000, + FORM_EVENT_RECV_RELEASE_FORM_1100, + FORM_EVENT_RECV_RELEASE_FORM_1200, + FORM_EVENT_RECV_RELEASE_FORM_1300, + FORM_EVENT_RECV_RELEASE_FORM_1400, + FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, + FORM_EVENT_RECV_ONE_NORMAL_FORM, + FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL +}; + +FormEvent FmsReleaseFormTest::event = FormEvent(); +sptr FmsReleaseFormTest::abilityManager = nullptr; +std::shared_ptr FmsReleaseFormTest::subscriber = nullptr; +void FmsReleaseFormTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +void FmsReleaseFormTest::SetUpTestCase() +{ + std::cout << "START Install============" << std::endl; + SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } +} + +void FmsReleaseFormTest::TearDownTestCase() +{ + std::cout << "START Uninstall============" << std::endl; + SystemTestFormUtil::UninstallBundle(bundleNameList); + CommonEventManager::UnSubscribeCommonEvent(subscriber); +} + +void FmsReleaseFormTest::SetUp() +{ +} + +void FmsReleaseFormTest::TearDown() +{ + SystemTestFormUtil::CleanMsg(event); +} +bool FmsReleaseFormTest::SubscribeEvent() +{ + std::vector eventList = { + FORM_EVENT_ABILITY_ONACTIVED, + FORM_EVENT_RECV_RELEASE_FORM_0100, + FORM_EVENT_RECV_RELEASE_FORM_0200, + FORM_EVENT_RECV_RELEASE_FORM_0300, + FORM_EVENT_RECV_RELEASE_FORM_0400, + FORM_EVENT_RECV_RELEASE_FORM_0500, + FORM_EVENT_RECV_RELEASE_FORM_0600, + FORM_EVENT_RECV_RELEASE_FORM_0700, + FORM_EVENT_RECV_RELEASE_FORM_0800, + FORM_EVENT_RECV_RELEASE_FORM_0900, + FORM_EVENT_RECV_RELEASE_FORM_1000, + FORM_EVENT_RECV_RELEASE_FORM_1100, + FORM_EVENT_RECV_RELEASE_FORM_1200, + FORM_EVENT_RECV_RELEASE_FORM_1300, + FORM_EVENT_RECV_RELEASE_FORM_1400, + FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, + FORM_EVENT_RECV_ONE_NORMAL_FORM, + FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL + }; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber); +} +/** + * @tc.number: FMS_releaseForm_0100 + * @tc.name: host is not a system app + * @tc.desc: 1.release the form that formID is 1 + * 2.Verify the result is false + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0100, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_releaseForm_0100" << std::endl; + + std::string bundleName = "com.ohos.form.manager.notsystemapp"; + std::string abilityName = "FormAbilityNotSys"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0100, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0100, EVENT_CODE_100)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0100, EVENT_CODE_100); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0100, result:" << result; + } + + std::cout << "============END FMS_releaseForm_0100" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0200 + * @tc.name: host does not have permission + * @tc.desc: 1.release the form that formID is 1 + * 2.Verify the result is false + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0200, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_releaseForm_0200" << std::endl; + + std::string bundleName = "com.ohos.form.manager.nopermission"; + std::string abilityName = "FormAbilityNoPerm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_0200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0200, EVENT_CODE_200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0200, EVENT_CODE_200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0200, EVENT_CODE_200); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0200, result:" << result; + } + + std::cout << "============END FMS_releaseForm_0200" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0300 + * @tc.name: formID id is error(formID < 0) + * @tc.desc: 1.release the form + * 2.Verify the result is false + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0300, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_releaseForm_0300" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityReleaseForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_0300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0300, EVENT_CODE_300, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0300, EVENT_CODE_300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0300, EVENT_CODE_300); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0300, result:" << result; + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_releaseForm_0300" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0400 + * @tc.name: formID id is error(formID = 0) + * @tc.desc: 1.release the form + * 2.Verify the result is false + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0400, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_releaseForm_0400" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityReleaseForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_0400; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0400, EVENT_CODE_400, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0400, EVENT_CODE_400)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0400, EVENT_CODE_400); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0400, result:" << result; + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_releaseForm_0400" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0500 + * @tc.name: formID id is error because formId is not self + * @tc.desc: 1.host A create a formA + * 2.host B release the formA + * 2.Verify the result is false + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0500, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_releaseForm_0500" << std::endl; + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + + GTEST_LOG_(INFO) << "FMS_releaseForm_0500, data:[" << data << "]" << std::endl; + if (data != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityReleaseForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = data; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0500, EVENT_CODE_500, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0500, EVENT_CODE_500)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0500, EVENT_CODE_500); + bool result = data2 == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0500, result:" << result; + } + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, data); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_releaseForm_0500" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0600 + * @tc.name: Form ID error (FormID does not exist) + * @tc.desc: 1.host create one normal card + * 2.host delete the form + * 3.host release the form and verify the result is false + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0600, Function | MediumTest | Level0) +{ + std::cout << "============START FMS_releaseForm_0600" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityReleaseForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_0600; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0600, EVENT_CODE_600, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0600, EVENT_CODE_600)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0600, EVENT_CODE_600); + bool result = data == "false"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0600, result:" << result; + } + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_releaseForm_0600" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0700 + * @tc.name: form reference is not 0 after release form(isReleaseCache:false) + * @tc.desc: 1.host A create a normal formA + * 2.host B create a form with formA's ID + * 3.release formA(isReleaseCache is false), and verify the result is true + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0700, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_releaseForm_0700" << std::endl; + + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string formOne = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + GTEST_LOG_(INFO) << "FMS_releaseForm_0700, formOne:[" << formOne << "]" << std::endl; + if (formOne != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityReleaseForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = formOne; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0700, EVENT_CODE_700, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0700, EVENT_CODE_700)); + std::string formTwo = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0700, EVENT_CODE_700); + bool result = formTwo == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0700, result:" << result; + } + bool cacheRes = FmsGetCacheInfoByFormId(atoll(formOne.c_str())); + bool hostRes = FmsGetHostInfoByFormId(atoll(formOne.c_str()), "com.ohos.form.manager.normal"); + bool storageRes = FmsGetStorageFormInfos(atoll(formOne.c_str())); + EXPECT_TRUE(cacheRes); + EXPECT_FALSE(hostRes); + EXPECT_TRUE(storageRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101)); + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_releaseForm_0700" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0800 + * @tc.name: After releasing a normal form, the form reference is 0.(isReleaseCache:false) + * there are still created normal forms in FMS. + * @tc.desc: 1.host A an host B create one normal card respectively + * 2.host A release the form and verify the result is true + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0800, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_releaseForm_0800" << std::endl; + + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string formOne = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + GTEST_LOG_(INFO) << "FMS_releaseForm_0800, formOne:[" << formOne << "]" << std::endl; + if (formOne != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityReleaseForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = formOne; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0800, EVENT_CODE_800, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0800, EVENT_CODE_800)); + std::string formTwo = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0800, EVENT_CODE_800); + GTEST_LOG_(INFO) << "FMS_releaseForm_0800, formTwo:[" << formTwo << "]" << std::endl; + bool result = (formTwo != "false" && formTwo != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0800, result:" << result; + } + bool cacheRes = FmsGetCacheInfoByFormId(atoll(formTwo.c_str())); + bool storageRes = FmsGetStorageFormInfos(atoll(formTwo.c_str())); + bool timerRes = FmsGetFormTimerTask(atoll(formTwo.c_str())); + EXPECT_TRUE(cacheRes); + EXPECT_TRUE(storageRes); + EXPECT_FALSE(timerRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, formTwo); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101)); + } + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_releaseForm_0800" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_0900 + * @tc.name: After releasing a normal form, there is no created normal form in FMS.(isReleaseCache:false) + * @tc.desc: 1.host create one normal card + * 2.host release the form and verify the result is true + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_0900, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_releaseForm_0900" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityReleaseForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_0900; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_0900, EVENT_CODE_900, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_0900, EVENT_CODE_900)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_0900, EVENT_CODE_900); + GTEST_LOG_(INFO) << "FMS_releaseForm_0900, data:[" << data << "]" << std::endl; + bool result = (data != "false" && data != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_0900, result:" << result; + } + bool cacheRes = FmsGetCacheInfoByFormId(atoll(data.c_str())); + bool hostRes = FmsGetHostInfoByFormId(atoll(data.c_str()), "com.ohos.form.manager.normal"); + bool storageRes = FmsGetStorageFormInfos(atoll(data.c_str())); + EXPECT_TRUE(cacheRes); + EXPECT_FALSE(hostRes); + EXPECT_TRUE(storageRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, data); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101)); + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_releaseForm_0900" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_1100 + * @tc.name: After releasing a normal form, the form reference is 0.(isReleaseCache:true) + * there are still created normal forms in FMS. + * @tc.desc: 1.host A an host B create one normal form respectively + * 2.host A release the form and verify the result is true + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_1100, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_releaseForm_1100" << std::endl; + + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string formOne = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + GTEST_LOG_(INFO) << "FMS_releaseForm_1100, formOne:[" << formOne << "]" << std::endl; + if (formOne != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityReleaseForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = formOne; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_1100, EVENT_CODE_1100, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_1100, EVENT_CODE_1100)); + std::string formTwo = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_1100, EVENT_CODE_1100); + GTEST_LOG_(INFO) << "FMS_releaseForm_1100, formTwo:[" << formTwo << "]" << std::endl; + bool result = (formTwo != "false" && formTwo != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_1100, result:" << result; + } + bool cacheRes = FmsGetCacheInfoByFormId(atoll(formTwo.c_str())); + bool storageRes = FmsGetStorageFormInfos(atoll(formTwo.c_str())); + bool timerRes = FmsGetFormTimerTask(atoll(formTwo.c_str())); + EXPECT_FALSE(cacheRes); + EXPECT_TRUE(storageRes); + EXPECT_FALSE(timerRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, formTwo); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101)); + } + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_releaseForm_1100" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_1200 + * @tc.name: After releasing a normal form, there is no created normal form in FMS.(isReleaseCache:true) + * @tc.desc: 1.host create one normal card + * 2.host release the form and verify the result is true + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_1200, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_releaseForm_1200" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityReleaseForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_1200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_1200, EVENT_CODE_1200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_1200, EVENT_CODE_1200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_1200, EVENT_CODE_1200); + GTEST_LOG_(INFO) << "FMS_releaseForm_1200, data:[" << data << "]" << std::endl; + bool result = (data != "false" && data != ""); + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_1200, result:" << result; + } + bool cacheRes = FmsGetCacheInfoByFormId(atoll(data.c_str())); + bool hostRes = FmsGetHostInfoByFormId(atoll(data.c_str()), "com.ohos.form.manager.normal"); + bool storageRes = FmsGetStorageFormInfos(atoll(data.c_str())); + EXPECT_FALSE(cacheRes); + EXPECT_FALSE(hostRes); + EXPECT_TRUE(storageRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, data); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101)); + SystemTestFormUtil::CleanMsg(event); + std::cout << "============END FMS_releaseForm_1200" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_1300 + * @tc.name: single host continuously release forms + * @tc.desc: 1.There are 2 forms created by the single host + * 2.single host release 2 forms successfully + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_1300, Function | MediumTest | Level2) +{ + std::cout << "============START FMS_releaseForm_1300" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityReleaseForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = ""; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_1300, EVENT_CODE_1300, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300); + bool result = data != ""; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_1300, result:" << result; + } + GTEST_LOG_(INFO) << "FMS_releaseForm_1300, data:[" << data << "]" << std::endl; + if (data != "") { + std::string eventData2 = data; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_1300, EVENT_CODE_1300, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300)); + std::string data2 = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_1300, EVENT_CODE_1300); + bool result2 = data2 == "true"; + EXPECT_TRUE(result2); + if (!result2) { + GTEST_LOG_(INFO) << "FMS_releaseForm_1300, result2:" << result2; + } + } + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_releaseForm_1300" << std::endl; +} + +/** + * @tc.number: FMS_releaseForm_1400 + * @tc.name: release temp form + * @tc.desc: 1.host create one temp form + * 2.release the form and judge the result is true + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_1400, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_releaseForm_1400" << std::endl; + + std::string bundleName = "com.ohos.form.manager.normal"; + std::string abilityName = "FormAbilityReleaseForm"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_RELEASE_FORM_1400; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_1400, EVENT_CODE_1400, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_1400, EVENT_CODE_1400)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_1400, EVENT_CODE_1400); + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_1400, result:" << result; + } + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_releaseForm_1400" << std::endl; +} +/** + * @tc.number: FMS_releaseForm_1000 + * @tc.name: form reference is not 0 after release form(isReleaseCache:true) + * @tc.desc: 1.host A create a normal formA + * 2.host B create a form with formA's ID + * 3.release formA(isReleaseCache:true), and verify the result is true + */ +HWTEST_F(FmsReleaseFormTest, FMS_releaseForm_1000, Function | MediumTest | Level1) +{ + std::cout << "============START FMS_releaseForm_1000" << std::endl; + + std::string bundleName = "com.ohos.form.manager.commona"; + std::string abilityName = "FormAbilityCommonA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = "false"; // normal form + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100)); + std::string formOne = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_ONE_NORMAL_FORM, EVENT_CODE_100); + + GTEST_LOG_(INFO) << "FMS_releaseForm_1000, formOne:[" << formOne << "]" << std::endl; + if (formOne != "") { + std::string bundleName2 = "com.ohos.form.manager.normal"; + std::string abilityName2 = "FormAbilityReleaseForm"; + MAP_STR_STR params2; + Want want2 = SystemTestFormUtil::MakeWant("device", abilityName2, bundleName2, params2); + SystemTestFormUtil::StartAbility(want2, abilityManager); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData2 = formOne; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_1000, EVENT_CODE_1000, eventData2); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_1000, EVENT_CODE_1000)); + std::string formTwo = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_RELEASE_FORM_1000, EVENT_CODE_1000); + bool result = formTwo == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_releaseForm_1000, result:" << result; + } + bool cacheRes = FmsGetCacheInfoByFormId(atoll(formOne.c_str())); + bool hostRes = FmsGetHostInfoByFormId(atoll(formOne.c_str()), "com.ohos.form.manager.normal"); + bool storageRes = FmsGetStorageFormInfos(atoll(formOne.c_str())); + EXPECT_TRUE(cacheRes); + EXPECT_FALSE(hostRes); + EXPECT_TRUE(storageRes); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_ONE_NORMAL_FORM_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_ONE_NORMAL_FORM_DEL, EVENT_CODE_101)); + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101, formOne); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_RELEASE_FORM_COMMON_DEL, EVENT_CODE_101)); + } + SystemTestFormUtil::CleanMsg(event); + + std::cout << "============END FMS_releaseForm_1000" << std::endl; +} +bool FmsReleaseFormTest::FmsGetCacheInfoByFormId(std::int64_t formId) +{ + std::string cachedData = SystemTestFormUtil::QueryFormInfoByFormId(formId); + bool cacheRes = false; + std::string formIdStr = std::to_string(formId); + std::string::size_type pos = cachedData.find(formIdStr); + if (pos != cachedData.npos) { + std::cout << "######### formId is found in cache" << std::endl; + cacheRes = true; + } else { + std::cout << "######### Can't find formId in cache!" << std::endl; + cacheRes = false; + } + return cacheRes; +} +bool FmsReleaseFormTest::FmsGetHostInfoByFormId(std::int64_t formId, std::string hostBundleName) +{ + std::string hostData = SystemTestFormUtil::QueryFormInfoByFormId(formId); + bool hostRes = false; + std::string::size_type pos = hostData.find(hostBundleName); + if (pos != hostData.npos) { + std::cout << "######### hostBundleName is found in cache" << std::endl; + hostRes = true; + } else { + std::cout << "######### Can't find hostBundleName in cache!" << std::endl; + hostRes = false; + } + return hostRes; +} +bool FmsReleaseFormTest::FmsGetStorageFormInfos(std::int64_t formId) +{ + std::string storageData = SystemTestFormUtil::QueryStorageFormInfos(); + bool storageRes = false; + std::string formIdStr = std::to_string(formId); + std::string::size_type pos = storageData.find(formIdStr); + if (pos != storageData.npos) { + std::cout << "######### formId is found in storage" << std::endl; + storageRes = true; + } else { + std::cout << "######### Can't find formId in storage!" << std::endl; + storageRes = false; + } + return storageRes; +} +bool FmsReleaseFormTest::FmsGetFormTimerTask(std::int64_t formId) +{ + std::string timerRes = SystemTestFormUtil::QueryFormTimerByFormId(formId); + if (timerRes == "true") { + std::cout << "######### formId is found in TimerTask" << std::endl; + return true; + } else { + std::cout << "######### Can't find formId in TimerTask!" << std::endl; + return false; + } +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_self_starting_test/BUILD.gn b/test/systemtest/common/fms/fms_self_starting_test/BUILD.gn new file mode 100644 index 0000000000..3e85f1586c --- /dev/null +++ b/test/systemtest/common/fms/fms_self_starting_test/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("FmsSelfStartingTest") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "fms_self_starting_test.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"FmsSelfStartingTest\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":FmsSelfStartingTest" ] +} diff --git a/test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh b/test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh new file mode 100644 index 0000000000..6ca84e72f3 --- /dev/null +++ b/test/systemtest/common/fms/fms_self_starting_test/fms_acquire_forms_and_self_starting.sh @@ -0,0 +1,56 @@ +# Copyright (c) 2021 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. + +sleepSeconds=20 + +echo "Install hap begin" +chmod 644 /system/app/fmsSystemTestSelfStartingA-signed.hap +bm install -p /system/app/fmsSystemTestSelfStartingA-signed.hap +sleep 1 +chmod 644 /system/app/fmsSystemTestSelfStartingB-signed.hap +bm install -p /system/app/fmsSystemTestSelfStartingB-signed.hap +sleep 1 +echo "Install hap end" +echo "acquire forms" +./FmsSelfStartingTest + +if [ $? -eq 0 ]; then + sleep 10 + echo "acquire forms succeed" +else + echo "acquire forms failed" + exit +fi + +formStorage=`fm query -s` +echo "get form storage:" +echo "${formStorage}" + +sleep 2 +echo "kill foundation" +pgrep foundation | xargs kill -9 + +echo "sleep ${sleepSeconds} seconds" +sleep ${sleepSeconds} + +newFormStorage=`fm query -s` +echo "get form storage after FMS restart:" +echo "${newFormStorage}" + +if [ "${formStorage}" == "${newFormStorage}" ]; then + echo "same form storage" +else + echo "not same form storage" +fi + +exit \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_self_starting_test/fms_check_self_starting.sh b/test/systemtest/common/fms/fms_self_starting_test/fms_check_self_starting.sh new file mode 100644 index 0000000000..1ec86d1138 --- /dev/null +++ b/test/systemtest/common/fms/fms_self_starting_test/fms_check_self_starting.sh @@ -0,0 +1,47 @@ +# Copyright (c) 2021 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. + +abilityName=$1 +bundleName=$2 +sleepSeconds=20 +MaxlinesInOneLoop=22000 +linesInOnLoop=5000 +loop=1 +if [ -n "$3" ]; then + loopKey=$3 + loop=$((10#${loopKey})) +fi +echo "loop times: ${loop}" +for i in $(seq 1 ${loop}) +do + echo "==========loop: ${i} start==========" + echo "kill foundation" + pgrep foundation | xargs kill -9 + + echo "sleep ${sleepSeconds} seconds" + sleep ${sleepSeconds} + + echo "check whether the FMS restart" + /system/bin/aa start -d aa -a ${abilityName} -b ${bundleName};hilog -a ${MaxlinesInOneLoop} | tail -n ${linesInOnLoop}>>log_loop${loop}.txt + + if [ $? -eq 0 ]; then + echo "loop ${i}: FMS restart succeed" + echo "clean host" + killall -9 ${bundleName} + else + echo "loop ${i}: FMS restart failed" + exit + fi +done + +exit diff --git a/test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp b/test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp new file mode 100644 index 0000000000..c8d252c131 --- /dev/null +++ b/test/systemtest/common/fms/fms_self_starting_test/fms_self_starting_test.cpp @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_handler.h" +#include "ability_info.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +std::vector bundleNameList = { + "com.form.formsystemtestservicea" +}; +std::vector hapNameList = { + "ActsFormSystemTestServiceA" +}; +} // namespace + +namespace OHOS { +namespace AppExecFwk { +class FmsSelfStartingTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp) {}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityMs; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber_; +}; + +std::vector FmsSelfStartingTest::eventList = { + FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_SELF_STARTING_TEST_0100, FORM_EVENT_RECV_SELF_STARTING_TEST_0200, + FORM_EVENT_RECV_SELF_STARTING_TEST_0300 +}; + +FormEvent FmsSelfStartingTest::event = FormEvent(); +sptr FmsSelfStartingTest::abilityMs = nullptr; +std::shared_ptr FmsSelfStartingTest::subscriber_ = nullptr; +void FmsSelfStartingTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +void FmsSelfStartingTest::SetUpTestCase() +{ + SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } +} + +void FmsSelfStartingTest::TearDownTestCase() +{ + GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; + SystemTestFormUtil::UninstallBundle(bundleNameList); + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +void FmsSelfStartingTest::SetUp() +{ +} + +void FmsSelfStartingTest::TearDown() +{ + GTEST_LOG_(INFO) << "CleanMsg calld"; + SystemTestFormUtil::CleanMsg(event); +} +bool FmsSelfStartingTest::SubscribeEvent() +{ + GTEST_LOG_(INFO) << "SubscribeEvent calld"; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +/** + * @tc.number: FMS_Start_0300_01 + * @tc.name: Host A add one form + * @tc.desc: + */ +HWTEST_F(FmsSelfStartingTest, FMS_Start_0300_01, Function | MediumTest | Level1) +{ + std::cout << "START FMS_Start_0300_01" << std::endl; + + std::string bundleName = "com.ohos.form.manager.selfStartingA"; + std::string abilityName = "FormAbilitySelfStartingA"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_SELF_STARTING_TEST_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_SELF_STARTING_TEST_0100, EVENT_CODE_100, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_SELF_STARTING_TEST_0100, EVENT_CODE_100)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_SELF_STARTING_TEST_0100, EVENT_CODE_100); + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_Start_0300_01, result:" << result; + } + std::cout << "END FMS_Start_0300_01" << std::endl; +} + +/** + * @tc.number: FMS_Start_0300_02 + * @tc.name: Host B add form one + * @tc.desc: + */ +HWTEST_F(FmsSelfStartingTest, FMS_Start_0300_02, Function | MediumTest | Level1) +{ + std::cout << "START FMS_Start_0300_02" << std::endl; + std::string bundleName = "com.ohos.form.manager.selfStartingB"; + std::string abilityName = "FormAbilitySelfStartingB"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_SELF_STARTING_TEST_0200; + GTEST_LOG_(INFO) << "FMS_Start_0300_02, eventData:" << eventData; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_SELF_STARTING_TEST_0200, EVENT_CODE_200, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_SELF_STARTING_TEST_0200, EVENT_CODE_200)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_SELF_STARTING_TEST_0200, EVENT_CODE_200); + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_Start_0300_02, result:" << result; + } + + std::cout << "END FMS_Start_0300_02" << std::endl; +} + +/** + * @tc.number: FMS_Start_0300_03 + * @tc.name: Host B add form two + * @tc.desc: + */ +HWTEST_F(FmsSelfStartingTest, FMS_Start_0300_03, Function | MediumTest | Level1) +{ + std::cout << "START FMS_Start_0300_03" << std::endl; + std::string bundleName = "com.ohos.form.manager.selfStartingB"; + std::string abilityName = "FormAbilitySelfStartingB"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + std::string eventData = FORM_EVENT_REQ_SELF_STARTING_TEST_0300; + GTEST_LOG_(INFO) << "FMS_Start_0300_03, eventData:" << eventData; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_SELF_STARTING_TEST_0300, EVENT_CODE_300, eventData); + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_SELF_STARTING_TEST_0300, EVENT_CODE_300)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_SELF_STARTING_TEST_0300, EVENT_CODE_300); + bool result = data == "true"; + EXPECT_TRUE(result); + if (!result) { + GTEST_LOG_(INFO) << "FMS_Start_0300_03, result:" << result; + } +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_stress_test/BUILD.gn b/test/systemtest/common/fms/fms_stress_test/BUILD.gn new file mode 100644 index 0000000000..d50c87e644 --- /dev/null +++ b/test/systemtest/common/fms/fms_stress_test/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("FormStressTest") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "fms_stress_test.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"formManagerStressTest\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":FormStressTest" ] +} diff --git a/test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp b/test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp new file mode 100644 index 0000000000..54b42cb0d8 --- /dev/null +++ b/test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp @@ -0,0 +1,627 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_info.h" +#include "ability_handler.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "stress_test_config_parser.h" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +std::vector bundleNameList = { + "com.form.formsystemtestservicea", + "com.form.formsystemtestserviceb" +}; +std::vector hapNameList = { + "ActsFormSystemTestServiceA", + "ActsFormSystemTestServiceB" +}; +} // namespace + +namespace OHOS { +namespace AppExecFwk { +static StressTestLevel stLevel_; +static int g_iSuccessfulTimes = 0; +class FormStressTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + // Test case + static void StressTest_0100(); + static void StressTest_0200(); + static void StressTest_0300(); + static void StressTest_1100(); + static void StressTest_1300(); + static void StressTest_1700(); + static void StressTest_1800(); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityMs; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber_; +}; + +std::vector FormStressTest::eventList = { + FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_STRESS_TEST_0100, + FORM_EVENT_RECV_STRESS_TEST_0100_01, FORM_EVENT_RECV_STRESS_TEST_0200, + FORM_EVENT_RECV_STRESS_TEST_0200_01, FORM_EVENT_RECV_STRESS_TEST_0200_02, FORM_EVENT_RECV_STRESS_TEST_0200_03, + FORM_EVENT_RECV_STRESS_TEST_0300, FORM_EVENT_RECV_STRESS_TEST_0300_01, FORM_EVENT_RECV_STRESS_TEST_0300_02, + FORM_EVENT_RECV_STRESS_TEST_0400, FORM_EVENT_RECV_STRESS_TEST_0500, + FORM_EVENT_RECV_STRESS_TEST_1100, FORM_EVENT_RECV_STRESS_TEST_1100_01, FORM_EVENT_RECV_STRESS_TEST_1100_02, + FORM_EVENT_RECV_STRESS_TEST_1100_03, FORM_EVENT_RECV_STRESS_TEST_1300, FORM_EVENT_RECV_STRESS_TEST_1300_01, + FORM_EVENT_RECV_STRESS_TEST_1300_02, FORM_EVENT_RECV_STRESS_TEST_1300_03, + FORM_EVENT_RECV_STRESS_TEST_1700, FORM_EVENT_RECV_STRESS_TEST_1700_01, FORM_EVENT_RECV_STRESS_TEST_1700_02, + FORM_EVENT_RECV_STRESS_TEST_1800, +}; + +FormEvent FormStressTest::event = FormEvent(); +sptr FormStressTest::abilityMs = nullptr; +std::shared_ptr FormStressTest::subscriber_ = nullptr; +void FormStressTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); +} + +void FormStressTest::SetUpTestCase() +{ + SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } + + StressTestConfigParser stcp; + stcp.ParseForStressTest(STRESS_TEST_CONFIG_FILE_PATH, stLevel_); + std::cout << "stress test level : " + << "executionTimes : " << stLevel_.executionTimesLevel << ", time:" << stLevel_.sleepTime << std::endl; +} + +void FormStressTest::TearDownTestCase() +{ + GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; + SystemTestFormUtil::UninstallBundle(bundleNameList); + CommonEventManager::UnSubscribeCommonEvent(subscriber_); + std::cout << "========stress test level : " + << "case execution Times : " << stLevel_.executionTimesLevel << ", time:" << stLevel_.sleepTime << std::endl; +} + +void FormStressTest::SetUp() +{ + g_iSuccessfulTimes = 0; +} + +void FormStressTest::TearDown() +{ + std::cout << "========Stress test: " + << "Current case Successful Times : " << g_iSuccessfulTimes++ << "=========" << std::endl; + GTEST_LOG_(INFO) << "CleanMsg calld"; + SystemTestFormUtil::CleanMsg(event); +} +bool FormStressTest::SubscribeEvent() +{ + GTEST_LOG_(INFO) << "SubscribeEvent calld"; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +void FormStressTest::StressTest_0100() +{ + std::string bundleName = "com.ohos.form.manager.stress"; + std::string abilityName = "FormAbilityStress"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // AcquireForm + std::string eventData = FORM_EVENT_REQ_STRESS_TEST_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_0100, 100, eventData); + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0100, 101)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0100, 101); + std::string formId = data; + + // OnUpdate + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0100, 102)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0100, 102); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_0100 AcquireForm, result:" << result; + } + + // DeleteForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0100_01, 103)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0100_01, 103); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + g_iSuccessfulTimes++; + GTEST_LOG_(INFO) << "FMS_stressTest_0100 DeleteForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormStressTest::StressTest_0200() +{ + std::string bundleName = "com.ohos.form.manager.stress"; + std::string abilityName = "FormAbilityStress"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // AcquireForm + std::string eventData = FORM_EVENT_REQ_STRESS_TEST_0200; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_0200, 200, eventData); + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200, 201)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200, 201); + std::string formId = data; + GTEST_LOG_(INFO) << "FMS_stressTest_0200 AcquireForm, formId:" << formId; + + // OnUpdate + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200, 202)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200, 202); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_0200 AcquireForm 001, result:" << result; + } + + // ReleaseForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200_01, 203)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200_01, 203); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_0200 ReleaseForm, result:" << result; + } + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200_02, 204)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200_02, 204); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_0200 AcquireForm 002, result:" << result; + } + + // DeleteForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0200_03, 205)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0200_03, 205); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + g_iSuccessfulTimes++; + GTEST_LOG_(INFO) << "FMS_stressTest_0200 DeleteForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormStressTest::StressTest_0300() +{ + std::string bundleName = "com.ohos.form.manager.stress"; + std::string abilityName = "FormAbilityStress"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // AcquireForm + std::string eventData = FORM_EVENT_REQ_STRESS_TEST_0300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_0300, 300, eventData); + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300, 301)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300, 301); + std::string formId = data; + + // OnUpdate + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300, 302)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300, 302); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_0300 AcquireForm, result:" << result; + } + + // CastTempForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300_01, 303)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300_01, 303); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_0300 CastTempForm, result:" << result; + } + + // DeleteForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_0300_02, 304)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_0300_02, 304); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + g_iSuccessfulTimes++; + GTEST_LOG_(INFO) << "FMS_stressTest_0300 DeleteForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormStressTest::StressTest_1100() +{ + std::string bundleName = "com.ohos.form.manager.stress"; + std::string abilityName = "FormAbilityStress"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // AcquireForm + std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1100, 1100, eventData); + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1101)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1101); + std::string formId = data; + + // OnUpdate + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1102)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100, 1102); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1100 AcquireForm, result:" << result; + } + + // NotifyInvisibleForms Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100_01, 1103); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1100 NotifyInvisibleForms, result:" << result; + } + + // NotifyVisibleForms Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100_02, 1104); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1100 notifyVisibleForms, result:" << result; + } + + // DeleteForm + eventData = formId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1100_03, 1105, eventData); + + // DeleteForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1100_03, 1105); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + g_iSuccessfulTimes++; + GTEST_LOG_(INFO) << "FMS_stressTest_1100 DeleteForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormStressTest::StressTest_1300() +{ + std::string bundleName = "com.ohos.form.manager.stress"; + std::string abilityName = "FormAbilityStress"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // AcquireForm + std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1300; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1300, 1300, eventData); + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1301)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1301); + std::string formId = data; + + // OnUpdate + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1302)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300, 1302); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1300 AcquireForm, result:" << result; + } + + // EnableUpdateForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300_01, 1303); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1300 EnableUpdateForm, result:" << result; + } + + // DisableUpdateForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300_02, 1304); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1300 DisableUpdateForm, result:" << result; + } + + // DeleteForm + eventData = formId; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1300_03, 1305, eventData); + + // DeleteForm Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1300_03, 1305); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + g_iSuccessfulTimes++; + GTEST_LOG_(INFO) << "FMS_stressTest_1300 DeleteForm, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormStressTest::StressTest_1700() +{ + std::string bundleName = "com.ohos.form.manager.stress"; + std::string abilityName = "FormAbilityStress"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // GetAllFormsInfo + std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1700; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1700, 1700, eventData); + + // GetAllFormsInfo Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1700, 1700)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1700, 1700); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1700 GetAllFormsInfo, result:" << result; + } + + // GetFormsInfoByApp Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1700_01, 1701); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_stressTest_1700 GetFormsInfoByApp, result:" << result; + } + + // GetFormsInfoByModule Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1700_02, 1702); + result = data == "true"; + EXPECT_TRUE(result); + if (result) { + g_iSuccessfulTimes++; + GTEST_LOG_(INFO) << "FMS_stressTest_1700 GetFormsInfoByModule, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormStressTest::StressTest_1800() +{ + std::string bundleName = "com.ohos.form.manager.stress"; + std::string abilityName = "FormAbilityStress"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // CheckFMSReady + std::string eventData = FORM_EVENT_REQ_STRESS_TEST_1800; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_STRESS_TEST_1800, 1800, eventData); + + // CheckFMSReady Result + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_STRESS_TEST_1800, 1800)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_STRESS_TEST_1800, 1800); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + g_iSuccessfulTimes++; + GTEST_LOG_(INFO) << "FMS_stressTest_1800 CheckFMSReady, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +/** + * @tc.number : FMS_stressTest_0100 + * @tc.name : AcquireForm/DeleteForm stress test + * @tc.desc : AcquireForm successfully/DeleteForm successfully + */ +HWTEST_F(FormStressTest, FMS_stressTest_0100, Function | MediumTest | Level2) +{ + std::cout << "START FMS_stressTest_0100" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { + sleep(stLevel_.sleepTime); + FormStressTest::StressTest_0100(); + std::cout << "FMS_stressTest_0100 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_stressTest_0100" << std::endl; +} + +/** + * @tc.number : FMS_stressTest_0200 + * @tc.name : AcquireForm、ReleaseForm/DeleteForm stress test + * @tc.desc : AcquireForm successfully/ReleaseForm successfully/DeleteForm successfully + */ +HWTEST_F(FormStressTest, FMS_stressTest_0200, Function | MediumTest | Level2) +{ + std::cout << "START FMS_stressTest_0200" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { + sleep(stLevel_.sleepTime); + FormStressTest::StressTest_0200(); + std::cout << "FMS_stressTest_0200 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_stressTest_0200" << std::endl; +} + +/** + * @tc.number : FMS_stressTest_0300 + * @tc.name : AcquireForm/CastTempForm/DeleteForm stress test + * @tc.desc : AcquireForm successfully/CastTempForm successfully/DeleteForm successfully + */ +HWTEST_F(FormStressTest, FMS_stressTest_0300, Function | MediumTest | Level2) +{ + std::cout << "START FMS_stressTest_0300" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { + sleep(stLevel_.sleepTime); + FormStressTest::StressTest_0300(); + std::cout << "FMS_stressTest_0300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_stressTest_0300" << std::endl; +} + +/** + * @tc.number : FMS_stressTest_1100 + * @tc.name : NotifyInvisibleForms/NotifyVisibleForms stress test + * @tc.desc : NotifyInvisibleForms successfully/NotifyVisibleForms successfully + */ +HWTEST_F(FormStressTest, FMS_stressTest_1100, Function | MediumTest | Level2) +{ + std::cout << "START FMS_stressTest_1100" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { + sleep(stLevel_.sleepTime); + FormStressTest::StressTest_1100(); + std::cout << "FMS_stressTest_1100 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_stressTest_1100" << std::endl; +} + +/** + * @tc.number : FMS_stressTest_1300 + * @tc.name : EnableUpdateForm/DisableUpdateForm stress test + * @tc.desc : EnableUpdateForm successfully/DisableUpdateForm successfully + */ +HWTEST_F(FormStressTest, FMS_stressTest_1300, Function | MediumTest | Level2) +{ + std::cout << "START FMS_stressTest_1300" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { + sleep(stLevel_.sleepTime); + FormStressTest::StressTest_1300(); + std::cout << "FMS_stressTest_1300 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_stressTest_1300" << std::endl; +} + +/** + * @tc.number : FMS_stressTest_1700 + * @tc.name : GetAllFormsInfo/GetFormsInfoByApp/GetFormsInfoByModule stress test + * @tc.desc : GetAllFormsInfo successfully/GetFormsInfoByApp successfully/GetFormsInfoByModule successfully + */ +HWTEST_F(FormStressTest, FMS_stressTest_1700, Function | MediumTest | Level2) +{ + std::cout << "START FMS_stressTest_1700" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { + FormStressTest::StressTest_1700(); + std::cout << "FMS_stressTest_1700 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_stressTest_1700" << std::endl; +} + +/** + * @tc.number : FMS_stressTest_1800 + * @tc.name : CheckFMSReady stress test + * @tc.desc : CheckFMSReady successfully + */ +HWTEST_F(FormStressTest, FMS_stressTest_1800, Function | MediumTest | Level2) +{ + std::cout << "START FMS_stressTest_1800" << std::endl; + + for (int iExecutionTimes = 0; iExecutionTimes < stLevel_.executionTimesLevel; iExecutionTimes++) { + FormStressTest::StressTest_1800(); + std::cout << "FMS_stressTest_1800 ExecutionTimes:" << iExecutionTimes + 1 << std::endl; + } + + std::cout << "END FMS_stressTest_1800" << std::endl; +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json b/test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json new file mode 100644 index 0000000000..c52dcc61af --- /dev/null +++ b/test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json @@ -0,0 +1,4 @@ +{ + "ExecutionTimes": 5, + "SleepTime": 3 +} diff --git a/test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h b/test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h new file mode 100644 index 0000000000..c561309652 --- /dev/null +++ b/test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef STRESS_TEST_CONFIG_PARSER_H +#define STRESS_TEST_CONFIG_PARSER_H + +#include +#include +#include + +#include "nlohmann/json.hpp" + +namespace OHOS { +namespace AppExecFwk { +const std::string STRESS_TEST_CONFIG_FILE_PATH{"./fms_stress_test_config.json"}; + +const std::string STRESS_TEST_EXECUTION_TIMES_KEY{"ExecutionTimes"}; +const std::string STRESS_TEST_SLEEP_TIME_KEY{"SleepTime"}; + +struct StressTestLevel { + int32_t executionTimesLevel{1}; + int32_t sleepTime{3}; +}; + +class StressTestConfigParser { +public: + void ParseForStressTest(const std::string &path, StressTestLevel &stlevel) + { + std::ifstream jf(path); + if (!jf.is_open()) { + std::cout << "json file can not open!" << std::endl; + return; + } + nlohmann::json jsonObj; + jf >> jsonObj; + const auto &jsonObjEnd = jsonObj.end(); + if (jsonObj.find(STRESS_TEST_EXECUTION_TIMES_KEY) != jsonObjEnd) { + jsonObj.at(STRESS_TEST_EXECUTION_TIMES_KEY).get_to(stlevel.executionTimesLevel); + if (stlevel.executionTimesLevel == 0) { + stlevel.executionTimesLevel = 1; + } + } + + if (jsonObj.find(STRESS_TEST_SLEEP_TIME_KEY) != jsonObjEnd) { + jsonObj.at(STRESS_TEST_SLEEP_TIME_KEY).get_to(stlevel.sleepTime); + } + } +}; +} // namespace AppExecFwk +} // namespace OHOS + +#endif // STRESS_TEST_CONFIG_PARSER_H diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn b/test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn new file mode 100644 index 0000000000..5e137851a0 --- /dev/null +++ b/test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2021 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. + +import("//build/test.gni") +import("//foundation/appexecfwk/standard/appexecfwk.gni") + +module_output_path = "appexecfwk_standard/formmanagerst" + +ohos_systemtest("FormUninstallAppTest") { + module_out_path = module_output_path + include_dirs = [ + "${aafwk_path}/interfaces/innerkits/ability_manager/include", + "${appexecfwk_path}/test/systemtest/common/fms/common/include", + "//base/notification/ces_standard/test/systemtest/common/resource", + "//foundation/distributedschedule/safwk/services/safwk/include", + ] + + sources = [ + "${appexecfwk_path}/test/systemtest/common/fms/common/src/form_event.cpp", + "${appexecfwk_path}/test/systemtest/common/fms/common/src/system_test_form_util.cpp", + "fms_uninstall_app_test.cpp", + ] + + cflags = [] + if (target_cpu == "arm") { + cflags += [ "-DBINDER_IPC_32BIT" ] + } + + configs = [ + "${aafwk_path}/services/abilitymgr:abilityms_config", + "${appexecfwk_path}/services/appmgr:appmgr_config", + ] + + deps = [ + "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", + "${aafwk_path}/services/abilitymgr:abilityms", + "${appexecfwk_path}/common:libappexecfwk_common", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//third_party/googletest:gtest_main", + ] + + defines = [ "APP_LOG_TAG = \"formManagerUninstallAppTest\"" ] + + external_deps = [ + "aafwk_standard:base", + "aafwk_standard:want", + "appexecfwk_standard:appexecfwk_base", + "appexecfwk_standard:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_L2:samgr_proxy", + ] +} + +group("systemtest") { + testonly = true + + deps = [ ":FormUninstallAppTest" ] +} diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp b/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp new file mode 100644 index 0000000000..53de9abe35 --- /dev/null +++ b/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp @@ -0,0 +1,331 @@ +/* + * Copyright (c) 2021 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. + */ + +#include +#include +#include +#include + +#include "ability_info.h" +#include "ability_handler.h" +#include "ability_local_record.h" +#include "ability_start_setting.h" +#include "app_log_wrapper.h" +#include "common_event.h" +#include "common_event_manager.h" +#include "context_deal.h" +#include "form_event.h" +#include "form_st_common_info.h" +#include "system_test_form_util.h" +#include "iservice_registry.h" +#include "nlohmann/json.hpp" +#include "uninstall_app_test_config_parser.h" +#include "system_ability_definition.h" + +using OHOS::AAFwk::Want; +using namespace testing::ext; +using namespace std::chrono_literals; +using namespace OHOS::STtools; + +namespace { +std::vector bundleNameList = { + "com.form.formsystemtestservicea", + //"com.form.formsystemtestserviceb" +}; +std::vector hapNameList = { + "ActsFormSystemTestServiceA", + //"ActsFormSystemTestServiceB" +}; +} // namespace + +namespace OHOS { +namespace AppExecFwk { + +//static UninstallAPPTestLevel unLevel_; +static std::string uninstallBundleName = ""; +const std::string COMMON_EVENT_PACKAGE_REMOVED = "usual.event.PACKAGE_REMOVED"; + +class FormUninstallAppTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + static bool SubscribeEvent(); + + void SetUp(); + void TearDown(); + void StartAbilityKitTest(const std::string &abilityName, const std::string &bundleName); + void TerminateAbility(const std::string &eventName, const std::string &abilityName); + + // Test case + static void UninstallTest_0100(); + static void UninstallTest_0200(); + static void UninstallTest_0300(); + static void UninstallTest_1100(); + static void UninstallTest_1300(); + static void UninstallTest_1700(); + static void UninstallTest_1800(); + + class FormEventSubscriber : public CommonEventSubscriber { + public: + explicit FormEventSubscriber(const CommonEventSubscribeInfo &sp) : CommonEventSubscriber(sp){}; + virtual void OnReceiveEvent(const CommonEventData &data) override; + ~FormEventSubscriber() = default; + }; + + static sptr abilityMs; + static FormEvent event; + static std::vector eventList; + static std::shared_ptr subscriber_; +}; + +std::vector FormUninstallAppTest::eventList = { + FORM_EVENT_ABILITY_ONACTIVED, FORM_EVENT_RECV_UNINSTALL_TEST_0100, FORM_EVENT_RECV_UNINSTALL_TEST_0200, + FORM_EVENT_RECV_UNINSTALL_TEST_0300, FORM_EVENT_RECV_UNINSTALL_TEST_0400, FORM_EVENT_RECV_UNINSTALL_TEST_0500, + FORM_EVENT_RECV_UNINSTALL_TEST_0600, FORM_EVENT_RECV_UNINSTALL_TEST_0700, FORM_EVENT_RECV_UNINSTALL_TEST_0800, + FORM_EVENT_RECV_UNINSTALL_TEST_0900, FORM_EVENT_RECV_UNINSTALL_TEST_1000, FORM_EVENT_RECV_UNINSTALL_TEST_1100, + FORM_EVENT_RECV_UNINSTALL_TEST_1200, FORM_EVENT_RECV_UNINSTALL_TEST_1300, FORM_EVENT_RECV_UNINSTALL_TEST_1400, + FORM_EVENT_RECV_UNINSTALL_TEST_1500, FORM_EVENT_RECV_UNINSTALL_TEST_1600, FORM_EVENT_RECV_UNINSTALL_TEST_1700, + FORM_EVENT_RECV_UNINSTALL_TEST_1800, COMMON_EVENT_PACKAGE_REMOVED +}; + +FormEvent FormUninstallAppTest::event = FormEvent(); +sptr FormUninstallAppTest::abilityMs = nullptr; +std::shared_ptr FormUninstallAppTest::subscriber_ = nullptr; +void FormUninstallAppTest::FormEventSubscriber::OnReceiveEvent(const CommonEventData &data) +{ + GTEST_LOG_(INFO) << "OnReceiveEvent: event=" << data.GetWant().GetAction(); + GTEST_LOG_(INFO) << "OnReceiveEvent: data=" << data.GetData(); + GTEST_LOG_(INFO) << "OnReceiveEvent: code=" << data.GetCode(); + SystemTestFormUtil::Completed(event, data.GetWant().GetAction(), data.GetCode(), data.GetData()); + + if (data.GetWant().GetAction() == COMMON_EVENT_PACKAGE_REMOVED) { + GTEST_LOG_(INFO) << "OnReceiveEvent: bundleName =" << data.GetWant().GetElement().GetBundleName(); + uninstallBundleName = data.GetWant().GetElement().GetBundleName(); + } +} + +void FormUninstallAppTest::SetUpTestCase() +{ + SystemTestFormUtil::InstallHaps(hapNameList); + if (!SubscribeEvent()) { + GTEST_LOG_(INFO) << "SubscribeEvent error"; + } +} + +void FormUninstallAppTest::TearDownTestCase() +{ + GTEST_LOG_(INFO) << "UnSubscribeCommonEvent calld"; + //SystemTestFormUtil::UninstallBundle(bundleNameList); + CommonEventManager::UnSubscribeCommonEvent(subscriber_); +} + +void FormUninstallAppTest::SetUp() +{ +} + +void FormUninstallAppTest::TearDown() +{ + GTEST_LOG_(INFO) << "CleanMsg calld"; + SystemTestFormUtil::CleanMsg(event); +} +bool FormUninstallAppTest::SubscribeEvent() +{ + GTEST_LOG_(INFO) << "SubscribeEvent calld"; + MatchingSkills matchingSkills; + for (const auto &e : eventList) { + matchingSkills.AddEvent(e); + } + CommonEventSubscribeInfo subscribeInfo(matchingSkills); + subscribeInfo.SetPriority(1); + subscriber_ = std::make_shared(subscribeInfo); + return CommonEventManager::SubscribeCommonEvent(subscriber_); +} + +void FormUninstallAppTest::UninstallTest_0100() +{ + std::string bundleName = "com.ohos.form.manager.Uninstall"; + std::string abilityName = "FormAbilityUninstallApp"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + // AcquireForm + std::string eventData = FORM_EVENT_REQ_UNINSTALL_TEST_0100; + SystemTestFormUtil::PublishEvent(FORM_EVENT_REQ_UNINSTALL_TEST_0100, 100, eventData); + + // OnAcquired + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 101)); + std::string data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 101); + std::string formId = data; + + // OnUpdate + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 102)); + data = SystemTestFormUtil::GetData(event, FORM_EVENT_RECV_UNINSTALL_TEST_0100, 102); + bool result = data == "true"; + EXPECT_TRUE(result); + if (result) { + GTEST_LOG_(INFO) << "FMS_uninstallAPP_0100 AcquireForm, result:" << result; + } + + // Uninstall app + SystemTestFormUtil::UninstallBundle(bundleNameList); + + // Uninstall app event + EXPECT_EQ(0, SystemTestFormUtil::WaitCompleted(event, COMMON_EVENT_PACKAGE_REMOVED, 0)); + result = uninstallBundleName == "com.form.formsystemtestservicea"; + EXPECT_TRUE(result); + if (result) { + uninstallBundleName = ""; + GTEST_LOG_(INFO) << "FMS_uninstallAPP_0100 Uninstall app, result:" << result; + } + + SystemTestFormUtil::CleanMsg(event); +} + +void FormUninstallAppTest::UninstallTest_0200() +{ + std::string bundleName = "com.ohos.form.manager.uninstall"; + std::string abilityName = "FormAbilityUninstallApp"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + SystemTestFormUtil::CleanMsg(event); +} + +void FormUninstallAppTest::UninstallTest_0300() +{ + std::string bundleName = "com.ohos.form.manager.uninstall"; + std::string abilityName = "FormAbilityUninstallApp"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + SystemTestFormUtil::CleanMsg(event); +} + +void FormUninstallAppTest::UninstallTest_1100() +{ + std::string bundleName = "com.ohos.form.manager.uninstall"; + std::string abilityName = "FormAbilityUninstallApp"; + MAP_STR_STR params; + Want want = SystemTestFormUtil::MakeWant("device", abilityName, bundleName, params); + SystemTestFormUtil::StartAbility(want, abilityMs); + EXPECT_EQ(SystemTestFormUtil::WaitCompleted(event, FORM_EVENT_ABILITY_ONACTIVED, 0), 0); + + SystemTestFormUtil::CleanMsg(event); +} + +void FormUninstallAppTest::UninstallTest_1300() +{ +} + +void FormUninstallAppTest::UninstallTest_1700() +{ +} + +void FormUninstallAppTest::UninstallTest_1800() +{ +} + +/** + * @tc.number : FMS_uninstallAPP_0100 + * @tc.name : AcquireForm. then uninstall the service app + * @tc.desc : uninstall the service app successfully + */ +HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_0100, Function | MediumTest | Level2) +{ + std::cout << "START FMS_uninstallAPP_0100" << std::endl; + + FormUninstallAppTest::UninstallTest_0100(); + + std::cout << "END FMS_uninstallAPP_0100" << std::endl; +} + +/** + * @tc.number : FMS_uninstallAPP_0200 + * @tc.name : AcquireForm、ReleaseForm/DeleteForm uninstall test + * @tc.desc : AcquireForm successfully/ReleaseForm successfully/DeleteForm successfully + */ +HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_0200, Function | MediumTest | Level2) +{ + std::cout << "START FMS_uninstallAPP_0200" << std::endl; + + std::cout << "END FMS_uninstallAPP_0200" << std::endl; +} + +/** + * @tc.number : FMS_uninstallAPP_0300 + * @tc.name : AcquireForm/CastTempForm/DeleteForm uninstall test + * @tc.desc : AcquireForm successfully/CastTempForm successfully/DeleteForm successfully + */ +HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_0300, Function | MediumTest | Level2) +{ + std::cout << "START FMS_uninstallAPP_0300" << std::endl; + std::cout << "END FMS_uninstallAPP_0300" << std::endl; +} + +/** + * @tc.number : FMS_uninstallAPP_1100 + * @tc.name : NotifyInvisibleForms/NotifyVisibleForms uninstall test + * @tc.desc : NotifyInvisibleForms successfully/NotifyVisibleForms successfully + */ +HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1100, Function | MediumTest | Level2) +{ + std::cout << "START FMS_uninstallAPP_1100" << std::endl; + + std::cout << "END FMS_uninstallAPP_1100" << std::endl; +} + +/** + * @tc.number : FMS_uninstallAPP_1300 + * @tc.name : EnableUpdateForm/DisableUpdateForm uninstall test + * @tc.desc : EnableUpdateForm successfully/DisableUpdateForm successfully + */ +HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1300, Function | MediumTest | Level2) +{ + std::cout << "START FMS_uninstallAPP_1300" << std::endl; + + std::cout << "END FMS_uninstallAPP_1300" << std::endl; +} + +/** + * @tc.number : FMS_uninstallAPP_1700 + * @tc.name : GetAllFormsInfo/GetFormsInfoByApp/GetFormsInfoByModule uninstall test + * @tc.desc : GetAllFormsInfo successfully/GetFormsInfoByApp successfully/GetFormsInfoByModule successfully + */ +HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1700, Function | MediumTest | Level2) +{ + std::cout << "START FMS_uninstallAPP_1700" << std::endl; + + std::cout << "END FMS_uninstallAPP_1700" << std::endl; +} + +/** + * @tc.number : FMS_uninstallAPP_1800 + * @tc.name : CheckFMSReady uninstall test + * @tc.desc : CheckFMSReady successfully + */ +HWTEST_F(FormUninstallAppTest, FMS_uninstallAPP_1800, Function | MediumTest | Level2) +{ + std::cout << "START FMS_uninstallAPP_1800" << std::endl; + + std::cout << "END FMS_uninstallAPP_1800" << std::endl; +} +} // namespace AppExecFwk +} // namespace OHOS \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json b/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json new file mode 100644 index 0000000000..c52dcc61af --- /dev/null +++ b/test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json @@ -0,0 +1,4 @@ +{ + "ExecutionTimes": 5, + "SleepTime": 3 +} diff --git a/test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h b/test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h new file mode 100644 index 0000000000..b65cf84d84 --- /dev/null +++ b/test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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. + */ +#ifndef UNINSTALL_APP_TEST_CONFIG_PARSER_H +#define UNINSTALL_APP_TEST_CONFIG_PARSER_H + +#include +#include +#include + +#include "nlohmann/json.hpp" + +namespace OHOS { +namespace AppExecFwk { +const std::string UNINSTALL_TEST_CONFIG_FILE_PATH{"./fms_uninstall_app_test_config.json"}; + +const std::string UNINSTALL_TEST_EXECUTION_TIMES_KEY{"ExecutionTimes"}; +const std::string UNINSTALL_TEST_SLEEP_TIME_KEY{"SleepTime"}; + +struct UninstallAPPTestLevel { + int32_t executionTimesLevel{1}; + int32_t sleepTime{3}; +}; + +class UninstallAPPTestConfigParser { +public: + void ParseForUninstallAPPTest(const std::string &path, UninstallAPPTestLevel &stlevel) + { + std::ifstream jf(path); + if (!jf.is_open()) { + std::cout << "json file can not open!" << std::endl; + return; + } + nlohmann::json jsonObj; + jf >> jsonObj; + const auto &jsonObjEnd = jsonObj.end(); + if (jsonObj.find(UNINSTALL_TEST_EXECUTION_TIMES_KEY) != jsonObjEnd) { + jsonObj.at(UNINSTALL_TEST_EXECUTION_TIMES_KEY).get_to(stlevel.executionTimesLevel); + if (stlevel.executionTimesLevel == 0) { + stlevel.executionTimesLevel = 1; + } + } + + if (jsonObj.find(UNINSTALL_TEST_SLEEP_TIME_KEY) != jsonObjEnd) { + jsonObj.at(UNINSTALL_TEST_SLEEP_TIME_KEY).get_to(stlevel.sleepTime); + } + } +}; +} // namespace AppExecFwk +} // namespace OHOS + +#endif // UNINSTALL_APP_TEST_CONFIG_PARSER_H diff --git a/tools/fm/src/fms_command.cpp b/tools/fm/src/fms_command.cpp index 462165df9a..bcc3b184ed 100755 --- a/tools/fm/src/fms_command.cpp +++ b/tools/fm/src/fms_command.cpp @@ -445,7 +445,7 @@ int FormMgrShellCommand::GetStringInfo(IFormMgr::Message code, MessageParcel &da std::vector stringInfoList; if (!reply.ReadStringVector(&stringInfoList)) { APP_LOGE("%{public}s, failed to read string vector from reply", __func__); - return false; + return ERR_APPEXECFWK_PARCEL_ERROR; } if (stringInfoList.empty()) { APP_LOGI("%{public}s, No string info", __func__); -- Gitee From 984a780c99441b7dc55114045fdc8c05c4d39ea4 Mon Sep 17 00:00:00 2001 From: "zhaoyuan17@huawei.com" Date: Mon, 18 Oct 2021 15:03:59 +0800 Subject: [PATCH 2/7] fms st patch Signed-off-by: zhaoyuan17@huawei.com --- test/systemtest/common/fms/BUILD.gn | 4 - .../common/fms/fms_fuzz_test/BUILD.gn | 73 -- .../fms_fuzz_test_config/config.json | 29 - .../include/fuzz_test_config_parser.h | 79 -- .../fms_fuzz_test/include/fuzz_test_manager.h | 58 -- .../fms/fms_fuzz_test/include/get_param.h | 394 --------- .../fms/fms_fuzz_test/src/fms_fuzz_test.cpp | 73 -- .../fms_fuzz_test/src/fuzz_test_manager.cpp | 217 ----- .../fms/fms_fuzz_test/src/get_param.cpp | 477 ---------- .../test_lib/formManagerFuzzTest | Bin 246288 -> 0 bytes .../common/fms/fms_performance_test/BUILD.gn | 73 -- .../fms_performance_config.json | 3 - .../fms_performance_test.cpp | 816 ------------------ .../performance_config_parser.h | 57 -- .../common/fms/fms_stress_test/BUILD.gn | 73 -- .../fms/fms_stress_test/fms_stress_test.cpp | 627 -------------- .../fms_stress_test_config.json | 4 - .../stress_test_config_parser.h | 63 -- .../fms/fms_uninstall_app_test/BUILD.gn | 73 -- .../fms_uninstall_app_test.cpp | 331 ------- .../fms_uninstall_app_test_config.json | 4 - .../uninstall_app_test_config_parser.h | 63 -- 22 files changed, 3591 deletions(-) delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/BUILD.gn delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/include/get_param.h delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/src/fms_fuzz_test.cpp delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/src/fuzz_test_manager.cpp delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/src/get_param.cpp delete mode 100644 test/systemtest/common/fms/fms_fuzz_test/test_lib/formManagerFuzzTest delete mode 100644 test/systemtest/common/fms/fms_performance_test/BUILD.gn delete mode 100644 test/systemtest/common/fms/fms_performance_test/fms_performance_config/fms_performance_config.json delete mode 100644 test/systemtest/common/fms/fms_performance_test/fms_performance_test.cpp delete mode 100644 test/systemtest/common/fms/fms_performance_test/performance_config_parser.h delete mode 100644 test/systemtest/common/fms/fms_stress_test/BUILD.gn delete mode 100644 test/systemtest/common/fms/fms_stress_test/fms_stress_test.cpp delete mode 100644 test/systemtest/common/fms/fms_stress_test/fms_stress_test_config/fms_stress_test_config.json delete mode 100644 test/systemtest/common/fms/fms_stress_test/stress_test_config_parser.h delete mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/BUILD.gn delete mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test.cpp delete mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/fms_uninstall_app_test_config/fms_uninstall_app_test_config.json delete mode 100644 test/systemtest/common/fms/fms_uninstall_app_test/uninstall_app_test_config_parser.h diff --git a/test/systemtest/common/fms/BUILD.gn b/test/systemtest/common/fms/BUILD.gn index 87e8f30e59..abd1810428 100755 --- a/test/systemtest/common/fms/BUILD.gn +++ b/test/systemtest/common/fms/BUILD.gn @@ -35,11 +35,7 @@ group("systemtest") { "fms_acquire_form_test:systemtest", "fms_acquire_form_test_max:systemtest", "fms_delete_form_test:systemtest", - "fms_fuzz_test:systemtest", - "fms_performance_test:systemtest", "fms_release_form_test:systemtest", "fms_self_starting_test:systemtest", - "fms_stress_test:systemtest", - "fms_uninstall_app_test:systemtest", ] } diff --git a/test/systemtest/common/fms/fms_fuzz_test/BUILD.gn b/test/systemtest/common/fms/fms_fuzz_test/BUILD.gn deleted file mode 100644 index 4258e11b0d..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/BUILD.gn +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) 2021 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. - -import("//build/test.gni") -import("//foundation/appexecfwk/standard/appexecfwk.gni") - -module_output_path = "appexecfwk_standard/formmanagerst" - -ohos_systemtest("formManagerFuzzTest") { - module_out_path = module_output_path - include_dirs = [ - "${aafwk_path}/interfaces/innerkits/ability_manager/include", - "${appexecfwk_path}/test/systemtest/common/fms/fms_fuzz_test/include", - "//base/notification/ces_standard/test/systemtest/common/resource", - "//foundation/distributedschedule/safwk/services/safwk/include", - ] - - sources = [ - "src/fms_fuzz_test.cpp", - "src/fuzz_test_manager.cpp", - "src/get_param.cpp", - ] - - cflags = [] - if (target_cpu == "arm") { - cflags += [ "-DBINDER_IPC_32BIT" ] - } - - configs = [ - "${aafwk_path}/services/abilitymgr:abilityms_config", - "${appexecfwk_path}/services/appmgr:appmgr_config", - ] - - deps = [ - "${aafwk_path}/frameworks/kits/ability/native:abilitykit_native", - "${aafwk_path}/services/abilitymgr:abilityms", - "${appexecfwk_path}/common:libappexecfwk_common", - "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", - "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", - "//third_party/googletest:gtest_main", - ] - - defines = [ "APP_LOG_TAG = \"formManagerFuzzTest\"" ] - - external_deps = [ - "aafwk_standard:base", - "aafwk_standard:want", - "appexecfwk_standard:appexecfwk_base", - "appexecfwk_standard:appexecfwk_core", - "ces_standard:cesfwk_core", - "ces_standard:cesfwk_innerkits", - "hiviewdfx_hilog_native:libhilog", - "ipc:ipc_core", - "safwk:system_ability_fwk", - "samgr_L2:samgr_proxy", - ] -} - -group("systemtest") { - testonly = true - - deps = [ ":formManagerFuzzTest" ] -} diff --git a/test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json b/test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json deleted file mode 100644 index cddf5115eb..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/fms_fuzz_test_config/config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "ExecutionTimes": 10, - "FormManagerAbility": { - "ReleaseForm": [], - "DeleteForm": [], - "AcquireForm": [], - "UpdateForm": [], - "CastTempForm": [], - "NotifyVisibleForms": [], - "NotifyInvisibleForms": [], - "SetFormNextRefreshTime": [], - "RequestForm":[], - "EnableUpdateForm": [], - "DisableUpdateForm": [], - "CheckFMSReady": [], - "GetAllFormsInfo":[], - "GetFormsInfoByApp": [], - "GetFormsInfoByModule": [], - "ProcessFormUpdate": [], - "ProcessFormUninstall": [], - "OnDeathReceived":[], - "OnCreate": [], - "OnDelete": [], - "OnCastTemptoNormal":[], - "OnUpdate": [], - "OnVisibilityChanged": [], - "OnTriggerEvent": [] - } -} diff --git a/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h b/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h deleted file mode 100644 index bbb46bcb13..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_config_parser.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#ifndef FUZZ_CONFIG_PARSER_H -#define FUZZ_CONFIG_PARSER_H - -#include -#include -#include -#include - -#include "nlohmann/json.hpp" - -namespace OHOS { - -const std::string FUZZ_TEST_CONFIG_FILE_PATH{"./config.json"}; - -const std::string FUZZ_TEST_MAIN_LOOP_KEY{"ExecutionTimes"}; - -struct FuzzTestData { - int32_t mainLoopFlag{0}; - std::vector methodVec{}; -}; - -class FuzzTestConfigParser { -public: - void ParseForFuzzTest(const std::string &path, FuzzTestData &ftd) - { - std::cout << __func__ << std::endl; - if (path.empty()) { - std::cout << __FUNCTION__ << " invalid file path, check!" << std::endl; - return; - } - - nlohmann::json jsonObj; - std::ifstream(path) >> jsonObj; - std::cout << path; - for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) { - if (!it.key().compare(FUZZ_TEST_MAIN_LOOP_KEY)) { - ftd.mainLoopFlag = it.value(); - continue; - } - - auto className = it.key(); - if (it->is_structured()) { - for (auto itm = it->begin(); itm != it->end(); ++itm) { - auto methodName = itm.key(); - - if (!(it->is_structured() && (it->size() != 0))) { - ftd.methodVec.push_back(className + methodName); - continue; - } - - std::string param{}; - for (auto itp = itm->begin(); itp != itm->end(); ++itp) { - auto tp = itp.value(); - param += tp; - } - ftd.methodVec.push_back(className + methodName + param); - } - } - } - } -}; - -} // namespace OHOS - -#endif // FUZZ_CONFIG_PARSER_H diff --git a/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h b/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h deleted file mode 100644 index dc04216757..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/include/fuzz_test_manager.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#ifndef FormManagerFuzzTest_H -#define FormManagerFuzzTest_H - -#include -#include -#include -#include - -#include "nlohmann/json.hpp" -namespace OHOS { -namespace AppExecFwk { - -class FormManagerFuzzTest { -public: - typedef std::shared_ptr Ptr; - ~FormManagerFuzzTest() - {} - static Ptr GetInstance() - { - if (fuzzTestInstance == nullptr) { - fuzzTestInstance = std::shared_ptr(new FormManagerFuzzTest); - } - return fuzzTestInstance; - } - - void StartFuzzTest(); - -private: - void SetJsonFunction(std::string); - void SetExecutionTimes(uint16_t executionTimes); - FormManagerFuzzTest(); - FormManagerFuzzTest(FormManagerFuzzTest &) = delete; - FormManagerFuzzTest &operator=(const FormManagerFuzzTest &) = delete; - static Ptr fuzzTestInstance; - uint16_t m_executionTimes{}; - std::unordered_map remainderMap_{}; - std::unordered_map> callFunctionMap_{}; - - void RegisterFormManagerAbility(); -}; -} // namespace AppExecFwk -} // namespace OHOS - -#endif \ No newline at end of file diff --git a/test/systemtest/common/fms/fms_fuzz_test/include/get_param.h b/test/systemtest/common/fms/fms_fuzz_test/include/get_param.h deleted file mode 100644 index 5702abff80..0000000000 --- a/test/systemtest/common/fms/fms_fuzz_test/include/get_param.h +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ -#ifndef GET_PARAM_H -#define GET_PARAM_H -#include -#include -#include -#include - -#include "ability.h" -#include "form_info.h" -#include "form_js_info.h" -#include "pac_map.h" -#include "parcel.h" -#include "patterns_matcher.h" -#include "uri.h" -#include "want.h" - -namespace OHOS { -namespace AppExecFwk { -//class TestDumper; -bool GetBoolParam(); -uint8_t GetU8Param(); -unsigned int GetUIntParam(); -uint16_t GetU16Param(); -uint32_t GetU32Param(); -uint64_t GetU64Param(); -int8_t GetS8Param(); -int16_t GetS16Param(); -int32_t GetS32Param(); -int64_t GetS64Param(); -char32_t GetChar32Param(); - -short GetShortParam(); -long GetLongParam(); -int GetIntParam(); -double GetDoubleParam(); -float GetFloatParam(); -char GetCharParam(); -char *GetCharArryParam(); -std::string GetStringParam(); -std::map GetS64S32MapParam(); -std::vector GetBoolVectorParam(); -std::vector GetShortVectorParam(); -std::vector GetLongVectorParam(); -std::vector GetIntVectorParam(); -std::vector GetFloatVectorParam(); -std::vector GetDoubleVectorParam(); -std::vector GetCharVectorParam(); -std::vector GetChar32VectorParam(); -std::vector GetStringVectorParam(); -template -std::vector GetUnsignVectorParam(); -std::vector GetS8VectorParam(); -std::vector GetS16VectorParam(); -std::vector GetS32VectorParam(); -std::vector GetS64VectorParam(); -std::shared_ptr GetParamAbility(); -OHOS::AppExecFwk::Want GetParamWant(); -OHOS::AppExecFwk::FormInfo GetParamFormInfo(); -std::vector GetmFormInfoVectorParam(); -OHOS::AppExecFwk::FormJsInfo GetParamFormJsInfo(); -std::shared_ptr GetParamFormCallback(); -sptr GetParamSptrAbility(); -OHOS::AppExecFwk::FormProviderData GetParamFormProviderData(); - -class FormManagerAbilityTest : public Ability { -public: - FormManagerAbilityTest(); - ~FormManagerAbilityTest(); - - bool ReleaseForm(const int64_t formId); - - /** - * @brief Releases an obtained form by its ID. - * - *

    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 ZUX@;Pet@4XSfHW*DEHpGU;yVAT|5w;( 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

-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 MV!UK9aU0VA0=|YGUjP6A literal 0 HcmV?d00001 diff --git a/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNormalB-signed.hap b/test/resource/fms/fms_host_ability_bundle/native/fmsSystemTestHostNormalB-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..1aae96bdca4b315127cd11b7783f7cfdac667fe5 GIT binary patch literal 146540 zcmZ^KS5y;Bv^Bki4xx8J=|xaMS|}d^A{|7f1Vlt>0qHG~5>QZjQ91$wBA^uM2?Qz9 z0v0+Xbfkt(3d!$X|62F$&cnRT%$_rQ&g?m7#@d{g4oJns#6(3!C8_nV`rpDrMMvcU z@qhZI}c7RJc?YYT&cwP^DwVPh;HSQ8X9YWz$j>qpte5WOpkmf`#cjauLcb%n|SqcOB64E6@Vk0sJZXJ~Hy+6DYP(9h^8~)*^?Md@Bs>F|h zf7Q3g-Y8fIs^5QfZNmS)O~6f+o3At~FwNi1Ui!R0JDYn&8|4_6l?-~-ZA zm}n|^`umrf9GdsCPmneU%Omo;!}hM-cdFaewcJ{scQ!u`Dld~ienO`Y(8|ZBzE6MV zt)c#i>RwxN?;vNH&!>?GUyY~l?_1}1EKT#b7!TNoN$iGfB?G2nSiF1wCSb-@Dwm-< zLa8k^{V^XmLSs7L=`J)N^hT>HFfq4~eYjAv+RSVu;O{JCxcq_ffs*sAYZ{b@!_N^c9(nHr|TFTNimAv+MJQe!?YI-r=g;9 z|3_Qv|C7NI|G4b?{P9!2AiId5U{61L&!AvaNKmjPV#@mrz&tpP)RdphdQ4IS*uU#mTxw7q=0-9C>YHat9?U&G4pln*SK?{=T> zQ{FGm&MzLm)V}(Ih(LnG2fGg}OCmPjZ$^CF4U?=h^i&gEp#ZDdQO~-}QgxQ`K^BY& zYeT&}?H^EBN4^{bdTe*q5Pn2+P-2|9CJ-jIy8gKjI`sZnoI_x zsyW?8^Vo$t1IDkx`1@*Z(ASrpIb5W5TtHZ${ywx&frIOdg8ndn%wnN_6|Cl?_1P_K z+Gi54gq6s+B2S^hN?|qmxxa?ztFRq&iK*)!RL6atq<(jWINccT+8|dLg+O2V2jdC! zeW%{Rh?O%%=5hUHB{eyy)w2H!xg~>Tbs+SfyCWQ!R*8cGKxJQ8r1~QP93OB`xDuZl zwV0b-YTI1gh70H9u7G8oE8hTH%W!UhhH{)Jz)@MD-v%glZ}}96Fma!LVY`rvl9KCs zi(+4|)O?L_zL^HyjkqRQpE3Q*#*yLL9ozhtA+P%ZK{CsxaU zfqItio5S`Ia$R|-d%W^Ga2Cg$m1W?Pk^6u{GOe6W5z0$;p)?<;QjRkMa5O0Q``?r$ zd2G#txghZT+CL)VmTJ*YP?(v^xu%{*Zm*R5ZQ&_DalsL^gzVjZi0G9!@usRjtMTGjV_Y!Xv0Oh}B1z^2^{uml4 zX5k(raTCO77I;^+KTS@jyB)~ST29D9$)GAVtKq;MS)Ei=btSMswyOwrF6Z39dlh0G zt_-)bZ42;8M%uNhz^CmluELSY*(>*f`xeV3awO?T$%`Ju)bKSUrM$s_n%RAbzZI< z0MA5Z`}<_0{~`Ei3`aoP2b={UPwd{I697~ZkRh4fWw<;A+&5T0211RO(~N5H?(cvU zOZWZ&Z^Xv{R=7o9CCQU(9qf?+Y<*`m3Hrw<92a0@!*1>^l-GDz~zz)m;wBA#*-TG zDBEx@IND|=LgOaVCS3I&stZy0<(V}>8~$%+X#h$}|Lt3Km}#IK06lL$+a&jI$vEV8 zThjgkIsb^G0&tY$&Vj{7|A^Q12KBECDR`?*I6wS+@{q&!tdHk+BqLngx=k3KB}*DK zlViVaawrUFE&DPUAva}xp#mr=$GHGBvPUWih4DZ}n{Xg}(=PlvT*K~y=^v~MKDfBu zKO3+B(^t5GdRwynR>^k*Hy_(ByhR@zp36RZ%bIx&(f$=ZpgCgu@@%cj#yq{M`$0#(pCcbHh|DsV9A7GAVh)f7{+A&D#fsC{bYp0i^X~`x;aketZ*Fq4g9IspLqqc z^C#lx&^ZRvuP7xGt_Ki#>+5ljhD6JP@1=L>Ao(;w_rS4w=%vK#58t_KJjRl0d(s{P z80sY2?imX{ntN@aZbrJw_GIX4ia{Uq{acJhV0%i;M1bEZ;CJ4{aeI?$aj4t`fEzI% z(lxNwGsW=>O)n!jw?}=VKdfGv&+4bDmP@X-1t*RZHNWh={d>Ef$#6Lbm`n27Gm)kK zc`QS=gm67NHjT~arWn6$5|f<>jf=9+C}X1S+uw5^0lOq#(}#wbLQP7$!Cvas0IP=b zidBsGz@U05MN1k<>`}3d(kvaILq>4uY~)Xn&C7IoJrl^?U9`a>kg~3E9{1E6vepXR zQ2HT=aT#dmcwHB8*?BMa8h5ntK>2Q=KGHJ&HU3bov?1P6aLxRSllwc`7MjaYBJ-D@v7+K_l*i=%o{b98cNlIv z@(nvZ&7cX9Icy~iStF|qBfUzma0$}rN?!uhl;0qaq@mOT)wHPq($^Hm>`m=55Fd?) z=F)vxbo-oY@qed9AK>H$^r1Lp}d+e1$%+i$SzashLbHx^pb;#?253S)8~=Y zl6z)lG3K_UDzwK0{y&oSE$RVuSP#ZD>MWkT|0vf$*o<(TGGy(f!mxLhEF25^%fNi% zD0E?9(?p|tWf|Oap+c|`ps=`7U-Bj4q@k+~o|$+Pmc1xEbvz*xcRgIUEVid)(Ezry z#X-t>v$+rHak4L|@^sT_<(;dN4PNMd1OOWUJQtunE-*_SjV9!kkzoqfH+svRlnVYC+qFZ}?)nc1x((l@BK zYV>MgcLN2t1;!t2YrZ*rGG|G@F3msg*mn+!=&?o4cPc*2!lxxEBjo6cSt(j%6V zCv);ik4|l!n||96)j%Jye8@xZ1bwsFMMswSko0u|dAf7EboE6&EX~Sfs4|J>@(#)C zB{}_tb1aI9Oiw2$1CE95#~$i5b*n<3hGq||U+RM={cKC=xG6FcT{iK8H?m96rBWWk zOn>)iW4wMx(hp0MJ>3zn1+Kg~4@?K=KkFi2P?Zgfw;wegSFxNpdb#WTri$DTDlibF zvx_w~owxIDW;6A!K!vUqkM)g^JwnDHrd`Md94i z%(DfYsK4ic#gnz!_Z;(^G5g~BdLp!>^ozl%+%gM&WD(P4Nh1E+Jr#HItv*sVJt@7a z)$LhBY8d=%32=lBw~2z$8T?SpFOjD~hMjY7fN6)+yS0n!^@jDo_~G@U0@&?Fq2|8y*waSe*cLzU@dFy!<9evWC+3T zFdn;PI04oyaFK4`)%%YGhDCxX_xBOOJ8=Fn{#H+NLc# zQ+F~iY18QPY|*CFsjEvO>u8XmIyto^jY|XYR}j|qC%`PX1CKS>57-F(0$50NRKs0{ zh$969XjWhJJT{{T@+iK`hG)P|r1zITbe2nD%Or}bb&ramX$A?QYsNUWS6&vpL})B0 zOJK$lk8U!O!SC`M^$`I~{A&k!3I?vaN}~sr4RJbbCl^Y+M*4bntOOdB0}m~p5p(&8 zhI}B`_B{86(KH7QOw-9S@veT<;d+Kqq|n6q1wIPIxvf5VahiCTO@A_WyfanH`RM#X zI)4Wh>^BW;?Q}I?|3J4yUhybM*Z3sJ~UL9t5yjcV(zmA;V2YkoLs3E?$*FVLH(|_%uO2 zEz=3Z07%_jLq3f%hB45jgmIul>D3At>?O|Pza!^@0$aSlGHbJ_9q(u8$o6q5sGjq0 z(BMljx|5NVe_>T8TLe2dFlv|vTn5r@G_jO|ail;u1HleF?+~$qT&|Cp45r3sRPfUt zA<_B_4l>L07PQb?rd#OS=WfuKXAiAbI#HyBYxmzF0fqx6{}CW|6X(}bw#vDOOd1wM z9}rN-hhp!NY zxK}K>O8=5za2ZYjWdTmsugnA?1h3|lXvapEnpu~clP>0%Pp)O6eP9VkIUd$5YM`sY z^fJt1!cheu19|n|DS;{3{$Xt}v1yWdmZAbUioX|oi-(|UWE7sf)~~Ia;Y_*f{&h2& z?PyjhBl=A2h-cnWj5_94`?V937miq!kWy$xG{xCsWC$rQOdUd7|o)btkH~gr0`!!mEY4xC26DzYwA2siUohDz2 zsB`(y9K90@8|{!D(l&|(ohnMqz#gXzPnTsN`ntR413eRI$DE@U(??gc1<(@pJqpcUf1tfnKqEqnGS_AIZ7kmsKFC z7J%L4r6(*=lWHuYVi5@Hh@&*^H~o4U^rUZKwt){N#VXV!iOjDv8d`?YekKE`5`}og zp9Vb*u>fe3z8J1RdZ_%DY?N{DxT^TnKL-RN=G&J0nMC>=m6T+6+?R`VmUzqy+_^eyYR>oiaM=fep99}YDFS(G8|n# z&$tXg38$+VA1(0qutVsfjWj3cgBZXW7lhN<^3__JW6qNy$N!KIq`Bu=n#Z{Aavn}o zPjGfR0M2|xe2{VYAj(5`vY+vfJdIdHl{3#q!$S$MU)$h6UPXEsAcpKqz360mNSYhn zstD~kou;xPx3qey)7zeIilk+xlcf0Krs*$d=?{AjvJ&vUY$vbpUx9A&vG3^`$EIc- z!5EL8=r_8Fhs-5Uta4(ly1Kbf;OXUYBq;Y<>+>{v;zyy4)`u?eBT*XsPZwz`|Cb3- zH&#y!3X4HZeC(>O5yYR@*+wAvRY@SdXepEJEN6+IR1rpe z@p@Ks9^k-Nj!Xmmz0?1+>``i5^eN9!n4dmk^|Vzt-MZ-;;Q zpb5_q6fQc8hoZfDxy|%zo0%fWUQLk!FReFLuAqDIhks7X^uf=s+Y-m)71J@oK_pI( zbG9B8W#*H13fDw=yhO=OM!dzDW$ECKYQ}|w*UTY&6%!jvdZaKzd93dmz&VyCC()2b zjjt7jsK8Hj#8}R1f~-|xhXe;E!=!n@j#*gQrTIHL;ze(zgvzU_tnE0`Jk{DcpbN@; zI-R^*ChyjKYJ8T!qWXP@k84-S+$}mgT-n6ELU*&5^eeQx^x#T*SjRW6llROL2PeDI zxXo*-FcVh3lgbWNMAEB0a8Fv84%Zqwx8=!JeMS}}5Sp_yG$F|oAIa0jwsGL{0be7# zrJ?{HRyxaQQ4O?wNjM^fpUDXz8R=qtd71S7`QbnT+^=~D{iU^Op0CkFp*2{htJFjl z<7*VU|EyI8Mf%1B_-P?+#rjC8B?&_v(==ghP%=aR*RSo$5PyRKw0^<(S;HRKe2;(H zpm;90c#kRO^~vA3iHyG%z%46Va;84VK@`iXy3pEX9)upR#uC6>s^W^!VR0*fAnaK&!qIP|OEuQN?tFtG>)QhQ{jMKl!W*)zZ21?C;IkC5ZJ|>g3E4<<-}j zyfiAQr83T~cINOC?W;pXM>*nvR(jgP0zLkj%7mAL4Fw&C-~Jxbi*TS4un-zetCx<3 z48a(2dGtC+0{sR*M=Y3sj(VNLZ310^oFmZ_-VY(Ba7_PP-P#}EdsZbyspb+!)sJi+ z@IJtMZ`hKVNJGMF?}wEoO1KH4)TB#$69Y;(`_TZ^JMjo;5bIjOE8jA*gM0LTr@~O{ z``Vo6^_=(a?)MbTF-^m`<2{--)l~sW|o$06ME% zr#IA+Ur#)R7$BLTuP06gND}Gvpu*62f$3 zl29&zysdAv&shf(V>29TDN2V54Qa2=v&@i04I?KbqirTi?vqQu%%tSTN_4N%k2=zY z(crzt0(%ie;K^U87ajSW{TgaV296)C`NaBXZ=m#7LWyreEbyv#+D+jKQjpRK+F7Lx z28H8~ss;@yR>$dPYw_hw#s%(;f~Wc_$~WmEN?C^}3Oh!` z48j;A6ngqzRjewG)M4-&vp<2D?%!is_2C;*X%Jvbx3>#`-XY zUvXb?n{~gT*_l12mZLNgmc2Qk(|^L(QI%|lZ`8+h?_I%_o2%N?pE2GWKxaR3w!CjZv{c#FYZ(#JT?ivoAlx{P~|6+Y~?!ays8RHq=H#(?7dd0I2&xF_k8xXpa+Cdp(7E5(;F^M{e}@IpW}il zKO__}y4-7>(&=e;y7E{EqPVR3{+F1nlRI(I9jdOS2eYcKIWqM4n5!q}tFfqP9G_aI z0r7J5IEqp5E?-@qs3Pm-y41|^oIXW`Z;yXFm;Gd|PT%Df(my8~HXK`$8zuk7N^klUhKsMz+4?l znFpJno*PdTABV;x?B5J|=r`nn0B3ABWo?_}0XsQl<0sXznFi*jQ3tel7B(UD+K2}c z9M=ZE8L$Gb9?Hb&=sf(+VK0$}_vM_s?Z@XVUVPTcFpoRBC7g*>H)w=2N zP?n)Eo^b$S-5|MGw-mYgdUvNgmP>TEcQz;>66Bk{&DcWGe>TKyAQl2Y41e_B!FBxu z1z`Zu3L$@O5uMF+blIgipav^2aD5>lJ9I3}E_o78f1(104Hrj!{tyf@4eSD4bD98c z{1>Z(%lU$62LSQs%7!rGxM)}QwZA^!DN};!{AcnHi1Gy#VJxEt{Im_wbD&I1S)Rt^ z+MUHtTTg`O(i6XTG4~)pvJkEEZHc2WGgu(yYBp7bnql>U_0|?!e8MSlT9vYZRKX3NmX|tj-i}i16vN889LyN(rERg2 zp2j_cq3XlsV#I0jvM&O zfo~Z3n&?)Xydl&Pn0xv3xcU?sN?QsuCStNDT+<-xThb6Ks!POEl~q80?*v>_kZz&J0eEa&Cf3D^|Bp8q)>sh!kiv}qNrEP84%_ zJ5i*Cx&)W0B0#Pg`$!y|Y|i~d3d-hLZ3b~i?t7PFBqpH+V%Es%>;H5Ug6#z2=Z+jO zemBDa1g;(4kq{^R;oe0j=_B3#JKN!$2$O$(GW#LC8>!^+)hnlgW!abjzP1Iqn)-UG zDOQZA!?*P}A%(T&Kyj$t!a&R!aC%$+L^$oi-$-+mca2UMu|61P7Bn%vpK|6U_>vs# zA(#@Q7p#p-`S_-v+yO+Tovoh-0gXARVOQs@u#A_h%G)K)1-21~T5mKgsAFA?Vkye^ z)pPM~a!=N-H0FKszq@`LEYK$Pga(OWrgblV*8RAR*3kV*Oce_b+5X{Zmzjzzxn1IQ zTuDIr34nP1Tm9>%^cQ+trZmrX8h%OO>OYLEa6>1X#}ZP`g!Skz7hNil{7LwwoiKM~ z2K7LY!z6i&B~KET5u?q-@M0Zh7-31%?U0Dyu_`WcrXmAK64`l1C>*c#F0)Fg zw0d!2y z#~*QB!qzlpI}Z8?$&=k+Gw-y3va_T&jF(MspLK0}_k^4A57aVj5V?)$E_n}9y5ip+ zOptkJ7#Y;=Nao$XU%mP&(TgYr`%if>Uc!{PNOAElRk&93<7j%XQ)a?01!XoyP#sEEnDH6K$l;C}01m zG}H?VzZDjkAacj@mQRs1Of{z`z?iHi$lp_91?CtnWV(^|{F6>5kr+0T%Vx4BR_03vn8RcTd&*zjcv1@c zyM`JP-MCS~^t9np@y0s^z`fHyf&yEWBS~LP4%Xd=UImP zJ{%~DEfIF|@>;lZDe<+MkR?|5`dT0~1B)z;gUDQ6-gQSw? z92g1tBOf;tx3SP{si(vz)vsunTP@l{m{)<(lt@ztsH1o4K0q z{KNAP!v%5Wv%6YGTG;0Hx@s65>bHZRru;j$V=rJ7&kD}hQRh#5!Vda=W2%C7ik6nI(ItNOK5Qd)ANr+w%qR(0geM%DZ!tKR#aw1=6aAkB0? z`){3#WxcV?29DWb#R@DhQJPuJB1P{Fom(B^Gjd#hXNW53+o+b9WJLuv_N9CLSndf-7^SWZyP zt}|QJ^>l-JIN6su8N@I*Q68l{U;oO ztnr+dD+c=~DAd-x zstF0eygX*)XH^z)rfa)}or~R}+jj~O3NXW-U~#i->TUM|E}WOcune)nH2xxO2S1(_ zQloEUH{$y?m7w&kfCZrdpI$$jR^#zSu5RIl5-fXM{6k?;+A!{g=K-5Nmu&lhwjHd0 zTqnyu_5Vjjzb|@=r)PIXe?K8Kp^B%C8+$iCh}w}?{mluCnT zK_>td>%{KQ+tz~B_q(Ird&#`d*~Wv#b?{b4Z2>f`iIchk=-zIIbA#St$9F}NU7lYw zHQ(vXYJX8sFWj=Bb+!ly>5YBxc01mO$&!AY#aSvq68q?-4;#BZm~LB=hL=5r?p&!Y zJb)R?-Fr%v2N-9n=hw8Zo6&Azj2EV7|IgFxE61H=c> zI0`xA4|p|H{(K4v4j_8jboAVKS-aMd!STFJJ9!rDKGSB&?V}T zrTE!l|I9@D`YqrE`2tQr7c~{|wJlZa&z_%J-m6AKK(E~Cy`Vf=5t@R z<#fi_FSf?NlI3&qTcmBvgH{mCB^q)5*bj0Z>0{Rw_Ssc&h> zj<-@FR#O6pV_hmcZVCn5Zoy96R7iqqw@}F7e3)jQt0w-^~tex<~dG^Ik44p^VInsQ)+P5ywK_dRxiD&PMnreb8?3kF%% z9f3niVbgf@4GV^_AHKG3eH@3(gW94br67Fl*q{~OGK%yh+;rJkH2xNY2=Zw2`^V|C z(MRHx)gR=7`xd00F%o zwi`l1D;YY0DTkIje2t##E_~l(cE7D|wKR8Fp`U2^6%jYWR!Ig9#PdTztpL}f*0HeB zA6q!R_4ayna@~em5@Dg^{tKJ9C`^gU)uohuT=>M|qUeajEMW)VbnGPZxwV^zB)9}q@&g~{arkL~g4KWI$#S@gkh=SpWBz(id&$iIfYe<=SG#4#L_&R|9=>?e zOZ<2{WKO){=i%j_H@Ht@JJ%Vn0mDPjgJYB5x47ERO$3H!*xLo4{M!4&VnWg#z8U!N zIXZD&*XrKV!o|lva>=yI=Vpz5Kf;38G8F9*CAt9JbQDK7Sn0@iukA<`5O2)fuKWG9 zXL}RP@ea9nNZJ?0oIHcJEc8qsgq6&b!eYnrQ5+kieodi!O(Dv!Wh+pzlXa(;Dr~={ zL!z;E9X8)a&bGi#&M={F$YqK84#AlJ&gr(lx)06mJWrsTCF%WYte?wM> z`b2*1UA(Brd|N<#hSa*SkyxZZk2y~m+dVV5d-5e8KCtNIVjzeqvx_HU{Dl`UR-w+MOjIG@48X>2d@=l&178 zk996}>_ceCpEkL*Dvsk5hZ7F#x=LCR-6#xfvUJRXPb2?qz_hjr!0xXtb=`$ z;u_!XM5@$cT^e0$m1@1m^-i!iBQtD591L@$#OE-3&i-Rh57G+8+ZNxio%tqAwsv)y zPrF!Eb(=yQ_bg^3|4tGuAszS+ljL6}#MI!&{_MiY74n>;RDS4#cCBy1K^v0}l<$3m zUb=P2CY(`H><9qfQcM}#4vW1RsWfx2BTV?Xn~=gow4comtn0!X2PGB98h70EzTXAO z`SRYsGAyR)QI!=YX8hrg!tIIOzV2TREQ>FY-+FW_?gZLhJw38vZoS)aHLPIbY8`AZ z`#lFC`xNld@pMgqzi;AZ6YTl*4%eKC`)@y;0Wgt@<+CS(^jg2qE+)ppRvmM)y^5Bs z1RC|lPuF^?0{+M_deETQXpGR|&iSxAFOo!^49}&$k;M>T2WCqdPjCQb8Vg zu#^#)bTr0`&Y<=F{W^3}=S57?;A+_U5eMREsI|AcVuyEiMLujsLJFKxIijv~041YTMFmv|lADTf+4hA%_X>iSg&72inqBJ6M(6S#w@#sc? zA^Ni={XB?2|;4 zPQqVAHCz#QJt>^38(1%qnnY3K2(4THSU0Kv=PP)8{Fbt4%ctOy z_bE5$IZh}orn!ivt;1ynbdt-NCa-Gc)TDKUIIINElBDSLtEcAS)b}VK1k2wGf8#mG z`P!bgvf$U-*@0H~S?kr5`{g!Xd3>~5-tmCm40!|uY3{6sv4x)9FRA&qz5HR&Gio0h zv9(<4*zl;kKqtuQC#E5P0sJQnGTHkkYELgjVLwwmeed>k>zC=VQGl?Iq8@M$_y9sa z7muS!REe5%L!3X&`yPqxSP*MD=$)7OlW$+J)bXGst7S~=YHi{zo%XkXAI7A2OcwFA zCixSij+1GtjOP3x^HIi;L_uR+js8J`*jW9I(_Fo$agf-jDI&ED`|p3+x^|naHG5KP zr0FcSc7{@>oyK=F91AZl^M@X@MTIdHwt1~iYiRLD3i5P)DLtN5uN9tNY>nRjJKw4c z?iQK*bZ@K<@qR~5M~36z1c5mWWQ5julK0@Y2(qK!gN@k#(oWVvUQmJU`EkwDPOizU z`^pXLE#*F)x0sL54hkF}uV{2CbUjA_1=m(@dN&{Wg@LWwZr<|8;@M0Uww*MzoK+kprN>Hq7^mn=x52M;~YKKPwVfl zS6p-};r@g#IXuRB4u?>g_SXv-arVMytJ|E`wkg&)$k&j*eh1|)6q8DwO8Dk!=T3FM z;f>e^mB+KL5U%CBX1|6tH!i*RlHyY$X*SK!+Mf>8f<}`7qAp(oFH?NPIQTe1JI{h2 z%#6h34Ijv3A81UL@8d2GQyV*c-t3{a9rMl$q8}mLcD|4oqwR%vj!h)Sc~60bUY@I%!XBVcvn!NauK4)M2rN+BL- zqISW(`n}L`y!AP~@hba&zDno5C-Da)S}Fd4CyGMzgUDTYQp#Q4!l|I+Pk^Omji+yn z`zZN`pOEr8w`NcTD|2JD-jOzAGoWZk1dDgehi{nrYt+09 zB4SaeDJ zv~{~V@X^slZmTe8{(kuOTjtiwTHwy^{BYSOc4bkhB|_)x{X7=;tNa3YQo)%m#D&Az z%_z^ebI`5f*45v8OI=Q9Wy@Lppyt03FMP}RkGI=P%N*j^8Xnb$u(3`M{6%8cPp1{K z8f3<&KJRn}qIFMOjUc1p5v?a_f^1h({-{mqAg9(>(p&hsH{Sb4iDPsK0Z;ylL&J}@ z^w-AUTkJ@C=iP9sJS+hbqHcJM|Ki>mNkA}*Sl?SB+5WmyUIk~@K7Nc3d>C5EB7Z#E zU!`#E}|Hmu}L@&$!Oej{VwZ5AVLy?GmS5ZI>3zmzp)Y)przR}q#(;wn1F2dSh0l9JI-yZVTPgW};t`_f&KrfdgOKO4^Rr@P@GnV>Rh)_^hn0QH%oM&WM zi0F-GeR0b8Ime)%|DpenJul_@O|*)uZsdAJdf4F7*>RV~^ShHr^B*mcvt2(I@8rNp z6VUr(uXhUG`f0WGj{h#ZB*kmj+qyo${~E?N9@QcDs@rB4kE=>BGQmiP&ppLKyq~)2 zKd6byPw55`3ZI&^Hd`+67u{$sIPCux5ktf7rMH)*dT;UB*q&;Vvg0RzFz2GY>MuVZ z$12q%N2G&1_wT(`ogbK0L?`HE(4-nCy zZ;`D^I`Yr)-;UlAlfH#0?Yf+wBn~}3I8$*sx{K_ZN$>w#ODaqZeb#}uuDbJ!7B;u0 zhJ4dyhkvoOBNRii+qzYMM$Bz_i$@Mx z0-~;OtQ1@q9}s_mzPSDXPdr@l*XTh$1IAC2ENfEhN8aU`|t2a?5QiQ>+`P`{231vwQ%KCJ5%gXL;QFDmxqOlG1!!# ziK`?|U=$jPZz8>GL+QnoF&&@!_jr}ILubH8#;cu}8=ogX(`>2ESlBROY`ramC!RhC zyVhYH!Fcim1NqLelkfGU^f>e4L6SVn^6FY)>fpy8(Lxl(DQaUr6ON-OsR|8N=xVJg zen(p{JdgfBttW(*U;k&PVR5njCQBhvk+j{w3w`)74T63#BIK({tAY5Qd`cxsd zSdFNcLPbf8MtrtPne$d8>3!z(jc&k(1%>BT>c7%BBHud+Cu!vT-VwqEu7zb+Hz=SE zy03KPQ@^7q>g$jYW6r=r3Pvl_9rk%&Z18|lkNEQaxyc$a!Sk!d{d;*S)%Qd;?2dxFB3I^nWV9P4An z5uaU*oUh7bP2tQ7bk5hMFt9<}o%GPpg-ts+SVJ`~M`EG%%0gQ94yVq}u%_^sfxMNk zx&q*!HTmbKkJw$>Jh=> zUi*rqr!T}pU1j6GD&ZVqqv^|n@=5|3UeG;mU8UT~2$=B?ewY2c@=a6TvT^S9@KJ+> zd>m25Ml8sz>)Q;J8EMt4zIeA?YI#xF2FhBqV>D{j8!~WaA3b;#;aI$Kljm!Z)xa#< zG0&^i25(Ox&?`GeZ(DKt7n8ZjQl8v*8@w_GpuQxSrKX_C;oVxCG|t=E+-DO=`fNV>CTyOY8Nj4`mP@A!4K<=+a$^5t2Ffmzkr5ZRS9q|K{6ywrc52wDNKUs~QhoQ&_l za_5IY;_Cq=gm*JzuiS^W6w{@dZ%(hX!?FvTI#*(BRIp)IuQXik2Y^RJu`W=W-<;Zb z?kL5R+ewv7`tFNs(BD11;F!;8bzh3zG{je39#|6kz;cI(?6KAYg~zLU5d+MBaOvDLHh2 zO3aW{lF{{5v{SO{fDx^R>rzf$m6XSr(RVJrLU^^E^5mYcw(w`VvUDBLqAuh$g((li zSF9MYmx{zdv3Hc7&LC+Ly~19~H0;(7%_tpn{x09d>8k>bsSoaHNA7ea{Dd4b{Qvhcn2XDUJ&ynYH!l_n)*8E0`lTRvH`VzkfytPbiRDEuS6I4D;xz3EIC>-nO6*T)s3 zrM<^(Aw6dgzA>H~X7iIbc4QU3M%qJiz^^bindp1m^-OMFxbxUA9ACTcZEFe^3lALt z9xM$UHO4vZm}ds=Xzjkc=J}oq?G#?e(E!c}`KI*UN^*1RZS%YHz5@_Wi~9$xw0d;J zbQag`Clug?BZ%m9>I-yDtL7(INdLVP3uZ=z9nL+G-RP?r6%NA6%vT5UurKdteesm2 zJI8f$;+YN}jXJF@d{3Hwd?+*@o_Q`^dM#QTs;(?!Yp?bZ1Y$Q&!$Bz%mgA;_?B zIh>8}*d{>q@R6j$(`Ytb*Z7^c(?-S~)G)nDmR1c~UAMN7p=-D<)8YFC7)R>BjUFO< z#W*P}ayl#eQ>Kiom5AxTZ=JGWuJEwTPy7fER>Kx_+! zD{0d}FSl-%1?zi#0Dn9<+0VSbJ!iY($fR7q#n0Y07Ki+CYsJI?K3x+62*mN6BbgKuhs zZ+blhf3ZOd^cTo+Ug07sbJkWXd;>asD1^+i@pN-}-C7ZQLrKmcC<=8^Um(m23BEe`ZAypo31K;I=PCeE9yvY}kA`K;CUEONsynV`aE zx)*5p^36@}52_b>wQ;QHV=uZ+RsS3C-!l?7eMkR-6rtD0{1FI)g<_U(pTiN?BJN)!hhvP@e$3xn+LKy7lwo#Vxt?}D5l<8x2>|$W za1mXo=n3Mdj@17TNIt-L#(OZXC>nGYV;_#6-a3FU$!zjU!|#qJU( z_7yAXbmaAF89vJ@{VPqL(bRj_9LiK&#E%on^Olux@5!^J6~BrkjncBb+h7TWFN%I2 z7yWjTeSUw=68-L)Lzu8U(s#1*?i(xbF6U8}`m!&l&xWEjj5enCI2S+s$y+CWzUS?s zc%6W^xsfOSRPeVDE*R^uqWF`jGDL{*Y|;A~@V+0G6Gi@otdyVsr1T{l+oL2&;|!K* z$nU1`+-^hL+`u*z8^ZOop&X}3Iy>#?%S60BB$Iqrk{cJflxYIH&l|CKRPDfeg2-=R z4simg^j6Si$7^d?pM-F&b15(W9O-irE=J@W{28|)~pWr=#dyVS3#O;x^!QDN(xkY-L-(KIB~t$z!f4F2CIzf1WcN>%b&zdw5>w z#|3$Y=1`YD;HE%${B4i`sve8P{45W8Elc7)BN%^Ta=s{zpOyGiMEUWb4AkY4j}ptY zcs*DYubSL;y2pFg@u#@Yir%@C_>IYPJ$VK}J|DzuPMAhTWy5z@4a^~L7xJ8r_tYb9 z5B^@V55E?PlOl?nF0K#c5ou$cuqdAaVY^rfzXsAN4)4?QNb4nDkD=PUBZ>37oIP4@ z_ummwo*&5X@2r$#1LTYEXu*e9Qn1ZWJjaN_R~6|ZI`ZC^gcW_76dfba;Z!~k_<1mg zwrEDxpZ}cmL3qE>3O(|lcV3LoFi`$CM0qU3>oMeP13r1zMpO?4i5Fp|Oa(;YV#)8- zqI?EmeG}7{C=Nbk)CAJHN77peVfMpsEp}A;e~Hq*s~K)NID)QY!7(Xf`rF+Md7m=_aRIpQF_Cu`gRArmHd8z*9XAe26vpKjnBZ| zhA_X$xHA;2UQ3?%>;^s)jnABv!*rJeJ-Un9Gm@lRNc3(OdG`lA@frNfkRJaD&t&q% z=RsOfeXS>H1mSZVqIxyN=UpHy{_JuoQTV|m{A^L!`{1fT*aCRZ2t4l~?tIE6QC_0Y z9izWV8q-J`_|C+s;0A+J;Wco)-YnzJ>U0w2(*)xEMQ{nK4_;91^>;2jxRj{fet>kg zk+5s=+MhKUkg_A-JKJkuo(Ipt;0|H_qu|cvbQOigXK?yM`n|yw!FCJW*VvW<&u-*= z%4L%cGD2HZ?cq(~qa=+O$ge#e#e7zB^V#Vs}J!!!Oc~0XUfizIu>KN&qSYq zcQ@eOd~oqH?v(ahQQ5LZ?TzmX>kO`noIBIx4PkW*e_{`@_bXMV+Gdf0oNdoZro(5k z@VJCD5=mb7#JrP=TNlgG5Uvg6)0E^JPyFVQuw}?oMV>#BGT}2#_|wYx9=;;@a3S&k z8n+er;m^oUXSlOyEFZ+@(8M}D;Hz@(fNpV7yDTQ@jFfSwrYkbsSvq{)Dv*S$iEWLf z9MM$&2jVq7QM-+x{C|LSf5&H{#PSM+S;lbZ-2BKpeE->0ehmVTD}0uZ;1{Cu@}Ijs zgt&8O;y*3m@4?N+dm``{BmM=+^9Ct{OwOHUyNcJ`NZh7$=c+rk_KXaRj8VD=q@{&q zYU4wD^-wB9^x71y!Q5Jtq771pM7L}mWA;$1la;DCjY$`;Hkpk&LsEEr>ll?thJV<{BSn)IEH;jXDO{$Kme4}6BkP99-}pr24$N?onu>DjqeN5qclcMO8#`Z zwJiJ~i-35uF4d3^d05LJNK8bc_Y&grWhn=@iC0i+N(vMP<6wJ^v@~^^(H&l!%$oQf>iFay>O_rBFL{xat}!M+VVbwIGBDl41Jex&dTm6K zQR$VUg_3Jc@kU)5G^jcxr$`>*0Ak{kwF&8ZtsU{a!eh)DbGj*78?V)6*b~#66f@ia z_0rpwsgJm6UlksdYB1{z=^D%+?C&O(PoyDAYfRCZOb|aPSz}1jCfHpJ5AX13E%dQTYqc~{ zMqP@=n3Z42MQhXax_FJv$wBX?nCzi>mK^Mf;2VyoygXxgL1!l>vV@tC9-mh)`337R zM~q81YZLgo1Etb$?N3Cdq+jMbQh-KdvP@=eNj2G3N9*TO#@J z8QC_dNi5&+Pg*?JXu@=bIf-QgvN4WFIQx^dpVdg8F%4OXqQc{g)GScx9%%?SXrOW# z+ML8+X#^$kHOP>gZ}UM6wIxqgq#+RKJjs{}m9?#yo-yfhxFzC9No|Rwau1D&QETFR zrt6Ga>=CFj$0vv6n`mW6&T6HnyZe8Xv)6x>vxoBE%o%fNGn+9Ptp7&Ns!v+m*WF#M z`VaH=_;2!70e!2L|4QDTRNk@Ll(c_uWYf8;VJ1(*KmLu}J;Mz;v5CUn1j%X>)M;j8 zIIAfsNyuFyaiuR5;2UO4U8nN+S9}(t%mt5TAPw; z)<(v4hq=?X;(B56-)IxB_Kt+vKQ+y!us%4f#+aMpnsa2|NJD__(_^r^ZNZeb1yki{ zk|IG`rE0K1r);h@vnrk;UTb3%uV`%&h^|^Ad7UqYEd16tG2OrlOW~nWm{ffD3^H;g z0uT7zDmAISQInPiMRRYFo{*$%1!{|)*XWg82=1LtiFiYk1R8bP#891H%i5fxTE^!P zGjFxrN-R%7Iy7rD%}V!RZbE_V^3xuZd!A59@Q%$&%dy+7MIpcKiNYFZbVhrkL}|=G zUIu%j#3pM~wBZRhM~M+~(b*OSj}+FvU`J(e9NeuYJL7~K%mGHDCd=lswMvce5y6=c zY|Tf-cBeko7=g`(c0?li*xuNx7;#QITO(n{D`qhg{+my!aEwRk$7^{wG?dm1L(ay5 zFRTjH&TjlgXZ{;b<`|)3S?% zJw-jG)0zZE=$!#lKq@O5h`WwreKB5Y+nJwNbIw?9?{M~JS%6*-b>q6+o`_+ZG@$=< zY*Dqn>%7BFp*o`p7=oRo;vJEip(Sx*Q$s-cjk7UgEH*?MG-fS7YHaL4?{-?FE-_26 zW9GwLrn50`A7Nk+i;%7D^(ENVX@Y$b@GH8TqgSOPi=QYC-CX z*3#(hC0=n{%bXPb??@Xs@7Af<5|f^0?|g{kwhfQfn0i2Kr(x~O_TKetYtW>dliM0~ z`AU}TJmLYV+Bh~;?m-$uw67MQcr|>Be|_Mj0C$ z_q$$`6$vuA!OUrtcEpa*=nS7lJt}34AnX9oHl}DS>%X8__*(I@EnOAOVxeKu^|s11 zDlBm{*Qds5^i;J-!BqHllu?&z#N6A)G&vF>liPnlB_h!#3fKg&aQjpZm3NR)3oRN0 z^|0D7Uq0eLvuV9Q8Th79V`@rUlU88Af{X*@`P?$Lj`2~4$M~^wkd36|%QYI_JE7NW z|3@{OpM)YKjsFez@@Cmjel&$`J>ttNWp;#TRbLy22^$_SfY};8hELzN^7s)6*=8o| zXVDgN%E6{B44=J$;j^|c*c6FuL9^emY2!W!Yr7y=>o8umvaDelm7b9X(saU37j@42 zXzWSaucglXiMo(OzuUY+s+~p;azJ2ud=D)yikHNE;hVGhLdX}I zClB^23Y(@iL~D9kjLK9QKb^hJM{`^5aaBPYlR1`OK)4Ht>uU6$Gk>-+@NR&~v z*BKI0dqt*^5oAwNcIB(fmzw0d2#|YZ4{k6-8MP*pHqX%jp(8-XGiGt?jk-KTgX#|? z^aWF%XFx&%w=q4xC^@Gi1wxi&TU(ATDj^og)yjUjJZZ)=SZnwk<|Q&DA?B4U^}|5nfQ$S~4CnVEEU4gp9ZSgSE76Ez~wK>*=7b%K}@@(S;5 zqYhz-;3Ld95*oDdr=0g;=Gk06pBSR@EKQ`Lr8bLY5CMjSuvC2lx2|Z7ZK-`BC`V~| z79`TpN(<7kXoAeEAY`=;%TI075;TMxz!c$*U$ro?D^Izn;Tvh-#V~U!Cq3jPiuqzL zhV@!YH|AMVUrx{$R$XyXaY?G4I*LGLT374ZH6vB=aqjU4%x~h)`Dz^ z(@tm75gOujIbpoA=btil!r7RFT~a!yuW%zffgjo) z63;w};1PuPdFemx!8|C;6CdDWNlb`J%#^x3icimXoH0Tdr~k)iK9v_%5Yo6kcmdKu zoX6ns5@sZ5BVcZpwe-AN${Sj$U8+7kg;fj#61u0GptAzAFx$_)r94C_ z)6I`11G0lt$G+3$*}9&==_zUdbQk`Q--XH-)T>Rp)|i#MG002(*(QP3Ad`p31X=n? zWLHutMMez}LK1LwwRva_-kkZ4D(@GkYSko`vkffw#B$xHYY7#t)u(C_s4Q)qIlM(e zk}c)MzFz9jY8ot6vU@FURAV@qvTYhS;6+knUa{=iuFOaCW!GTx7BuqO&@2katt;AF z4yK{#^qomQ1;cGLJU$V}*efjWx4ZoG$OEpJQ(GV~Hv_wU@y@ zvVwT6wY~B%k^=(MK}agH3p}E5)N7zY57cJG>P~TzV@(e53QVI5-id_@snY z^5cp@f(NRtlcuC{Uvkd*%TGDmf5!QXPB`0lzS-W>&Gw#cw*O@FXPj&PoKwx8b*A~# z%UwK$%UxKDY`$O2^AFtw6ZcPNAWZW<(b~j7jY+Fi1#9DD%*Iqh61)kCYMEgrNVp-7 zAQBGk6BBDrP1T!}zT8N`R|2s%AG1!c^kbJ#0}>MO8z9nDV}i-1OIq?ir~cWe)P*RX z5x8{FrZGKqdcDaP%9&p`C*_@64%g05p=`f(M&)kVI78n%V_mmZDMjIgO*hsHZ!JSr zTf;w?We#D9NCatlTJx7$pz}&hA{q#Rb4*!@ckEjB8CtywDd)&!zZSL)Nc%X%o>U|R z;TNXM&}n-Ghj#D^)3r)X@?@*e+vM3-tu%33Jw9OAJI7dFAx2}WF}G+f^SaZ(PqZ(_ zGBdhkb&h?VV6ouR3k9E-vKPCoPn(rLD=k6Sv!jT)oMaLX-?X&t*bccRLwu^lhM2zG z@k-wIWKXW_rgc$V$v)_oxvZ%)XO%5>hrN~JitjROZn?`$6d;%DyU1}V+e5R<**1q} zCmAj@&zRI|Uc&X}eufhv(}NRjS^I)zpHChdPzW~aP}_S#*`*m_iQ1~g|qsgIV(-8)&b`c#a1cVwy}sz5FHQ4@K$lkkPsELk2%?x+Don1 z8j{S(YArkQu(|)Qp=YIU0!X;V)GTNWlC<`JSrvRp4gQxEJ6<0W6RQ5~BLC;ZEuSgp zzh@s`PDcNE9X_F{PZU0D`W~(BdE<*c3<+3X?*64|v1&q$*B6(G*KKm+>Yi$~5jZ-` zW$fELBS_Q4>|9Xr)Y_CZy(V58-uiRIaJp|j@lvD`C@9sS?yWVZl8pYHr&n#k8cb$-&7bK_G=U;lHnYk8Jt26NOu^J0vgaiaunClirvQNP} zPh?kE)N1G`l0L|AX+RgaErFLxo0b*qXu4uId|0LjmOhjs`oIA&b=Y1lpXM=~k>c~4 zF}HeoU~{ifFAq_@@cxwmc3eWa67dbq+MekeJr^iC7t#kG6<_K2RD;Q^)|v5%5Zpci zYAbCLppIz)Y3lf7y@)SNEF?rL@Q#U4N4Jbs|F3E~4`5n^Q>l}62D3Wdpz8^V^w4Ih zHO3@1S_^KWlMGM~HQ6*2B5sL18xXg+ zM$4apk@?9+iQEd63E5i;m6?N*;+0qFyzD4l40Rejm&2meRRFnG!#D40*xkr}=2X)E z?6PT$*~gH|TIB)6#@fHv3MU;NhcE z+j~Mc?`Sq37|k=OT#gg6alO?x-hXauXl3r9?YvSZ?{sWFs-JgKIh~iyJ7$h&So4gU z>)}I)?P*89yLlPd3*I>|6=mt;2_bBY+v=%LDRZ zn{Zri`FZifI{z~Km$MUZ<^D8B_RAgyD;t`HAU;8yK%RS`=K24{%TIHW>>9S>t;*Fq zIQQ86@@`8(+TaeCvbw*$TX{f5O4gW?)n-kco>Q89$eVnz*zm?A737m{NHr#Cu~>wa zD4d7ZC^FmN7gDngt6NKBSqyPpBwrS*&8a!qdsJS6E#Q;o3?H(bp;D&lKw|2pGZ7`; zm>zFd>QjM{oz^BF5i!!F=LLC3kG?Oph24syi4BAXH$UC|e zZAkYo-y;RmT9SeP*3p+FrHT1uiPYl04olh7kZ9quNjy8+)813VcN#f&_{0@FxH zRhyxv3F=-Nd?y536vEl@r&L%WHYFWIKCach<6-(Uq$=HUBz0P<&R`~YFqqhLP)0!SLrLgNIERlWX6^gP8sK~ zE9%bno(BO*2Y)RNca-b0(S3Ci(vY*qs2{3SSRftB_ImKKAn9Hu&H`IN+{ zh7Xf|a>SgzjyohosSGfM8-QUaYNX$gvojsv0249eiPG>0j|$@6vPWB$_?&L;U8TyS ztEd!JJOQxx+2l`>#1;k*b87x131r$zV=`Mm_h}`tEi`Rs5xgS}?5BuqD}zr!LIQ7+ z)TQaHTp=no-QxQmC80xdE(uoUI0&T(!W&<6rWlnwXN>rV%EH}(WbIZarTR;b`L~Yo zR)2aav@~xipP>AdQa?%cavHBvN&r<>e7BdBdX#?cjUc00lHtB7kgwM*NHYvlS}Q5% zC#|gQ^Gl8&zx=ET?hB{4&zan;U4Wr%t?gy0Q@&j}Vbc{SDsOAoH*nR>sjYL1!+z<; znztyvm6m0XZAzkvPTE@uFCi@}{=uL6vo>9oZ)mH4=IXG>h!Ayn>)4RivFgz1$Ov^z z$C%iVh>(B!_5kkFg*?MyH3=&`LwxKLpPx6F^ZCwMZ^97Vd4}NaDY}-4_f@jK)y!~+2&{iH2 zdmw+qg9kU+x7TWVcN;JrJRd8PLmMU&^6$)@=J$vsOi=$LV#Z+t@zaKtYx^ic| zjqS-P|LDf%jPXnwnquN}&agce#~|5_0F(-6xlPT-vKC}T&B*x+lRnn!=<}Il!vin7 z@oQ5F+-1_j%1Lfb?P;wTp1FOBG}nUU(@HQ7<(#RASetz@F{N{v64T3n-MPMaCMDgIBPX!2MXjpZ)`o&j z$+6eVkZZricjA27U{ZUXua!8~zrihL5}xYM;0$aLV=a;hH$1|Dsb|_K^VpaRduKC- zxH5s2AIJWbxv!x{}_p zk7cR6s6OHbc|KLurXmRYM)F^zu&n@uC+0(i=`qb~RH1rJl5MTw%kIXBFeQD`9JWP| z(DcwsKE?Ohn}&S3#Z#4}DPIX_{G@xR0dtQl+h@G37dj$#2(AFFl8<`n}dwpz(of%2`ax#jJFEAa1RXyj)6Tb*o=);Z^p9mn`qt65h`8SauUyU1RgGtg*45 zEs%zkt|mojjHYDnGu^E8;4KnItw-?)H?i`)c)8blNWY+DZF~<7w9+PNgs+2Zyt4Xn*R)|Mhx;ez|SYCY1QT)TIA^ z?7aS}Rs+QBhH;;>x<+U36KO)zGGGinP*-_Wyj(b7tn=dATzQ z!T;~`|NPPPJLjC|Jm)+w=k=a@ZZLUEAHU#p(N_$OcHzZbH&p5Ikl8&@lGlfuhGIBq zK!al*?WxtOQPFLlHm66Pt!r6Eow4o!Tct1D9oIQ^l~11E^VKI?wV~-}oOVhsUk&%2 z8&{HQFEdMYbp)=dC8ZoKghxl7Ku6OWuQwLOJxkPTeUXT39-8YWygraRs@O)Es^odY zSkzSwy5y1K08S+mQ+fO~NuN{@E)JO=)jG5&G+3YHQQuQv39)sTotsIhUbguEgoLTy zy2^(wGX2>`-OI7M_818keUvl%5UBLSHW!K3f}5vSEo+^Ry0q06J(AWtJz2XY*@v&{ zN5piPXQ)P2h;i&6DG$Rg^)Pw3DwPh64{V3UqS{kXKO&BLuhuI1`5dE`)h@e8@O z9;YYdau3tS!^@Pjq@1S=&1rJ+8HRp_oljq0^++^SJrWI77onl*A~aMzLJf`3hp0Ci z-ih8+uHi5EIcue77^j%Kw62&I7yROZ?(jHKxvJa31U07T7@axKF*?nTmV$SUWbLXp z+Xi#y>Rg<|I15+d*6ng7Q{CxvXHxMs}=LcTj7k{^V8Gr%LYhMnl8@ zR7suI-n~A5Hh!-JSJmUKoa##XR&}HgfRjx`;19<7x;!e?A0+yiMi`E0p|t%f)zLV4 z_M5uu`RZs|-Y+9%=9n+vHpc_)sz0czf;iiXVW5B)apjTZCYzQa$`O9_!3LwN)KPzRA1lTt}8VjZ3{PxSqmo0{#mGHB(jDvc$fM!D z97n@(u#=Xi#`mYvi&wrnLcI&hS4RYLDKIrChgyAd?TrN?T8d*RPQ_=jTgS2c$3eEn*qAoWB7KtC!XWO2!})m&w@MTLo?AK=fWL$a40%rnzk`4 zI^r5Ne$lZBElP0n@r6Tjq7@JOv%R^4W<>ebT^Z{O`Eor}X*c#W?ee2J9^KU`-Z(Ce zm77DA9#4Bfe=BN*r@7r(-@L(@yhBC*?4kH459y}{@<`2aWm68AzTL1=*`>qOF!jSN zXC5pQ3CHARF&*@y$>^(w3mb~!I6s2kyu%v^@>W#sFeOmi^cim0>h=s@xN2IkQ))){ zQ&iR(n*Bv(x2Mlq4JV=*V|U0Kq`8zPUC6}i>fuWKFelT`+N7JUX%0B+Q@3bTd)DAt zV=@w+GjG_QQx%{dN>fkhxsBBq)kJ6wMpKX;ZTKdaP89CwsK)_-RDUL8{ekERT&No# zxlRo_ZEcsh5o8RD#pQ8kG|-}Q>Aun09NwfwM`zM2WXDUY7U*+<=yid*@9~XjdM58g zs=xTJQB{*~1vZmw`Gz}Xse%`+&*NFcW`+T1{qT=fRLK!5b0$($*4$IO@Cc@M;o(f} zDpOO3VN|ZjOs}W*g4o}>XWzJZ2d(_D-56^pQ&66{7 z&rc=GQN-gEldm5AbyR;mW6yF&4YPfavR(0!{hDYFMG1);YBYj zO{XeFuM>5%ym&Z>VO8+<9j`lh*`c1_cw!hEgAr09RvmKBK=68mS1&=CMXp_V=@Qj6 z(Iu6avudREyj9D!-C>*@XU=TG#m{U;T7@DeYw2puPxp6Jido%qoMFl}`wtIi_8-nS z`yZ+7##w!O?lw|>MiDPcSp@`Nc9Au$h^c2tSu4uFgUe;k=kFLT_ewp!jV+G(0)fK! zb`1aFLs9ce<9Xk9U3X743r0GX{^9S^6lukFS!u*I&L?z#E$yB;3x+Yojs2qOaa#2;cN7b&buzR}BP zO)ib<4YvTaMFU-<<5lT7bPYMItokVXYRxEj3(O)KE4sH|m19>hc{G1M-w)`0)O*l>sq4Ubk{0#ITXpKSR3th!U`_ggxGuGZ6IFIy*CcsL)-}!Y z#`?_c^K@mWDD*7w+&Scn^y$xyNggeEs8T1uvLtakshA3PZP>51;Os8ftG=bPE|5XQ zHPVq9E9I^VBmaS|prI-PzIL!G>IC>*3IYAg0A zM|u8G-xZ1XG5b+vU75DRC>Ego|Q6N_!=`W=XD6 z+Z~P4bRTa6Nd7&UhoRI>uA_VyN?k)~tUyC|FqqP!t|B${y}n?#Uuz?_IRA=@)@i{& z7oI4?#633( zRb`sobnbF>M8kaS)Dy1{7NEvUXo@s>(p7iKJWYoYSNQGS)Q$3<^33nz=&?bYR_4x10$-r)@f{P{|# zQ{Z!asZ8uOcCMnV!G53SqD6;*HiQ|00Od5Dd7 zLhBRUc@i?N*4HKEV`aQDKkMY4soP{wQ+4IBR~>hCDk(R)dsyT~(J~WVW{Ej3p>?L) zSneBPooU%~6IAfwTWm8NC?_A;hO-VU8fgl?0g$FNcSb!OyJE5h<)$m>u&Ea= zT*enJbn&@w%r)LGlDtOOnJdzj`)=K2dCN>bPu3y4}4OeoEdNHmV_2FiZUsLIqy2#Y0qAzVRzF_i^ zK~|S%cwaZ8uQ0q7n=G&3*Mcvus`dFkS<-H}bzi&4R`oVd=Dm^pCFSMRg*3FULdcY-{}S-*xCA^qF9FZMCE&T?67Y;&0-o_p zz_a%f@a!8sp7^LOIOpnIJ z3e~3G<;$7e!Z#k|PKHpj0y(6@5)-#=$_>MOZyBnp(ey4Kh3ZxPCNG^(*VUINS=q6@ zoeY`vK9IR3@!Z6mtKWYqxOQ}03a){`rQo_@!=>OFi(Lw?@%W|S+S_|6xc2pp5?420 zy4TTx!-P57u<-@_s^s1xdiRwy}U{1V^$-`id z`7sk2F8V9tLu>O=`pxe<#kH<9r~J-ST>DCM%I`hJwXmAhxTLdGEH_zl(p3ES<}UuL zp@s^`HJ`4Y*{i>r)F6;1YtKVvbkA(>oS)uh(v_LL-84Vlx1{M}dB`$!`1kqrs<8?g zTFg?S+o`+TAWfGgxZ719igia-Q;MaA=ALZAwD;898HjhPLqyrP5V=!dS`6dNK&nw@ ze8f}VUbDq?ySZLqCHGqM&KcZ>wSale+&c5=g)p3$N)j6{!7@; zNB@~l%f9Q0Af`1$!(HkcrmTygc<*IZhe=}I8>FyqikT$l&4>-zUX#S!8F{NGyS3{Q zvop4C3`FuQc2W(tCcD+E$DAhXHN%swWSqNTt{j($7#@dJ=lB|MGR|<-Cls1;#8lB(M?X4N@ps#90#8irrWd0{YG+sA@&_c`i?^Moksf3Li7P6 zeV`Ei1|$83Li8~seXJ0D+(;iUMBi(q?=3{%XQc1TqE9`X%z9X-e>|DGl`^VjoU^UC zT??%a1@7+7Jl^N3M1;Rp>+(iA!%?krC6#HG-hz9*P15nb5|i|*TD%%*LQu^|D9k8U zhj4JugkoM>w68!t=Hq;WUlOfaR)Yf!c!xMI`KY|QyTOdTNuvAGmhCo4%s66`k?1l@ z)Q?^B^ZL*HT%NNmCr2EZy@T(=8Ns(K`gD0}aBxy?uXuXA(E!F4mop^qJoY3{Sfq~w z7;AyUi!qH4PWm@d3CUNU*K6@ez@K_6UEWQHlZ_iQqWH!;5#ytkF-`uW%<`%q8IW%b z<41&~l0V|nJ`^Q?cT4Y=KV@95_rYE6R$r&)?+$A6HT9l6M0bXx8=FELlaHu^PYHw1 zitesFRHNdex!-Je<|#7cTR!?KJ6HB-QJReUjb9OQxjh~~zS_Y@cJRt_#yQShH;=0i zG8nF@AP>MbgPwM|;~{T$EWk=WfN(kG4Rsx~PKnpA#7&YH&r^5l-3U0YDp*av@iP5g z5~;vqb%%Q&yner|p2ugHFB)!lsN4_^g!0VZ6iFt3yo+VLW+;8GC+!OQ*C*t09$H;B zg)YVGmuc>!^acg7*B$n$Z1wi2rD0pR!Tf&s;lJh}-&Ew2|4aJ7U3WOBIhWThM9iRL{YkNkKDNSAqTh%~iERf-JVsFb~=;d;81 zxH)dG(5)^yv~Y*$pc#ly%}q4FZp2;LjxLs`NR8eYzbR&%E$B(`zJxi6Yq8(YLBmTu zhL6k9@RA}iObm2<-10bnfx^_=6{AsJ6@L^XNf%R(0bI$5#nJV}=FC&sd2-i85oNzS zp`)x}v1k#P!BiQZZ<*$8&#aI3=|#m3DSth-(vxS>Lh}f|?wRJV!FT{namlp2##&y3 zsk`v9(j(9ByL7i)%Sf6a1d`WWH+n8jMb!oJBd^}2saEQ6bKau$a}>GuZBa9F`6jwc z&1U3hg*LRLUnQ&N1U`M%*A~WPUcU{POlIWktXi_uE7iANdIRy+)ZI%4imEil;#f|S z%B89Kn?73Ip>^>q1KlgginVcPl;ey$qiyMX!!qNHJEKZUyk1KZw&2pkecks<+m)1BGebfYjwmgw~;QMSG8gl7-9Z-@&n?l z^*7C#5VwT+D>H#&h-CvSlC$9vgbA6uC^AE1Ga)OkP~(l0`tFz3>~dqoBfp0kXvy!{ z>T+CKa&~zmDw8kV6`|g{DIj0iS6y`gcj>yam#o!=y6fs>cb)oxT3&(bMLRwxDl~Y% zy0Fld3{f}1zYO~~Ia{lXH|Ax^dw zb1HH~LsLrjE9RNp!^xylN8Ae-xwvZa6?FMpcr?3R8fhz18*h?2=PSdQ3T;@WyP+v} z-AC9P8o1=|dyHgxI}!s~4KB=V4u=cTWPzww~7ErY*aDRUl7xc_%IXYVc=Gh>|3$L(yaj zc}U!K;le~U^;it84t2*gzl>?3B6FP^bLT%dW?(qKE-ZgEQ?ce3B0vYZ6@c@&-PwHy zC(c_L%H6?oa?NsYAe6J~QR(J}>5+!XowK#GJMIr}3f1RMH-Ge3?n0Gu=iYi$ zL&NZIqxn0{3NF587d_^gZ4q3O@ut4;#*U0x*&Q!x|HwV^{Ui5?*C@F*O4P+gRXHv$ znqS~{tlE*UNG`f2Bb;@OwA|60gN|7Ci=1(ewA}O!TYtYYaUK^ZaHAdaOHk@CZZbxF zDk}YXhsCkZF0D(QF*n|(UBPL%z!H1Afvl8P4HxCc>jMGZeXbPKu5o&Uzd;GBf9T9< zxanH+ZRD#!13C`LbeB9B&w(7-U8_Shw&YEAvqUOA`EfY|2@diqIgDG^dIHF&FnxEu5-GPYyxlbq_dZrKoa{%viHrMIk- z@F*%f(w!sHc(_2txpKt0li!)t#~NPJ&_yM`%$B31+-dx=+z$PxwgO>1Pz=Ok5gHps z7kP>3>V~u6PW#k1>2)owdexoHxB%F>It0x5z%WVUVw&6!{}fS8AujU^vLHLO=Skr^ z?~KzPl~yl0Vm@!EgCy)p{p#41j!XT->9!b7=*K7!i~9p1e8WpBXJv$1MVCI<=0gb2 z-iSE)sjoCyGDu{pl9E4KH6IP@v|ww+&zA1^o!G#|d1HC1Zn&=(%pe@Q%Dvjb`2 zB!z;ClRx88>Jh19@=GnH33~ESq&cK@oBRcL_Qur@vK4=DEryR9B%?za@zVR{ryVxp z$0l9*>EE%m$LM~hev$0VA3r2R`VmS+g;H@`$fl$x$zRHgQp|#Zc5izi7>M_648%Pl zZ#>YWm2EDIg=I=4qV;ONj!he}dguy=(kYy$E0&7c5DQbukyLn-Hx$ps2=lMp1w_;F zJ}s6nE)WW7QL1aYlv;npa1|y?v=TKMt-2+PlfdF+3cP^+eO9 zByr9h^{b;R#&@Wt@7##|m%NaWrE_5=kQMgv& zc7;0>9#HtC!jlS5DV*q1@d{5VJg@MA!WnL*H-*g#TNEY~Zd15V;eLfD6h5!eUcp$R z(5bLe;TnYzg$ae*6z){GOW{6+`xOQ&RepsDh5HpARCq+;q$=en3L6!+DO{s)o5Jl1 zcPZSha7dx3R&pwwq;RsrJqq_Kd{W`TB;7ov4}~oX*D746uvg($g}W5)Rk%;#F@>iU z4k#?CQT0!PK1fzG;lKcA>!Xf_5xl@b_HHXaw2^S)f;%d5PrnpK>7o|o7yqZAw)lL zD)}978r2&(o!TLA2FV4yk@O9mN%{uAS)?~$sSt}0e-rr)a5nh~a1QAg>2rmsL-=Ou zSAb1uld_32!000B@!C3cQW{4Y-Kp0WKy#2QDFh1J;s#!MBe572$gFM_>cl1$aC8 zDX@|325cg~0sT@T;s`IJ{uJ0u_5v=aegn9I+B zfa}R_z)tcX&Z15Fe!aAlyZIK{!Nu2GY0~1l~>l2#k{7f-XkoA{-}w zLAaar2kasKh~Gr*0N6|VMSLIm1#mOThxjezSHP_#5AZ|eS4h8y+5^J(lD>fn(l_uv z@+aW^;c?Ceu?x? zke?y^5Xph?C&}&z_mkfM|AG7x_$g{fNZ(2R2mD9!XT*Po`~~4%)ITBoIckr<&r|up zFOa_@{flH5;6G74fqSU^0v{$n27a0R5AV?HTybWGCQPslNmMAL=K7`>1}% zcZmE7_zdY8_&q8g_$=uObccx#%@eFYBK`{3RWNqWV?3d7;d`im`YG8L=|3mF^B8v{ z{+Hxuz~jUZ_$%^H;J=Vuz+aQU0Z))U&<_5U`~~+kh5} zn1XbhMfl4ZYn+VZU5qVAw_C)na>k&OagmF$4e4VnVs|-X#K~CaVr)kGWfrlsoUzl% zxX{J84&kvDQR!lA1bvA`^p`XGos2au#!{qTPUVy{);Sp`yA&dQ9Puq@taLJ#xESXm z{R)eSmoqjx8K<}yYmh$PA`<0{ZBE8g7o!t+CGi1XWf3!g6D;C{!gKJyYb|08_*`!h zd&(K(PR2$TqZ8>jSVV6*W3!Xd;bJ_l@G$V*R1WAJr2lfpMNY;^F2*AY52F0p7I6qT z$0Cjbofa_&bXmk{pqumo|EREtiNH#WIEnZwi#P_Xwum9%Jc}3r){sAdZa$R|L!8;cY}; z#dxxsu@UhfCOcL!K3~l^fOh^-k{`I;A}#_n!Ja zGdttXISj~Ey>(Kb@i;VDKvY-f9D#P_#f-W3N=ClZgjvq@k4soQ{imWvW%Hhx>Ysxb zlVjx;^s3k6!9{r_ zlAv|VEF{m(oG1z&OO~xam?|>recCl$&K!Ma7osQjv}2MBKd_*O%3ai`_xWj-+AYPg zyu?~U?1goy*nc<;Yh^GC-ZSLRk^5~2Nb`oMt42k)U)tbp@+BSoV16UJMnxh#FM zpf>8iMDw30$R+?~>#WW!OhW`Z&6<5o!G5NZ!j64egn;L>daoBtUo`%Go&CMdOn)-W zMd&L9$9rg)ULDRxK1X6}_%5Rp{~nIJKQ=F5c|J!E+@7MJEa2NEiBDr3ibC@(GE{|s z^&&@)Hpmpp*!&cuQX*Of=kokEZZp9Deti5H5POr=d>hb3y~;PmfB;8t%69O_uB-xE z2l-ZS6uB6D?>NpSC#1hpgucD8Iw$Rc1fS#FkkjqL-Ud8u;du4rw!?~I{0I8gIb^j_ zB_Po+?CEVb6VO92TeoShw`pP&d#ldr>Lcun=juBWj?DUfb2AuS)lK?}XUA57V+WMT z;2nv4c;!9Dm98BFifwaUQM^jN;44ji49-T9AWjqjcbK}LXR9|#Tnt<73ISmVU|fLq ziuk$Y>Alcjs*B%5`5ZGBl?p}9eEavJrKflfB9jDY%dh`=+?t$V)i7f|;&Rx*0@_6v z#?kieyl<&Te?WYY-IEC%rSar#%t;l2_ShE#Lx4|ZWB9bInLWAY?)Y2e^K6}_s_$oV zY#X!GedaSx$r>XMk{1+(xff)QuWHJ(Q?_fc5$|6#&6z!BR z8jRu$eT~};RJ+E7@h=A9U6L;K;4IKPtaGm4=(ImY1M@lZPx4+5iGL*DA;S=7aNcXmWv z6xMJi$i^N)LGRn&-l&~(&+LF4ES_G0voE#B#1wPo*DeMy(4ZU)?;Zshq7(*(aY*JN zf$vd&Ffp4&VUR&~lA&uQ-ydM7co{M@(Jl8725Y8MlMgaoU3}3j&|W@viI-a3%X=1? z2iD6Kr}kdkIcqkqDgrMccQ^hH_`huqnRpVNlsEMzme)u9A1W zSy^!A+=jF@fX&uXKE7|`&!zzD2P*X99XkGj+{N^qkR&sAW+cwkkFTPh zE+kj?Ic7a%*9je);AuXRL7zf1T0I2oIa&6D5M@VkXk7$eP1by`V~JE>J^y41RgTZ zZF~Urkm{gvU`+8e;IVkjz}Wy_Lm>PhA24uZ)5`e>28+coqHu42WH#yq3|xq|dedK8 zL@G0`NW7cDaj@)>$?=c;f{)?u3nO|Q!@$xf4>E`*Bd4g4m#&~@LAsh!vy278HwBoR z5pdAE40<*IeC>#OK0W83-o4>fa+yWT zfK(zGM?BeB9v8$uKX_1WjExJ>-$_{_i6V)-gcf1Hrvd@jY=@xrQICP2|*oI=)QebqY}D3ZO=59&P=VmD-kiL7oI zupb(bA2Vd6B0ak}`Z(ClFPXXPUo${ z>88b`wyX((7HWyfOi<+yEu9!y3$m)uCcmfiB|GiNMZ;TThb12dWjSskrcA^;-UU5yUHV-)WWkO2Jk-TK5y6Ma9V z|EdZ@wadW~jcQa(eBT@j83&UhNr$T0H1QZ(xyYnOeg9p_n^(wp0|mTGG|D} zP_2^F!4xs6%V$f?XI6ZTn-tNIe(n;O_8P3%`EyveQfMNmxXL@}K7s?ZbsBE4K(aLE z>VKWRg>d6)+tJFz(CiqF1IAtM^5>e&vIC;Jsmv`~5C`gBmmb$e$v`)MU-ZZxKo4;X zm z_0!Mkqq&(B&q!Hia9L%5`fD2^rTLP!je<}C{RQ*=K39Y?K`7lunNG*Wh8R4NTP$Fg za17=z)qfMSgGlEVZ`)NRA^m+COL)@pv)iw7-TC4niBm@B+EBRu9z0^D@9Kqj>k!6M zlOeNb%`M>rf|{ZuS4j#lQBgybGRxV9>p*5M`?%95amFylh<6+&HjLwC%F*L1n0 za=Kb8b+2I2-S&lsTWt>G#AT$I*76z@DJ}y{O2CC{9jc79P9MU447PYOqn-#9n$)qg zl1!=b4^drk6mqON#}+szQF2_rLf!eb%LQ&o{TdVO)*N8( zxQ!?mt<9cGbn*6kd2s;HfiyH^9vJP_4Y^b^gq<7u57y$SHA%;mz#3g=^xKWeRgUpbm#AuJcc@&YN#VE>HeC>!>7(YT zVWYaRTY9r6Wtv|rAGMH&?l&!O$fk>qw`U#sA9`A)uy0Q{CGHs~yCRl#_)c=IOkwsJ z;-II>8^?dP27n^f)@%o#sABv0@BNZwR)&2S>wjK#)c)nV&;6sn?FFH^050}j{%{!C zc|_5X)Ag*l4X;!j>@0k-R3EaZS-$35e*0jzkFCeJG*gMzZ1{5H#G<9yt2!VX7I7g8 zi9M*D=-!i*D(gQwnCB~M*B6KUY;^Odx-$f3$vDQ40WTl}VJfg4^A zY?n=F)_v6pO}51R4jsoJ`;N22XY{4Cq2%qE5D0(DjWvG?>N4qoz9&^}1gfm#SOvSjMjAi<6 zPu`!|>v=Eri@^~9J=i5F!GHTp zZ_F*^F~9oL^=uBK;|8bVvqO^-ICzK)pA!{gnJIH4?ntHeOvdF%^ceu1aNzUv^u^>+ zK->i#`|}SmQ*SjvLIbXCQos8WQpA=egHH3pO+Z_BN06iqQRvqBA;dx^3ER-X+!af5 zz*sfy^;{}?c1~>hmO4gs9M*T#a_eziNeUagEkvg6k)VyPx_6p0DV$sps~KgmKv9=; zxv+o;jrDw!zA!IS_MXqHFPI7+R6gy(q2=g#@-h5rLFaIADp8xxV-DxGr%9dFax)K9 zw1@(GyvZim73e1T6j)*v9PzWsemz3Ki2;q!VJfH)4R_C#|&07JhZgR8_I+%MBI`!me9|jnN$#-&m$tD4thOu<^2Z<4y zY8;UxgqWi7;QT!Vs{%~ffa}E`mDL2fOk5GeUfWgDLyHIVpQwK5@MXM+zb#*VLcVZ_vjXJU)Oy^KW#f;jH+NU=R&5Z&pNfC_{&-{Zkl zt^om|hongS1qOs|4e%6nWWjW5qhI~_MSX;XQMSe#Tu^Pe^(uYq7n~Iva)(Zq&ydv{ zECB{WtYPq&keyX#?znyfXxaT8=1%Mrbf6Zt#VqvdGmc6>>#W57@kZn;U`72pWlv<1 z6wHrh9r*QbtVIxY%0ifR0x^0joaPL9Nda#!(j%-2a4yGv4E2E>g{E2k8Agorc~`v$E0`LZ*E=hyS5 z8NO}Y*77cb!`g7wk4YLc4~BUxm|lM&kN8G3h?Y$k62%?n{q<6;o7wmqs5U~xNGrn- zudE@WzB6hDZRJC`2GDE_(_9rTXMUXDZ151FX&iyaVWPnA9IyB_>8d*7;i*K#JpQr+ z)lwj|K7vj*UF{mrsWv>TlftuFZFY{`6VEoP9w64se2sh35boa@v(yv7cx@dxGbv2~ z&QPR%C}T$v`mL@|`U$vIkrv0?flSFNpj8YXJj5Q2M{~IT@HAgfiWC{Fm-*1#k*eq$ zM*fIFY?2v2Kl?Wd&$a^iFw=@`=bNZWkI%tt zWC`D}mU;OC3lUM{AUtLJ`+WU~j;+)y#Mh@Z*rQt(&<4&%m&UgmEN7_3h4Zw>>gNlES@e;5sDFF50N|z4Bp?cbcWfZac>NJ1Xde)*PAw-$T+@f z8TVXt7V)gJo|;g)5H>9{YvMsvu{3zGx{ol2e5=z30;H6$Q+$72lOn~5n<5Bqun4Z3 z<;Rh6q}T|2BbtWw={9Rl%p&mgo0&S!?E8B_MML<@&c+3WSEu-P7+GU%o{%msu0U=q zUQe)KY(2CfbMDZX!8xgkc()2!QWT2aj^veeQ>S$vU+UcvXh`h{bY343u2$$Plq^Q!jqBV4 zWUy}b4m;%EV!6kwo+CguXh;ztA7k0rW{9yK$YaACigj)>mb?;{uh)Mej3piVUyl`2 z3wu2PvftxDw60UGYQx^H((YpdTOHPEtFWt(N?2Z=b{MtQ9nVhy2?y+T4FyYQnUJKq+u`5g`6nl!k;F>hjNa3ki(jn=x9hJ+f)^7|}i9X0G zP!~hmHqF(51J^oYK;U3WX;4m*9%APo=3&?9-UF_&DwSeQi^Vd6tp+wzWJdcSV2m&O z;nX66u__v?(r-Ole0r>@px6e%ViKK+9i+fc7s9IWXcUu=#9E0TYaI}l8S+2qQ(*a= zVI`%qa?mG{+)Y6=8aK(T4|1{_QjR*e@}%R6B) zBj8z0u54dx)~WXy@)2u!ggG`$pje$SjQ7KLSQDcYv2cK6*?_7d*Q8R|`+>+p zulDLU4O+Z_UcP8N2v(eTU(kTBMYjy65G+*;_L}e?OzyBki(+A8@&%c49z(VhScE+Z z`E?Bfv|?ihg1vSFumeCW$cp~skc(zOFz913axKt>BPG89oKU<5=)cDrw?jiL5R`)r zI4*1yreoz7O~>G2g0Tlruz?(lMT^!KG->8%3WrWF<6i1jd3~3EqC7X!Ovjj4=C4}c zp*08KH`6D00D77TIKjUY(qVYaFr0JJ8e-lu7GA+9K6tgoC!bMUB5W4D4UcxxOCd zcpgDu)|AH2PZr@XxN&}^y$wnUc-!)~D7bA>*06AI-DS)1XMl=mg_6pnsM})t2-J$Q zX~dAPZ_5_(F1-gRXyjS975pEW))a62-M~2&1xzl2`>6Q5y(8)%kM%nP=#e@{`R?h< z-JHg|_Z)m$qKU)$*X{tRLnnIIU(0*8K(#4llvl5m_UPQk+1>Fmi9&ryKGBP*ld+T$ z-*68l=07r8j5B1KeJO5#wv3kzj@jrDLqxay$Fc{H%lNywZ~D$}xi|-*pn1_`D2Gwm zl*QWdZ>@yBl8eG;=l5P>)Hxx16rWUgILJdSaC+YhXE&U_)LT%aN7|gtTU3{@uo3T?T|864Pl~|ad{c{ zQ!e?Ku-1pJlL9c-aAf0PtF{T9ty=F$PP8DUQ*xG7Ml_$0{%p+W&LXi%x6n3q?v13m z0tp&Al>lkM(9AuvPhkJ91RgxhOy);LK|;_^)qq0g%7E57!$_`>OXCIWtx?l*Q#IjZ zg%*puF#UbMu1WWib>$%ZVs|lN$Cpj{cdvv!^U1F^8f4V6zE&&{M4+T!*dx#V^l+{} z`FB`R*Kas~Q0wC*?E#Mr8|Jo93g*nxU%x|zJdCtauk0go1vB7BoktnJ$$vDQw-O6n z)?3kZBTP@P_AibLdINm|ut2Ji!Un|(zOtdjRGOQX7#<(s`^4GP4hoP?+*nQ(oiQ8_ zuN(7JNLBpHXAq{NiXUW0Jx$m=3VjYRYfrhFnPkPj$nxt27#qyZ&Neoz6zsaZO|;ST zKiJK@V?7P_6`b9Af#Z5h@0D$=d}>>WNR05@%h zN=oUytO&8W9cuB_a@bg>Xq=lP;8d@VV_S`Iwy$}$|ID?Qzb{KLY0OTE^KimBZL9ow zg{uVFF|(7x!(g-L(UPw@2$eP(xo&mN0xOi?=cNU!8X4}nx`8>raju`_!=;;+#@3=L zPVj9H_4z`9Njs14!T+>F+tObR((fgaEI&*I(t&NcXwLCHY-_-mr)if-J)}obC57o( zEcBiOlHrcRDk;Kk!faGi7Oe6=U34HwrY)0;vjv5Ymn79PT(VG4;;fZ;UqU740zTr> zMnR0T*D~3$v%;D9u!+a{aBE^>ga02#SmEV<)I(ZBd-ZG%#f=j_lKccxVkb1%UAX{_Hkla?r zju*wyiDz2M$xs}yl&N)Osk!vMq*q#_n?bJUv7pmVh1}7y)ykMz@M80DTUJJrQ#L$J z2v*JFoOVNA0Y(K4w?Un^4meD=Q3~1Mr0rX-i!HZ|9r+q${hMv|z3{HKwvFFysN}&r zxs=SJe`z~d(cyH2K^89QkyQ=}tb<6Oc(?uDv|h|{*=FXw=GdX{j>=eGBeh%m-_3za zr>DXTS7Yj9d6n1?4)0Xm#w5p57fK7O+Og)EOfy&5Vy%V8Z63u7Xzl2$Vy-F>CbTC^Kbl>|*3ds`6V_ z*0v{KDg!y25U`kUUdHtA_H_l{Z!g7otrHazpFW|YTkq`=AV%nbig5VoP0Esyp<_|= zvL<BXH%eKSmt>Ri;VonqvqLhz=sqzkQYb?l@Uj4B^mhL@-#|F=88%V=J% z;JQH18(A$fNS3PKDZ2TK6CDiOR`3^vcVuqg3C=F9hUskw80!sajb53(22y^s4lp*F z*Ww;U)zwr%_0#Wd3&Q`mvyy3V<qVQ!+x8|$`*Z#VXp~&z4jCJNp30$IHH7b$!? zxw(*YZ5`PfO9NW6jFn|IX)J~}cVr$jFNQC*Wi=7ikvIBCx@6RmyZMPGsjE)l|pG(bkAPe^GOLX7J(Gn?{2_$Tyl;GB#^2J+{X?nz}%* z^!sL^N~q*0YT0ODd~|De2jbL7d1N0InzwQ#Sp8~-EP7NAfU~Lc5G)m`rRnbNPp#-M zBWIP#pY}n-v5`a%FW%;K_}QzHh;%9 zs5n$fTkQyqX?foNL53lnf{5~Cm3c%dm&Efp$}Mtw=GlKM)G-pc0->|mPYemr*BLVE zbV}!9U^B)-l5AE>yQsJ4(P3wdPa)5yC-9;GMP|(3HMMeGXfx)=4blKAfX%+!gAR6jpjqR378Sm6dQTfjeQWP9HpZe0+_c5I2e~ zDKW{fT>ZGqF*7-Od6{=pNzB00y{FE5WHM3e=XA#>KJ-S|BN6*(XHp-~>$c)2+K3N@ z*?&v{<~0M6!jBhYU8%SfYBISorR1@$`Nehb%Op$0nOA;m5n&Uihs`N%ryo4F&9Kw! z{4_A^pqgSz#_TBlpDuGr10y~Hm$o>TEW4*hJyreElsv^|Y0oh~KEBe6B- ze|vM9*67*T51y304}1A07}w=bJK=mp&=lTFt} z9f&h*ITZy6=G#oHM|n~2(#XDi;@8~0dHgDZ^JUtl_^pY{Xch}??wBd)e))6nez=wo zhX<`$Rp*zsN9R@hytX8Y0_K!q-AROJA@BpE(lvdK49cjGE{Rz;7hLy1zKCX#5ZxVj zDPd)CoJ2f~sW6h?IWiS0)ew#&1Srza7JNQEbIT)M{~G=-R6@8T)7Z`H^^0(&h?1#i znSVUJQ8T2IwDS6)S~Dat7BSDL~MYU)Kgk(ChaTpx6NnE?XETFV9*y0wPbL3t{J5il8+isN$eMt zMO&Kge0ugSP5+$J;{k}@GbqoM6HnWy$N*~MNr*s}BSRYC8$|045@5}1Pu`9aNrh>| z74PJ0YIg8nFiXh#*_8m|XXYJjp_BkSwpJ@B6a<+a4btvQ^$9%nakr{%K7Ix?D<4qy*k5y+=B+e(lE`p*Ia1?v_=Y0PBsv|2^1`>MC6&6a1uH2C_@fO zG8QISdb2nK*t%7$Ps;s!o+TK_{xSh%oop^wi^*?{%}}-yK}gqm$DU+UFbNA|9=DC3 zyyth|b$+oOxM!PfD#BJ2JSf_Bym{(MQKq*XzZR))xD+n>Jb5}k%Jdui-de|I3Ez;V zPhv^~6OYE+97r|?TOO53P=@;2j^&y^qQ=QnW{n{5z!o8%eHwT1w{CsgwC*_z z@16xRPlV`#Y~xaWkUw7fQz)okl@)%Lu*5J}GR5`pb)XKqa6H9Nn7h1Erd_jU?NPVM zlUmmGvWU|Ro}corC)VDy#;4Z5*u9u9TLFE+^|t@6qT<*==(gMK!gtBaH4}#gEEHoW zT2|#VoNPQ^FK88KB4L#LieAsTl>yW% zAI(#SE1CTrv8eTLcy7RF-B5BeP$Px(2+!WLO5b}wv$fn43NG|W_`y*TY7nub*NEVaE zIFf?>)8vm*i&0T*TYp~CRX9dG=U2s77SBjv35lInjp3)CNnisJJ_)_7e!k9|aHwGr z=Qua|3I0w)q@uxDK^UJ}s7o7?03tC|-*-BV&^TgVt-S$<4 z7EaFSS*%QLU7d18Am1H>EUy&sh+DJ2!WkwU?EmShPm*k~S_S4wDqO5Zh4_p)BbCoy zdZNpG9~La~XOAmCI^)*(f__53heGzM*&XcD%zoy5JX4x2p7+maazD5{gSJs(6Bn0; znB=Bh$jrjp^8=+;=DU%fWg}#-pwO7ll8nt+xG`>p6|T7p@jzN$t>7iRTvyb3PB$p~ zU`^fCj+0?Dk=V)il~cd+*oV+G(OZ$T0oRQ^lOvu_iz0@qHB5z!TUvfwj23Mt$XTkOl@aoGO}r6a z?K)>-<&zj%P0ZXnw^s6PH)sFy{HLwa!ClRvBE;1Q)+wu>(e^t8z}Q{8r*9Wm`X%{o zo^o1jZBcIkM4;|*onm|L3*KS-RwT>TV8&2JTdp_Lc(S89Cdvaa8j-SJSpVRRxY3C* zl-4>=sMldDxXsB-6gyM~$m6i)mzv9jo=(4?%^x3fW4>gUm@e@=v96lE2&FCzI+9ujaJGE*vgwSz$EHbsL{mS^B zvL&rvB}>oVX{UPJuyZC})-M=2rtO1@N)SpneMc{^HZZ6KO(Kkf4;o~6H$KV?HN*-d-sJ&X!juc z-B#Ww|8(QJK{{50cVA-{AJh9^2uBo%4hpaqf@Sbe!qw`KEN?&sCbmUhG{` zDmLTJZ9N3rV#`9fYNy7f)YJuMoR$Tj$Ep4h;ALq<-|o(2u2Vus8U4-{1bet;^4|VX z{A{1JWZ}xiP_E)pdz3yNp`;boQyAwMl+DG;wv$sf$Rn7jXrFmnOyXixgY-;b{P`9SKjvncp@Gp=D z(mWqOMpf%Q@jpla91@>6)=4!a47E1=;ZSQUfhD@qC*S_~!MO(bk*vj4dkk;Qx%k7j z1M%38Nyaj~2UNyiRRbm0Iwyn*~OxToz}#ZSs=GZ)tT8;D%C5e_y8hAij=UT{)GRN?i4k-hrP_@wNW(>K-|Pl6ir_ zW_$1X2k%E@KWpzztQ4_~huH{Ea=%$4r?W_y=NwW<4SEvs0(JiLF{)CpXV1XYU3Z!5 z7x-LBKQ0HxAD|p&%YZpB0d(laF^%KA(%Sk6ODqaGbU(^YBON!#Pb)lJ&}noX5LmhI z|B~JAy8Ca#o@vrO-eQeI`KOA`PdwJ% z^&-;P=X)56cpCzhXU_u2SWB>5R};=3S-nWHB&DzZ$#QvvDwlgB_4sysEAeC?0uTO` z={CAUY=>J^>X5~!r&Mz(lAn98&kXY#<#ny0Ae?pM}ey&d0iK+C?%j?5{4aJx>3Q!%`FP`r#_7(zHHT4P|;d zTFgd}3;9xS+lZ%G48#0R7ZFMYZM^)^woRYL4?~CZrRl^EZyjyNjiL(JuQS;TD5f#D z;H(6z>^#529fcZnmrVk=O~PVq?`=&#q?H(k!(3KOTi~&w=~w%=2vT zw}~sBU^*3K29=|C(;;_N@y42tEvV-D$NFDI5kthks*5Rc4Y!Xw#8nqx=WpM7|ELi% z%5-k1yPQgrcVoN{iJG<-uB@vWx1KhY;D%fU=U>8PyjRmwAIE}Y3w2fXl+j5F)6D+O z5w3kbzIR7+wmHWD{jf!}@Tx^+AF<*=i-w|cj*ALCB4#5}pg zw=0f6Q?->&ZS=|JgxuUjF(%@de9GdI68_Qr|LmypSr5cg>q^sLd@1#!Lrdx&P!)*5 zCBY;n4%U%W36%D-PAS9O3QaS-BMn;2J9eAMi*EHCe{=b}7K>|DX)Zhd!e3}n{~3Y$ z>!{w1_cyO^tp>LDGbP;e_%&g84dU38sl5Or%}kZ+y!DR?J9)l7Z66Mrc3F6tQ@ zRzbDD(QiN#w<+W(jBI5YW-{>L_w_Ep`wJC6eUhYTn4^(9{ywbWc(Ko3`(`14x?mC}Gch*b@WhSH?Z9Guz)cFc!H#-r2@~2Ypz^Tls^h;rjW+6=IpPai? zEC~Jw$8kI^aMFIf6hB@9w&T~l=r#pP9$xgdvLCxlX&*Q2mA<^8FTt$cYh#vNXCcUM zoMx=|8>RS#(uc{Yv&hgL>#P20D~RdJhwS~BVZzJ)S}RE8WYcKzApL^VZk!D<>NqJs zbE6|=L1yR+r8bA(qS&pjEUGcf_?>A(Y|^hdw6ThH;Z!5trHieq=1VDsqfm6qM%{5M z>0N57JVR|rL;Dow$|X^-kX(2frK+-_LCiK~{foSKkQ#zY!yC^;SLh+XqXT3i8{tJA z=;nTyk-S6Y$2O>N-8Mz!&1rP8-?mJdl-2bc@9`g&=4L@;ki9x-x7RfDRRxZo8($G) zKT?TUmHfS5EPgv@n?mpupKW>r?SJ#=E!_YUis6ppmTLk}sR>o-ZsOQ;dviV^Eumbx zC|=j#CoS*%PB`e^Ov6E(vC6WrdhspbSq-Oy7(Ej)a(l~`)PNh}#=hfK>(rBZLUv|H z)aJOS?)?wnAc4mGhOupopwjQ5dD^8!(WS(ezgoeKgQ55b95bnT(e{QPHh9_@<(3^| zH`i^MGo#h=6B@?kJVwSkvmbJAakfvFZ+bUJIE&LL_ZrPC=BD!*?)(lMnMB}3sO4;3 zphrH`N(V^HKMwW|oYC6rPI`q}{yZ`MwHR7bxStrnMYIbzs-8}p(J7dDX8qIL#6ju3 z9an5_vCAusQOU$>=Ju0Q(}~~Ja(8w^6NZZ^PZ`LO_4#O7d zRU1Om_J(@nUs-MzKU;w`(#$_2TpRU^HOe5`&FWH;=ipEm4QI76q;q8r`a4HkM<|N& z7v<^sMY@#%8KJfdAh?JzlIP_&8$rtF-70-6o6pODyua5PJV&2wLm^cZr~NF#F`J02 zIIBW&@;B6L$`$gEt9u zGY;ZqjG*znyjtbn=vSo(eAFnD56RcT6OajD0ru=i-UbMr_yncJ!1)^Hke3=&bIfcH zhAMkN)=c!z0{NIU9nc3RWYcY9*=EXrd=aXb@TDhfwEkh z&l>DH8p+bqXKBJc_GBn&a#qN{Oef5z*@1$pFgLbPmt)BalG$U{jrE>G8JDGe?4iWi;65{B;3+=;Dc@Ex*cAPraqm6(b=k$k)63OMX>D&kW)?bTTJI+E1 zK=yO>B@1N6IJ}Jy7pchK@w9lnU#Bbfm?+DA$}$;RLbVnlCNn zW#0$BVe$f*tt0hNtS#SF=}t=^!em+Ea{UCfkT2qmztTS@FK_ z+okar$AKZW+$(4&4WP`@U*F!k?wx*#`+ZFwOLLR36N(QhS};}_zLnHd?af7j)y`d@ zbJ^hHYY%-;)=d;B`rc?dUbKRC&cF-fGYKpYJonUUi#s4onW4cCP@Yl0_gB0h3(7zI z)Z!6;938kc-e>9rMgORcE-fbx9oI@l9I=mGJ>RO?QwwwHkVtd-(@Cx|r`{-HDqdST zc1^k>s@mrRPkpV{=F3(N;260x&TbO|bWGLldX!pH|1D#koN|Wy*aJsN@u|(d6l7e` zg=mJ34wru%W0J<%l90UL(ybF`-L;x$%eSvk<5^IyeGtQ!+_+&EMOe3h+wQ1=%-=Vk zsBc#&46gDz^!3mWjXDZGZ7t-HQ^8z%o4RczX~{YJ{XZn^j77o)-F7#*i7Nre0rzzb z9rWibXkQzG&obbK+RK%~MzW%vG4)6}U$r0I)u~NG;GGO|p->W7jf(B1V4|?epv3)M z@px9VwZ)))28-HCRiqzB(xYMyf6wiS4ukI+2LHUfN9?VL```1G1y;m2^ANLDwl_Np zoVD=jwGK)Ph0^<4nN1Jnma00&dZbMyWI6r9Yo;DQZrwOth!Tps_yn2g3oK|-SYbTIdHW01FyxoJ} z*u3v(cBK4!)GQ=KZ9~HAQ*iAudf#B1e4o;>;?w_~J)LSillQ(Vc^SLz1}XtCW|7z=rX3LWnd7kWi^=)KjnGd81ONOZzf zE`50(Sjb&e4Fm~kz<==&W8KyJC%rbhRm0Yi$;Sw}6*8CSWkM5x@SU+glPNPkVLcz} zCC`29ZN+Q*)Vw)tcdi53%-%nOUos4`mJ1=+2a0;X!zv;yC z>J7iK)p7*oOM7Fs;jiKB{()>x8cA;Gf~ZY?FXfU3^FrgxyKk4N-8Q^qlHsnj^-I(I z^%!7}Kg9Hd-W?`w_(AtKiDz77tFIXu({R$%tVLFxv)+=w5ppy0dQ(3+^K^7#7K(oiT`3ZNV_KY)=)2M-mULdF%tr1b%CVeJ_41H5{?#)b8yf^N; zL?2pUygyacXk~9ad!!DEER%Hv3nBNEZ5ENIkgB=MpdFOlC}qbju!-!$LwwwI@BM@Me*uzM!ACv-X8?RaI;u29x;LWhJH!wU+os zME$0q^sdfd-+0wS>))zAsFirDWMH2>c2YoYsJ0_tSC>^^H+bcB$htTq>F3P#1)k5s zSb4Xl-~5}N%QUJmyXE!d2}8WcpZl)dib$)Y$cvX7?kV#PRbJJJ)cz$$!M5(ulgb6l zmIMeDBJam7{IXG}2XR#a#P^hC%TK*do3SSU3yz(M2q^yAm$m)OWcaBGcu{{gCJzWYy7vH`8@Y zlvugdZPu25(f`x4i(sM2Xu+l|3bd!EeU-7>Rc`}fZ#-49i#?vThocM^Q5B8~MC_AZIzqh16{-jrxiII6YO$ zwe7*k^S2+=)dmM1A1dwrtN+p7_SEmTefsfBUsJ}#X5fHi0L$>87`*9ya-~0Wtlg@} zYGR62Gwtt(lsNo6$yUS@wa){#Q)St6%%xvD5?J7VRBYyn!O?FI^X+VS7kC&v@-ioE zd=`(}8GIGbHcEa!=8 zdiQ17p1=H6^sUDcD>;AXhcn~f?i4HJ(>t_wJ5q-~78B*f4Z&FR&WiQS-i{dWMCq#6 z;=j3pdwm&$&k?fM&btiG0GmjS0%bn?lXbC-IKMwgKNPc(Yq4wF|4P$& zJ5~F_sx|3q!sB{*VDp_=bXqjU?M6sJ2!H&na`ia%vBw$U-_=`%5@4wJ&H zVQ(1rtlljxu>FFV?&-8`;C-=9Z7|d+`R$2b)qPq5t)f2coA1|)#5AD%5uF31DHHxu z63hUZDmVkK3r`mGT8}Jlbi0&c3Fpwm^7*T{gP_F6M}qQ~E#Dh56D`Y|2|rVRj^fXF z@^lVy`S}GpIre*lDQ^w2#tXYAOu=CUzPSO8L*gJA8Jb@Ou9pdJ9kipeXPHj4lg#E~ zfy$r0EkHR;8;LxOT^N^MRxVP|?W7!%(e3OUodh1d@Pu{LS8*g>mOYP{B1^0>D&|lH zyq~Ixr!J88jBshN^_(EVZqX1nwT6a|h$;$C&q$6|Zm@-{NVHsxOi%t@l;{0`uyLU* z1ukgrTj)H~9sITzMpDdB)LP7_)9S;u%66BCe;>x|7jFBxR2KUlQ{&Y&-u;WuZI&%o zZ9;Kpo)t-dJoio9ueHl-iwX*}?XuEN;QsVG-s?(|scv83x=ZDpAy;Yhp^O^`&`A%f z)1|u~v5|*|7Y702gYS5^TX<`~6n`?E@)f-`BQ+zGatMgWg-olTww&+?Jm+JLUt7J) z8+f!zD)L85y{kEFLt0F3eh+UCq&4NXY9hdSiXo}L^n-P`Pb)->jq8Ug=s<*-05R><-x;EhFyUx3SS%z_UY3pC)! zorio2czLcYUq6IvC?5v8P+kkX`de9^1zZIj4vbqb%W=SC>)?kDB34=}%g2F(fwe$s z75o}-6Ho+hejTwHun2hLFaCIGfHZ=QX^7_st{!|`J)|+21W#)SJ-E3VS2L;G?ytB^ z*SJiQo61~we;I=5BA4j`lRD#W;xhf6%XFB@)VoiHU^>QS+QOtZxDRoeKH@U1WHL+L zdqObn9@kTb3JF+QE zs>JmmcVzc-M&|cTo>!4O!57p4mB2W}Fjo%1r@&Xy=Ni_(Ez7HbBY zxhHV(YUFPp2}B1x0=)GaVj$oS;9OuE{M!iN7GNxJSQUKLe#BwmIR@N}SZqB|1X_U7 za#_{`2O#^WBeFSfhtT`CT)kgnQfHm5*tL0kwmWdAARzUoU+M^x+Uxu}gwC&Vb-tBJ zZFGLg)%kyMt*M&HEOR!67}ejoqngX4raMovScKXUZ)``o_B58s8k`41jBOuxY(tn- zrgL`)J^qQS$9N{y)AGmtK zT)s~rHso7lf$M>3z!^(q`PN>6Xn^N|tIK40D{v^V9C#3U+*sgLpcW|3N4(P@5D((1 zQ@}R(n$5s1z(qh;wJeVT)&g}v8}hxjdhh|y0$nR)c^j}6c;!QZbl3W3I~~({`>mf5 zL9Jji<@Ofte#wuY<}jJ5_Ma0!l`t8D{Yx&-fARN!CX;1v3TZ`u=UPz$lj~_eL3ia; zx(a!=#P?FSSXL<6{=yyGKJM7AF`0|D-Q2P5;EwGylR0Ah1DEGLegwc|w%RswdDipy ze<1!5vj5lS#Jy zocO6HlTq59q1e{6;R%NDfb$beYLCc^~8Qo<0h%-xR z(l*HXebf=eN&DdwEWp*kLGW2KfR~mbM+55MgEYWX@Ilr+h>PH}4gx0tYxel>OId)+ zfO=pud{i9pG;%)22Ld?{pLZO%99RcD44+g6oCPcbCX~Ww0Z)PFyWIlu&5`BLfoW2a z_lF-{hu?5Vmd7+Q$SZL*@8W7cnaRX@|HIY%|8O<0WHLU_WiHP}E|0@QWv+Vu!R7fo zm#2xzoba6B@*Lyx9AGlLJcqbEA8~m$F_{|A9xl%=E>9JcS?u{Em*@9f9t)G1;;H4z zY~ad_WikbxH6g9MnrjQWOfKD18NwGW1>XTY1|+|dVI%YA{n ze+eJ86TS?16u1<)9+(cC0~`+?J@6KMWBg9)lT>U(w_UePJbiz|)q=-GWv;tgeuhW7 zz+}$2zT)!y50~dKlc{%o`7=Dy7ACXN)x_obJC|oAlUe3E`7=DyTqZN!b(qWZ5tnB? zlQFtJ{23l8kI4*nZR7I%p39TWWa3=!a(Omzd6Z1%JLg(1&l_AGhm*=!ov(6vmUDTU zn9M0>IhSW4m*)VJ+3lRi<*{&iHZhs?&gop9UvYV=m`u6zX)e!rE{}!DOm&Xo@{Hp0 zjAb$gXFiu_IG1M#lgV-p0yP;vWGR0lfSt zft*1uwimb1#6|DpbNIURKo5M~E?_HsTorILkdEmVR}b|LI;QQ8Hm)98xO&*gWL7(zTz!AV zCzod%m&eLvF4{M9dEVvnoMJLZ>~C{<)^d4vGnuXSYA(;KT%PqzrrOT` zcCMVuQ_f`O+sn8-^SC@ynal+H-G4U+Z@^@R*{5)Mp62poF&V9W++BY&2XDY+BJ3iU zC!fpHW}`AL+oN2bphthxz~j^5*MReZm$%~csqkyStB9pm0aw8< zO$QDI4g-!yOce{fjhM>u2goDVI{pV5E0wV^S!{Rzy&Sv&lNoDkd%X5Is zbA-w4^@^=?$I)lE7LAKbRZQC*czWy4octkG+R9{Vz3+2*ws3i>napx;9lL*gFS3<; zGk7`NoosWNq}jWM%k~DBZ9J0^y;ULZwer4|OO=K)sX-mTl<3M-#$`%mGO^ydA()=y zG6_to&12>=P2n=xJXGe2=cy1(C0wSnOzOC&h|5&SW!lSRc6c5S!8DA^RLi7RdmiF4 zJ;-HR&Sc6wnM{UA#mM14M-KJf7J*d351j`N2JQkD{2Fl!&;!3R8Mt?{Eaw8J0@c8= zC9-_&_X0UUpK$_C1+MWk$7R~XWtzlf#=3WeVEQAMX#|tX zb#LM_)pD8Am`uETT?nStTqYHhy6sxYWvb*d(fmIZ`Txrym=<%HE-44{#~H^9$@0`0dtttR98XBJ6(@)<;F6( z0@qMeFYG$~yYTs+5X|Aqa~Ta4qt=T;MRE3OF2bmGyV;fG>@ zYvF$!bppu)9s^d5lI0D+OrQn0b)G+;`++;6(@r{~qt0)BhDX}NWVSh7CUu7YS&oD> zeZR)!d^fZs`Z>pyo5bYCI8Sj$c$_=J z5lkl6`PYspOPvusx&z!eOUI<*o%JE^4*!{RcNiXkN!@a63&Hh!E|<$erLH;N4Z*d6 z%XOYfopP)RiXJ|*vFtTXwGgD)^V;jum(j3N)Cz-nHaU^$SaZF0(7|x!{ zXt(`#uhaP?)18uSb`}BHvzfP|+U%DR?0KkWvN)1N8jZMV>$`}FkdrM1#!i&wF~9>) zA$9?tf-jM35#s<)1NTpm<;}pUz(qhaVy7aY8mI*>8Y|1bci@A7p93YD`vL1{?guH0(30@*CGEe z!1$sw+Mg)xVf6JYT&9_vOEWdIV0Uaj9P{0*vH-gp! zUVU32J>hrifqS2jiM|aZWf&u%y@t+yOznW@YI`nWwiU(uJ^HaaplUGoW-+^tIOYWbvcR2jP<;0 z;xldFGL2wTxgHuP#i#P0_`Xw0$E4ytRVJSHU*T$B#bj=~UxGJ?i4sKmd_W?+YLxn? zo)6GT4mXvxy64c}|D^Jsot?pz`<%(0a8C{S^ur{s++HTP!#y5-?E%k4pGimx@?8FB z5=L`nH!#^%?!u6n+T&cgawa$5{YXHkQEIBEVBI{#^?6g6+<5l`0Xg~%Y>(*Rer5!% zAtDtW911^hY#jUza1QX=I>bBhGY5c)z}3KH_=)Mj6C(T#@HqTS1aLm^YK=fNkIM3X z;NfAiyb3rJ<>|mHDCYvl=usbd<8k=Ew~!;^`YvD|a5>O{oN+vGJuv+(_Pe>j+P>kU z<8iodhtz|QtA|TW?sHdbNIkgt-k-_s?RZ|`PChG_Zwr&#=(-$|?*f-^1(RFq`aC4x zX)d3I$xU?~56O3g%QuF}6}S$BS*RGI!+qisjOiu0E9Fnh=%ja`aIgfLF zNWRrvzAH@bymMtpz6vhiF(!Awxilo-A}-%HCRgX2ACk|)<*R0L%R8PExRY-Rmv1hU zo9>(#lCOlzSHk2(XHiH#1D9_Ilgo0B2+5bn<%?%>J)OCb>(M3l^0Pg_WxMU5Qmu}3 z6WtN~F;mqP_>#2($pQ`qIwrwa0oMbst`W$1 zytrB*0%ECMz+Lcd%Yjvp9}mm|rUUmv?z=YyG8y zbBQadXOcr4%^fox%yy2ui>EW01V`t$ay>JGnLgo;P|c)>%b8S}eR)SD)ithM!kvZbOlp#SVF<4ITrMM%8s71=KzFX`T&_V( zN*DCJKv%A(xm>YKD#Bh8f@?IFi+=yFL&jeif=kcky27NIY>$NC8p7o|#-t9|28ZAp z*p18YoA$2~$XVoKtAV>F!|wpc0tW#vO_XINa0T%48v-#riJT1R84o`NOnwGA8Sps# zSURu>{^wRTVkG#n^S}e}KRbYC;Bw$}_@4>D7+@B#C;Sir9t8iz*WvdNqwRj(|65)i z`~DyCf6%)Ix@zHDt`XPm+LzZ zmGXEjA-JC9a$RLo7d*cT!8M7?b%IG9^o$F^HHOQzgGp`nh#|Q0xm;_RR8_~D2D)=S z%;hR$QkI~14Rqzo>c-`N_FD~qU|R|QW02*ez`?)`z|sO)o&!t(>VXrGoAm|WMsDVM zO&}KdtK+Zv@0r&Ewmah2bt7v z_vH{=|KzWJCbi!E5AHWjXShsNOs3p@f_wj@k;`LoYalb#eaO^1jmFnS?9E~aO!Tdf z1wn5X%N1kH?Qd{Nk;XEq0=L-qLQahCRNKsHmF8V0|J#>#n!*?Q-?|iIZhucyiZsN% zjlJWw^G!i1QWop4)*be)AofY^{vMcjIq^`6q+v1p8v6FLicZe& zT(p;xYn4fCn;ZLS+oD+d7E#*Am8N69NG<(7?qpf_o?2aO^}A^7G&|MLu`IxGPeo_^ znIfHWWuxXX*J4vfMh@p~aQ$_`cRBmBQFZ%0?u9@6-3Er>k%zEw%+YWsjVU#-fjf7)Dv@?~pGu~Ag;+=8&u5&ZeKZ*jTxjfgf zkoTyDaOX6g$tAi5hqx<0ko&t76MWP9e8fob1;c>?a43Awr7D3~N67LXV8UaFk$|U$ z)AvjYq~ZZto&r3c37-Yb#?ceUwL!AnT8Z;CSw0OMJW!Um1FxsbvITeoI2d>V*jgbF z-C+1C;1FOPa6Z~C1*Wk4A3MJDc8EKl-*Ppu-O1+P2|Mkbrh}#S4igpAbJ9GV_hC6Y z=B)FrP$|+1*1}Tfb@~>|sJpYp%R#otRsdVuW+yyStB@VMQYSi_yS$%{UK_(0^-e?U z*nB}e*;>3HHI=@@D>dU&POrP&1%KP$>nx_NWap8PztH*%S6@AuoZzg7mdgTbbWg_` z?cL1}v^i)`U5-($b8-ZczUz|q^N*ZfcKe0gJASr{4$5}c@hqK31phlwsa#jR&v*1_NsKB>iE0@@Mzubt>zQ6GY1E2JOTdRmwS+6wm2vFN<}(7< zVpFK66x*KDoNAq4a?bZKF|_4tPPG-9&-rr5X>DYUzIC0Z7ydq=iN@czHTTqrZDQ%E zwz3lXMm$5?ypm5_pVRiK8E0JM(`&@mXUCNr*7&sAHNHnmniy*#ee+%^!sK!=q~+HJvP5Vo0t@e5d_g z#roFi`u;W1+N2t~7dY%<>--%09?D8{4%?@6HSIOUwx=1 zv^AFuKriO#Gtk00yLQnUUk!Ru3-;sosFvR-Q@qwq;h>B!H1Bap9B zWO*s@5`4>W;9wl-I8NV>_+`03sRdgnHxsp8hwA|8sA?_{CZlXzaQgVu79v54jQhbN0Md zi2v;u=&vMoBT(zH^>ptqmil#ji?qJ=<&yUIT0_n!p=Fi*Q>;S&8tkhJUW4>q*!fz0 z>pb>GX!>qzDnlv}?b-gyMlaSBCHdo;;I~=pTj!UKVsA7zY)p|Z*$~sPH=4($eaPN$ zZCc+xiWgYRqXWIsqUGbZKbiXI&e@;PE-{?*Wmg8?0w45#?&2FBGnFc4{Xx8M8`U~v zTul0@*16*<&9%%1$9LGEzO6<3BD@Z^(YyKR)|}6`rom{Vz9W;$p8m3fIFeBn7?>AKGP zH?+U5q27r8`hR-Oo!|M;KWyw~{Ypt!t6}e}l+yaX|7e^GPH*Q-?D z_Lcr6)b4}%ZmQHuXS^=c(xBe%VRrp;U@pp6X{CeS>(J^e`XvVVqtcUQRI9Mub$-nr zDESTQYNhSoD{RK9=v&r(^xf6nXRVjEvPR$5+x#l4zt-E#EO;d>_?%C(o=E8jXC%w= zR;>RyIF`c~Y=z%gglhzc66Y&%JsIcQ;8!*#%JNwpD{!R2hg^owC_${V2fif>pWnGE zdT3t*f2{d+j9x2^_3kyzgq^=Z->dG^R<)1+MfP6xH`&V9O2fQ#UY20(M6?b_iA_^i zz7MZNy-Y0IN&aYB%ihbrx2VrmdxKvsuB;pwmiyz3-Yfvbq~q(7M>8QWRDG z+0So1u6-vkgMzol6sM~hv&2wWvy9D3iWoU9->3X_ika3H)bE?=%+ywu-J6o674H$X zlGdwv_@kR~zq#35d?RjAc9%DfYbBMJzHxk+@fFi6Mf44(OAT7-qUU8(HXt&vW=>t_qnHN}qemF$=3aRpPV898uj;9!>v+o)Ynt zo$Na0Q`KvwBc8B#)#w>4&?De19%p+!3Y?|kY>y`bXW2O0;Ze5?Cn;!i8_ta65u9zt z*#u(3Ssl*IWFXEq;A}3*$61Z%Jzq6B{l_-xEv*H?&Rj8Cxl;Sx);kJKp2|K%gv z==GmPMl{p7r@|uCoC7{>ZSpC%6t_tWK5dg1tST%&|GMRHOL(sy=ZhUhu9b1Uqm{K6x9X8 z8wv2Of_`6QNs%#XDN-P5kWg*UQG+!$WYgSnm z;&|~<@gbk^vSL^Y{(jp`QnbDVjaI65_cJL!Q2iFMg@{?mQLdW}n_1~r)xK5`)|Ap12vTGE* z|058p#}&}yNTcBnJ%;_H9%ub*J(e&%o_GCxJG8UY>P>J5 z>*%;EEJ#PnfQ}|H9bIw3d$>-B0-26O^HIJtNEP;~KZ(BS$h z8;o`FY;cE@>UR+Io9j|Sx9NofDJuN`WrH=&|93XH)k*bs%o(hs3MbD7`!XHXIknOj z=MjTIu8tH)=||zPy7wE*mK_B>nj*x$zL=!WeRYcSqk?SlMzhvJteN6WGdzG(E0%tI z;R4m`+WIPSno+%Homg&YLRNeUJ?K%R(5h>)!L!zBZTMwi2d;6()TIrWWPHYi9ip_{ zFlqD>!^;La@|>MKscI}sghz4)?;TpF`on+Og;cuRRyoxz$_O=b{b6D@D+kw%af(mW z`IM!v7%ux%+J2HkIk4PfQ8g}A^_CPdsz#%#s$f?0WnT;-gLYaXS`=Zb#(41vW>VES zJ8{CHvW9Y%y1ak+I|WZRD{>SMDe}H)R$3Dpw9-T;$uu>qKcM}fd;17yKwr%Uhn8pdx_1hvax4iW-}ct3ow^OvYeeO zkagvXw!IF`zS)7X z?RU_A3@neRJH~o{Ix+@h`p`1nI3j(zY5HioqFzS4N1helL4528?)3;qX89+muUAu>*Zdk^AML2tMY>b1FODxq6x>^@ zLLR!tr_q|M%H3fYGv)a=U+@C*ZwKK%jX-~i79%vSpZ)z+a`g9EkGPNf`xREsk29R%(sfp zH!_-R`{#Or95l-EtZad}3uT!;3w&Y}a)k#4^2|h8j-b!_;&T_u`^U-hT$EkE5=i_k zHcR*v58ybluvJuUNP5S|VE%f~rv?l0mA*XA z1oRcp^reEnHrv8Ji0beRJ8XW>5QjQ3tWG%UthNPfc%?0-!%}(#qUl5%Y1}(PAe%7P zQw9s-F)*un*b4P-%(4%!jdA+F`Rc z++)gPB_WPc^-g^I1b8R*5Pz{;CtQ`bG2{;shO zz0kt`-tDx%XZ>q$s;%?i+vqQ~dDFE0r4!yt@hxMGNre%T^d*KdBC&i1yHjO<2BtjG z;8VWPUy{7l#wWx_MEY-1s1QvqE0Y5LG}b1F=j;*BOt6t&ifn_8gpvDw z%@I4Iag~&oh*bZPo5RIf4cSTb-wG|Uk^V)=dK*cl_2`wBhKKiseL!bA6Mft3C7Hi$ z8gI&EecJC0ubZA;Vl1I^4J{W3dEGgQ{iWUB5!P%=r6pUe9!2dx#zr2v)ExFfSfI7l z-b)Q518uEETQk!0jroDL^xfJzFa3gA{8 z2XP$0x>}qikOgC8ISK1;4$4_556GA0<`P-Xd z9&5v!%>MgJUwPDZbJDAgZv^bWx|{v?m#%t(?SHX{+P}e5DK0nu#&7?+4*S;z+5dz6 zrBcsJ#<3mtFLv1f4A!E)^~$(l`!DjSKK#t5EuogZ$vuZzHtnAUHfsr3v*dmbrRM@A zn|o%!w);z$JX?n#zz8e<#lUok|)?s>)km< zqRTOT0DEq?cWWsh~d!?}7i?|j` zZ4y{FK_FE);wB2j0`xp3kX68Kz*9J`;JEy_EZ1cSigE<*_K6M#!@D36vpQ z^DAb%BhSHh*BT>tcUtb48X7TE%dK`>8>$1AyUHC^SCzifxROT6(A8^qSZ;;8Ge+(& zCAg{Oe&wnZml>CtBKPntH#=ataqbt5#bQptaz}Mou8Os&Z%tg#Zn?B&mn(7)wOl&8 zBV5k~EO(WA7IyGi0b5<~nt{@cKxwt>S(N;iyWBku=hKR&by)5)_c?p`k`8NCkb%DD z@Et@)QZY6&wV6fkh@Z4q0rn~|3v;=G?bYK_*3|^;RmHK_uUuX2RdiE(6=1La)=s%P z?e#R;S|6}i6~|r)^rd1mpoE?#x!Ubj#q3ppy&iQ1*D$&wVXs%5cW19Y*O(4_eS+HS ztNrQQ`G&%u!mf1b0{J!UZ8~f=@fQNI!47ZXGwV2koW?QvNrCJE4god+9peQOgL55@ ztj7=wrwQagh$k{f%ktIXvb-7PcOS(%K-@DQ_I-WwPupv@tJ7X{T~T$lKWeX;u3&pT z?xgm*)_FJfdc?`M*LtVlUemkS>jr11y?*6rx7S=(u)Pj*2HWcpC$(39y>wT1drfow zl)WapevZ9va0c7!MyIlF`;XY`T4z^#^*FoQ>wIUYy_TY_9Y12PJDkDRNSt@t>#Qy{ zBnP$E6^^^J*DcOF?RCE6^g{yK3%e>y708FMx8K2L=ME7_3G8qTFuNG}7LHvd0=Yd_ zAS-}cl!pPQ;3&hfbQof9oj@K&j4=&y_+XShDFU(Q$#Nf*FT%d_Ci(64b=d1XW7zID zf?@-IgibB?qQlzoT)<*4Il}8cOrK$#8Q6_x++ndzj^N$K;-D5g)Da<0HvZBS7Kjao zz+(3zGR`))#|1MS6O8Rqfn<(gmO7cWq;H$kyJcE?dwPeF?cfhj$7*m0B62hIFv96; z=+P1rMSD!Oy4*oBpK8iC8Cjo~qtAaCFv9qFpwA=d4FA?Y!%@i35WzTpVWsk60r{yI z@xuXWGo%j5W}REZJ#vnZ=^Zfgz*IFz7rf&4I1mir+GKa6W4=64Hl4CXrqpZy;D^)%R0Pn19JFOXjimE}~F zi(o6Ni9hYPF4#N$)@JN;IyP4l2YzJpyI zP8P^Fu($F;S>BIp@vyNC!15x2m~pg@hJ6Ch0xiHQ;5HnGaU6eGmaCEk@(SX?5%67$ zQ67qN&JbB{g?(>^zpH+-(_Ytvu-9eC=wA=m>vCIE-9OV`GrktE*A;iz>mpmQz4o-F zX_KYP$mm}-zWfvRs!PSRo>1$c9E^St(Mt-%2wyt?%r0DrEA_!TTPa(dzE$n8`4&jr7Pa9wmRGvY^%xA z5pTP#CQC=r)_+3UYO>Vk?X<*XX{@)qttLzRyVMxrjogteoxiL6J6ZC0yW1*y=P?fw zND*vGohXn|ur(d*R{4NHBopE|e0Fw}K=$JhQLY1Ofk%KBjRNuE=!tUQhp>+(2&5UY zpbKrC$(7|*D8H5?%Ue)hih9 zb*_x1#--F=&Co&neXxb!1T>cD?X=fq>3}El1FCbir<7S$vNXXvA8pMK*wIwaJe1}I zN)tWLqeNIeqjxsWXBW*0SQWjZWjk!LG~KKGK#AUI*nD2_*czq<`ghS2QP-CKYvZp2 z_ok-?ttVlFzlUc%o%foPk>5`=MSh?Y>C+6!QiPZO9p--2m2g>yt)q8 zC!=otVC31TE5P6G9@}n{Z~UlDUUu6WDg$$V1-Z4pHM}3a$K$uk<#$-+d3Uf?&T;## z@~CT3z$(?Ag=lSIzz$>G3s71RD8;x-$5N|YZpeYmEq5k-ssdK%b5m=5zUcW53vF|^ zTWG8&*g~t^Qp2->-mY**)D_>TUTij+19SUpj*TvL2hUZk`{^JX-S4Jc!)YPX-vqce9>VU0T2H8vPSi`cROSCc0?^>Ssy@lfJc2-_Um2w+quA z*WK7@Oc$9AE^4P)t~>2C(?uE+GXxUxAndBIKorO$egm7e79eNFG1-8e88`&kRN(*a zm*BiFj!Ce&zL0qpzO@;4n2yg@KY*CCk3i<&S{SbB;8W|6Pq*Rveq29$zbwzg_0_np zruUXUT2ZeQ>AhX5tq6w?cX{%&g@M(yFT z%9}k)v08ARjq_-nU&VRmUAI!}f^|zhePOjZ7Wyr_R#euPehd%lB#leckn0VAZ}_MZ zIyr6}fK{uoT<~cH#m&KGikkx$LLa#b=tI$>3R6HQ&`55fPt`xKL9i%qsuqm*#SGHG zrZ%BZ@#tST`nMV9F*p}+z6IyE6eKgT@q~{Eh)0|kd_IL=`WB=$OnNzLNz*omj4N`2 z@|I+2FlyTZZQST+V+yWbzw0()Q2WYV*KR|v&rUnqaKYE4s4wW*6e;!#dinq>%6YUP zPrT8LS_)##7Ekz^reXa<>hxW6oIvekcU^loY9GAo+8a^3{;q2;N9`SVUE6}%Tkg7c z32N8gb?srOU31s9b*No^_ZEQK6|l_sM#K+J>=csvwpLWsOCOWQ#aI{0yksf=pbCFS z9NcpA2yA)S!HSQPCB5@wTZKMZdITj}CofRWL7CRh4wMI??3YUqT+tq+d*o~NmEwIy z#hz-cwMa{zMTrbUQA2xFS zGJYlVw_)(NSL{YHA8q&?%GyWRH<;l8e_LuNjo%?Zw`Iuk_Fl-%b;yHsozGVcF)Bak z{&WTP8%p$MaA5a~pidgKX7sz?|MY;_|MUQP=Ve3tPJPQB?EN>|>7H}gq4*$0WIMJ) zYXpZ~krGyZkEDoHHs&WzR?$xmI_OhPB(2gCvF@B(8GX!73@gmRBP+GX8WlU0yA&JB z(UVJEc&6X+!~ry5BaNjP?_`WO9^-vEOO|)yST-E7_i*-{RsPEQ3NgVbd_bRa&9;Qs zv}Y`PyhkcN^Gn19EB6lhn>lS;3Hc7hejS%yUBx7J8D?eo?k@Pw3 zznHPV+8;8}{dkGto9Ch|*e4Y&<`eceBJOs7K5e_;OB0mO{dkly*Dh?@)SwO7q82S` z(IQ=Un{8o`m|~}6HroewtdJ}=14+^>uN67!nKW6hjzO;4UzT5_&-i0bCgU(9u{Bcs z8f@Yzqhj~(Fy{4QFA+0RL-Sz2ztW0HQmeP;yS9cWSX7xL-SAS6wR3TiaWwTq zz?^tkRGB0>yq)VhNm>DEvQ95PB90e-iC)LqA2+FPM!)EfmgDThi%8mV(^AA}u@-oR zG?tIrA2BU4s4aOW{}pNr#6FZ=dpPJ?o9!WXEjQ?z%a+ZqJs5QDn(YC0ZBWp)OSUX_ zZD7!~&utm(T6)m66Sg#VEj8%cVOt8WMbZAoQR_c!QwE-H4EW=>lB69T(m4J;fecNR zuL^90h0>qmgsfoAxs3qb0(P5^5k5y*bve&9A>_Ar5L01g4J0G{~nApCi6f7fHWDB>r4@HP+u@8+Rz_NtK@Rmd(1gt9$<6C>L z--h0(4;P;>hVQNc|C^M5%VqGZU_s%`g3fzv4PwB4E_fobrl0LgpM`tR7l$=HvfEv? zBWDHn6S4g+&N7t zd_ddPT2?-jiTyfB(s=08QuU)cJ!cZ~(M?~I#-7k&n-)2YN+2!BVP@Wk++`Gdp0)Tb ztj$-A(R+|-s{@*4YqKZfh;zO{Tau(SPwl>CES5-;(mj*J9>0IjH>e~@+TvC1R)|#h z+vpQQnngx+-Di>IhJ~huqp6PdtuMvV-^GvuN94-}RpU#E!%(+p(DNBd(spEegIK8t zN?Y8~dnji%>N(sM`=$q2U2fHf&xk!X<%xdgMT~DsfbW;4Uyi0vU=`mu@)F}K^YblA z)S;b=?qI(8UHB~EQ)r`WDBoVUW?xZ&Z@(L(+~nsHy<(BRbxFTMlQ?=QZN1bMNo|R? zuMsK3wk~asfNYW!>x~ZRrmr{r!xZt7uhg6;(ocom&#>#U-fZ|QDxc^Lp0Q+iuwC|b zLy|Nxf3D*AbJY&2ov6F?=Sk9mE`7DRdUp7fUI7bVj+}abKY?t5A2&uK)_|>Cz8Cp1 z%9kPpQjGE(ln=nq%tg5`e7_oH@&b*2lcawgE*(|+(dv2{rO^l=x+Y0FLe~e@NrfxX zG^%xW!HL!-I^_rc-|EJjs?0?}wAI6ZM!s_w zsBlFG;)57urAbn}YZh|$2=8rqi;Dj4Kq*ETQlGhGbo*qihsNtklJW2gd|r?C zGmRH~GkUi(C~wx6CP@a*2Hyns?A8U}6a_58wZUf$luJ;KLwR_hY(P22rEEzfSTD{L zahy-vD--#vKX*lZ;p%Pt&urR0p-{NVw z<{p6vM*m!>%%!6a-_w5oLZj`AHZq;zqAEK{TISA7%0aop-J8{pNE-Y3{pKfqF~fTn z4={U5eq+co)4LZVXFqQFbICw6?M20GOG#vlg*@$xxo?Nr5}zVI2z!|2rdiH^=F zl?6jD-!DFi_IB<|5?jCSV@@*1i>QTJRz03**ENH@h7}LXg)JYVt`eKeXd{^00>=@U3tuIEiK&-+za+=<> zB)m+r;u|#|f8kSEulk6#t{}WAcVDb8rkD)+pQaRCQ)&|${N;Z&#apTiN}48F6qaYq zWME?Bn`SC^49B|`wK(3V9KESP)uYSv4P1DMi!0Vw}}zi8s?7|5YaU z365He&><&?z0IS|@0y!&U7=MiBq?Agw7&|==RT!|Mi8H{eyTK;X8McgzFlcZgC|LRPX{@Tdmke^rw zmz|yKV2Zu_I@nHnEUHLCl#F9yba z-mYDCEYQXUTl=`LAMIZMK%oBKp!!ET>YqK@J~pB&H(YzJy_Z@ucJ&-R`jEta599CM zr$4Yfzn`1V!g4Nv)$ZyjtQy-J!C>%x1Q8lqJ zukjb+>kXHD@%lq(ZJ3xMsv4tP6bb>+$5uytLw$?<_?Q1yTK5)S`l7QQtD_X&)rvI! zT^pz;{5#S*u`v96A?;l+Rl^SP_}7ZsFl!HUm{n0*C}KTUWQt)dDx>%MDiNno@+sj- zo@i2)7mCex#S-*PP&O)B6j7s88Y|KMr68|Sp*@Pf#gd#&GPR_0qWe`b}KKC5+mXPq9TNeyBhTn`> z7Jf5qc|Pid-`usJ+~7aEwZM-@19&Qcp9k<_0Ivq{s{nfZ*!rK|#FGDQFEzBD!@lup zQH7nf|I&c$u6Ov&0}D?2EWPQsKqq}O^5La&cbdt~feXmZ!KEjCJ10yhycBqScA_nhL(HP%B&Xght$N;Vhf@Q5!%_0L{QP>H?e>OUuU#W@U>J zG2aOL1$&>89R<+Eltjh%f>i8yD!N!AQHr<2Y9g&og(*#8wNY5TF~6uR zymtPv@=M}>*%g04%R~vE^ptu@qOz8*V*2~mCi^`V#|sOvUdOZbiuL3nnOB>?{Cay! z3^`cPzbUdsr9|s0TjaJD6&;Nw5&3`l?Ei9yMISUrVpR17fAYmte2T0~Xd192W{CZ3 z;k}HcJ@aV4ds>C}j$$^3h;hD{9#k6>nYJ#v|5T6;Z7EHP+9ie$XTm$!6oD}|J>b^~ zy*D%3_^wFr&GZt9C9DQJV2wh%#+OJk#Rz0?!)(LKBU=>eqn3g(BaP=HN1B!)gPtfB zj8?Xcj?UF}{H8K}GG_FaJG{jh@rX$C@^l-un=D&R!?5y3%P)+-FrAP51^W$VvGlM& z^YEwX?;dFT)!DB%LO=}ppxbHaeiP>yB$`FlZ@5=XCvyrWOq}~+lfMvx1fcP{$C0^ z;%M)@7X01q{kNS6B@RK+rztX#4L4e@iHHDimRtVQYGl5^gQNv2@{< z@5400_hICMourOwBUyiIs~a}n5f+I$k+Dq^lNYv-h~8h0YEw=umV}t&t)EOhkg&`d z7SV??js#YQsEk-qW1h0d4=#x#=X!mL}rSEq-4uYMLX;y*{W zCCp1$nUBvR4mK*%$H$M%r{7zV!HIPD%cbomN<-QB)4b@H0y>zv<$JZD_+FjzZ@ZAX zH({nTEKHNI&f|q>U;RpXjxA8 zDafRIWqFfEmM?sxApgL*h;w6>Ebl=1!(OtSplM(8RpKaPU$F=K9>c%lOTZ&SKjAHk z=npOVWAdS)e74emE$Zn?S55Awp$ONbqm?_tcV^Lbsd?F;ZZRt&c7*>nQJUk4sLc`M zvN3xeo)&-oqgrfr`n5Q~_$%E2(|~T8IqTE~w0P0&*J2j5m~5P`3tHcSx(A%WTAb?a zuEj5Xbkq)a`zmk0SDYwaax4!M$opzpRzi0}<7Ig%^tWlCEU#@-kT*~!C<`c0M|n1U z!G)gw@2*zVM~WH7K4S2bPtdUTQ#&CC%_{J%cVmB!7%0;H?~2>FkAC|EMtAi-(h{f0 z!}%(=|Jvv7rUpT@h&ecKa+CLnmej0ipm!W6HDt2P#)h5rnj@3#s+l;y;>bkZ%ZRQM zrRDChj_-W@858zTN22tdLnqLC2lQKkOk<|$#q`XgaziG24vKzHGdees{(A^$VT3!) zL?Z{PZLK?0?6B40j~%S@-=9hLy+8lA=-XgRd+#;`^=>We-6{te{4n!3 z`h*G%`ChnL*!on-Cpcb6e7#`Or9WDpNq9puZe$T^9K-P!XMV5R#$vLrAhR)29M$l8 zf$37Da}=q79rbiXh}Z$r!<~gBUyN|lYX%2CRS-m}5za~ho~Ykj1@|TZv9@nhZ{@bUjh}o2g{5-`HA*$drR@sS1vy`MA^ym}*<%=Qjx|M1I zUmVuwwtW)-I!;NXD?4;-y4O)*PVZWy!p~a*5?)iUKd5C&Ra@d2&q|zcCif|1i z5~Ttc+EbGU;u{qM432Pe#B)rocZ^cdPb+EGB^sggJQp2rd2(bySkvJ`{rNA%kyheR zN9)mdMU7w`ivIqosnk+Z7~Q0JApBnk3(^|t2roJnR>iw2{iMR$=3Ft>r|Mr4$hM5C zEd~GEoXs+=lEj$i4Gl&WNm&>l?^9@hx%BOVe>N*}stekhBdmiO@s92C7IMxX% z(%GEe)J}30&fdLKBq?Xy$f%x*f$B^7$qF64Hz#C%(xO#lHVWS-NnI?c8zM6D&o?9U)3+u$iv zW}0=D0$&PI#m6qKh4x*@s#by)^&YRoELg zJrKIR;;0g%ty&8iFd)FEv&}TuSS{4X)mn?*msNTZo}b>eAku3UmgIAGh3T9f>YpyOHEAs+z6=c+_^YOK_VDe06a9BN z@|$XXDvhcoD&mqaX3Hm{{|yoJJ_wGOFe_bUe-}&l{a@m~1-^+Yd-zVC)3lWIot9A2 zw3M{G3L=)rUrR`b6p$7c5nXi4Lkth0BI^c44WL*R*?_geZ+;h+Co_o%nnR_JMC)^6u$exqM zRf93?i{*OPR}ric7WWrtqE&9)W=zIiBubc(e|LRx z6|Y@zPT?Lxf6TLoBZg0%ir1K}=((0u>nv9y>GgmqA(l_z48@w@8VGo58&_W~i}b7J zxMSRktMu!l-}mB=g;A2YD#BV_z#G9YFtNBA5^veY$1GbVST?Y?3)(H4;>Xp#%(+;u z@G0Uf+xTC!Y{2#Ew+^6v1L=YepnXGqAiim&6}& z#aizP?oU_AfHTetuqb$DV)z8e>m%3ks{+p}Eg77ILyBME+AaDbOXPjEyt;L9|7$i!IAa7 z_%biq!nl{^vSp3Nbfv~^=5x-x@B zS50(=YDTACf>!Uem)y^kQp-oBa8dkMb7-*HYLZ!WR(zJ#tki&&(*aajsO~_St{2aS z^0&*mocftJ!sF$wYNkI|eIu;Osn<_}viNCJo>@PB%#F(NBoB88EP7s-H}=LD)z}-A z#f$TsuPu@evE&sln7tH!&y)6_t<8VmOJ=`Z-HYznCs;J~i5g)gi2h$pEMzfx3=Gsv z_&=8{CCeaiT1*zf|A)wI@;kBsu8kqH$UL$Tj)UOuKMlu%#%Pp3`E#`KQ2#FUG*WuD z2B#k=0eb3#1ru_Cq6|vWlP098lGi06Rq6FeQ*U!`N)ghNZRyXAy)hAY%S}R>vJwB$ zi2t)eVSTt4-*~+77x147XBGhVi@~ESD&l{Kivk$KleqWwiC#Y+q&gPda&+574Sn7 zMClf8NBXt($O+)fe0ggLQ#b*+(X0MR6O`lg%>~Gn`N%Ki%oyD7Ebq-onOfvgG4N-6 zQH(#=1MU3Lb>h!M#7gBjSL8%IziQzB82a~Dz_*!jJOr|z34B@z{F(`^7LY2SEfbCv zK%aurH@I8+b_Qyx{x$>*6Z9bO>~7?(q4Lf%=XE3RUR2&o@)yir2)g?a=x$z&w$(A( z_8*IJAVx#gv45q% zD65A6&&T2Kl9>M93)dC_ZBxiFz&#m`%X^~H>SI4gYYz1j-kONBCne}D_^lLwx4#!) z54aa2=INkuhNNB-mJ}fVPnvSfIf#4loIKz;=-Iqk55ccR3|N*~?X+mCGxDC4>|+nMBH;CWYlx%fAR?1N*$J7DjQAiuk}-v$076n}$X3ga8G?OjjudZYC& z&aKZ!>plKylOC-1=I5nxV;cFrgxNe>msfscOz{xQyu#*dk1NW7zP!E<&YlgmhZMQ9 za|?l{X)ggy#NTem2T=b1()ey4*}sKzQ{c`s*BD}lWAE;0bm);=+p7~kJEf=DC)lgv z34+CX(iCsA1dDYmd)02KD)~Mro$(!#+3IVT%()|-NAxezV+2YT!N^_+cU8cz$0&UZ zX&uMQ&k(U)gu}Hf8lCnY(sxI<^iA}6s6DRo^?xIG`)r_xw3bKbj9< zA1cp&X2ZXbr=C(v^52Y@N(7qw&*_+p_KDBDbNEY+uJ-zu=p9Qb#ql_n&OnwfbJA#_ zH60EH=v{pX=^fQAy)z)Dy~|k*6hG+A-9G3Il&NmJfyx)8{UT{ClcI$Cpq$6|ujr3* zo{w@aMmfKT+91jqB#yR)N_u=H-ydn8zaW3?Lo=zAXG^6I4T+QTpcwVP23#Hk8?u;E zW1&?268)8MPZibWN1)|n)F#b|g(MU`_A;v2r*Wnx1r#9?gG9PY$JrPY{sr6W;lLD zsrePm?elJmXqLuCB#x=t07J&Zaq^95w6y6~^2_0eg;9Pvd};XqR(=lwl}kFwFEd7& z@nl!|bx%)+$I_MldOt&+fa8-L(P&lUt?WY%|7i&Q+Z^5*`k(M`bNGXyb{gC#Zsp&i zeW(CTAAvgB2Ar?E+J`TF4A~FIKej_W^)C8b{k!pRbNGc2FC+dnp+2I2`*5D79(^g@ zgi3w@#h(;BY3gmx9lvW<+$>gH10L7i%)D7+psZoy{9IdR%+Jl?Cx!$+H;1?0GG0b{ zy5g?`+nBa7^6$b2MJxZ>6tGgMz+Vga0%7IwOWr?eTx5uN>5HF20q%P6QeX;h6AxH0s=Q ztM!B&i2u7^Pk_-ct|#R1V~?v(5`g8o3jX#r5qa+yi_ zSTfBoh&xond=U7$0)H(tAtt{E`rZoY0M6FHpC@JH;|gF874C^J^9Bo2$z$_w^n4!k z2{BOqNz4J3RZ}eH07E)fQ#_Uj&Q-MMZ~W+{{EhVfEduU2{36<7R^Sx0c(M1a8Fg$d z;-}rpZa8f}!1rOrzo(HWyVb~a-w~RZvY6(e)NyDzRlb8XFJ=5WLVLUJ#k`dHg_xHT z$9o_3?r!jXt23A05_a#GIfmJfGQ>V|n|ROs?&{EM8Fokv1}w@0fiaYay%OBR%NByqJ}IGArc9yjG!nY?(>hO>WF(G&g4NSZ>TdG&g1*%`ccU@8yUUxM2e> z4D%$mZe$W;xiNEAeA6XE<>kAdGJTHuDf^;Czp5AqJr>yY8(lOj8l*Bg8htw`B82!n-Rn z_2<2#Xhukn9lf~DSt{EzRQ?z6tY=L&Umt$GqDSGl$H33RY;U*BQ8|WYI=pjQHorRD zo}+SIg(;2#AwOlgh>dZ5HoqkNBF#@Zj$)%(ckBF=6(Tm%!!$o-Um-u`PgD;kcFIqA zH^pQ8bJ@HxjQJ@MkJgH+E*UB%s>u}MdG92^V^G*v(X;R)fHn1&IV$g=Iy7Zag+BE8$n+KQIV$g?5+~u$L6SY$8MJ@JE%H=8AoApXkdPpJ=YZ?+mURX!@V zI07w}h6t}YvT#pZbSc=7)9-*yfbwIge*?Cs4eZBfaBc=1)$sc}IR7;KuB}*lQ+CVW zigH{6RE`g=0N(u$#uLqNS^W{sZ~6Gf_Ux9+;NEP0c*qKOJ!u1P_OXw9Kd~{TZ+8+; zseX#ytqU!pW8Vgv|MbT0GEqK5Gf}Rf@@7M`X(q~5RVY7pedkP+&(RT{&Hor|&qSGs znJD|JR@~bu6Xn#3TAE#Q_4>}4C|{tNC|{<0g!w=Z(hrWWu+w|jZtR?iQcg2bt`oK7 zL~u+6%uNt)Zm>T^IatIgFcal7MPeq(cdL<$>(?jxm6D>~1}=@u<}U@+cf9vQ`ZL!t z7v*mg{c;kYjWU}*9aR6<-&_OD11kpIjS<&VrebKdHrU@>%=H(ukR@2aA_R-fMX{JH zRj1-45hn2goqC0i6QV!Rh~UOL63djB`P9jPM9h>3<1bCtH zJ^dv^&cLCE_M;UYdtVsLJviBrj`wkeh;5n&-xcvLtcoNhqYbfJAa)|F2aoDa%gKJ>pJ!$mYC;UCp!&p9^r^>UB zQ*uJxz>UC&)`ROYQ#~EKWeD%N@+-3W9RcE4{{=(N{+S`4d<*nJ*^WD|T6N$pYu!My z`P6WKy22xCT|?xp)0rH;#8cE;2iy;Y`quEP|1FeY@50?tHY{-IbB2rtdJ5qP0gbH? z=X~}BrElyips$}<%<4sVu8`PSkjc3&GU+ouuj&cYf=6;I)D|6BwEUUbd~H|(xPmXo z;=MyOWgN~}Srl9RT^on3P%oj_t_dUV_AqiHo8KB1_*Ng5#PZMSgfI72W%FP7i6e56 zAtu0A4|waK#BUqrv=<$PCP>5{#+?XGea?t`72x%qt!lWk9PW6Q;JQ*ae>d(m0QcAq zDJvwFWhVRrKEa|kW%HKsh7#OuAe$cr_dL<*o+R;}X|a2X;GSt>U&RE8|dm=Hvc)?tDrCw;&6LbgOGDX$hk4dr;dJe zG5+49*u66GUN&}b!_ob4FMnuNV-lyW&{9vmrzO=g%92wdc?B(eZJCW-rwN4Pv_`lwxkjd~2v(t_n`5>$o8(!4USoGb9oBJ(D)_C$stMKGg+=SfT%^ ze`$-F|0N#JJ}h8yKgFW)CM>4KVKKc67Sly6W>73T?+h`qU32INemCqn{&_tqcVq6b}qZF~WE+s~ZE)d8-_ zoZM1u={vEnxv*lnsc?eT#I7&9mX}J_a9|xd@1;L6 zq`1?GZ^XG{fvxe_q%Ct|Lon1AbK-W|fB zY;%JKsw)EK^8j-^yPNI}h&uyz#u}}9dN3a62Rq?B&8w`-vvlkU2pZ!dj$FX`z!z;% z72v!RY`Ow)Zah?Ok#Yb2ZY$Zi9|D}=4?WkIQnAdGY#Cyat#f+GxD&<{C$rZ;$5)}3 z)IRJ0yheT|%=w!dCEOaA6MO9InD<|($gtygirM_0 z!1EQtuf{<8j)|&u=Ywo)$HeyR)-Zc{WDR>G>1F6&;J2s`I~A=O8S26{-;>l!V0xoH zNDWxcq|ge!z}|?tdYLI@6MB23wN#Q+g4t2i)}QzGtlA1*ai*UbYMj~p$^c`L+9yZU zTGk}p1^%T^3h?JRVXp3zv@gjn+a~OhfTQ+PpTWZJ>aqJa?jzvdk#TY^sjg$Umn3Mt z(tEP$fr>|9}}{1tHh9(TF9x4vBTPqX=_ z{WwN@#EsFX{ddL2sLkKmV%z+J#eUY09I5r+ULkLw9QKvErJIJEd+CSAAW!k5UzD`3 z!!N4x502T_DgMrW(GwMBme_n zt|s|AYuQ^~)H1^V-j=WrG?~Tmzs9>ZPLucf)|eT+>@~pyE@hHR6715to?thKVQ-{V z-DBN(Z(^#(p)O(V3THdNS%7WzmRJ&Yv+opfvUw$3J!mN#ClS1(1oZAH=Q2T0w=Oej z_~F!tY}ZrbkJnQTuL&uoTk4&reAs=YHmWD=IVTv zG0oNcI%_Vzy@r}w=tJEZ;NwKio#dV4COWB|1Ks6fu&;Z&!oKG17!}vOonc@13a}$o zFWbDsMc6v;K=*KSYTTGO>%}p_#*K*&y&YrXthckzan>u?#8180ON+OCL|pfjQH(l| z3k`1#cODTMz9t+$A}pa4(Zfm=M*sopHBdeWb@QhTNr&G{ z;rCA;GvtShZPAf%ZU7u7pgs-G?||}kJb!~B??KxS{)BTwEm&l&nb{*`7|p4`JRr!E z@4cD|;g`=#ZE^kz3(ik4Bk8~z-?pmSsZ^|!xnvDY3FwDU;Z|%#uKonP)$nX6el(Gg zQp`BYHa5aIstZmz%aE#2TeKGZ#Ttr3fjNm|#JySdfQ5nfz0<3!5PrS&Z(wo43s`JJ z85{vgX!tY1cq~o@br!~;x@@{ume+i(CsY3qhB@z*F*t4;U^X2hVpszhnjx0|^dpA+ z5%A0S=9lb8eK4C}>y7WLHrSp0&;|zq%$h^1Au{Z1Zr_Ji(tsmWvRT$}5d5+h^PQ1ocZ&J$z9|(c2;wkn)ey_YZs``GZuFq8!o(eVIhWlUBkq*zur`O zOS(&e?oyz;l=2(TO`|zXxLf8h(eP`6h~Ip`Z=U6hmoOum*xp@sou%F$aU2G@?1N+V zN7TMoJ`cWhrMZ@?yeUh)A}&k4%zi#75wg@bwr8n-seF0MbC%;`mih@aqw&iTmPi_e zEcM65EcJOKa( zSz{JyGH~rdh?Y8R6a)H_8<&Gn!)FE*u^k$PFW)r$9>1hP!w(H;_)=W+`G6s%A9Szp z#Dn@?cI}5$h}b;;zQ*qibZC5k(0H|ZdS7)n8gB`7r|~BOoi%={pZ_C6>_-@~#Mu@d z{7GB1$w~G7|Bw9r{}1KwZd{?QTh8p{(j;}h8U#ukGLlB z99`+lppmJt8$8~Z8!n048F2{o8SqQ$N~$#n7z^%`@rfmmtAiQV(2doWFbLt(P%dcI z#iqQ9M+)=C=f!>Fui*>*Iqo#`oWitXUGYb;k>WT%0>hUR^t|a+Mfv~qc z#)5*?Hu{Jo@IL6sVemJ>CZ?Qgiw<$LMK?kHPhYh~|9-YDng#VgfuA`LuHEfu6Z3Br ziaIZ)^u866)YSpKsz>rT`#4V%t`7FAc)o8xz^`8??LF($x;5r!3N#fOxTX=VZ4j>g z=ue25{H=i8$90RC^B zYKzuE{r5o69Z-J`>Mc-z8EASG>W))w;{Fc`uGpO3z9u5>|A5pD2kIK2-(oJG>p6c2 z#6n1+!CX|atzQw~StQ{32T=k*VYYc=VRl6hT+8VsgBK}*+3rvb`HXayi^=4rxoVqfNc!L62>< zrwIOj?HPA%W?ANzkFG7&F}u!363Dn~i^)gV9@3qU$O+NC9O*&unZ1l)8&fC$D%mRo zPJQf25p8TL#dn9ta!Qy}Ujf~D#N4AbNhPeD=q#yr+zswSFCkR`Ei>48r&J9@OVT<+ zHTV|J#CMquN{B}!b`3A_&!q1@mU4N$HM~CXpc!|rIv*Kr?}&^N?FNe);-Ma!L1vGP z0GX*;HHp&!=C{6IQ9q`ND}vUtz-03kZ;ut2=|^X;EvM}z3F}E~l0>>5tu^lIoVbnJEr{au0r=H^XL6WRg4BXj_#zP#okQa1Gs0OnowG*Ok*IPIvh9x zygFUJH=-s0i^%PA=a*h-s;V^!Y=2|midO-)zK_G{m8w@5Yc20*X&k^A#sC`VwO|}F z9v~{VJ=LUqZJ&{KPK)SzFf`A{A!Ed)s3UFzr`)LF$9s^ms}BsZFhz-I*>zyq$@YJc zm}PhS!RlL73))AU-ke|Y_riSOb$%yXG0dX{D<1|cpAOg3J6)UW!O^BR|4^u|P{UPq zr>mKsu9iNFpBR>%V91(AhAaY`*Z+@g(R!eD5!6RRywn5gE1}*1^^q{v#zFnW86h^1 zaieac`!j!6x|f63Q&fHQ0BbSMmo(VNN$MEOi`1gXxvnFBuBYUd^Inx-XWe0GrWprt zjrWJ9f{M!P&plo+pm{?%$Td~~Km#(E(UjM_AjZA(=!o>XyjcorWB8tBvE#;EAGi@-4)SOl}T#9{;c@$sS}YE9_#bVFvRdxm>4UaGwQ#_u}W!#@a^ zuMKAQWg4)5bL?5MfvXVt(G2n2H{kCs0a-ry4ntDFr}!uMO8>jL-7myED#ENTwKLG$ zYA>^SGgvxj_h=}0L;cwPwy6CuL)ztVZ%hslA$c&)0}t6FNTcl9 zy3|$kEf80sJf=E-WzN(8Dn{ePn`oREzB@+aq%Jg05^0=5X`B|G$CW`;{%mB5yVTrA zUmAm|zX_@?P8#|yQ1v3zLJD<2Od5rNX<-azB-9n=kD)#>n2}Itn30eG^XCx4l!!1% z-0A>IV_%@FG5n#Oex~?N+@wGk)SfXS<%rC%iJ;XNreu1B_ zgMR-`SbMC0Tznq?+X{tcnJIUDZ#^B&^yxdZr~T?Tc06SVi>+RYh=Y;FHI~9z7 zC;^`!(*W^A;@*g*5#$}t;*DWqnC4`5fr%O3C+ zEL8GZko=F{+}IlqeMHHxftdZRCWa(~%>M{B&I59vvK(o1V$7|oaipMw2!BkjW+%{+iHt^U_y(9ybOA3;cz6KJirc2Y3c8l$Bm=M=s0@Z zd)~`b;W#4e*nv406#jB?6qPe;jj0# zH;tVPHCjs;KOtG%b2YI4-lQf*SLoK7Z>R6C3D(XQz^7c&*i$Y%lPNys%A(J!JDzf3 z9sPwYx}QxJ|6%|*v-vCWtqi$1pMUAGz_l4(&e zo2Bn&fS-~S%d6Gfj@sJ@8j{D2gkLTA?uem`-*1zGgf9k556HL&%@0=e*T?LCp!0io zVE+U6cG&+w7yBO&?SFvU|G;x@qMOHoJiUZq54(en2d;PtchFes)LAdayug{@1ybwo zOB#02*y<`br^cS1XF)uPIB53>I3QoX@!u)>S$H-6ogAziC|HyFfiGLOteJf)BS!hS;9)lWlJ{F?9{b9$j`G&4LI}*m;!D z*q+%4^70@DRKebHt6jNtX37NbW%xdrmq3nL5Tj3natG8Ge}M0xGGr4RpTHayfHL!Z zTeM|ghdteHet~Ahtv3^hwN#eZMSGe@?WvKzcfhcUTeOx{g{A z&W}`&_s84Q4FQNh0>toulW9N;^l1Q}dB0&3tm|2@uImHrfmL7`Z>N?~Mtkoar}+}# zBKE5A$G???bsg0k7422+e+*#cQW)R*y25b#1Q_4>I**+1e8R}__z*_O*S&S!=)MoE z>nMFCKPo}6u#GqM&?xqBuuBgI#U75(9!~hmbeS-p^v@f~&AP#;z{)cC-4a?{D93|E z^^$C~wur+R`i48TwP17mg9Yw6zwAbW3hMLG!dAG40bauaui+wIb8f3U)t} zw}*&hD#S`BAVypVHmDBDg16hECOD$F79+%rR9{~+uje*Xjol_{?AFd6fVZm$;PGw{ zG`3O4-AC)4=RJ>Cn3)4!>H&E1eGUsj%t!lCpNZi?(AO#41i1QyA2oKTsIlijV@LYg z1JA_#f!*G&Jm2j#&|dd>J8LZNUxQNG@1@qkyEx_#)ZPT6R)n#}+gWaFyn@{96vhT` z_Zqv_ea}Sn2VfkkmYXX1I}-BHWA`dzy$qqfOci^X-UZX?-V%!G3@`F`mKU|-`=AWu zFN^sFbACZP22&lLL%o88cCVm*jJpId8w8jQN?2|}tW-B)r4q49?t)dah*c`ZD$`p6 zSZxjF<{?gijcQ12^x#)>!sy9m=G>?pFY2g@;wkFrgT8njZ3y11qjv_0W5+Irs388; zfi3-hH$$%NY>P(VSoL9B^xRoNN4GaJudJY2D(I*rPDgd?bE%Hjc~D2CaXPxm(^*G1 zc{=OpCXb+_TRfUPwzn8Ew}BxKeAE^-LdouEi|XO{uRpd$r61yY_0dKd z_ptc(TB&_Fz}0w%*Ac@+XK!2q@?`O6J@_tU?}j`&zVNqf5A|<65P#;$^f>y4Z_ejb zmT8vWyNR9U%6|NGNaHxvxaVy5nfr_Hf)Pt5MD(a5cf@og6XO3VqW78^7ym0bp^kcz z3Gu%U{tgIdQD5mn_h|D#{pc9XNT{=g#M$ch7|ckhGt5XxfcbL>VM@YsUGp^?Ig>lW zT?Br1k?7kMnTy5W*u#gk2U%PXABJ?X9?o{@;jGxhr?dxWNDf%rWD2(o_&FZN2$q99 z$lYSk@VIq{;kz>VC4th|bBGa*{K-t7^;hp?i1tl}gip0aB~X3{^_=(HqV-T7gJU?H zuYvP*P)>WZW9?^TZ0#qL|16BLc_!ZyW;V~GYd^1uYd^P})AhH7EfHb%pL+^KgA`3|{d~@C>1>7`);x@QOuvgDAXVAz^K%^O`{> zc;uZ|Vlw&1eJ}1{i0uuA%mW_Gh0+PffYWW!!*AfTsH2V5aT=bvkpJHuVI`aIR@r=3&H2L03+jYooAb^37d?wEEQ33k?wBSAqsP6V;H z(?LO}r@KdhPLGJeTpR4F(`$l5V=&itfw@+Mxt_wT3reWQ4RiMcjqVqNIVadvi)RHp zw0KSzm~%v!77BAwP$G;IE$T7M_#xEeO#b5#^6C{wxq}h&)hoC$UEVE_+ocUSx}6;7j99S)3kz7Z@DV!|wx~_3-dOrI`h)+3`sC6Q%^TwjM^OtHxZkGQH?T&Nchy5Sm`%9ZuHLvz$$-KW+unk!2=XzcIASo6G>Veg3~l4+4db^Fu3 z>8ATk2GbBzCVwrU@F%izeW}BQjPm=hz;6cl{ntJzUy%WX zm#x5E``I;)b9qaKfryIa>zKzsk3xEN7Yd- z-x+AERkS8C^|nS!eYLDLiGV%xVFoirtA+t>^95I~-X`Hbov++lKFi zU;B*D!f#otP1fi-TD}}*S9VW1;aAztM`SiqxXFAz!q($6XQ!9h^$MLUejQN|nO{M_ zxhydy`U%6fS^;)Lz!Xu`C;Am~B~WxfT-BM%A_{v$?e@va)>4RUtZF%2X#oB-SWucQ z(3`<;2(v)19O%v9*TU}t_+0?MYr}>Ga-jEYqy+9926x)vY8hNDgR4)#?}_kxBK%$o zzo*l$U^DndVap;pP<%Er2U=O6)tvC5$WowpW8`tt0KX)gYvGr?)kbQKb*?Kw=P;8B zrB?MOXyZLpqU~>ffOeD#+Mz>jEX&{rg*$2EGd6yc?Wn(=>SKL&Gw976-#g7BhZ`mK(c(M9HTNygMh?Sh)W|4*BmQv_ zd83O{_~oi!!xhP^rKU?TCXYpAy0Mdymsa>&O6ng*J=$Ka0$%U1W$@q8jCd-_-)};w zPb$jaFGH7rv#OXzWq?P98l|HA{WydgrK0>j6GDwrQU0ESR&(HYyG~{B2SZzcpSIgU zli<9K90MMI%$dtUztpc%{th;E9%W0xc5AmWBomHfuQFu+tHL_lsz$XXiOZyGpeY)} zI+K6ef3NvoaqqfR^Qv`Rlcg+@G`QKz=*uE9?H6FF zCg)%V%0H#NC(455GI%ZeUjC2NXS~vTs%OGo%PPy4I++cmu&X3wmLvDcW4b;$O=nNl$h+UMD^g&{lP zD1pPUrTuxFjO%ZHk;?-gBZF(tPp6<>#wp*nND^s2ptGp_@`QV+tomuJmOn={Ho`ZO zwuL$a>$sb%(WbfN`$kZ&;e;nU=24uY@u-ga0CI%qX`93EpN#p#YRb4`ZUR{6-jTAS zI%+9(CT89kUJjP*MIZLQ)~ASNdDC&ildue479@^Ye_+U(Ist!t)2P%;`jG*`yZAEu zgU&0FQrj!s{WoyL@W5vQpKUXW0fL zQ@UBYz^NR`={VK__c3)qcgI^58N4ER%GlGj%b%!V1}OoP`?wBVFdOArz!Y;5%3|MM z%0;Sc13Nb1H{u!m=rDd0p27cc%yy{RLJa8HKz!sA&ialu!ad&x80*JMxyz)L`6tWw z80D@+H|Tl#LmHfebyl!1URi`m#5uU}B(^yFi!D5HErgtM(pO&L?i~MwDcz#Cujav z&3jqQy}Qde>cW05+LYjzlLSA*Ho%;7)HvjFU+cMEtVIE^F9r-v zHCo}W;HBPfuDqA?Eq{XCqRnzjw@%|OdKqb+HHBv+n4yW-F{jT+kk4#wChm7-ohg2m z*2A>-Dzo`YP?o5utF3+?_aLMz2~u|kKQh3Iu~vd8k7oaXjrhzvgOdRc#R0u_uC~mw zJ(kghbqwK3nuz|T8SfZnE@r6Rc*BM7PU<+4mxl>U@~nhM7!G`pMjk<%RjR<4zfioPu>TOn1Tzwa&;m zSu0+xfU9G)qnu;*lOn}MoZCK_sb0o>$Zb>EcSchy#%2@CS!jia%N-A=$+9%2T>(v+6!+iV->M>}s zIkTcK@M=S3fNq(okQ2TMPLk$VgEmQrm6S)ydODR%E6co5%|(*>XdTrHGWe}NwDYMR zR+N{H)-c}Fcyt`@e>)W5m%u?@5#;iRM)@mB?p<>&cO_!8XVQ$63OmG;_6$pv1@jHc zFmqn)sb2;^-}k0b$6a@&HVgxg9&^V2wp!}c=|TQs#*NqO@F}}~Tf|JzTR-nj)~nYG zBfgR)g9(4d_TEp=w-$2g+t^k{T9E+JO}%Vg>aK}e%(1ru-wWBmI{I?MIF2L5(pOl= z7A|eeIf&nk>@j2WwUf3jpg(fIB+oI3>IYt)Ytk-n($4^ zcl<#T@80E?vtaMRYi0=MK5P8R##bbiC9q>Nmthr*6QpoWcw3~D&L3(R9p8H~TkVygDluuZdL7AYR_=`$)aQfAiP_Esxc-GV z!>wu%;AHTRcWQgqOWW0{>9@HCg01j+&&};$<;ooLI%4SIM9Wlblsl7mW$-7wNhQ_Q zQg`w$9T)lgs3`I{b=PgyC6=_;KTwi&tYaMer4rxtG@4Wm$8&Ig!h5jSbm(=B(CfDI z!PG=NKg6285wm|uUj4$$Ji$78V>UCX^i>&fyplyJk-?R|$tkjRD?uvHTp#_euFlY; zYDnFM+)#w2Zv36W*LdS;yI<&KO9xHr_5X^hDV?Ztw#CC5=8eaHfH$*FAzGa*aqOJ- z1nlkm*~q!RG_NnNFiPyj)_FJsV4gL0*@0b_#af)7M{ul_6xO$vFsdTv!azg5i`kUH zH-;3|D>#Fd*|pE2(&L-UcXBva?g=rQn*h%QYc_tnr`8u`xcXanTawH@DlRLnCe|^M zTV{gz$V&<(bXJl$O2i#(z9uy=qv?kZ)Eqq_VLsYC9ycjuGdk$?UwQl@`o2 zX4Dd0+KiG>s{TnWOvwtE*%_VfWP({mS9rkQc?r~|W|>&$Xx#!ZZ2;2>Wz)O(9fibN zj<6ZlaS!`Q)3X**NQzj8Nn8Iw20t-W-NXz(L}AyQRGAY+SUP}Jb5ds3bM4SI^bB#R z0Pe2=z81>bFh2(%{Re6BElaJaIXX0 z8Bk{JYyVbMWt}MUe=4gzps*S(nLGnBU&4Od^fE}p8DVYUNo&bq)#b{JDH zRdVn76Uf_smeDvET~ljx2$XqjnfR5aPACUi%eWMJTo@^ z0Qh(H$eT)Em1;-%Z!d#?m(TiD33pg0b7fotV6dQN1hl^tAcnclA%KA#Y7&q0fCc+! zwi^SN?sp4NB(Df?h%Ut{Gqre`c`4KznuPgI6Lyqy7y5B?53qh2Ic?evZJUh$b$K)R zkKnu9!K{A)`ntV^0iOc%UsZq~E$7nt&%)Lwi&nThc&VQo@4dS`-^pxw)6bGI+H>VbGUAla&;x#jCE>3m68@CECu&www;P*@$=!Ar&L z;OYE{5OFMeNtoMy-}oZOa3yBNyIPuGy*-*rw&N2$6-ly}0+y*^)jN|pBXH)6fP!O6 z20K-Idw^e+=f<~0B7d*_*-TfipvT+DA2Rs$fo%~DwMcATIz;$af|A6^oUG2su>h|> zcRr{{1baeZC5U$JE0BLW|4j((+@G(;w?7lw2G$>INp*;QvKV8@96d#fri4;o6ztpc zjmba{hhHcqbgV!t>}G)77{b`_eWk($GoD=TuTq|*QNtClOg>n15~2o!HG@CnmqXO> zE{vZ?xFMVY+HDBo+g+el3b|{sR_U*jy$$VpLOUjFx#n%7%2^8S8vIIVhwE&3H-WpM zw=&t5bkI#^GwYbel0m|E1sN{MW-=$2>ZMG+e&x{sYyl%G%qy5&iEW%x(Bh zK_0|b!epyI=>@?^R_90405}^zseMl zL0`MRy-FOW7Z?(6S#h=jJ29@^zOKJPNMmdCuCE=qLd}c-&6Wsvv|bgysmm~{I8tae z&Eqh3mD<%98_$)%{NVJPo34Q7N$T*7poNl632x-a894J+weW^qI)5oB72nmz@8Qz< zB|*>g=+pgc_znLy{M}vP8-umacleBj)MqRJpRup#GwQ%+gpdZmZEqb0afm6x_HZi8 zBc;@5Oy^eyah{9#I($Z~8EDpobpC_m#L-sEke}iBv=;lxqI-^IPQYEqo;2aUW4$a) zYm#Dh71OFC_0@$O_^hNaCv9aV!=T@!!OhTHnb_Mz+FP?v8Q0tCSZ`~OZ-G8G!SP_N zKvSkU>%Z*>r}G-x%UWMTTrZgYI)mTf(}{g)j~7E91~?+mcl7n&=ij#h>}z_bzNXW@ z9*p(%{jpQf#|b#r(7v)M4>kWG4|mfZb365@qdgYHdfbb9)IncU;K+Gi*sG2;Z;0sB z*oH09Ri8!6IzOGhjfp$OrSqRdn{QVO_a=0E@4^7~^{rR9|4F$2@M>W%vX|$9eH{Ji z{40?H_a5VD$N5r8I?#PUYdZ+xH4mVAy@{JADFDA)0l zWt8cCuXGrmH##QF8)bTF<_Rv1qjSq`;LUqUO0!q;N8H&=eQ0H)D?*w{0oc?0D-n(R z>xjA;M(QN@I7y@WX)879pMP}JuX?8USQqy5cKYuX+y*NWHg z%Wa0}vzn7em``mdfh$SvXKW{hEE#gntYw{_dlfZF+~;1&3(tf9>YIOuTl7zUzcErm zniaB(2v0a8Z`CPC-sh3@#uD!H$bk9`UhUmT_dH@;sywN?#G(T~dQ5H!NAz#|6P3ID ziK+~KnzzIXGmfK-eN_9oH-TaNDhX@qY4Xkbz$?%4%v`2j0Flo+%qHDBK$>HLeoK6_ zdMSH+K8V}pXOln=?z&9%VBdU&KS}z5S2DYJCStp5rhEVB8UZ(h<*)mV3&bqGmFjU9 zFA~2bNmi`5Akn>)Q2n>pQ<5S~Z;4x4obF2GBzbiSGynE_8l3wtN&bq2*?)Uo4ZnM! zy{U@m2|E^QNj2jn#mohk3tlC~tfOXJ`0CRQ;FlXl)7hZ$2eNpyLju1@UXx#4sdSZH zi#}RAw(*DQWg3T+-cj496g9NvX)pJxD&Kj5bxQ_I07eq$ zyGjOUZ~@n~t3;=+!Es0&p11J*pcRe808}c#YvRCnb(Mg2@F(%ff{CG=H}>a%_x+yt zNfeF1`%+WMmoFK0Eq!X0lz!y>YudFy#qe5%$PwWEZL)sA``c`T|9as)f%pBcTvcAT zj(bm}`-`jNv`ij)jqY%16Fy1L1J7_2t)I9`3Xfry=P?p%E!PplWHjX+U9FYF=)EI48cTFW`AwJD#$7isy(9JgMXoU0bzl0M7!H9Gv-g@iYORI>2j9*w%#a58x_m zKCPEw4rxB(FQqkxVkHx!N|+UW0-lqWF=We*wkR_~TJ)@=^2caR&A7jK7+#VmOGQh@ zSdCVjmEn6b68&N~YN=T#>?=6qD4=Sj*si9|qf$ z`BtcF#v#wfYS5A~MWZhFt*GR4L5CkQDy$@#M1M%(g9yPB?DwmW`NhF zzR3JozrWp3sRidvmDxHdoWhUG|Hl5#u>#{@D9CCv=4goJzZ~$%87w^@? z6g4=Q{*p`dj#YR6ND?Ieu~Nna*e3z@lm7H$bXg^T2P<=zm}MUq#HywV7@c;wEp$O@7C7+8*?rQu!R^ftzTC%m8|}-`Mwlu-*05g|~mO-JZoI_%{~xi%2HCZrs;m`P=J#@3F~-9=mEg#EeSk zw}eO@W3!#aanu8%(saHqB;(LCPQFsDmE@)KHKAJ2ZhW6}DAgJpZISFwfCxK5)D(qR z?pB(WVvTr7p)d-Gqu_T8x##7!XeN}WwhP~1;+WvXF)@vudjR5k8r9=l3hDgxkdpSF zf5l4sFA0?#z_&_=aK&_Vm4%32Vl&j1G&N|6z9f>WW`>fYpIl`e##P1;MlyvVL6-&n zO*D_>5=Gqhd*tr+brkTPJgm8$hMgYaZsK_2afZCJrY*V<%5=cF8p^-C-u~?ej|Cdynjm)l(oiwU!{Q+tLBD9 zB)ynXI{16THPt=X(huUC<+&S-ms=3dSayL0<540t;1jL9)LwaLPl6ThJHJ9W08`2q zr?;eVgWP&vnJnRz(ucVu|0K9FN%lB56Tj%WQ~081Q~6m}zI$uAq@~uF!exF5_bcFj zW-;GWS?}kP-|%y+dX&0!7&rUII2Aj(4E{nZ<5;eSQ#vK3l2NxsB+Hl)fa|gwE}|O{ zNhJn|!6mLLVyGeR`PBw-_Yz@EzmBW?G4$9A+($n~AG8l_FJa)Muk5|gTJ1D?!nj~MR@e9K36giGW1gpyyEY+?OMLh_0uYBhfSb=phRrz32=@HD|nK*9OmW<6x?Z|6fj$7l_$UcICs`{{%RWkR*3o(WB2}GdteoP4&CDi z+k=nbGl9G@*BA*Y#J3eci?9U8+gg8txrnR0ZkvME(jJg-jX&6alkkBQA-F zxK-S*a(4I$AsaQ0v07XiB6^rV{T;g^rt#mz?LU^re-UKGJrWbZDyH#^f|=I#JxH`> zW^cz{Q;3T*I0SbL(EX>FnB#T_P2=l=GO=$t?Ykss``xYkUN7`rg3oAVjtS8B`x>Ty z!sQ%pWYcQsJu|{A96YGKcXiH`9PHaj`%dRooqC?prRVDb;*kBW{ryRlM*AKla(l70 z!qQ+7p1MwEEn22Xec7lX`JZW$oL^{|QP}UGL4S9V{<#j9hRsp8G71$~C7n$!_948H zn8r5;dbF}^5myG(6bB8~q1*z?dCYR8WWm1bxG{j|VPCv-*x=V!Yahp0cV*)`i0oWm z=6`7^{gu8M$rH3ve{#|(h(i-DF99xW1umpVn2Cc2L|i$*g<0H%oLS}jTIn+_h!$Tl zvaVBLtK?3iC+lFo^kGz(#(x*U5^0C%+X{V5Q`0`m*-6@(Y-V7>DqMuApL?PWrczx8<4|Ti`rIj$qkYc#;(LKKvYbL%%0M~lt}H* zSJs-JF-iVlH7V?U+^SvEIl{mH&yMxaG=6jdpF#^ypVRo^0errOwFIaQ3gGB{*0+Mg zUOu%Yw5G8mK;r5AO6Zq&DmLTqh$61@bWOp;zZG7I9 zvVL#GtQMYnrSV5#Olj53t0yC7lCq`Fc2=2F{c>ak%|oT$An@ZYKXOj;dOPo4^Cvgl zhvU&V|7tvzvnZCSfTiU1lo+08y#k&lz%!NNDHZWl0-nO|)+;PY>&^#NiS2k^rfb=b z>-u+vXPzsno8hjcl22g#pZBVEpO2K(=UzoAIqCC2vbCL_Du258#zqF6qtbYf5Bpi@ zPl3Pl{lsx;DMJjK+M@ZJ1pRvnY{h7Ek5)|rjBJ(Fgsa;4<}B&gzV5BEv+j&_{0UmOBH>Em8v_|O@Dw(MFk1!gBWf6NKn+%#T8nU|cyaZ*EJ3yTOYxiMM3E;C`iNuNlJ@8F67C%{>D&H9DAS%|wZr&R-@~qF zhNf;jr3j>+yiRsAMvNCdc)i{u zj1kES8;p^JmMf70d!^4z{tt8C0^UTKHT=HGB$=d1nqGjC21u`@<(48sMZ|VUrzyBl zzzevpPC?yCMXj!@#n0Vs5fNA~t=GbODP9Y@+K4Eikb>wUyZEK0?sAd+qW}I&C)3Lm z5hJ+ppEHxR<>Kys-?#fbf1hWXWagdsJ?FgVocEmfa?VyY284&$+EXH|#)Fnhpr#w7 zcE6NVhr6{b4M<@QYFX8V`oRpGwUtL+J}M=toM?`7B69CCIUzBoT7HPcl#q0gn5$KZ zNo~RwpazEtB<5<8J|Hor0%mMWeM*xMdlcidm-EIKv>5FmkI|L~7|)d_?t2?*bfh*h z&tX5g)&Bk^VEwBTcf_A)_hH0`yH}oA`ZiMT#x9blf8mY@b!(Kowu@cgf%}MR6Z?*i zs_TfQd~yax%F@4}=NAU|!N`U?izXGu+V^GXBhz{P3k3czbZ+OG`_Vr_jsI)T)b0(k z>ufDJqNFK{`t%X}1=<>9Yl_3RDY@xt*C4c>E_cw-)MiR+CwZeISR#1<=E+^^Y>7b^ zGBnjGl-v|;tFgATO|-U7<;xPa2BXRc86lcC7{xwKxko};C#bwk8Xk}K=ix`hxmG8k zW?LyLkGL0ll-?(3*DRg6+(%g3x#?DuRTR1yd!PEE=Lw2O3DcRBvu9!d3PStbhx~J2W z42eB3fx&ma+mwsHLc>vZ4B_VU(n?|wO`8e zahNx%zfz}tmc&23@lSXB)1iLWWS4%o+foYOvH)T~K%8~&`&>qtXlp1(yO|?!lkE|{w9wubvhw(eP?)Iz~M{FA&A$hL{vzxYFaN-`Je_uUup9Po} z^V!eBh~1SNUnip>w8!$|HgPfFdGdDLqo}Vniz~z8<(yR-V=xpr7t^ zk$mitVzsA8U*)#K+AOfnI@Eh0U+P=DS@ZF=HS2Y)hDIH~33q$uXjVc-TuY_iw_h?( zrjyg3{nVsa^%RUxy{KjK>kYi_DdpBmRxR?t*Qs-`kGB)|RiT=r?yRY@>5 zrviU<^_o>%btRs9gEw317#RPHREuv#FKVl`6(u}+9ryR5wz8~4s2}LX=d*h?ZFL$f z6HQxfG`D1JG8jxPxUlXsa6>+CG+4Wp5wUplYid$nXJeRRQC>zcT$9 zSI7=!-h(nTKwGiTYx*h$?!DR9tm>Wy`ODAKUO%L_ zEbEfvdh7dceFT4{DmNlNj^s@#L-baf@`oNasCzCgf>6(JrwoDmuRXfwii0Ek87j=F z%4dB9phTJ^sF6QpZ&Ru=x-TOx^X4W3T5hDOpHh`~daclUaUTi2yNr_WA3bySQ@HNA zg%baLXU?|WOvzLCYWqUa@5R-V$*SLLjr%E|fvr(37T}&$lE$;(AI%Ah+wK79y{h+{ zrdYZ~S9&DhuSI_j+*!Iwo`gpi(NxhXW4G;*Ghk)Ih{#mzftlzCD|QkC3Z z5+QDrT&}|$pl^soUZML~BC9`!aj{b(Bc2qXr2cVkH%88vA0)bdt3EAE@~`XBCtVj~ zZs72O@7C$%lK$567_-cJ_2cA$)vyc?F;x0uS^1^)3l&MNa@2gxE zXv(}Gt}QF20LzC7FXwm{(xKXz2v6SaIw}$BJ6@9Ac05@}a#9taq+g#S zu2)yv9XnE$M|w!;)K9hXV*T-}RnJ#ZD-<4`2W`xoQ? zy$f(0tO6asTCTzQ#7>HJKaon=B1uo01wlP1c5jCR+oxl|BUb;TP2ZSeH4H=1-5;{l}gJ?z&9i zI#ZQw(7T;Kmnq#EqGNHNh=U)=+t&kj-T}&hyl?L=1iBOhT_O*kIs1hGzAt>9-`9Xm zAGXgQC%RoH|Fj?-+MnBXZeKssO+xlt6MHw32jVS15X3Absmcp|s57_Ax&~bf`V2c| z)qZj#&+FGsRwLBn9*tC`raOEK&cFOdjX!Jst)^L=4Oq+lYAsDNS|a-;JdNcb1^gX+ z30M*?cjS!x;u}p0z7WLiIP#PG@7RQ>BfPmitaS!D%p4Pz1!n)UV4C7lVe!Hn4uI z8|n>dHDhbok}ia8Xf?hIzNG+lCe0xQxWe=wzD!Zy&+1`pp3x@hQgQXyS~S0lOrn!Z z<5B%<%1Njj@U(i*&Baht-r3o@#lYLtedjGATT~!41b2zFAo&R9%EoK}SkuDMP}3AL zKGsePb?sEF5HUAE>yFo;PAt6@+Jy2}EPsPq{;Doggn1?s<=OH?Tgm^UwlKbDs`AD* z5}FQeQXWsHFzT+Swc-=iq!7RF6>7@ssx^*9co?e+iz@*ODa-&k>qPbfD&X8bw4Kbk z1}TPnMi}pf84_p#p1SRfv29<(SYT|&Q7gQC4)k8)iM4+bV;r=Q4d1m*7s2oIw|x;=3r6L^<6v;J4N=3{d z=GZ|4YfPs)5$A#0;4Y2>D_YGJ)x73;Q1CqJM6_LcB^r-2ty6jFG4RioD&)^uBD84* zn%QqqX#+G%$3D9cMkVxxelva~QnDG3&VF?TcM=)lz+6ZQ>KAod)J9 zbqm*+#(a*D89#@TS0+lu+Odr5NSc6{!INatUsEzy%}4TWJ9RsDBw8Zl{_CjL#y10P z9B==xV`QAMlLn}wqa$ab*X7vp1@6l)NIsh2yZOj>X-F%yA!wmFTo5Es?$2tu@7fWn zljqP2pLTY#n%C6N>Xw6t^tgp&gNLyMa9O|>fn24c{JgY;k~XoX9P{_!&MNIRn5lsc zc!KpDW`9}(oQj%~X<#A&o@vyH9b!W{)1N_?@t8g1v(rq|N=_g41c9pqG(tr)Krl2< zPpYyYnNmc)pLe0?(wcE$9LFre1|R9_A{vw#H!h%ECJi7zo2I11@M`w zwEa((f1*5cVTuw9eNu%mlz@zl=wyn{m5f&CMUB|r*qVkv8w zdQdYkMTxT9=t21^5m6R_vVpd*OGr(5`UO&18X#^`uveAl_|wYH>3 zvgJ|en~DC3s_r+6tO&ln*V^b7yl${BrGg5QyQEfu36Oj7v)V5)H6t+iO$uX zqbg{&?g=&<^G_Ood$flpnZ-MK=2^CgG#VQTP}0NepRzo?zsHnheu^kZPFb2Bx`4J! z)590svkv4Lu&E>3CtW9Rqy)$J?Qk`~HPG{*KQ-L0h>zLUhANS6CfTdwTylQhg7^cP zbsCv8RI?&ows(03_+Jn%E&&(P#r5B$%e?ak0=84s4?^F3#VEI^G{@-BDNV4x)}n zyxH>B9VMbBO&5;-i1+Tzh_#Ag7-t5U$q77XjZR=gJ&21gpy3h={_kN5$C$Pc`$=+k z_@A*Q%oo@ae!vH<35QxM+E|EXdI&5x)u8>HfjmTZ10a%CAsqP4erYe!2fGRK!sPd%hx&7)=m2J6Mc~u?O#I>$wKL(7%yOtmpc| zo`98afiXBM@CfG!7gV{crbn^@8@LfL-tQAJkAx=>A3Xz}s&Nq(c%9`jBD_0(-xF|G zO{f|J^4i7k6HAA@LGmY7VX1xM(DI}yi_eEQc8euy40jqR;a8XER-L;-oT9XXzr1yk zHnuz5DayefV?`%u;pM)s#NC2fY=iG?5mn>BbS*}`scB7%5QZmh;$C4FeAbkI2G7D0 zO$CcuUP3x>Prf*R5nFB%bwY)R`?>2YNmhMbO?i^2hdT>n))~9tPU&5`yO77Q{d7Og zuJx^q6}!PB(GhWvl$4FSYspf#U=D6r!bTW?a8*xIMe`Dk1F4{nIPQ5T{6%{t1KlH; zh_J*xsszR!&2G5|;Hq4#;fHUFJ&xHl$Dxi?_hVb${{8PEEsC?~e>5=#Ol&SKTi0&O?&J&5yxp?N3J+H)K#IeGT(2LoAA9Uzv5k^-&C{|Hz z^qMngNuZ{@EkLrsHmL>*z^@g7wcJFYUwswoo0=_IFy_=%TLGdm;Q)*!u24Y$=Q##B zhPvOxJ_))(tGGcMj0*_CYH=iQ1X$d1E!;2Sbpd>WX9LZCXM8VXiqhPTcUr0gqQ)aF z)dhh&gg{mJ*onE6JbDeD*$jgZs}ETFGj!`Y(;>S*IZoSX6whJms%Hn=0%3_1Js7p> zN6xZ@SudS_vfUWpA(^WDQ7wmOI=4cdpDs9awgEnS?^fsT%8$m}4Y(dLGyDW^z|-q2 z8Ec7L6`M({@@J$}@KjT;X9=A)uWUm2bBP6i#NOTl((+B1%B8d`U@W?d{gR}rJ2K?( zvL#(r7WsGd`q(ruQ7Xh#XRSTZljlKVreORaQhZg10P*RN*=vfeWMz`t23xU9z4T zc_18bAt_9Qi|5jCA z#h{JP3T))e9fLfU5kwBVrAlj&1J0NXoI&H9!GH(#f5c(Dg|7-^_(=Yz&T)Kks0eyJ zH_8URXp2gEO7jbR9^W4LhIbrWELY6}K6$|B^j#gx@>+ZgV$4-JC0vY|5tj5h7T-u; zo21V|-TFYSHb<_`AQ@euVLU0sJ?HAqX}-(lR`hI3nXW_IOPb8%9*b1vq(t(uF9dNM z|CLx3aQN0Zr^n$sC=t(}+wB!CvVj0>(`fz@ak+1tZxTQ=KjwDm5YA};(TtG@kqgSC zQlA6wI<$6=--m0gHlE31puRS#GAM{&ie;6EDO1FF5zj;qVL7Undoxk)YLy~I^n!9a zwOmu8+yX48E7F})u4W6HHHsh3W6710pqAt-SznoerP(4jUOLgM2`KN7YM?CXbzJ|Y z$olGfh~;9?4z2xa^^LM_?``-7?l$?M7Fe}~84~4*dvUNz{7QVZGR5aV4IO6lSt z!?S!cmhUQaF&&Ke+#b~WZ#eYdqTt1P?^Kr~sP#hf|Dp#;$b0W#?pn6i#_uxGcAnKo zTEO1=QTPtfVN6!4y8B{LSflY!dUAA)vx))2KgT!kpMXC(qCvK*3;P~-$$u$w=W<>i*qC|o zGdmB~{QQUUoIil)jezG3e+SRET{<_Bc{6HB#5N;DCY6P2h{1aoE_tuHf&AXZFDSNle3+!FeZ@nkR9;bj=E`PWjI|JC7Mu@`hwkVF*<-sLWCK zJ&)_4{Ezv`{LDxtz>uQ+p^tc~!-t_1!f`leb*m^!An}%cQA<1kbH!tBt}~i7L2}x@aSJeh-gbY^xwm3|IJ}>j}Z1 z(G&&zAn;0GD5%@3_OssN4~7GOnvg%IB7a`)oAyueXHul*hxjr-u4`1i7P(7pe8>0>L z!|Zaf@j&Nvf@N_`tmhoakhcnSYA9;^#mTf)vtQf-TG+tH38Supa~lnQRJX54^an{nLd9x=d^r?q%{ zDat)kr-bL_QaVT$70CLM7&Fejlr)aO(~I#nHJ$3yIWPip|9BGMb;{frX&RcjDn-fY zqVB&QBOx+J+k4FLUxHm>UyhOt6nZ#C$?x@Ut`e#HD{(c_ER~tefN!NwJsB+C>{j_} zbT8RV<0Asfp1l`GmrvEvW%YR@twv=$kzNu^PzKkX9p&)+VU7Ok8C=mHg9I6*+M9P4Acn9CQV}+;>{06;_oL{RY)^b>)raZ-m|8;TO z4Bl}M{sK!X1%FeZ3kf{v#8t}Tke+A86$2)IF>TbZg}OzFwWxX#-+K{f9J1JwnsQE@ z<9bl2yn$wECGZ}WS?EmQ%8b(=;KZa+4+;wwRlf80o;u#acmOo;YkW$JLrLn>Qh?w= zVa+1+zRrh{9XBI{e#snB2YPk2ur8x%QHA*T+6ez$2pZnOc>sLAK=s|2!kM8LdrTHb zufu}4VyViE2C$B_JHW#PbH=yzIY{Ciw$KRmfw!*5vba}wez!O2VqCzCvp`8}KLaJf zmnAeiPQx1HiHnstomXBfiM{?L_nhj_A}20{9&yEVgsq|Of3lvsi?^tYm()SY$$z)x zMd}nTUXqPt&BjYE@huQ{Nkm7p|8aSpj5Q-oG3uO#`%r#i$1%V!I<>6EF`9lU5nmTc zR(^ow5!u8Z&nyA0UI<#m8Ep+V%PgJkVv52evlKnO#JNG%>6!&kXcYf6$WT=P&j)S* zDcd`;St#RG%~7w_x>`&MknAzg>mzt(Qr>~NqG{CQ!ljG0z}P~{O6z%U;xQB8h~2BG5ILh>z&VlS2a8E49N6a!5G;ik?fZQZ0l6US|KB5 za8C}d7U1q5_5g*{Q*;w9a!$uo%sZ6g?&SmLbhJI?Das2`Jg0;2Y5M~oYPIsd3NlvR zU5Sxb986<9@X_^v&2*kA%mbR+N39aBiDUC(9Gjo=I{=$IU4VlfHPhjsPBvN!M`bH| z9crtWWRnT?&j)}Fr(&}LuyNP^HpbMDXDyM*z7>KKu!#oi1@&&*{upV~BFQ)u3;6mw zVvK{Vch~KS>D*t|0S@bq49!0UR!5VZG{H0^4;MAxzAYs|0k#Av@Sco&nrS7Tt{@G5 ze!fZrJU?rW8Au{>4cITT7T2R0G$Kaz*n6zWr|t2sZ+%>3czb}jkAqIu0Y$tA+G9-J z<)950#Z0Xq09D2w)nzMAojgYew6TM>c0sU?W+r{RTsx zqBp-MTL>%bjT?c>a0aS@vp}yuq4qi((aw%&XY2K{S+`c08p|Zb!N;-Zd!gqe+B39N z(N2A^Y;FhIsD=(Eru#kGs44ANCTvWw#?M|^dK7n4I+TfW1=yEROD1v!TA7$BB*FJ4~7d`efOy zydgXlPsHKLy>WOpF&Chw@%X?F#VY{>sA5Rtpgg9ET-U+1E9YeCXZSn zERGrLwgUWxM|D{*I;rdj`6gqxaajj-FfyW_f!yZ=+WHf;wIKhQWu0l0OzGelsEv}k zh)%Z9dSO~D!?7W_N*LsUFmQ!i5QK|y+LCC3(sgA&?$`>HW;;Y4dltO_;J-FU`^*Td z(c7{e;GF~Xo(=TAHwye$H(SmBwiT#Nc@C&;1UxEy46cPABJiE#ALl4g+oPE5Eap_q zG0AhSM4n6U<^Pt!&eZIEy+Pma&}-CI%6)Dh%q!==dK&?8B2$b_scvvv3b_0S8eg(R>PcgIMxM(+flC&9=) zHRk*QKF9K^PgXXsV>|SKv4b>WtP$Y&B;MY#PvDbDRq~UY5# z@x%ECK_5?1XHSlRhj;}1Q(xtgxK;go_zZ|t8Dp6pou9g7GkMx?o**X40h3vw3`Wo} z$aU;wo{V>eE)&--rtSifoPuX1#XQD*YbX~tZ|fhE%!Zgt;ge*9Fw$g8Sv~)k_DcBw zWjg^$w~`7mdG>$0pndOHMQ^&_x7?ZGV|@!^S?)^k<(wtp-;4*CbgVDM_j}dS*Lpb- ztHpk^=CiE^f3qDtD!a3^6MY5ne)=MtFPtqoD3PD;X+jC zTzuBAAM^#lilyatEWbU|UhyZ_QV}6s?%NI!I>6`5c2ug~W{Ku)(iF|xq(e{HlhCrI zXU-1x#lfAeGZTHWmakVKwmSWtet@_Mdc>hD1CP8UdekV0Q2SkcVRb9v-R| zhQfcxjt?)VWbpU09j)j5uHNy=IlsjnO_yJY@0=m{cJvU>tbfpF!!OonFfteO3%kAJ z68)z9OZ)Afo3vOwwgKHVBd(ijd$w+#ee#X0R>!`Ro3g$V{j;jhn=$!Z)l-%*o`G;E z8FDOWo%%laZ9CqNh}$!5|1FKA#vM`rAHMO2V4C>fgz4U%e-%u8943Kv(D)WnZW-s9~$p34BeY#?gJALhU5m7MUjMlrj2Bvq`Qq*-z=eE*6_+(aFWa)7*&g>tase z2-smu!48WaDjwA=2x{pf5lgl$zRpbLhfT!umvFI|G3);vYZkKt7N?2Oc zfgR>hUg=JfS0;^sx0A!y$8yQuezy)i1U$Kvb4qvIQPMbzo%MUn?}ahvSo+2@U5&*4 zd*ZQwLN_+<$_OPZ(QdMyOt>b@ZQiQJtb;mCXw$#V;dzD2d2)*FUmY69pLO;)Vw%hJPH(ceM4p)p`8vQ$%5B6-2Pcw0~G5uHX;WNubWX zYMn_J)S0E0%qPr126N5pNLD=EUa+K=^}R54s4nt+;Fy-sMNK@(Aq97a?feSh*e7}9 zSx+bpxM#$n!=N=RqxQvE_re%$AUWtOU9a-4o?lls>(E61Y+l<{nyeh}P6ob2i|X1K zliZd$h4+`O44Gsz@d~+OB-4*``Z7zs5^0%z*dq5Axl?PO|#Ch7_Ff|{@m^mM)W1kj|3M@haO zBzfck(53FAQJ=dVp3I zpq0A6%Oi(%({=)_4grRTR9ejgI#GF!N-Lz<2Kc^~Gj<$`(+i+>pgdzvN6;ooi{eyS zIgyfIOc_d#?CmF}XfYp29x12{C!a?P)M_b1XhHIj5;HnKf@kCSE%Fn;n$*6Yn{aR# z|0jvuydiV7V~e~Y*?6eHi9P`%<6S255H}-alpkUq5Sl?>G$&^se2sG?a5e$XlM*-= zsW>kRGE?8>j<>7U>B9!UAx`OcWn7ojV#hfrP?C1ZP+WFz8~?w;Wx;v4>;+uD9KhwR z=ulifj^h&fCvageip$&~xXc|-N%`cVxGdRr^Ckak*-e-Kf0Nzx=nu>87vm`Tyl5y* z{=D_-$^UBET^s%TvfCm3|02743n|&<9ZHWIw)%_yeX@J2^skj&7|93t{l)@HuA4N7 zi(UCXROkKo$*x2C*UE0q5L}+{Q1a`ELveX7v~|+IuV1!z{cHQhG6a`T#!?cRFcg;= zA!XvfuU~HN`q%c$D_w)QoXV%<>+#xtJUsDP>PHL)BdzNjZV#{JH;C>5>pkjLma3OMHz4&7<<@uxZC zp^eT;u*+h7prvbuN76eCa+!|GD@+e_N#{j_uq&_iY0)6|;krk}#2=0kVQVIy+cqmL z9BAgeVUe9&YWQ|FPASM!ANmi;iZlAWnr8>&iQAPGedy)%w9`EOK*aTUl)s1VN_rm& z9R|I+7HBhd2yMzQpw05XOPlH+pv_dEjg}GBuKc-=&0Em1K|N2;I`343()VDDXbSO;I)|3Su!Nr)#8O;G zE3sn)&IoaT;3yP{{Gk40pgNwPC-N$529J9r9tRqb{8=&P_UmHIgl(Ktm??aF?m2lc z&dxf*R$dpuv++sct1sB+Y*!xWQ;sFh%-fZ<@iX(u$|A|GywKa(sm0XGil66W8=A!+ zcykjDk$m*xOwa6>47W}^>K~0*R*u*TkZ1QA-T*jKcYOrjCir8O;Ahs6{gQq-Z7{Ux zH_}bXN^|d1T_$o=GE5^L(+dFWG{YOO38s%SLUv_xFB?DehjH}m%Dx^$OETzZ658X@ z^vv2;|D6Bu9nd(@YkqQ;2%i7F9TK_vh0J{4tFp;tlz(R`7jl9(j{e2yJ4)OWEeC!v z+9+mC!gJ;GqSp+=Id49eS3~g4XBV5{-6h~#GJ1gcVJ@%zHL!TvGpXEWq!X_?a^2?N z^}Fd}@W38J5A6~QuRmq_W@~6NzsC8VGv^fT&k+m2Ps@o?%Fc2N;gLicV=6T>P@^pZ z6k1~12>6%K7Q-g}8vrvv%)k33)3e}t^=3!NSY<>7Z~jnD6e4 znpu~4Wg$Q+j1^5$)-)DdyT=F+=AW{kyh1FCGKMRJG2%;rG1OxiCHz9n<_%G^;TLfC z3XzW*j5CL{@ux57c>UokBk4RHKjTOi|61AB&|N&#dF@*=H9@;G?EouMW+FgXC{8Qc zKC4gws0>hMEXMn_Mh({Cq80e$r_M`f4MTYH=p>uZpo}ph2kPX93_yWvZAXB&m_opm z_D?*;oO}oBaf-vmqFE`zP54$So-ah}PFwv6OSIC?mu3bzXGbSUz^gKAHp@l>uBcyr zv{_~eXp+(`atY{`GNNe~QucF@aJzDC_X<8KGBJozM<#=ezb0MkyG32s!MI!&*=)l5 z#klq&UE`bS+tyE$nIl>}94H;d*$R-=*IpHva0zORa=UWZc6{Frwa@H37sB_zN*;A6 z0i#h4s4&hNfU$+c@u9?#fbr=dKA(D21RX*EQfp*t@NR;zCM%VaLFNsEu+EDH$lVw{ z6(B}0*#?-n=H%;y60?7F|kbex2e{vq=Ph1r8pA0}=2$0vviT%MgzC^^ae}jmlza>8UZ{qSgvc)>k zh|Mfo5bSC5b!bIA%#q_O>ee_Dv1myC8V5aX?tfp6Ni$E4Nn_%ZH$TkXb#$@ID=)9|#-_G+J`im_O_$H3Rkr|#95s~XBx;^UIWz1HY z+Q>9i@U+|Ke7~`0?#bUTxawrz z!v8$^#ggBj{PV12<=tojPqXbxWe*k8v$af?`vfZDdKCV;#x<*-n5YjRzs@`MKW|P} z)<7zg;QeIXi@F#3LEu8d%x^Ujb~6{z@m62S_$`7_T|U3N-?3a z+6pXiFbR#$qQqB8i3hG3Ig|{Ct2UdG@28wOdkijrwszhO6l5cBNUOP>#40C2O*@vw~KC)-Mxhr`G z#T9igN2*1@v%5pm&Kml&Fs>ZsQ)0}d4k+n&wLwW^G!a)0>$UxZdKGD~UQW{X!P=As zA;qo1&+x-=?gz??E-Zgg^3;}O%{y`A?!>*EK(f*)302yD##Xh}p>3ef+B5Lnp*}AO zlmwHN-Rdb3%nl_~;S-E%QMaWe;DKi!N(n6Rv{vHo){EYK@0`1Mei(OFr^an#+8_j) zf*?6l13Y;KM^~~AVJYI>fqKq(SOEB6iPu2X-OYvZ-OV*%*hF zdIG{1Ap_KdUZE3*&spxfFy9eoI?9b_I&x!{B{kDgaa=m4bfI)? z>S2dS$L=mITa-?Wl+l@p z{fvIu>cD5!tGF4Vy-SSzyude^!}=Y`_jFh$q#e}uY`)KpYQHh^xM+_*yA_^I9(XpR zy>iHYMw>FXkL_3YGpTzz-{(rhjtQv;-i7*wkq>jW19?iat~p~{MjHRq?`#&w2J3!Sp|6(0+GH`9H;ZmTSQy zv?+&s--oAg53H&&p;9Mv*`3iw3iblY2F*dwHcGliLA zXs_=f?o>P6CwQKDPwbIOoAORC)4vE{$(J;kvfFT`drE`dlT@%Uw8L0Q(gs#TS2ek_=l&NZOWq`YIX!h8kp#B;c?W_ zi4IZMuqd`V`CyCz>}WXOT@s<=uQ)>8SvHzF*?k+ZAxmd34Sl?bHI0NZ(UcNRS*64vET*k5g_hs+xEGXLsxVE z)j`*R<&^m`&})B;X+3g`tOqR~8Sd7tOI0@Lv}t0_WDg7t>jLi<-Q&wuVQCr64|J`DqJ)sjZZ2Ve<(}Q z>%VsDeaz(_aK;YkQN2liP`{o_<3}H)IeNL#J`s1`I^bP`meA|+8td!*4*HV3M(-%b z{2O!ms_z~zWM-Cr_pqhpyN3(EZU3z7r@Sdl++Y)qng!Q~T(JcCVkD1iyG8k{EW(V|7Pwt3Bu3el1 zT*D8}0O}e*N}!*7VH{@|f?P@(Y$zYGH%Sdh*dpVdd}pl1QO}tUc=^jfdjFz6Bc88O zUg)O0PN^U#+3EDni@t6&oHm}!2;DdOS&l_n1Ma=G7oTHEr>~wH9lq-LF8YV#ZSWl z!((r{Rck}dGu95+qfeq{8AB;GFkl7SKpH$q8IZf1`%qV@vRAqm_;i74?E0^fz5MBK|MoXy)2a(% z>|lH6wUdHv;8`;070L!KjLQT4O6g_P+xpF>U+sbK$p^3o0@6688^2+l4DKJzHx;#-N>HPC%b#kn**!2DXlUIEgF^>Pmvxu0i;NYxIujRv}s8_cWJnp?=UZl zrQbQ)_u6UG&o_3iR!pK+|30c2_0Nk=d2Mc9ZNZF{ioWzw26WSUB_3%m>)mPO%2a$?@8HBXf3z%CfcU%``X zpz#%@aJ6uSpgE!CN(xU5d<)KZkK8k$KONmTt`7RmHf7Ydgx_paqCGanE7xrSdBS;! zc@G0+e(N917i?_E4s0qcJOC7)ziE1QRYZh#->Bzq5lWOx>+{7eT*>h_>RK{swoYy) zB%8?LnwMmOEpg1wd{wS9&WpZeX2Q7kVpndC-Xa?0)x;>Tp@OhMNdFS))hX%bv(9Md zGmiIQL@Mc+cj8yVM(*Bro3b)WH_`?ir;Xj%{?N9+t;4o=AFRuq7Zprwh>m?9`le1f zRkxLFkPYm-=(A>}gPA!-(DgH> zG=4gNvi&yTPb)Qm#}74|i3c+>GmRMGnVPq$ZR~|w)&LJoiQ;GpEhMerX#>K&KW44l zA9J+s2kP6D-00jgXM4EJcc?|S=&-L}qEv3b`%XniX_TWaGG+Hmy49upH4zwJ2C!|C zABmLmb0X*C_Q*N7osfp&wj}(IG0PV#BlY|TvV}ms2Bswy_sknptw*9C?TaHTl z%vZ&);I~@@UToPT=`x`f(|$?6U`$BL)T}~-Tu(DX`bOe83KT}G@I%QFxr=uTdtyvv z1N^tPjShN&M_Z*0;x4eGnnlLjEEor}M4RF^Pl=?$ANndKz9yo^bJoFFy8z|l-kn_L zA>|?*x;FDQxz40XY8%>V1We%m)WT4ds*$6%GH1xofcn>^e z)po-T?SU7e2f!x&F>~c8>;Xd>UkE)gRwRHS(8LZjag7NU^9cP0@i0glD`@!P+@MXl zRnqj-8jMUmoZ%k>i}OCOl2;_t8M9!cZId&zVhIw_RSlU7YQo9giq} zziYWKD>AF%rs&=pHuQiCGkw@mo;;Zie-5+mtOoPjIyY$`*~L7`u`7ziv|Pqx3FG>A z`pK_MM=$kXs;=82ek6Bh#H;3s0}HB7A88fQN4rY^yC<78Xf=E$X>b+$Rt9pn(cJt9 z^+p8iX52NqnlrS!#nNgwzq*`yM})O|G)!vsk;MI7?;w@;^k~l_P`+NhPsSf@r@7|0 z2dS`0O3dpO}XkR*%*u<=;ljeY$kY6(%|eJ{z8jR=+S&mFT9^&*JKjo z%VQ3#GBv(DuAXc0<nh=Sut{}|`{53H zea0rM@>(DBTP-sij@bDAp6=&CFI4k7%xGq0LzONqLz_)$>(TPFISzUJo_N3IcYzeH z#!>Q)4<dgTMt58+d+H{f|+at;)N7BzJIq->O*q^aFEcIICqEGQ~B48{0nWo)@9&Zf%lV-=J^YGEw&aDar?7*E#sY4J-vi} zIIdi|j(!|W?AHeRcf0Xh4tdtDtmvZN^su+KkPoVnP403b-~6(xg>$rP`^Iqxx~e@& ztjhWwNq%d*{;T>vJEr3?m*qHKyW{Ko_}J9|^HU?voE6~nalqjO19Y5t=ImGSIVV%w zj~xVzZtxG|lQnOm8MUpqfvv3&H97`2FY@c&GWIj(1eaUAx&~vvNL-B-FtWqwB3G)~ zXOg-OFi~3vptug;=SichQ5*07(3f4y^wXrYbN{`t5l>o!5(bXW8VN0HWnjdR)0*6yi)(-3 z`jbSpJX@gx9(QJdJ=d40i#*^^49TOzFNyiJGipB&^ZehM@+#QS^+1JVrsbdq$MFb( zC4%`DGX1W&cDx>AK`YPn>fR!`BtmmZldHkcYZ%_&H!Lpg*wzER6ts&ddz%i&_klp) z#kI@5JtSl?Q{skxuunL1b^-ABWVn8BJacxp>&)4;dP;UBojLmoe5S$YRLjM5jX0od zm`s~8W5`MY{OU!iFO)T16Na|7nsHuV58ONYsFj~Bn$^4&Y-l!nDo8vV#0;JdRk=Vv z_2I1TsG~aGUAt7&^5m`O(!v@3k!ruVA`ZWkcf|Y1(TiS#&2NwY-rIxo<~Ai=W<-Re zq)*SYezqbz&XutqEdPLxk`FY^XZIG+@oHzHspQ80%iiDZ~53&G_l; zqq+2j;cAci{JwaPE`jk5clxkiW__uji{H&w`}w6F)Del?fL7&Hw{ak*t|{J^4c#Tj zDcg3Oc)-_-(f`;NV;tC8XRp@!!CvACwQudG?9}jKiGtlFw*yDCZjh4<%Ul?VXU5TH zIZ0jVepg+M_a#>2eYru@e~)z=(VNQmj=X0iodCM_Ka58(bMs0bugfazxq%Y7stwFZk;nqz9CrXR8! zO&}EoJPWn0djbwDd49ya$?j;?c|f zlX*?Euo1L)F7<1>%P{}Z{VuEWW;e+Jn)$O z9`xhzqkj&PfpG!+tDXc#nzl&|W4owJu-)Cq=sK+TV2_c&X&zk(HsCD+r z;Pab;GiOWS^91OX>y6qzpUtgC-seYck0a;g20RP3n)^{$|Fo^&kyPqW>SrvC{GhI9 z8j?WQk8YgLqosMU>oT=BiyAQlo%iWPDbj$e!nAR8qfPl^x3_j!ZcsD=&*Lao%5PI6 z(@e>&%%x`Ja=mye+&;ZADr^I^@>v~5>s4nX|XTc*(iXB2hTQH&lyMAw^4tw!~*<*GjS`rn>Uk*SB9UDxxwT+8uQd)4$#jf3Yypi zw9_)aUd7(wBI618x8`*?S6IrjGPP{r>W;6iyN-V!{MFaNtHPDcVE@@7Jb_H3#IP@N zr@tmnvzao<`&89>%lx+w(Rx;8GCbK5vGu20F5^)XtdAzLrCODzq6n9zpIXc>Se^sO zC==q@2V8dqF|)1dMeNz@_;ftIt-RHT8Aj>MZ`%uMQC|WMKUH(aKF5USvUj@Jerf=V z&$=pzF^bsGcz%TX-V=RH{5^b&c@E1!?P??={R>B9uGaKW9?!E{&Zz_ZjX~o&jDGIFoscYezQkxcxV|;1_D5oxg4tz%!hXD2UyJsASfcA6!@DNTQM=GgpwBF_IZ2yap6jag z;R%F|oae~2+6urgx8pK^?u%Zs8MD4J@ZAXb2`;Tv&*AjQ4P~y-D}bM)pHf@c&p&zm?B2MG0s)#c-nz2;S*;*SDYf`q3{28R@--J;OF>9@aN7@56VJ)(D)Y0f|0Nd z9?;;&uU3jQ*{uRjmTDryA{Y981b z?B*?TPiI-zd!TzVfQI9Mh6Fw%RLzwr+GpSI!~HD2j8swA?mX~H-p!k{SjD` zP32F;1U2J}yP9}xN_F(9Se5#_`8NE$B${aB7tjU+_2bNKtAy*8NlMX9Z9SNXHoiW9 z^8@*6odO*0l`#Rv{ymZ{^{b`sB`e`h>yFZ(a9d<4Qj}&jFNJ%K)*V^Z7@Mx1>ks34 zaupG7+auW>>I`QVz9&GL2H=IbuL-`lQC&Ag+-*F-L5G74kNc<+F#J_ImkxiH%oA^2 zYCQn>)Q|}nQPI_o9tl{VSy(>{9z8yT?}T*=OA#LTlKZx?6Ay;i{J$>!$u@O9MKbWz zZG^IU2o)iD|97bdv73K&Df*&`wF3V#Jaup5sW^sj;Bn2+$a|J$Y+e*K5gMiwM<4Ns z^#Ko1eD5}PoxWgr$7`oqH_5@%V`QT7w8`pOMj8)>X7lr+f4y&S$aI?h$fi6Z)dcrQ zWSuUeMaW6y{MsYws5XD*S%&u5=Td48=6XAR?98`?-)mZu;n`(Sc6wWo6_fc<09Abe zV-(=JbKSP1lI5A=WtZ?ccRd?0y;kyW`-tDi|4vGMh>57D!SZl-4%E5@T6;~?aEL8t zNuTc@)M?;}EW@0WtLg;x^NG4IZ{KIMcbZKPd=3=$c1r1~;IX8>q0VKIJd3k^#5Ivl z$w2ElbJ&ghw2N?WGItxso~GU8`f-h8KjRtmJP z2Op$3EG&Cn%&sTuG$66cDM^P-WvO69-aMRNedCrQo%?$@O@ zWp|eY_bpv&kKjqZqtFw3q*MxAnDyl?K&h0hsy&h!IE5K<_CY;Y{9uyueNX=gk~f+E z9Qx_n(CJY^XS^YSCA>Y!IlAf|Te}0>S2>J3#X4IaipieKdj`^JL^pHE%(GyRAP{H{S(N zW@S|oPqh6dk;!uhRycKX$K4AZ7;o?zpvzb7&0_+P z0O$_>aToFYB)mbKJyJc-@Am&>QKXq)6w4iRFvfU)je94muXkFN2YR3f(z2@;IYGW? zKJV}eOV)Dfq0ZQpws{I`y*B25Q72pJwUYk-{4vHf^D(#UE!m(mJ3ol?Y^kcG$g zJYC++loyt51s-B^z*aLS`CeWE9N4x&?2OHbd=YcBJ?1O$felk%!~?fUk#fC9-|nv7 zP~9vrk!I1b&f~+C)rbI?*HV=(8$_f>Bc}_IEUo8E@vLyHIwB=0xjkpTg)u$!7><9- zb_c_fZt{~{ddD2suy8|ck@tv^?M#i)88@A(|9&ah3s`GS`NGj32`sORQCCg5c4z+R zT>`;K-sRd{_ZqMb77sc94;FwbJHM%W8v1=L-)79{6mLT*{8-X`VD@|*bF`)%cp5l? z6r_hfkGWevm+Y;Jd>_ZsTYaNHj%BoVSFw@L;a7J6v{mlMlHr4o!E$uCyKZ?S;OwU) zIXrHgt$&Pukqe$((pB{!_^Y2w2KOx28&ywo`u3E__572ZJq&G-y5I}WamyS)`N_Zo z*Y~w@bK9}T?yBwmXT2GrO5PtSs1}zoPZ5u?@v5*1=$K)><2FOTpEbOBRT%2LPObhzsDE@jo#bpctbZdQE~~DRs~nq6 zqT$Vg>N{>r)MnhMdq&^*$734p*Ln=8%&t2Wj~!-Kbybq$>pt`C%iq0l zQX8``WXj%Rb0J;HiT6f-IK5(I<~L>mXQ0uy_gL#bpFW-^34vZ;rnhJSEEv5 zM811_CDc*;?GM`!=fcx@PHlfwYui0g+nntrWP!S(C&|E`lW{|MO4opIt(9=x%=a_> zQz+BVurS)cjpHWM@1sQ2zAdDzxAePY3rYc-vSCRn?-q*T-FtdRsyk(HwoQK)VHJ*EOp}H(=$vd3{_P-XqUG zK?wHG-EiUlM6%2gB>5PDK3ma|VLUA+`Imdh@$2d)0JZ+BizuTPE?k(kaN&g9g$uo7 z7cQI$zYF2_CGdMH{67D0CR~MZT?W^TQBa2~k_G=qMn=Q`;gM|kpB8b!e@A3E{I^9i z;lCx44*yM&k?^01q{4q183F$>zLr%v-c3C2o3A|a#@icBuildMImyyxlYFbv+v5qk zmsyqSp8T5;1KgkddjH?fK4v;|cHybNoqaj|%-N^l+5=ZE+?xScCR`)oGQ)Mb3FDwV z*lOg54dkw2#c-cAa$SdPV=_5trUBM~5oi7Tk=3)ox zIksa8mKu{4%;%3E%jZdC3O`m%4ia}xB*UGgd=fSBha}?ooy0hbgUopudx-mY5+OT< zv4TegS@AeS9wAG-j2FcurJ=h;q}~>Rx>v^-vNuL*G+RcE0`vdad-M3Fs2iZ80mc5F=iYPyac17{_mAHnzaM;>yPfqp&;FbxV$!Oi z6^LoKwatlgGhX+N<*h@r*szjxwh<(PYTO{+>bEekC)tJIHis%;D5-Q<{YLSIw%k}; zz#yL5(=&s}AX?jIN4cTqp}=k0h&ey1x(%Z_UG#l$k0)v+z2_Vm#CV|oub{2ja-_;) z5Ff6UcsJ-jYM?W9#H5Ln;sHjci>S0c+K}v@wK4j#L2PZ^044Lgt%KbK>Ocvv1`V24 z8^vfV&O5Y1DuZ~rm2SbcmbQ{K&>o-Tvw&Jkd9zQ$5NjohSux(U5n}5xr3F!Gm>1hPN9%`Zds}9bucH-GSbYeM3Hw$V9tq+xK@!1Cd z{9H?XGp5$YyLlUEoY=xQ!7ed~XTT0Btt)*$2$EaR&`Y2W+{!=f8^{LnWW*1_W3e-= z)Ir?u5clp;3wpMm#~pk=i*mO0d@BDENb!#$-FjXllsi6#l8E@SYdw#6k-P-7i@*!~ z2Iq_XP5g_F6u;`mY-b$b*SXz!J3q&XmcVvr+>+IfzKik17%~zp11kxZ*5S_F$^bP# z4>oIQom@LLR`RJ!`te&Fia-XmaftB9?t!dOSQa(bmq(34B|n?b>@Ia9|E6;TpM&x6 zL2Ch8IqU{!n)4;+0DiS&I?wr2SRcNRZ@?0g#R9YWWS<4@rUusYSkf{_c5r;Ja+CQ7 zq0Mr+Yx!5Nl_yr^D%Sju-m)QkLxT&E_$ed2uo1qWsK%kxK!&h+txFUcW@Kn5O9=y?(Kar~GtY z;lvYFJ(I*-UECJwYD>^BMhb6-BDEnNjnUh zRk`zUlrtXzeIyuF)$Eh}ea}e|iavqUQI2?hl>c=>Qh-?UobX(l%QyS9F?uiK@szei zp@V@jcz%>;Qs2a`0CndUqgqGqEL;Q0Y z70ILmE4U+&V%CGcOPQ^Nn^#&=G%qICM$@rf&@%H*pB~^cmH&+|g(*SuTso%Y@rwfB zVn!J(C9h>vYqE zX(W=bggld^GfpEZUFZEqtP1&>tI+ZC`KR0%S9G=+&y90M=a}n51T4epVcDM0_F9|4 z8E~Z$=xfcAzSoSphbb(#s^nM=inZ0W5xrX6@o@L6D(xq9Q6jUt28__+6-bC@%c95f1sI=y)CHE%j=+UZ`gWm zLg28(UmARv+X+3}5S{Hbh)*?d1l~hSh@g|aV~Ax2vAFpzAABddwfMw06Z4rSyvuK< zpf}CN9o%fZ6LqLLL@hz=iDvvhyBSYB!hIOf8XDNGM?c6L#g)xevRT$N)6C{tT<7&d zR8>qo1~H}iB`BxN2e4N^%Fq{Y5QjuRW7ASiSge2Q_1QYfN&@+}Hc-mJTa>DLNb8@0I4%_x|RQzRiJe zJ7V+gaZa_NNXAmLbH)V%`hR-|XTcees)&)`6ERy@UeuZ(%r~=n^G$V+10Hncqr8*H zvk~)BL0gB` zR^I*&dF7;Dd>?G(mZq+9ac+n9jNFSg(o7GhlQ!a<3{`CB8@)KJO=qq@Pl>6n^(-MX zH1ggq?%f!*FK5p(JK)Gm9lt`kU;L}6^|5DmPhz0+muz!Tw#Tm;qvNanDm)nwY?S?= zKblKcIEJ3mN32?)76fQQ{&mMP527?W~ zQInZTK>4v}x3i?E;O4;CqH(cwfmTBXq*G-G<5@1>P>X#3`!HqoA=R&m8DtT8(K*3+ zDw+|KMMvOn0)GnZ550J#?NoFm$f6_gTMTkzI`qrdp_2M{g9JZu)jWQJkBeCe2_XBG zmT;3~DvZ-1PZ`>D!S9ZLZ$D2}F?Gy<+Emf>()tA&;E zinqt|inV!6wGl9?z1SCD^b|jiFUyacM%GVdm@c=K2qZ(>&FLj?pIa}E3_tTFA-Mt} z3$I-16m>s!_JjKmzrPY&7d1c{eNAliH@1&~URx8qXhEA3n3|0&8Npt1?2#^%S4xOJqr)X`w|n5%hL$ zsDa-HQ0~JIl%C@F%>d=c7w!cZFPa}&NGC+*Pk?ei2kTc4+O3bD&cubQ9sB)uuEuEt zNQ3^`u4eTB@8w?*5>N5GMg>z@RmXHP6p5=&-HrL%!!p*n>WKgRKMBeB@k-}*u4~`Y zWo&X$JnQZKCuY!1?Mlzl5G7}P??qhq^T&o$Y|DEs(yDi+@Q|>|1Qs*RW=ap;KqDrl zX^P|0-}HJmfL#nKJX9c=#GE$>cOoCh^odz$frI8kZ5e^*chiy9(_lGk9p{z08KOcz zjHv|`^h(uk8c!z=44}SvDe$W(mrBJ%g(+JM=(U;?i7mPWqhH@LlTu4_6KDCRDX}Oq z*2mniMnFA$xkKf5l21`T9W}(S*nr$`P0KYlG{`k`3$50R543#+cp48dIRP*vVj?wV zsr)KDxksDt=imx0q?{wkPt6JoZ7C+Dg;!f22615PWpfqPBM$MJ$cE*W0x2w|%>ErV*?B z##oCj!rdf_wCcZ`e=DC6it!RFJXby1^W3Z*D#h3EDaF6Kuv$CUUsG50@YN?z%ksfk zM1f*0i)0yL10M7q=#h@LDyPhi|Je%MnPMzYmxwX~*UHa6C+RkME|yW$5FOdQ<`gx{ zlHCmhpYF8t7M_C4KLor)A>c^87uxR_7|3J~@a;Uw`7UrhPXx)rcTK?_ zUxZ$CwtUgVNp0HE+JIwkIfN%>cb}9h?ZV+sK8LYWgV@rFu~VJ6-Y<{k8ot~?0;Ppr zWAX4FxPL#qxumnfT_Cs4v=Zz00cDX&!a6JktcyMGohD>a=ao)e$M53j`oP|5 z1swq37Z=0M<`7EVuCq}=+K2i{6j@V8GR$n`qMEv=p^SY%m(RoX0VoS~Eu*xi)gVr9 zeRpBTjkq4ShBt`YTc6!$%n_Q>@*eMXk`B--jVb!eq+X|+Dd)mHP-rW%lf zT`flZqdZr!2-@Gn#D3=@Uw>o2&AF`G=I)%f>!a(8o(jF4>S@o3FOG6Q-u7FctzUlIsv4=rD!6vNG&vo(J(+!g{@y0et#jhZkuC7 zpc?RgFZA)Z{5IhD=>k{;xbrQ|bHcBQI>m)FSDfF@|7Sip&?lOaY6dpP*2w}+5AYLz z3RNVP=)_YUHsBHZyL6ym zfqf808KR2V={E~7T7f!d?qdf-7;`xoN`9!cZsI@D*1)|b1{8Ij*{3q=#3wqC-|lTT z!F_3mk|h=OnT~U_pMsWu93sU$`#7XXM$c|db6G9%o?R%+=NVaR5LY+T*bG-Zp}Dk9 zCz?BO&9njcL-gMUwD2K}Y2#lyJEycG+^}v_G<7J>V8{J6@>1t51l!e<0Q%*`7W2af z(Hu^xeRUz;rG?E8;|YBTrH4M0Vjd62G5X{LU)S7Xq*I-E--iYco{Dn8F|`!Zs#<>qtTI7M?<=#35@e-tBD6^Kh}ViXS@#e z-sStWD2;tOZ5)&P@Ic452vt3G_Rt-&Mlzi}lRt(>yv9iG^weaG4yS=FyCT5w?O3OT z^HPer(d7Ge!nJRKa*J==J(Z0v$!7nJv4pWnywyK~k?g*psZA|N2@EV*>*#wN)7~Y; zGgvRmpU%2!Kh{%wlhq7Xa}98+DxEl~9kI2XnQSu|XnUaHWSH|V)$2{>BT;j4oKq)e zw`19$9p^f)J&ecQk$*~W-)JImqQYt2AShuSnu6G;YH{z*ucr`hxgl>P}=8J|Qs zPma?Wi}yI4S^OAQ#p^_Ghrr`%CZxpeZNvhc_buwg5`H7`-&$y&Zj~oUFPzt5Y%qRbia|L%B{UdTD93$n+thy zh7QON(0=Xk+u9M|ZKWhgG6nc!EAh`iLx>apKKmT>fPY-+bbU+6WZ+9b9w+4X?%^)LZ;;bZ~x;`auJNmG$_*o)YCj$ZJ-HyBfS5obm+`xf`jqAyVvm($&%ND%&xJ2&pFxIfF278o`>LW0*pRtS1|tV4R{_QNP8ox zDZ#vm$>sdIsM$8oXXo7@-H@}O)>XVPcDmn;=W5(+N6{T!bBQHuL+`mOn!9wBPZ!D6 zD1}_$hLagcd#SD5vB?;F0gN5bzHJ&07(1EWz<&kSF!29Y83$CwhzD;uZ*ZQB-Vkf+ zVYnN^TLANOp{rBhbwZ`YfnX0 zRmThN4V;Q{0M86k?f5QuGHN5_$s*8dQV2#fUUtd4Kc?|U&G7EaKx0U4ayw21Ra;N8 z&j#T-<<|}Sq!q{IuKGc^7Ji?!7Jf#H)6l&d{#GgO5x{hdj?HL!4*IbpEU)6IG9kTb z!Y;KY{G5S~1PySI>NM`nkOoqRYf*a1Xw>~a1&FI2bTh@~RMe`({o&0`jX=F_&~9mk zYI_l+-rk||N-Kn2seZKwI80dQE#BQ2(rU)U?1nLt-JtU*1T&OT8NRPzVBiM!1phTp zMtv8s{tK(2H#M`?FPik-mZ2d=jY;7jFD{Czs&(RB?K*K&nE0RgJ4i!juz`u^yw)p-hqT*7}4_LC@p=Vw4i39nR2(;>T zC;|j<-FUL0D4R9JwA)kdv2{2zbmINBx=6B?u16o!c%WnSG0Aj1zMGDfFHPcQ&iGYJ z7gbcvLkxV=Imy`&i&!8H6QE(lz+@P?4_Z$Gejo;>kP{*G?wfrngRhDBug_-h6}>+V zPxF#n_I&#hb~k8x+aoHX@@(;;b+41S%ozSjpp2fm20FQYL$iG70lSO+3b156n-rrM zPm4q`iqn!u6k3}2rW0DN0LrnbDkeF(n8e|n6S^tpzSbU!!8%ou6oM<%j)v5);G9d~ z#4hxoV=N;%pz%&(c3y>)VsiWP*=pciCcxwGrMBfu^B}T(RV>mJV6&lZ`D_^flOzir zEx--E$kXgR@WBd@fiB>S6!_u*RmHGgZL<-+3y4_fLSF>s4FIQY z4qwm*qw9-}Zc7_}YmAy)o~YSGvZe&ooAN-D)QdN@zs~N7<|fqah7{(9fXB~TXe=?X zm%8Uj!~>5X0C@9IK}KLq$r^{{_~Tc3m&V4tOS^k{myG--;Ku4#?tXZegY*A-!O4f| zgp&)F@*j}i~+ z8)-p=S#`(_Fau0g5R08Z4C8q?%GnRYh#rO!{RGlpjfG?QX)(zCE-XXtv}6V0F9$p` zmC)S7@OwIHbpB_y5a374T=;znd*jsXZUkP_2qV`RP4*y`89|SD^KW2VpSaR#glqpZ zS31Y=6<6VGTnuNYb>pm50^nC~+#MVG-{UR`_u#HjqTEEc6n$UY+A391%P0N+eU7r%Nt68=+Hq_Ad z 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