diff --git a/modules/ace_adapter/ace_adapter.cpp b/modules/ace_adapter/ace_adapter.cpp index 9ad701a107d43b229da12763f4d08e3b25fc4e5d..e28bb3fd0b1b2e897aa8a2e8ada666cb4fe28f34 100644 --- a/modules/ace_adapter/ace_adapter.cpp +++ b/modules/ace_adapter/ace_adapter.cpp @@ -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_STS_VALUE = true; static const std::string PRELOAD_JSON_CONFIG("/appspawn_preload.json"); static const std::string PRELOAD_STS_JSON_CONFIG("/appspawn_preload_sts.json"); @@ -95,32 +96,40 @@ static void PreloadModule(void) return; } + bool preloadSts = OHOS::system::GetBoolParameter("persist.appspawn.preloadsts", DEFAULT_PRELOAD_STS_VALUE); OHOS::AbilityRuntime::Runtime::Options stsOptions; stsOptions.lang = OHOS::AbilityRuntime::Runtime::Language::STS; stsOptions.loadAce = true; stsOptions.preload = true; - auto stsRuntime = OHOS::AbilityRuntime::Runtime::Create(stsOptions); - if (!stsRuntime) { - APPSPAWN_LOGE("LoadExtendLib: Failed to create STS runtime"); - return; + std::unique_ptr stsRuntime; + if (preloadSts) { + stsRuntime = OHOS::AbilityRuntime::Runtime::Create(stsOptions); + if (!stsRuntime) { + APPSPAWN_LOGE("LoadExtendLib: Failed to create STS runtime"); + return; + } } - ParseJsonContext jscontext = {{}, "napi"}; - (void)ParseJsonConfig("etc/appspawn", PRELOAD_JSON_CONFIG.c_str(), GetNameSet, &jscontext); - for (std::string moduleName : jscontext.names) { + ParseJsonContext jsContext = {{}, "napi"}; + (void)ParseJsonConfig("etc/appspawn", PRELOAD_JSON_CONFIG.c_str(), GetNameSet, &jsContext); + for (std::string moduleName : jsContext.names) { APPSPAWN_LOGI("moduleName %{public}s", moduleName.c_str()); jsRuntime->PreloadSystemModule(moduleName); } - ParseJsonContext stscontext = {{}, "class"}; - (void)ParseJsonConfig("etc/appspawn", PRELOAD_STS_JSON_CONFIG.c_str(), GetNameSet, &stscontext); - for (std::string className : stscontext.names) { - APPSPAWN_LOGI("className %{public}s", className.c_str()); - stsRuntime->PreloadClass(className.c_str()); + if (preloadSts) { + ParseJsonContext stsContext = {{}, "class"}; + (void)ParseJsonConfig("etc/appspawn", PRELOAD_STS_JSON_CONFIG.c_str(), GetNameSet, &stsContext); + for (std::string className : stsContext.names) { + APPSPAWN_LOGI("className %{public}s", className.c_str()); + stsRuntime->PreloadClass(className.c_str()); + } } OHOS::AbilityRuntime::Runtime::SavePreloaded(std::move(jsRuntime), jsOptions.lang); - OHOS::AbilityRuntime::Runtime::SavePreloaded(std::move(stsRuntime), stsOptions.lang); + if (preloadSts) { + OHOS::AbilityRuntime::Runtime::SavePreloaded(std::move(stsRuntime), stsOptions.lang); + } } static void LoadExtendLib(void) @@ -150,7 +159,7 @@ static void LoadExtendLib(void) 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"; @@ -166,7 +175,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."); @@ -179,7 +188,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); @@ -225,7 +234,7 @@ APPSPAWN_STATIC int BuildFdInfoMap(const AppSpawnMsgNode *message, std::map #endif +static uint32_t g_preloadParamResult = 0; +static uint32_t g_preloadStsParamResult = 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.preloadsts") == 0) { + flag ? (g_preloadStsParamResult = true) : (g_preloadStsParamResult = 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.preloadsts") == 0) { + return g_preloadStsParamResult ? true : false; + } return def; } } // namespace system diff --git a/test/mock/app_spawn_stub.h b/test/mock/app_spawn_stub.h index 17982d517b2528544721ff8e6fabbe563fc71a2f..1b2df0cee2a28d515438faf64e9dcfc7a13ba2ed 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 @@ -114,6 +117,7 @@ void RunAppSandbox(const char *ptyName); HOOK_MGR *GetAppSpawnHookMgr(void); int SpawnKickDogStart(AppSpawnMgr *mgrContent); int AddPermissionToEncaps(cJSON *extInfoJson, cJSON *encaps, uint32_t *permissionCount); + #define STUB_NEED_CHECK 0x01 typedef int (*ExecvFunc)(const char *pathname, char *const argv[]); enum { @@ -129,9 +133,8 @@ typedef struct { void *arg; } StubNode; 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/unittest/app_spawn_standard_test/BUILD.gn b/test/unittest/app_spawn_standard_test/BUILD.gn index 7a06607118a33ef289d08cf7de5c4e421c64dea0..31800acecd181561a95dda3bde99632c56cfbc78 100644 --- a/test/unittest/app_spawn_standard_test/BUILD.gn +++ b/test/unittest/app_spawn_standard_test/BUILD.gn @@ -128,6 +128,7 @@ ohos_unittest("AppSpawn_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_appmgr_test.cpp", "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_beget_test.cpp", "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_cgroup_test.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..0177051b99ed046e12cfafb7729872d147804d84 --- /dev/null +++ b/test/unittest/app_spawn_standard_test/app_spawn_ace_test.cpp @@ -0,0 +1,161 @@ +/* + * 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() {} +}; + +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); +} + +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); +} + +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); +} + +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("presist.appspwn.preload", true); + int ret = PreLoadAppSpawn(mgr); + SetBoolParamResult("presist.appspwn.preload", false); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +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("presist.appspwn.preload", true); + SetBoolParamResult("presist.appspwn.preloadsts", true); + int ret = PreLoadAppSpawn(mgr); + SetBoolParamResult("presist.appspwn.preload", false); + SetBoolParamResult("presist.appspwn.preloadsts", false); + DeleteAppSpawnMgr(mgr); + EXPECT_EQ(ret, 0); +} + +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); +} + +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); +} + +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); +} + +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 3b53cc29e65b63333c07f598154fb84739d587de..ac58e163ba52f16a1b935ef4a8ba7528ffb44b7a 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);