1 /* 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <cerrno> 17 #include <cstring> 18 #include <gtest/gtest.h> 19 #include <cJSON.h> 20 21 #include "appspawn.h" 22 #include "appspawn_hook.h" 23 #include "appspawn_manager.h" 24 #include "app_spawn_stub.h" 25 #include "app_spawn_test_helper.h" 26 27 using namespace testing; 28 using namespace testing::ext; 29 using namespace OHOS; 30 31 APPSPAWN_STATIC int RunChildThread(const AppSpawnMgr *content, const AppSpawningCtx *property); 32 APPSPAWN_STATIC int RunChildByRenderCmd(const AppSpawnMgr *content, const AppSpawningCtx *property); 33 APPSPAWN_STATIC int PreLoadAppSpawn(AppSpawnMgr *content); 34 APPSPAWN_STATIC int DlopenAppSpawn(AppSpawnMgr *content); 35 36 namespace OHOS { 37 static AppSpawnTestHelper g_testHelper; 38 class AppSpawnAceTest : public testing::Test { 39 public: SetUpTestCase()40 static void SetUpTestCase() {} TearDownTestCase()41 static void TearDownTestCase() {} SetUp()42 void SetUp() {} TearDown()43 void TearDown() {} 44 }; 45 46 /** 47 * @brief nwebspawn进行预加载 48 * @note 预期结果: nwebspawn不支持预加载,直接返回 49 * 50 */ 51 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_001, TestSize.Level0) 52 { 53 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); 54 ASSERT_NE(mgr, nullptr); 55 mgr->content.longProcName = const_cast<char *>(NWEBSPAWN_SERVER_NAME); 56 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 57 58 int ret = PreLoadAppSpawn(mgr); 59 DeleteAppSpawnMgr(mgr); 60 EXPECT_EQ(ret, 0); 61 } 62 63 /** 64 * @brief cjappspawn进行预加载 65 * @note 预期结果: cjappspawn通过processName校验,执行LoadExtendCJLib预加载 66 * 67 */ 68 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_002, TestSize.Level0) 69 { 70 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_CJAPP_SPAWN); 71 ASSERT_NE(mgr, nullptr); 72 mgr->content.longProcName = const_cast<char *>(CJAPPSPAWN_SERVER_NAME); 73 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 74 75 int ret = PreLoadAppSpawn(mgr); 76 DeleteAppSpawnMgr(mgr); 77 EXPECT_EQ(ret, 0); 78 } 79 80 /** 81 * @brief 未设置preload参数时(使用参数默认值),appspawn进行预加载 82 * @note 预期结果: appspawn根据参数默认值判断是否执行preload预加载 83 * 84 */ 85 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_003, TestSize.Level0) 86 { 87 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); 88 ASSERT_NE(mgr, nullptr); 89 mgr->content.longProcName = const_cast<char *>(APPSPAWN_SERVER_NAME); 90 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 91 92 int ret = PreLoadAppSpawn(mgr); 93 DeleteAppSpawnMgr(mgr); 94 EXPECT_EQ(ret, 0); 95 } 96 97 /** 98 * @brief preload参数设置为true时,测试appspawn进行预加载 99 * @note 预期结果: appspawn执行preload预加载 100 * 101 */ 102 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_004, TestSize.Level0) 103 { 104 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); 105 ASSERT_NE(mgr, nullptr); 106 mgr->content.longProcName = const_cast<char *>(APPSPAWN_SERVER_NAME); 107 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 108 109 SetBoolParamResult("persist.appspawn.preload", true); 110 int ret = PreLoadAppSpawn(mgr); 111 SetBoolParamResult("persist.appspawn.preload", false); 112 DeleteAppSpawnMgr(mgr); 113 EXPECT_EQ(ret, 0); 114 } 115 116 /** 117 * @brief preload参数和preloadets参数均设置为true时,测试appspawn进行预加载 118 * @note 预期结果: appspawn执行preload和preloadets预加载 119 * 120 */ 121 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_005, TestSize.Level0) 122 { 123 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); 124 ASSERT_NE(mgr, nullptr); 125 mgr->content.longProcName = const_cast<char *>(APPSPAWN_SERVER_NAME); 126 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 127 128 SetBoolParamResult("persist.appspawn.preload", true); 129 SetBoolParamResult("persist.appspawn.preloadets", true); 130 int ret = PreLoadAppSpawn(mgr); 131 SetBoolParamResult("persist.appspawn.preload", false); 132 SetBoolParamResult("persist.appspawn.preloadets", false); 133 DeleteAppSpawnMgr(mgr); 134 EXPECT_EQ(ret, 0); 135 } 136 137 /** 138 * @brief 未设置preload参数时(使用参数默认值),hybridspawn进行预加载 139 * @note 预期结果: appspawn根据参数默认值判断是否执行preload预加载 140 * 141 */ 142 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_006, TestSize.Level0) 143 { 144 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_HYBRID_SPAWN); 145 ASSERT_NE(mgr, nullptr); 146 mgr->content.longProcName = const_cast<char *>(HYBRIDSPAWN_SERVER_NAME); 147 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 148 149 int ret = PreLoadAppSpawn(mgr); 150 DeleteAppSpawnMgr(mgr); 151 EXPECT_EQ(ret, 0); 152 } 153 154 /** 155 * @brief preload参数设置为true时,测试hybridspawn进行预加载 156 * @note 预期结果: appspawn执行preload预加载 157 * 158 */ 159 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_007, TestSize.Level0) 160 { 161 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_HYBRID_SPAWN); 162 ASSERT_NE(mgr, nullptr); 163 mgr->content.longProcName = const_cast<char *>(HYBRIDSPAWN_SERVER_NAME); 164 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 165 166 SetBoolParamResult("persist.appspawn.preload", true); 167 int ret = PreLoadAppSpawn(mgr); 168 SetBoolParamResult("persist.appspawn.preload", false); 169 DeleteAppSpawnMgr(mgr); 170 EXPECT_EQ(ret, 0); 171 } 172 173 /** 174 * @brief preload参数和preloadets参数均设置为true时,测试hybridspawn进行预加载 175 * @note 预期结果: appspawn执行preload和preloadets预加载 176 * 177 */ 178 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Preload_008, TestSize.Level0) 179 { 180 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_HYBRID_SPAWN); 181 ASSERT_NE(mgr, nullptr); 182 mgr->content.longProcName = const_cast<char *>(HYBRIDSPAWN_SERVER_NAME); 183 mgr->content.longProcNameLen = APP_LEN_PROC_NAME; 184 185 SetBoolParamResult("persist.appspawn.preload", true); 186 SetBoolParamResult("persist.appspawn.preloadets", true); 187 int ret = PreLoadAppSpawn(mgr); 188 SetBoolParamResult("persist.appspawn.preload", false); 189 SetBoolParamResult("persist.appspawn.preloadets", false); 190 DeleteAppSpawnMgr(mgr); 191 EXPECT_EQ(ret, 0); 192 } 193 194 /** 195 * @brief nwebspawn进行加载system libs 196 * @note 预期结果: nwebspawn不支持加载system libs,直接返回 197 * 198 */ 199 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Dlopen_001, TestSize.Level0) 200 { 201 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN); 202 ASSERT_NE(mgr, nullptr); 203 204 int ret = DlopenAppSpawn(mgr); 205 DeleteAppSpawnMgr(mgr); 206 EXPECT_EQ(ret, 0); 207 } 208 209 /** 210 * @brief appspawn进行加载system libs 211 * @note 预期结果: appspawn加载system libs正常 212 * 213 */ 214 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_Dlopen_002, TestSize.Level0) 215 { 216 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); 217 ASSERT_NE(mgr, nullptr); 218 219 int ret = DlopenAppSpawn(mgr); 220 DeleteAppSpawnMgr(mgr); 221 EXPECT_EQ(ret, 0); 222 } 223 224 /** 225 * @brief appspawn执行RunChildThread 226 * @note 预期结果: 执行正常,分支覆盖 227 * 228 */ 229 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_RunChild_001, TestSize.Level0) 230 { 231 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); 232 ASSERT_NE(mgr, nullptr); 233 AppSpawningCtx *property = CreateAppSpawningCtx(); 234 ASSERT_NE(property, nullptr); 235 property->message = CreateAppSpawnMsg(); 236 ASSERT_NE(property->message, nullptr); 237 238 int ret = RunChildThread(mgr, property); 239 DeleteAppSpawningCtx(property); 240 DeleteAppSpawnMgr(mgr); 241 EXPECT_EQ(ret, 0); 242 } 243 244 /** 245 * @brief appspawn执行RunChildByRenderCmd 246 * @note 预期结果: 执行正常,分支覆盖 247 * 248 */ 249 HWTEST_F(AppSpawnAceTest, App_Spawn_Ace_RunChild_002, TestSize.Level0) 250 { 251 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_APP_SPAWN); 252 ASSERT_NE(mgr, nullptr); 253 AppSpawningCtx *property = CreateAppSpawningCtx(); 254 ASSERT_NE(property, nullptr); 255 property->message = CreateAppSpawnMsg(); 256 ASSERT_NE(property->message, nullptr); 257 258 int ret = RunChildByRenderCmd(mgr, property); 259 DeleteAppSpawningCtx(property); 260 DeleteAppSpawnMgr(mgr); 261 EXPECT_EQ(ret, -1); 262 } 263 } // namespace OHOS 264