• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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