diff --git a/modules/ace_adapter/ace_adapter.cpp b/modules/ace_adapter/ace_adapter.cpp index 37da3a22e9b2e6340837e24f64e2999ff8d9286b..1b00fe42a0d013d1913e92d26b1c167b6d9ec1f3 100644 --- a/modules/ace_adapter/ace_adapter.cpp +++ b/modules/ace_adapter/ace_adapter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 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 @@ -49,6 +49,7 @@ static const bool DEFAULT_PRELOAD_VALUE = false; #else static const bool DEFAULT_PRELOAD_VALUE = true; #endif +static const bool DEFAULT_PRELOAD_ETS_VALUE = false; static const std::string PRELOAD_JSON_CONFIG("/appspawn_preload.json"); typedef struct TagParseJsonContext { @@ -84,11 +85,17 @@ static int GetModuleSet(const cJSON *root, ParseJsonContext *context) static void PreloadModule(void) { + bool preloadEts = OHOS::system::GetBoolParameter("persist.appspawn.preloadets", DEFAULT_PRELOAD_ETS_VALUE); + APPSPAWN_LOGI("LoadExtendLib: preloadets param value is %{public}s", preloadEts ? "true" : "false"); + OHOS::AbilityRuntime::Runtime::Options options; - options.lang = OHOS::AbilityRuntime::Runtime::Language::JS; options.loadAce = true; options.preload = true; - + if (preloadEts) { + options.lang = OHOS::AbilityRuntime::Runtime::Language::ETS; + } else { + options.lang = OHOS::AbilityRuntime::Runtime::Language::JS; + } auto runtime = OHOS::AbilityRuntime::Runtime::Create(options); if (!runtime) { APPSPAWN_LOGE("LoadExtendLib: Failed to create runtime"); @@ -108,7 +115,7 @@ static void PreloadModule(void) static void LoadExtendLib(void) { const char *acelibdir = OHOS::Ace::AceForwardCompatibility::GetAceLibName(); - APPSPAWN_LOGI("LoadExtendLib: Start calling dlopen acelibdir."); + APPSPAWN_LOGI("LoadExtendLib: Start calling dlopen acelibdir"); void *aceAbilityLib = dlopen(acelibdir, RTLD_NOW | RTLD_LOCAL); APPSPAWN_CHECK(aceAbilityLib != nullptr, return, "Fail to dlopen %{public}s, [%{public}s]", acelibdir, dlerror()); APPSPAWN_LOGI("LoadExtendLib: Success to dlopen %{public}s", acelibdir); @@ -116,22 +123,23 @@ static void LoadExtendLib(void) OHOS::AppExecFwk::MainThread::PreloadExtensionPlugin(); bool preload = OHOS::system::GetBoolParameter("persist.appspawn.preload", DEFAULT_PRELOAD_VALUE); if (!preload) { - APPSPAWN_LOGI("LoadExtendLib: Do not preload JS VM"); + APPSPAWN_LOGI("LoadExtendLib: Do not preload VM"); return; } - APPSPAWN_LOGI("LoadExtendLib: Start preload JS VM"); + APPSPAWN_LOGI("LoadExtendLib: Start preload VM"); SetTraceDisabled(true); PreloadModule(); SetTraceDisabled(false); + APPSPAWN_LOGI("LoadExtendLib: Start reclaim file cache"); OHOS::Ace::AceForwardCompatibility::ReclaimFileCache(getpid()); Resource::ResourceManager *systemResMgr = Resource::GetSystemResourceManagerNoSandBox(); APPSPAWN_CHECK(systemResMgr != nullptr, return, "Fail to get system resource manager"); - APPSPAWN_LOGI("LoadExtendLib: End preload JS VM"); + APPSPAWN_LOGI("LoadExtendLib: End preload VM"); } -APPSPAWN_STATIC void PreloadCJLibs(void) +static void PreloadCJLibs(void) { const char* cjEnvLibName = "libcj_environment.z.so"; const char* cjEnvInitName = "OHOS_InitSpawnEnv"; @@ -147,7 +155,7 @@ APPSPAWN_STATIC void PreloadCJLibs(void) initSpawnEnv(); } -APPSPAWN_STATIC void LoadExtendCJLib(void) +static void LoadExtendCJLib(void) { const char *acelibdir = OHOS::Ace::AceForwardCompatibility::GetAceLibName(); APPSPAWN_LOGI("LoadExtendLib: Start calling dlopen acelibdir."); @@ -160,7 +168,7 @@ APPSPAWN_STATIC void LoadExtendCJLib(void) PreloadCJLibs(); } -APPSPAWN_STATIC int BuildFdInfoMap(const AppSpawnMsgNode *message, std::map &fdMap, int isColdRun) +static int BuildFdInfoMap(const AppSpawnMsgNode *message, std::map &fdMap, int isColdRun) { APPSPAWN_CHECK_ONLY_EXPER(message != NULL && message->buffer != NULL, return -1); APPSPAWN_CHECK_ONLY_EXPER(message->tlvOffset != NULL, return -1); @@ -206,7 +214,7 @@ APPSPAWN_STATIC int BuildFdInfoMap(const AppSpawnMsgNode *message, std::map #endif +static uint32_t g_preloadParamResult = 0; +static uint32_t g_preloadEtsParamResult = 0; +void SetBoolParamResult(const char *key, bool flag) +{ + if (strcmp(key, "persist.appspawn.preload") == 0) { + flag ? (g_preloadParamResult = true) : (g_preloadParamResult = false); + } + if (strcmp(key, "persist.appspawn.preloadets") == 0) { + flag ? (g_preloadEtsParamResult = true) : (g_preloadEtsParamResult = false); + } +} + namespace OHOS { namespace system { bool GetIntParameter(const std::string &key, bool def, bool arg1 = false, bool arg2 = false) @@ -58,6 +70,12 @@ namespace system { bool GetBoolParameter(const std::string &key, bool def) { + if (strcmp(key.c_str(), "persist.appspawn.preload") == 0) { + return g_preloadParamResult ? true : false; + } + if (strcmp(key.c_str(), "persist.appspawn.preloadets") == 0) { + return g_preloadEtsParamResult ? true : false; + } return def; } } // namespace system diff --git a/test/mock/app_spawn_stub.h b/test/mock/app_spawn_stub.h index 1e70b90f29d36121d38476ba751fcc8e5e53c4c4..dd0e63600ed53dc75b0df105b980a23362ffce53 100644 --- a/test/mock/app_spawn_stub.h +++ b/test/mock/app_spawn_stub.h @@ -27,6 +27,9 @@ #include "appspawn_client.h" #include "appspawn_hook.h" +void SetBoolParamResult(const char *key, bool flag); +int SetSelinuxConNweb(const AppSpawnMgr *content, const AppSpawningCtx *property); + #ifdef __cplusplus extern "C" { #endif @@ -139,6 +142,5 @@ StubNode *GetStubNode(int type); #ifdef __cplusplus } #endif -int SetSelinuxConNweb(const AppSpawnMgr *content, const AppSpawningCtx *property); -void InitAppCommonEnv(const AppSpawningCtx *property); + #endif // APPSPAWN_TEST_STUB_H diff --git a/test/mock/js_runtime.h b/test/mock/js_runtime.h index 3870ea6ffed124ec70f4a9efbfcbc2129da70a10..4e05753fdc702c4c35825411f845965c820aa41d 100644 --- a/test/mock/js_runtime.h +++ b/test/mock/js_runtime.h @@ -27,6 +27,7 @@ namespace AbilityRuntime { public: enum class Language { JS = 0, + ETS = 1, }; struct Options { diff --git a/test/unittest/app_spawn_standard_test/BUILD.gn b/test/unittest/app_spawn_standard_test/BUILD.gn index 15a882f557c5fe69357c92810960bc5c6f254180..bce88a53fd4d3897075aafb53ae4fcfeccab5b4a 100644 --- a/test/unittest/app_spawn_standard_test/BUILD.gn +++ b/test/unittest/app_spawn_standard_test/BUILD.gn @@ -525,6 +525,7 @@ ohos_unittest("AppSpawn_common_ut") { # add test include_dirs += [ "${appspawn_path}/test/unittest" ] sources += [ + "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_ace_test.cpp", "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp", "${appspawn_path}/test/unittest/app_spawn_test_helper.cpp", ] diff --git a/test/unittest/app_spawn_standard_test/app_spawn_ace_test.cpp b/test/unittest/app_spawn_standard_test/app_spawn_ace_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3516d98a634071b6bc08266666aa1af728ac7bdb --- /dev/null +++ b/test/unittest/app_spawn_standard_test/app_spawn_ace_test.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2025 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 "appspawn.h" +#include "appspawn_hook.h" +#include "appspawn_manager.h" +#include "app_spawn_stub.h" +#include "app_spawn_test_helper.h" + +using namespace testing; +using namespace testing::ext; +using namespace OHOS; + +APPSPAWN_STATIC int RunChildThread(const AppSpawnMgr *content, const AppSpawningCtx *property); +APPSPAWN_STATIC int RunChildByRenderCmd(const AppSpawnMgr *content, const AppSpawningCtx *property); +APPSPAWN_STATIC int PreLoadAppSpawn(AppSpawnMgr *content); +APPSPAWN_STATIC int DlopenAppSpawn(AppSpawnMgr *content); + +namespace OHOS { +static AppSpawnTestHelper g_testHelper; +class AppSpawnAceTest : public testing::Test { +public: + static void SetUpTestCase() {} + static void TearDownTestCase() {} + void SetUp() {} + void TearDown() {} +}; + +/** + * @brief nwebspawn进行预加载 + * @note 预期结果: nwebspawn不支持预加载,直接返回 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_001, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); + ASSERT_NE(mgr, nullptr); + mgr->content.longProcName = const_cast(NWEBSPAWN_SERVER_NAME); + mgr->content.longProcNameLen = APP_LEN_PROC_NAME; + + int ret = PreLoadAppSpawn(mgr); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief cjappspawn进行预加载 + * @note 预期结果: cjappspawn通过processName校验,执行LoadExtendCJLib预加载 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_002, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_CJAPP_SPAWN); + ASSERT_NE(mgr, nullptr); + mgr->content.longProcName = const_cast(CJAPPSPAWN_SERVER_NAME); + mgr->content.longProcNameLen = APP_LEN_PROC_NAME; + + int ret = PreLoadAppSpawn(mgr); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief 未设置preload参数时(使用参数默认值),appspawn进行预加载 + * @note 预期结果: appspawn根据参数默认值判断是否执行preload预加载 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_003, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); + ASSERT_NE(mgr, nullptr); + mgr->content.longProcName = const_cast(APPSPAWN_SERVER_NAME); + mgr->content.longProcNameLen = APP_LEN_PROC_NAME; + + int ret = PreLoadAppSpawn(mgr); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief preload参数设置为true时,测试appspawn进行预加载 + * @note 预期结果: appspawn执行preload预加载 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_004, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); + ASSERT_NE(mgr, nullptr); + mgr->content.longProcName = const_cast(APPSPAWN_SERVER_NAME); + mgr->content.longProcNameLen = APP_LEN_PROC_NAME; + + SetBoolParamResult("persist.appspawn.preload", true); + int ret = PreLoadAppSpawn(mgr); + SetBoolParamResult("persist.appspawn.preload", false); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief preload参数和preloadets参数均设置为true时,测试appspawn进行预加载 + * @note 预期结果: appspawn执行preload和preloadets预加载 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_005, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); + ASSERT_NE(mgr, nullptr); + mgr->content.longProcName = const_cast(APPSPAWN_SERVER_NAME); + mgr->content.longProcNameLen = APP_LEN_PROC_NAME; + + SetBoolParamResult("persist.appspawn.preload", true); + SetBoolParamResult("persist.appspawn.preloadets", true); + int ret = PreLoadAppSpawn(mgr); + SetBoolParamResult("persist.appspawn.preload", false); + SetBoolParamResult("persist.appspawn.preloadets", false); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief nwebspawn进行加载system libs + * @note 预期结果: nwebspawn不支持加载system libs,直接返回 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Dlopen_001, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); + ASSERT_NE(mgr, nullptr); + + int ret = DlopenAppSpawn(mgr); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief appspawn进行加载system libs + * @note 预期结果: appspawn加载system libs正常 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Dlopen_002, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); + ASSERT_NE(mgr, nullptr); + + int ret = DlopenAppSpawn(mgr); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief appspawn执行RunChildThread + * @note 预期结果: 执行正常,分支覆盖 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_RunChild_001, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); + ASSERT_NE(mgr, nullptr); + AppSpawningCtx *property = CreateAppSpawningCtx(); + ASSERT_NE(property, nullptr); + property->message = CreateAppSpawnMsg(); + ASSERT_NE(property->message, nullptr); + + int ret = RunChildThread(mgr, property); + DeleteAppSpawningCtx(property); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +/** + * @brief appspawn执行RunChildByRenderCmd + * @note 预期结果: 执行正常,分支覆盖 + * + */ +HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_RunChild_002, TestSize.Level0) +{ + AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); + ASSERT_NE(mgr, nullptr); + AppSpawningCtx *property = CreateAppSpawningCtx(); + ASSERT_NE(property, nullptr); + property->message = CreateAppSpawnMsg(); + ASSERT_NE(property->message, nullptr); + + int ret = RunChildByRenderCmd(mgr, property); + DeleteAppSpawningCtx(property); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, -1); +} +} // namespace OHOS diff --git a/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp b/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp index c0e73013a74a2a7b3112df468e14a5bc828555fe..5e7841099e51e1177599fb2b893c90f5210d842e 100644 --- a/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp +++ b/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp @@ -40,11 +40,6 @@ using namespace testing; using namespace testing::ext; using namespace OHOS; -APPSPAWN_STATIC int BuildFdInfoMap(const AppSpawnMsgNode *message, std::map &fdMap, int isColdRun); -APPSPAWN_STATIC void LoadExtendCJLib(void); -APPSPAWN_STATIC int PreLoadAppSpawn(AppSpawnMgr *content); -APPSPAWN_STATIC int RunChildByRenderCmd(const AppSpawnMgr *content, const AppSpawningCtx *property); - namespace OHOS { static AppSpawnTestHelper g_testHelper; class AppSpawnCommonTest : public testing::Test { @@ -390,60 +385,6 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Common_016, TestSize.Level0) AppSpawnHiSysEventWrite(); } -HWTEST_F(AppSpawnCommonTest, App_Spawn_Common_017, TestSize.Level0) -{ - AppSpawnMgr *content = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); - EXPECT_EQ(content != nullptr, 1); - int ret = -1; - do { - LoadExtendCJLib(); - } while (0); - DeleteAppSpawnMgr(content); - ASSERT_EQ(ret, -1); -} - -HWTEST_F(AppSpawnCommonTest, App_Spawn_Common_018, TestSize.Level0) -{ - AppSpawnMgr *content = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); - EXPECT_EQ(content != nullptr, 1); - int ret = -1; - do { - // spawn - ret = PreLoadAppSpawn(content); - } while (0); - DeleteAppSpawnMgr(content); - ASSERT_EQ(ret, 0); -} - -HWTEST_F(AppSpawnCommonTest, App_Spawn_Common_019, TestSize.Level0) -{ - AppSpawnMgr *content = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); - EXPECT_EQ(content != nullptr, 1); - int ret = -1; - do { - RunChildByRenderCmd(nullptr, nullptr); - } while (0); - DeleteAppSpawnMgr(content); - ASSERT_EQ(ret, -1); -} - -HWTEST_F(AppSpawnCommonTest, App_Spawn_Common_020, TestSize.Level0) -{ - AppSpawnMgr *content = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); - EXPECT_EQ(content != nullptr, 1); - int ret = -1; - do { - // spawn - AppSpawnMsgNode *msgNode = CreateAppSpawnMsg(); - EXPECT_EQ(msgNode != nullptr, 1); - std::map fdMap; - ret = BuildFdInfoMap(msgNode, fdMap, 0); - } while (0); - DeleteAppSpawnMgr(content); - ASSERT_EQ(ret, -1); -} - - HWTEST_F(AppSpawnCommonTest, App_Spawn_Common_021, TestSize.Level0) { int ret = SetInternetPermission(nullptr);