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 <cstdint> 17 #include <fstream> 18 #include <gtest/gtest.h> 19 #include <string> 20 #include <vector> 21 22 #include "aot_args_handler.h" 23 #include "aot_compiler_constants.h" 24 #include "aot_compiler_error_utils.h" 25 #include "iservice_registry.h" 26 #include "system_ability_definition.h" 27 28 using namespace testing::ext; 29 30 namespace OHOS::ArkCompiler { 31 32 class AotArgsHandlerTest : public testing::Test { 33 public: AotArgsHandlerTest()34 AotArgsHandlerTest() {} ~AotArgsHandlerTest()35 virtual ~AotArgsHandlerTest() {} 36 SetUpTestCase()37 static void SetUpTestCase() {} TearDownTestCase()38 static void TearDownTestCase() {} SetUp()39 void SetUp() override {} TearDown()40 void TearDown() override {}; 41 }; 42 43 /** 44 * @tc.name: AotArgsHandlerTest_001 45 * @tc.desc: AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID) 46 * @tc.type: Func 47 */ 48 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_001, TestSize.Level0) 49 { 50 std::unordered_map<std::string, std::string> argsMap; 51 std::string keyName = "compiler-pkg-info"; 52 int32_t bundleID = 0; 53 int32_t ret = AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID); 54 EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); 55 } 56 57 /** 58 * @tc.name: AotArgsHandlerTest_002 59 * @tc.desc: AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID) 60 * @tc.type: Func 61 */ 62 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_002, TestSize.Level0) 63 { 64 std::unordered_map<std::string, std::string> argsMap; 65 argsMap.emplace("argKey", "argValueNotInteger"); 66 std::string keyName = "argKey"; 67 int32_t bundleID = 0; 68 int32_t ret = AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID); 69 EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); 70 } 71 72 /** 73 * @tc.name: AotArgsHandlerTest_003 74 * @tc.desc: AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID) 75 * @tc.type: Func 76 */ 77 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_003, TestSize.Level0) 78 { 79 std::unordered_map<std::string, std::string> argsMap; 80 argsMap.emplace("argKey", "123456_argValueNotInteger"); 81 std::string keyName = "argKey"; 82 int32_t bundleID = 0; 83 int32_t ret = AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID); 84 EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); 85 } 86 87 /** 88 * @tc.name: AotArgsHandlerTest_004 89 * @tc.desc: AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID) 90 * @tc.type: Func 91 */ 92 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_004, TestSize.Level0) 93 { 94 std::unordered_map<std::string, std::string> argsMap; 95 argsMap.emplace("argKey", "20020079"); 96 std::string keyName = "argKey"; 97 int32_t bundleID = 0; 98 int32_t ret = AOTArgsParserBase::FindArgsIdxToInteger(argsMap, keyName, bundleID); 99 EXPECT_EQ(ret, ERR_OK); 100 EXPECT_EQ(bundleID, 20020079); 101 } 102 103 /** 104 * @tc.name: AotArgsHandlerTest_005 105 * @tc.desc: AOTArgsParserBase::FindArgsIdxToString(argsMap, keyName, bundleArg) 106 * @tc.type: Func 107 */ 108 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_005, TestSize.Level0) 109 { 110 std::unordered_map<std::string, std::string> argsMap; 111 std::string keyName = "argKey"; 112 std::string bundleArg = ""; 113 int32_t ret = AOTArgsParserBase::FindArgsIdxToString(argsMap, keyName, bundleArg); 114 EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); 115 } 116 117 /** 118 * @tc.name: AotArgsHandlerTest_006 119 * @tc.desc: AOTArgsParserBase::FindArgsIdxToString(argsMap, keyName, bundleArg) 120 * @tc.type: Func 121 */ 122 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_006, TestSize.Level0) 123 { 124 std::unordered_map<std::string, std::string> argsMap; 125 argsMap.emplace("argKey", "com.ohos.contacts"); 126 std::string keyName = "argKey"; 127 std::string bundleArg = ""; 128 int32_t ret = AOTArgsParserBase::FindArgsIdxToString(argsMap, keyName, bundleArg); 129 EXPECT_EQ(ret, ERR_OK); 130 EXPECT_STREQ(bundleArg.c_str(), "com.ohos.contacts"); 131 } 132 133 const std::string COMPILER_PKG_INFO_VALUE = 134 "{\"abcName\":\"ets/modules.abc\"," 135 "\"abcOffset\":\"0x1000\"," 136 "\"abcSize\":\"0x60b058\"," 137 "\"appIdentifier\":\"5765880207853624761\"," 138 "\"bundleName\":\"com.ohos.contacts\"," 139 "\"BundleUid\":\"0x1317b6f\"," 140 "\"isEncryptedBundle\":\"0x0\"," 141 "\"isScreenOff\":\"0x1\"," 142 "\"moduleName\":\"entry\"," 143 "\"pgoDir\":\"/data/local/ark-profile/100/com.ohos.contacts\"," 144 "\"pkgPath\":\"/system/app/Contacts/Contacts.hap\"," 145 "\"processUid\":\"0xbf4\"}"; 146 147 const std::unordered_map<std::string, std::string> argsMapForTest { 148 {"target-compiler-mode", "partial"}, 149 {"aot-file", "/data/local/ark-cache/com.ohos.contacts/arm64/entry"}, 150 {"compiler-pkg-info", COMPILER_PKG_INFO_VALUE}, 151 {"compiler-external-pkg-info", "[]"}, 152 {"compiler-opt-bc-range", ""}, 153 {"compiler-device-state", "1"}, 154 {"compiler-baseline-pgo", "0"}, 155 {"ABC-Path", "/system/app/Contacts/Contacts.hap/ets/modules.abc"}, 156 {"BundleUid", "20020079"}, 157 {"BundleGid", "20020079"}, 158 {"anFileName", "/data/local/ark-cache/com.ohos.contacts/arm64/entry.an"}, 159 {"appIdentifier", "5765880207853624761"}, 160 }; 161 162 /** 163 * @tc.name: AotArgsHandlerTest_007 164 * @tc.desc: AOTArgsHandler::Handle(argsMap) 165 * @tc.type: Func 166 */ 167 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_007, TestSize.Level0) 168 { 169 std::unordered_map<std::string, std::string> argsMap(argsMapForTest); 170 argsMap.emplace(ArgsIdx::ARKTS_MODE, "dynamic"); 171 std::unique_ptr<AOTArgsHandler> argsHandler = std::make_unique<AOTArgsHandler>(argsMap); 172 int32_t ret = argsHandler->Handle(0); 173 EXPECT_EQ(ret, ERR_OK); 174 std::vector<const char*> argv = argsHandler->GetAotArgs(); 175 EXPECT_STREQ(argv[0], "/system/bin/ark_aot_compiler"); 176 } 177 178 /** 179 * @tc.name: AotArgsHandlerTest_008 180 * @tc.desc: AOTArgsHandler::Handle(argsMap) 181 * @tc.type: Func 182 */ 183 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_008, TestSize.Level0) 184 { 185 std::unordered_map<std::string, std::string> argsMap(argsMapForTest); 186 argsMap.emplace(ArgsIdx::ARKTS_MODE, "static"); 187 std::unique_ptr<AOTArgsHandler> argsHandler = std::make_unique<AOTArgsHandler>(argsMap); 188 int32_t ret = argsHandler->Handle(0); 189 EXPECT_EQ(ret, ERR_OK); 190 std::vector<const char*> argv = argsHandler->GetAotArgs(); 191 EXPECT_STREQ(argv[0], "/system/bin/ark_aot"); 192 } 193 194 /** 195 * @tc.name: AotArgsHandlerTest_009 196 * @tc.desc: AOTArgsParser::AddExpandArgs(aotVector, thermalLevel) 197 * @tc.type: Func 198 */ 199 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_009, TestSize.Level0) 200 { 201 std::unique_ptr<AOTArgsParser> parser = std::make_unique<AOTArgsParser>(); 202 std::vector<std::string> aotVector; 203 parser->AddExpandArgs(aotVector, 0); 204 std::string arg = aotVector[0]; 205 EXPECT_STREQ(arg.c_str(), "--compiler-thermal-level=0"); 206 } 207 208 const std::unordered_map<std::string, std::string> framewordArgsMapForTest { 209 {"outputPath", "/data/service/el1/public/for-all-app/framework_ark_cache/etsstdlib_bootabc.an"}, 210 {"anFileName", "/data/service/el1/public/for-all-app/framework_ark_cache/etsstdlib_bootabc.an"}, 211 {"isSysComp", "1"}, 212 {"sysCompPath", "/system/framework/etsstdlib_bootabc.abc"}, 213 {"ABC-Path", "/system/framework/etsstdlib_bootabc.abc"} 214 }; 215 216 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_010, TestSize.Level0) 217 { 218 const char *systemDir = "/system"; 219 const char *systemFrameworkDir = "/system/framework"; 220 const char *bootPathJson = "/system/framework/bootpath.json"; 221 mkdir(systemDir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 222 mkdir(systemFrameworkDir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 223 std::string bootpathJsonStr = 224 "{\"bootpath\":\"/system/framework/etsstdlib_bootabc.abc:/system/framework/arkoala.abc\"}"; 225 std::ofstream file(bootPathJson); 226 file << bootpathJsonStr << std::endl; 227 file.close(); 228 229 std::unique_ptr<AOTArgsHandler> argsHandler = std::make_unique<AOTArgsHandler>(framewordArgsMapForTest); 230 int32_t ret = argsHandler->Handle(0); 231 EXPECT_EQ(ret, ERR_OK); 232 std::string fileName = argsHandler->GetFileName(); 233 EXPECT_TRUE(!fileName.empty()); 234 int32_t bundleUid; 235 int32_t bundleGid; 236 argsHandler->GetBundleId(bundleUid, bundleGid); 237 EXPECT_EQ(bundleUid, OID_SYSTEM); 238 EXPECT_EQ(bundleGid, OID_SYSTEM); 239 std::vector<const char*> argv = argsHandler->GetAotArgs(); 240 EXPECT_STREQ(argv[0], "/system/bin/ark_aot"); 241 for (const auto& arg : argv) { 242 if (std::strcmp(arg, "boot-panda-files") == 0) { 243 EXPECT_STREQ(arg, "--boot-panda-files=/system/framework/etsstdlib_bootabc.abc"); 244 } 245 } 246 unlink(bootPathJson); 247 rmdir(systemFrameworkDir); 248 rmdir(systemDir); 249 } 250 251 /** 252 * @tc.name: AotArgsHandlerTest_011 253 * @tc.desc: AOTArgsParserFactory::GetParser(argsMap) 254 * @tc.type: Func 255 */ 256 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_011, TestSize.Level0) { 257 std::unordered_map<std::string, std::string> argsMap = { 258 {ArgsIdx::IS_SYSTEM_COMPONENT, "0"}, 259 {ArgsIdx::ARKTS_MODE, "static"} 260 }; 261 262 auto result = AOTArgsParserFactory::GetParser(argsMap); 263 EXPECT_TRUE(result.has_value()); 264 EXPECT_NE(result.value(), nullptr); 265 } 266 267 /** 268 * @tc.name: AotArgsHandlerTest_012 269 * @tc.desc: AOTArgsParserFactory::GetParser(argsMap) 270 * @tc.type: Func 271 */ 272 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_012, TestSize.Level0) { 273 std::unordered_map<std::string, std::string> argsMap = { 274 {ArgsIdx::ARKTS_MODE, "hybrid"} 275 }; 276 277 auto result = AOTArgsParserFactory::GetParser(argsMap); 278 EXPECT_TRUE(result.has_value()); 279 EXPECT_NE(result.value(), nullptr); 280 } 281 282 /** 283 * @tc.name: AotArgsHandlerTest_013 284 * @tc.desc: AOTArgsParserFactory::GetParser(argsMap) 285 * @tc.type: Func 286 */ 287 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_013, TestSize.Level0) 288 { 289 std::unordered_map<std::string, std::string> argsMap = { 290 {ArgsIdx::IS_SYSTEM_COMPONENT, "0"}, 291 {ArgsIdx::ARKTS_MODE, "dynamic"} 292 }; 293 294 auto result = AOTArgsParserFactory::GetParser(argsMap); 295 EXPECT_TRUE(result.has_value()); 296 EXPECT_NE(result.value(), nullptr); 297 } 298 299 /** 300 * @tc.name: AotArgsHandlerTest_014 301 * @tc.desc: AOTArgsParserFactory::GetParser(argsMap) 302 * @tc.type: Func 303 */ 304 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_014, TestSize.Level0) 305 { 306 std::unordered_map<std::string, std::string> argsMap = { 307 {ArgsIdx::IS_SYSTEM_COMPONENT, "1"}, 308 {ArgsIdx::ARKTS_MODE, "dynamic"} 309 }; 310 311 auto result = AOTArgsParserFactory::GetParser(argsMap); 312 EXPECT_NE(result, nullptr); 313 EXPECT_NE(result.value(), nullptr); 314 } 315 316 /** 317 * @tc.name: AotArgsHandlerTest_015 318 * @tc.desc: AOTArgsParserFactory::GetParser(argsMap) 319 * @tc.type: Func 320 */ 321 HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_015, TestSize.Level0) 322 { 323 std::unordered_map<std::string, std::string> argsMap = { 324 {ArgsIdx::IS_SYSTEM_COMPONENT, "0"} 325 }; 326 327 auto result = AOTArgsParserFactory::GetParser(argsMap); 328 EXPECT_TRUE(result.has_value()); 329 EXPECT_NE(result.value(), nullptr); 330 } 331 } // namespace OHOS::ArkCompiler