1 /*
2 * Copyright (c) 2022-2024 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 "assembler/assembly-emitter.h"
17 #include "assembler/assembly-parser.h"
18 #include "libpandafile/class_data_accessor-inl.h"
19
20 #include "ecmascript/base/path_helper.h"
21 #include "ecmascript/global_env.h"
22 #include "ecmascript/jspandafile/js_pandafile.h"
23 #include "ecmascript/jspandafile/js_pandafile_manager.h"
24 #include "ecmascript/jspandafile/program_object.h"
25 #include "ecmascript/js_object-inl.h"
26 #include "ecmascript/module/js_module_manager.h"
27 #include "ecmascript/module/js_module_source_text.h"
28 #include "ecmascript/module/module_data_extractor.h"
29 #include "ecmascript/module/module_logger.h"
30 #include "ecmascript/module/module_path_helper.h"
31 #include "ecmascript/tests/test_helper.h"
32 #include "ecmascript/linked_hash_table.h"
33 #include "ecmascript/checkpoint/thread_state_transition.h"
34 #include "ecmascript/module/accessor/module_data_accessor.h"
35 #include "ecmascript/module/js_module_deregister.h"
36 #include "ecmascript/module/js_shared_module.h"
37 #include "ecmascript/module/js_shared_module_manager.h"
38 #include "ecmascript/module/module_tools.h"
39 #include "ecmascript/require/js_cjs_module.h"
40 #include "ecmascript/module/module_value_accessor.h"
41 #include "ecmascript/module/module_resolver.h"
42 #include "ecmascript/module/napi_module_loader.h"
43 #include "ecmascript/ecma_vm.h"
44 #include "ecmascript/containers/containers_errors.h"
45 #include "ecmascript/dfx/native_module_failure_info.h"
46
47 using namespace panda::ecmascript;
48 using namespace panda::panda_file;
49 using namespace panda::pandasm;
50
51 namespace panda::test {
52 using FunctionCallbackInfo = JSHandle<JSTaggedValue>(*)(JsiRuntimeCallInfo *);
53 class EcmaModuleTest : public testing::Test {
54 public:
SetUpTestCase()55 static void SetUpTestCase()
56 {
57 GTEST_LOG_(INFO) << "SetUpTestCase";
58 }
59
TearDownTestCase()60 static void TearDownTestCase()
61 {
62 GTEST_LOG_(INFO) << "TearDownCase";
63 }
64
SetUp()65 void SetUp() override
66 {
67 TestHelper::CreateEcmaVMWithScope(instance, thread, scope);
68 }
69
TearDown()70 void TearDown() override
71 {
72 TestHelper::DestroyEcmaVMWithScope(instance, scope);
73 }
74
75 static JSHandle<JSTaggedValue> MockRequireNapiFailure(JsiRuntimeCallInfo *runtimeCallInfo);
76 static JSHandle<JSTaggedValue> MockRequireNapiValue(JsiRuntimeCallInfo *runtimeCallInfo);
77 static JSHandle<JSTaggedValue> MockRequireNapiException(JsiRuntimeCallInfo *runtimeCallInfo);
78
79 EcmaVM *instance {nullptr};
80 ecmascript::EcmaHandleScope *scope {nullptr};
81 JSThread *thread {nullptr};
82 };
83
MockRequireNapiFailure(JsiRuntimeCallInfo * runtimeCallInfo)84 JSHandle<JSTaggedValue> EcmaModuleTest::MockRequireNapiFailure(JsiRuntimeCallInfo *runtimeCallInfo)
85 {
86 EcmaVM *vm = runtimeCallInfo->GetVM();
87 vm->SetErrorInfoEnhance(true);
88 CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, thread->GlobalConstants()->GetHandledUndefined());
89 ecmascript::ThreadManagedScope managedScope(thread);
90 if (EcmaVM::GetErrorInfoEnhance()) {
91 JSHandle<NativeModuleFailureInfo> nativeModuleErrorFailureInfo =
92 NativeModuleFailureInfo::CreateNativeModuleFailureInfo(vm, "NativeModuleFailureInfo");
93 return JSHandle<JSTaggedValue>::Cast(nativeModuleErrorFailureInfo);
94 }
95 return JSHandle<JSTaggedValue>(thread->GlobalConstants()->GetHandledUndefined());
96 }
97
MockRequireNapiValue(JsiRuntimeCallInfo * runtimeCallInfo)98 JSHandle<JSTaggedValue> EcmaModuleTest::MockRequireNapiValue(JsiRuntimeCallInfo *runtimeCallInfo)
99 {
100 EcmaVM *vm = runtimeCallInfo->GetVM();
101 CROSS_THREAD_CHECK(vm);
102 ecmascript::ThreadManagedScope managedScope(thread);
103 ObjectFactory *factory = vm->GetFactory();
104 JSHandle<JSTaggedValue> current(factory->NewFromUtf8("exportVal"));
105 return current;
106 }
107
MockRequireNapiException(JsiRuntimeCallInfo * runtimeCallInfo)108 JSHandle<JSTaggedValue> EcmaModuleTest::MockRequireNapiException(JsiRuntimeCallInfo *runtimeCallInfo)
109 {
110 EcmaVM *vm = runtimeCallInfo->GetVM();
111 CROSS_THREAD_CHECK(vm);
112 ecmascript::ThreadManagedScope managedScope(thread);
113 ObjectFactory *factory = vm->GetFactory();
114 JSHandle<JSTaggedValue> message(factory->NewFromUtf8("load native module failed."));
115 JSHandle<JSObject> error = factory->GetJSError(ErrorType::ERROR, "load native module failed.", StackCheck::NO);
116 JSHandle<JSTaggedValue> code(thread, JSTaggedValue(ecmascript::containers::ErrorFlag::REFERENCE_ERROR));
117 JSHandle<EcmaString> key = factory->NewFromUtf8("code");
118 JSHandle<EcmaString> name = factory->NewFromUtf8("name");
119 JSHandle<EcmaString> value = factory->NewFromUtf8("BusinessError");
120 JSObject::CreateDataPropertyOrThrow(thread, error, JSHandle<JSTaggedValue>::Cast(key), code);
121 RETURN_HANDLE_IF_ABRUPT_COMPLETION(JSTaggedValue, thread);
122 JSObject::CreateDataPropertyOrThrow(thread, error, JSHandle<JSTaggedValue>::Cast(name),
123 JSHandle<JSTaggedValue>::Cast(value));
124 RETURN_HANDLE_IF_ABRUPT_COMPLETION(JSTaggedValue, thread);
125 JSTaggedValue err = error.GetTaggedValue();
126 if (thread->HasPendingException()) {
127 LOG_ECMA(DEBUG) << "An exception has already occurred before, keep old exception here.";
128 } else {
129 thread->SetException(err);
130 }
131
132 return message;
133 }
134
135 class MockModuleValueAccessor : public ModuleValueAccessor {
136 public:
GetModuleNamespaceInternal(JSThread * thread,int32_t index,JSTaggedValue curModule)137 static JSTaggedValue GetModuleNamespaceInternal(JSThread *thread, int32_t index, JSTaggedValue curModule)
138 {
139 return ModuleValueAccessor::GetModuleNamespaceInternal(thread, index, curModule);
140 }
141 template <bool isLazy>
GetSendableModuleValueOuterInternal(JSThread * thread,int32_t index,JSTaggedValue curModule)142 static JSTaggedValue GetSendableModuleValueOuterInternal(JSThread *thread, int32_t index, JSTaggedValue curModule)
143 {
144 return ModuleValueAccessor::GetSendableModuleValueOuterInternal<isLazy>(thread, index, curModule);
145 }
146 template <bool isLazy>
GetModuleValueFromRecordIndexBinding(JSThread * thread,JSHandle<SourceTextModule> module,JSTaggedValue resolvedBinding,bool isSendable)147 static JSTaggedValue GetModuleValueFromRecordIndexBinding(JSThread *thread, JSHandle<SourceTextModule> module,
148 JSTaggedValue resolvedBinding, bool isSendable)
149 {
150 GetModuleValueFromBindingInfo info { thread, module, resolvedBinding, 0, isSendable };
151 return ModuleValueAccessor::GetModuleValueFromRecordIndexBinding<isLazy>(info);
152 }
153
154 template <bool isLazy>
GetModuleValueFromIndexBinding(JSThread * thread,JSHandle<SourceTextModule> module,JSTaggedValue resolvedBinding,bool isSendable)155 static JSTaggedValue GetModuleValueFromIndexBinding(JSThread *thread, JSHandle<SourceTextModule> module,
156 JSTaggedValue resolvedBinding, bool isSendable)
157 {
158 GetModuleValueFromBindingInfo info { thread, module, resolvedBinding, 0, isSendable };
159 return ModuleValueAccessor::GetModuleValueFromIndexBinding<isLazy>(info);
160 }
161
162 template <bool isLazy>
GetModuleValueFromRecordBinding(JSThread * thread,JSHandle<SourceTextModule> module,JSTaggedValue resolvedBinding,int32_t index,bool isSendable)163 static JSTaggedValue GetModuleValueFromRecordBinding(JSThread *thread, JSHandle<SourceTextModule> module,
164 JSTaggedValue resolvedBinding, int32_t index, bool isSendable)
165 {
166 GetModuleValueFromBindingInfo info { thread, module, resolvedBinding, index, isSendable };
167 return ModuleValueAccessor::GetModuleValueFromRecordBinding<isLazy>(info);
168 }
169 template <bool isLazy>
GetResolvedModuleFromRecordIndexBinding(JSThread * thread,JSHandle<SourceTextModule> module,JSHandle<ResolvedRecordIndexBinding> binding)170 static JSHandle<SourceTextModule> GetResolvedModuleFromRecordIndexBinding(JSThread *thread,
171 JSHandle<SourceTextModule> module, JSHandle<ResolvedRecordIndexBinding> binding)
172 {
173 return ModuleValueAccessor::GetResolvedModule<isLazy, ResolvedRecordIndexBinding>(
174 thread, module, binding, ModulePathHelper::Utf8ConvertToString(thread, binding->GetModuleRecord(thread)));
175 }
176 template <bool isLazy>
GetResolvedModuleFromRecordBinding(JSThread * thread,JSHandle<SourceTextModule> module,JSHandle<ResolvedRecordBinding> binding)177 static JSHandle<SourceTextModule> GetResolvedModuleFromRecordBinding(JSThread *thread,
178 JSHandle<SourceTextModule> module, JSHandle<ResolvedRecordBinding> binding)
179 {
180 return ModuleValueAccessor::GetResolvedModule<isLazy, ResolvedRecordBinding>(
181 thread, module, binding, ModulePathHelper::Utf8ConvertToString(thread, binding->GetModuleRecord(thread)));
182 }
183 };
184 class MockDeprecatedModuleValueAccessor : public DeprecatedModuleValueAccessor {
185 public:
GetModuleNamespaceInternal(JSThread * thread,JSTaggedValue localName,JSTaggedValue curModule)186 static JSTaggedValue GetModuleNamespaceInternal(JSThread *thread, JSTaggedValue localName, JSTaggedValue curModule)
187 {
188 return DeprecatedModuleValueAccessor::GetModuleNamespaceInternal(thread, localName, curModule);
189 }
190 };
191 /*
192 * Feature: Module
193 * Function: AddImportEntry
194 * SubFunction: AddImportEntry
195 * FunctionPoints: Add import entry
196 * CaseDescription: Add two import item and check module import entries size
197 */
HWTEST_F_L0(EcmaModuleTest,AddImportEntry)198 HWTEST_F_L0(EcmaModuleTest, AddImportEntry)
199 {
200 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
201 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
202 JSHandle<ImportEntry> importEntry1 = objectFactory->NewImportEntry();
203 SourceTextModule::AddImportEntry(thread, module, importEntry1, 0, 2);
204 JSHandle<ImportEntry> importEntry2 = objectFactory->NewImportEntry();
205 SourceTextModule::AddImportEntry(thread, module, importEntry2, 1, 2);
206 JSHandle<TaggedArray> importEntries(thread, module->GetImportEntries(thread));
207 EXPECT_TRUE(importEntries->GetLength() == 2U);
208 }
209
210 /*
211 * Feature: Module
212 * Function: AddLocalExportEntry
213 * SubFunction: AddLocalExportEntry
214 * FunctionPoints: Add local export entry
215 * CaseDescription: Add two local export item and check module local export entries size
216 */
HWTEST_F_L0(EcmaModuleTest,AddLocalExportEntry)217 HWTEST_F_L0(EcmaModuleTest, AddLocalExportEntry)
218 {
219 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
220 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
221 JSHandle<LocalExportEntry> localExportEntry1 = objectFactory->NewLocalExportEntry();
222 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry1, 0, 2);
223 JSHandle<LocalExportEntry> localExportEntry2 = objectFactory->NewLocalExportEntry();
224 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry2, 1, 2);
225 JSHandle<TaggedArray> localExportEntries(thread, module->GetLocalExportEntries(thread));
226 EXPECT_TRUE(localExportEntries->GetLength() == 2U);
227 }
228
229 /*
230 * Feature: Module
231 * Function: AddIndirectExportEntry
232 * SubFunction: AddIndirectExportEntry
233 * FunctionPoints: Add indirect export entry
234 * CaseDescription: Add two indirect export item and check module indirect export entries size
235 */
HWTEST_F_L0(EcmaModuleTest,AddIndirectExportEntry)236 HWTEST_F_L0(EcmaModuleTest, AddIndirectExportEntry)
237 {
238 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
239 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
240 JSHandle<IndirectExportEntry> indirectExportEntry1 = objectFactory->NewIndirectExportEntry();
241 SourceTextModule::AddIndirectExportEntry(thread, module, indirectExportEntry1, 0, 2);
242 JSHandle<IndirectExportEntry> indirectExportEntry2 = objectFactory->NewIndirectExportEntry();
243 SourceTextModule::AddIndirectExportEntry(thread, module, indirectExportEntry2, 1, 2);
244 JSHandle<TaggedArray> indirectExportEntries(thread, module->GetIndirectExportEntries(thread));
245 EXPECT_TRUE(indirectExportEntries->GetLength() == 2U);
246 }
247
248 /*
249 * Feature: Module
250 * Function: StarExportEntries
251 * SubFunction: StarExportEntries
252 * FunctionPoints: Add start export entry
253 * CaseDescription: Add two start export item and check module start export entries size
254 */
HWTEST_F_L0(EcmaModuleTest,AddStarExportEntry)255 HWTEST_F_L0(EcmaModuleTest, AddStarExportEntry)
256 {
257 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
258 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
259 JSHandle<StarExportEntry> starExportEntry1 = objectFactory->NewStarExportEntry();
260 SourceTextModule::AddStarExportEntry(thread, module, starExportEntry1, 0, 2);
261 JSHandle<StarExportEntry> starExportEntry2 = objectFactory->NewStarExportEntry();
262 SourceTextModule::AddStarExportEntry(thread, module, starExportEntry2, 1, 2);
263 JSHandle<TaggedArray> startExportEntries(thread, module->GetStarExportEntries(thread));
264 EXPECT_TRUE(startExportEntries->GetLength() == 2U);
265 }
266
267 /*
268 * Feature: Module
269 * Function: StoreModuleValue
270 * SubFunction: StoreModuleValue/GetModuleValue
271 * FunctionPoints: store a module export item in module
272 * CaseDescription: Simulated implementation of "export foo as bar", set foo as "hello world",
273 * use "import bar" in same js file
274 */
HWTEST_F_L0(EcmaModuleTest,StoreModuleValue)275 HWTEST_F_L0(EcmaModuleTest, StoreModuleValue)
276 {
277 ObjectFactory* objFactory = thread->GetEcmaVM()->GetFactory();
278 CString localName = "foo";
279 CString exportName = "bar";
280 CString value = "hello world";
281
282 JSHandle<JSTaggedValue> localNameHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName));
283 JSHandle<JSTaggedValue> exportNameHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportName));
284 JSHandle<LocalExportEntry> localExportEntry =
285 objFactory->NewLocalExportEntry(exportNameHandle, localNameHandle, LocalExportEntry::LOCAL_DEFAULT_INDEX,
286 SharedTypes::UNSENDABLE_MODULE);
287 JSHandle<SourceTextModule> module = objFactory->NewSourceTextModule();
288 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry, 0, 1);
289
290 JSHandle<JSTaggedValue> storeKey = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName));
291 JSHandle<JSTaggedValue> valueHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(value));
292 SourceTextModule::StoreModuleValue(thread, module, storeKey, valueHandle);
293
294 JSHandle<JSTaggedValue> loadKey = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName));
295 JSTaggedValue loadValue = module->GetModuleValue(thread, loadKey.GetTaggedValue(), false);
296 EXPECT_EQ(valueHandle.GetTaggedValue(), loadValue);
297 }
298
299 /*
300 * Feature: Module
301 * Function: GetModuleValue
302 * SubFunction: StoreModuleValue/GetModuleValue
303 * FunctionPoints: load module value from module
304 * CaseDescription: Simulated implementation of "export default let foo = 'hello world'",
305 * use "import C from 'xxx' to get default value"
306 */
HWTEST_F_L0(EcmaModuleTest,GetModuleValue)307 HWTEST_F_L0(EcmaModuleTest, GetModuleValue)
308 {
309 ObjectFactory* objFactory = thread->GetEcmaVM()->GetFactory();
310 // export entry
311 CString exportLocalName = "*default*";
312 CString exportName = "default";
313 CString exportValue = "hello world";
314 JSHandle<JSTaggedValue> exportLocalNameHandle =
315 JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportLocalName));
316 JSHandle<JSTaggedValue> exportNameHandle =
317 JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportName));
318 JSHandle<LocalExportEntry> localExportEntry = objFactory->NewLocalExportEntry(exportNameHandle,
319 exportLocalNameHandle, LocalExportEntry::LOCAL_DEFAULT_INDEX, SharedTypes::UNSENDABLE_MODULE);
320 JSHandle<SourceTextModule> moduleExport = objFactory->NewSourceTextModule();
321 SourceTextModule::AddLocalExportEntry(thread, moduleExport, localExportEntry, 0, 1);
322 // store module value
323 JSHandle<JSTaggedValue> exportValueHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportValue));
324 SourceTextModule::StoreModuleValue(thread, moduleExport, exportLocalNameHandle, exportValueHandle);
325
326 JSTaggedValue importDefaultValue =
327 moduleExport->GetModuleValue(thread, exportLocalNameHandle.GetTaggedValue(), false);
328 EXPECT_EQ(exportValueHandle.GetTaggedValue(), importDefaultValue);
329 }
330
HWTEST_F_L0(EcmaModuleTest,GetExportedNames)331 HWTEST_F_L0(EcmaModuleTest, GetExportedNames)
332 {
333 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
334 JSHandle<SourceTextModule> module = factory->NewSourceTextModule();
335 JSHandle<TaggedArray> exportStarSet = factory->NewTaggedArray(2);
336 exportStarSet->Set(thread, 0, module.GetTaggedValue());
337
338 CVector<std::string> exportedNames = SourceTextModule::GetExportedNames(thread, module, exportStarSet);
339 EXPECT_EQ(exportedNames.size(), 0);
340 }
341
HWTEST_F_L0(EcmaModuleTest,FindByExport)342 HWTEST_F_L0(EcmaModuleTest, FindByExport)
343 {
344 CString localName1 = "foo";
345 CString localName2 = "foo2";
346 CString localName3 = "foo3";
347 CString exportName1 = "bar";
348 CString exportName2 = "bar2";
349 CString value = "hello world";
350 CString value2 = "hello world2";
351
352 ObjectFactory* objFactory = thread->GetEcmaVM()->GetFactory();
353 JSHandle<SourceTextModule> module = objFactory->NewSourceTextModule();
354 JSHandle<JSTaggedValue> localNameHandle1 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName1));
355 JSHandle<JSTaggedValue> localNameHandle2 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName2));
356 JSHandle<JSTaggedValue> exportNameHandle1 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportName1));
357 JSHandle<JSTaggedValue> exportNameHandle2 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportName2));
358 JSHandle<LocalExportEntry> localExportEntry1 =
359 objFactory->NewLocalExportEntry(exportNameHandle1, localNameHandle1, LocalExportEntry::LOCAL_DEFAULT_INDEX,
360 SharedTypes::UNSENDABLE_MODULE);
361 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry1, 0, 2);
362
363 JSHandle<LocalExportEntry> localExportEntry2 =
364 objFactory->NewLocalExportEntry(exportNameHandle2, localNameHandle2, LocalExportEntry::LOCAL_DEFAULT_INDEX,
365 SharedTypes::UNSENDABLE_MODULE);
366 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry2, 1, 2);
367
368 JSHandle<JSTaggedValue> storeKey = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName1));
369 JSHandle<JSTaggedValue> valueHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(value));
370 SourceTextModule::StoreModuleValue(thread, module, storeKey, valueHandle);
371
372 JSHandle<JSTaggedValue> storeKey2 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName2));
373 JSHandle<JSTaggedValue> valueHandle2 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(value2));
374 SourceTextModule::StoreModuleValue(thread, module, storeKey2, valueHandle2);
375
376 // FindByExport cannot find key from exportEntries, returns Hole()
377 JSHandle<JSTaggedValue> loadKey1 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName3));
378 JSTaggedValue loadValue1 = module->GetModuleValue(thread, loadKey1.GetTaggedValue(), false);
379 EXPECT_EQ(JSTaggedValue::Hole(), loadValue1);
380
381 // FindByExport retrieves the key from exportEntries and returns the value corresponding to the key
382 JSHandle<JSTaggedValue> loadKey2 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportName1));
383 JSTaggedValue loadValue2 = module->GetModuleValue(thread, loadKey2.GetTaggedValue(), false);
384 EXPECT_EQ(valueHandle.GetTaggedValue(), loadValue2);
385 }
386
HWTEST_F_L0(EcmaModuleTest,ReformatPath)387 HWTEST_F_L0(EcmaModuleTest, ReformatPath)
388 {
389 // start with pkg_modules
390 CString requestPath = "pkg_modules@entry.@hw-agconnect.hmcore";
391 CString entryPoint = ModulePathHelper::ReformatPath(requestPath);
392 EXPECT_EQ("@entry.@hw-agconnect.hmcore", entryPoint);
393
394 // start with @package:
395 requestPath = "@package:pkg_modules@entry.@hw-agconnect.hmcore";
396 entryPoint = ModulePathHelper::ReformatPath(requestPath);
397 EXPECT_EQ("@entry.@hw-agconnect.hmcore", entryPoint);
398
399 // start with @app:
400 requestPath = "@app:bundleName/moduleName/lib*.so";
401 entryPoint = ModulePathHelper::ReformatPath(requestPath);
402 EXPECT_EQ("lib*.so", entryPoint);
403
404 // no special prefix
405 requestPath = "bundleName/moduleName/lib*.so";
406 entryPoint = ModulePathHelper::ReformatPath(requestPath);
407 EXPECT_EQ("bundleName/moduleName/lib*.so", entryPoint);
408 }
409
HWTEST_F_L0(EcmaModuleTest,ParseUrl)410 HWTEST_F_L0(EcmaModuleTest, ParseUrl)
411 {
412 CString recordName = "com.bundleName.test";
413 CString res = ModulePathHelper::ParseUrl(instance, recordName);
414 EXPECT_EQ(res, CString());
415 }
416
HWTEST_F_L0(EcmaModuleTest,MakeNewRecord)417 HWTEST_F_L0(EcmaModuleTest, MakeNewRecord)
418 {
419 CString baseFilename = "merge.abc";
420 const char *data = R"(
421 .language ECMAScript
422 .function any func_main_0(any a0, any a1, any a2) {
423 ldai 1
424 return
425 }
426 )";
427 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
428 Parser parser;
429 auto res = parser.Parse(data);
430 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
431 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
432
433 // is not start with BUNDLE_INSTALL_PATH
434 CString moduleRecordName = "moduleTest1";
435 CString moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
436 CString result = "requestModuleName1";
437 CString entryPoint = ModulePathHelper::MakeNewRecord(thread, pf.get(), baseFilename, moduleRecordName,
438 moduleRequestName);
439 EXPECT_EQ(result, entryPoint);
440
441 // start with BUNDLE_INSTALL_PATH, is bundle pack
442 baseFilename = "/data/storage/el1/bundle/";
443 moduleRecordName = "moduleTest1";
444 moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
445 result = "requestModuleName1";
446 entryPoint = ModulePathHelper::MakeNewRecord(thread, pf.get(), baseFilename, moduleRecordName,
447 moduleRequestName);
448 EXPECT_EQ(result, entryPoint);
449 }
450
HWTEST_F_L0(EcmaModuleTest,FindPackageInTopLevelWithNamespace)451 HWTEST_F_L0(EcmaModuleTest, FindPackageInTopLevelWithNamespace)
452 {
453 CString baseFilename = "merge.abc";
454 const char *data = R"(
455 .language ECMAScript
456 .function any func_main_0(any a0, any a1, any a2) {
457 ldai 1
458 return
459 }
460 )";
461 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
462 Parser parser;
463 auto res = parser.Parse(data);
464 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
465 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
466
467 // start with pkg_modules, pos equal CString::npos
468 CString moduleRecordName = "pkg_modules@entry.@hw-agconnect.hmcore";
469 CString moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
470 CString entryPoint = ModulePathHelper::FindPackageInTopLevelWithNamespace(
471 pf.get(), moduleRequestName, moduleRecordName);
472 EXPECT_EQ(CString(), entryPoint);
473
474 // start with pkg_modules, pos not equal CString::npos
475 moduleRecordName = "pkg_modules@entry.@hw-agconnect.hmcore/test";
476 moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
477 entryPoint = ModulePathHelper::FindPackageInTopLevelWithNamespace(pf.get(), moduleRequestName, moduleRecordName);
478 EXPECT_EQ(CString(), entryPoint);
479
480 // moduleName has @
481 moduleRecordName = "@bundle:com.bundleName.test/@test";
482 moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
483 entryPoint = ModulePathHelper::FindPackageInTopLevelWithNamespace(pf.get(), moduleRequestName, moduleRecordName);
484 EXPECT_EQ(CString(), entryPoint);
485 }
486
HWTEST_F_L0(EcmaModuleTest,ParseOhpmPackage)487 HWTEST_F_L0(EcmaModuleTest, ParseOhpmPackage)
488 {
489 CString baseFilename = "merge.abc";
490 const char *data = R"(
491 .language ECMAScript
492 .function any func_main_0(any a0, any a1, any a2) {
493 ldai 1
494 return
495 }
496 )";
497 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
498 Parser parser;
499 auto res = parser.Parse(data);
500 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
501 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
502
503 // start with pkg_modules
504 CString moduleRecordName = "pkg_modules@entry.@hw-agconnect.hmcore1";
505 CString moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
506 pf->InsertJSRecordInfo(moduleRecordName);
507 CString entryPoint = ModulePathHelper::ParseOhpmPackage(pf.get(), moduleRecordName, moduleRequestName);
508 EXPECT_EQ(CString(), entryPoint);
509
510 // start with pkg_modules, packageName has pkg_modules
511 CString moduleRecordName2 = "pkg_modules@entry.@hw-agconnect.hmcore2";
512 CString moduleRequestName2 = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
513 CUnorderedMap<std::string_view, JSPandaFile::JSRecordInfo*> &recordInfo =
514 const_cast<CUnorderedMap<std::string_view, JSPandaFile::JSRecordInfo*>&>(pf->GetJSRecordInfo());
515 JSPandaFile::JSRecordInfo *info = new JSPandaFile::JSRecordInfo();
516 info->npmPackageName = moduleRecordName2;
517 recordInfo.insert({std::string_view(moduleRecordName2.c_str(), moduleRecordName2.size()), info});
518 entryPoint = ModulePathHelper::ParseOhpmPackage(pf.get(), moduleRecordName2, moduleRequestName2);
519 EXPECT_EQ(CString(), entryPoint);
520
521 // delete info
522 delete info;
523 recordInfo.erase(moduleRecordName2);
524 }
525
HWTEST_F_L0(EcmaModuleTest,FindPackageInTopLevel)526 HWTEST_F_L0(EcmaModuleTest, FindPackageInTopLevel)
527 {
528 CString baseFilename = "merge.abc";
529 const char *data = R"(
530 .language ECMAScript
531 .function any func_main_0(any a0, any a1, any a2) {
532 ldai 1
533 return
534 }
535 )";
536 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
537 Parser parser;
538 auto res = parser.Parse(data);
539 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
540 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
541
542 // start with packagePath
543 CString moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName";
544 CString packagePath = "pkg_modules";
545 CString result = "pkg_modules/0/@bundle:com.bundleName.test/moduleName/requestModuleName";
546 pf->InsertJSRecordInfo(result);
547 CString entryPoint = ModulePathHelper::FindPackageInTopLevel(pf.get(), moduleRequestName, packagePath);
548 EXPECT_EQ(result, entryPoint);
549 }
550
HWTEST_F_L0(EcmaModuleTest,NeedTranstale)551 HWTEST_F_L0(EcmaModuleTest, NeedTranstale)
552 {
553 // start with @bundle
554 CString requestName = "@bundle:com.bundleName.test/moduleName/requestModuleName";
555 bool res = ModulePathHelper::NeedTranstale(requestName);
556 EXPECT_EQ(res, false);
557
558 // start with @package:
559 requestName = "@package:test";
560 res = ModulePathHelper::NeedTranstale(requestName);
561 EXPECT_EQ(res, false);
562
563 // start with .
564 requestName = "./test";
565 res = ModulePathHelper::NeedTranstale(requestName);
566 EXPECT_EQ(res, false);
567
568 // start with @, has :
569 requestName = "@test:";
570 res = ModulePathHelper::NeedTranstale(requestName);
571 EXPECT_EQ(res, false);
572
573 // start with @, don't has :
574 requestName = "@test";
575 res = ModulePathHelper::NeedTranstale(requestName);
576 EXPECT_EQ(res, true);
577
578 // other branches
579 requestName = "test";
580 res = ModulePathHelper::NeedTranstale(requestName);
581 EXPECT_EQ(res, true);
582 }
583
HWTEST_F_L0(EcmaModuleTest,TranstaleExpressionInput)584 HWTEST_F_L0(EcmaModuleTest, TranstaleExpressionInput)
585 {
586 CString baseFilename = "merge.abc";
587 const char *data = R"(
588 .language ECMAScript
589 .function any func_main_0(any a0, any a1, any a2) {
590 ldai 1
591 return
592 }
593 )";
594 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
595 Parser parser;
596 auto res = parser.Parse(data);
597 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
598 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
599
600 // start with @arkui-x.
601 CString requestPath = "@arkui-x.test/moduleName/requestModuleName";
602 ModulePathHelper::TranstaleExpressionInput(pf.get(), requestPath);
603 EXPECT_EQ(requestPath, "@ohos:test/moduleName/requestModuleName");
604
605 requestPath = "@ohos.app:@native.system.app";
606 CString fieldName = requestPath;
607 pf->InsertNpmEntries(requestPath, fieldName);
608 ModulePathHelper::TranstaleExpressionInput(pf.get(), requestPath);
609 EXPECT_EQ(requestPath, "@ohos:app:@native.system.app");
610 }
611
HWTEST_F_L0(EcmaModuleTest,ParseFileNameToVMAName2)612 HWTEST_F_L0(EcmaModuleTest, ParseFileNameToVMAName2)
613 {
614 // has .js
615 CString filename = "test.js";
616 CString res = ModulePathHelper::ParseFileNameToVMAName(filename);
617 EXPECT_EQ(res, "ArkTS Code");
618
619 // other branches
620 filename = "test.ts";
621 res = ModulePathHelper::ParseFileNameToVMAName(filename);
622 EXPECT_EQ(res, "ArkTS Code");
623 }
624
HWTEST_F_L0(EcmaModuleTest,GetRecordName1)625 HWTEST_F_L0(EcmaModuleTest, GetRecordName1)
626 {
627 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_module_base.abc";
628
629 JSNApi::EnableUserUncaughtErrorHandler(instance);
630
631 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_module_base");
632 EXPECT_TRUE(result);
633 }
634
HWTEST_F_L0(EcmaModuleTest,GetRecordName2)635 HWTEST_F_L0(EcmaModuleTest, GetRecordName2)
636 {
637 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_A.abc";
638
639 JSNApi::EnableUserUncaughtErrorHandler(instance);
640
641 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_A");
642 EXPECT_TRUE(result);
643 }
644
HWTEST_F_L0(EcmaModuleTest,GetExportObjectIndex)645 HWTEST_F_L0(EcmaModuleTest, GetExportObjectIndex)
646 {
647 ecmascript::ThreadNativeScope nativeScope(thread);
648 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
649
650 JSNApi::EnableUserUncaughtErrorHandler(instance);
651
652 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
653 JSNApi::GetExportObject(instance, "module_test_module_test_B", "a");
654 EXPECT_TRUE(result);
655 }
656
HWTEST_F_L0(EcmaModuleTest,HostResolveImportedModuleBundlePack)657 HWTEST_F_L0(EcmaModuleTest, HostResolveImportedModuleBundlePack)
658 {
659 CString baseFileName = MODULE_ABC_PATH "module_test_module_test_A.abc";
660
661 JSNApi::EnableUserUncaughtErrorHandler(instance);
662
663 ModuleManager *moduleManager = thread->GetModuleManager();
664 ObjectFactory *factory = instance->GetFactory();
665 JSHandle<SourceTextModule> module = factory->NewSourceTextModule();
666 JSHandle<JSTaggedValue> moduleRecord(thread, module.GetTaggedValue());
667 moduleManager->AddResolveImportedModule(baseFileName, moduleRecord.GetTaggedValue());
668 JSHandle<JSTaggedValue> res = ModuleResolver::HostResolveImportedModule(thread, baseFileName);
669
670 EXPECT_EQ(moduleRecord->GetRawData(), res.GetTaggedValue().GetRawData());
671 }
672
HWTEST_F_L0(EcmaModuleTest,HostResolveImportedModuleBundlePack2)673 HWTEST_F_L0(EcmaModuleTest, HostResolveImportedModuleBundlePack2)
674 {
675 CString recordName = "module_test_module_test_A";
676 CString baseFileName = MODULE_ABC_PATH "module_test_module_test_A.abc";
677 CString record = JSPandaFile::ENTRY_MAIN_FUNCTION;
678 std::shared_ptr<JSPandaFile> jsPandaFile =
679 JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, baseFileName, record);
680 EXPECT_NE(jsPandaFile, nullptr);
681 JSHandle<JSTaggedValue> res1 =
682 ModuleResolver::HostResolveImportedModule(thread, baseFileName, record, jsPandaFile.get(), false);
683 EXPECT_NE(res1.GetTaggedValue(), JSTaggedValue::Undefined());
684 JSHandle<JSTaggedValue> res2 =
685 ModuleResolver::HostResolveImportedModule(thread, baseFileName, record, jsPandaFile.get(), false);
686 EXPECT_NE(res2.GetTaggedValue(), JSTaggedValue::Undefined());
687 }
688
HWTEST_F_L0(EcmaModuleTest,IsSharedModuleLoaded)689 HWTEST_F_L0(EcmaModuleTest, IsSharedModuleLoaded)
690 {
691 CString recordName = "module_test_module_test_A";
692 ModuleManager *moduleManager = thread->GetModuleManager();
693 bool res = moduleManager->IsSharedModuleLoaded(recordName);
694 EXPECT_EQ(res, false);
695 }
696
HWTEST_F_L0(EcmaModuleTest,GetModuleValueInner)697 HWTEST_F_L0(EcmaModuleTest, GetModuleValueInner)
698 {
699 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
700 JSNApi::EnableUserUncaughtErrorHandler(instance);
701 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
702 EXPECT_TRUE(result);
703 ModuleManager *moduleManager = thread->GetModuleManager();
704 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
705 JSHandle<JSTaggedValue> moduleRecord = JSHandle<JSTaggedValue>::Cast(module);
706
707 JSTaggedValue res1 = ModuleValueAccessor::GetModuleValueInner(thread, 0, moduleRecord);
708 EXPECT_EQ(res1, JSTaggedValue::Hole());
709
710 JSTaggedValue res2 = ModuleValueAccessor::GetModuleValueOuter(thread, 0, moduleRecord);
711 EXPECT_TRUE(res2.IsInt());
712 }
713
HWTEST_F_L0(EcmaModuleTest,GetModuleValueOuterInternal)714 HWTEST_F_L0(EcmaModuleTest, GetModuleValueOuterInternal)
715 {
716 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
717 JSNApi::EnableUserUncaughtErrorHandler(instance);
718 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
719 EXPECT_TRUE(result);
720 ModuleManager *moduleManager = thread->GetModuleManager();
721 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_B");
722 JSHandle<JSTaggedValue> moduleRecord = JSHandle<JSTaggedValue>::Cast(module);
723
724 // moduleEnvironment IsUndefined
725 JSTaggedValue res = ModuleValueAccessor::GetModuleValueOuter(thread, 0, moduleRecord);
726 EXPECT_TRUE(res.IsSpecial());
727 }
728
HWTEST_F_L0(EcmaModuleTest,GetModuleNamespaceInternal)729 HWTEST_F_L0(EcmaModuleTest, GetModuleNamespaceInternal)
730 {
731 CString localName = "foo";
732
733 ObjectFactory* objFactory = thread->GetEcmaVM()->GetFactory();
734 JSHandle<JSTaggedValue> localNameHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName));
735
736 // moduleEnvironment IsUndefined
737 JSHandle<SourceTextModule> module = objFactory->NewSourceTextModule();
738 JSTaggedValue res1 = MockDeprecatedModuleValueAccessor::GetModuleNamespaceInternal(thread,
739 localNameHandle.GetTaggedValue(), module.GetTaggedValue());
740 EXPECT_EQ(res1, thread->GlobalConstants()->GetUndefined());
741
742 // FindEntry fail
743 JSHandle<NameDictionary> map(NameDictionary::Create(thread, NameDictionary::ComputeHashTableSize(1)));
744 module->SetEnvironment(thread, map);
745 JSTaggedValue res2 = MockDeprecatedModuleValueAccessor::GetModuleNamespaceInternal(thread,
746 localNameHandle.GetTaggedValue(), module.GetTaggedValue());
747 EXPECT_EQ(res2, thread->GlobalConstants()->GetUndefined());
748 }
749
HWTEST_F_L0(EcmaModuleTest,GetExportObjectIndex2)750 HWTEST_F_L0(EcmaModuleTest, GetExportObjectIndex2)
751 {
752 CString key = "module_test_module_test_A";
753 ModuleManager *moduleManager = thread->GetModuleManager();
754 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
755 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
756
757 // EcmaModuleRecordNameString is empty
758 int res1 = moduleManager->GetExportObjectIndex(thread->GetEcmaVM(), module, key);
759 EXPECT_EQ(res1, 0);
760
761 // EcmaModuleRecordNameString is not empty
762 module->SetEcmaModuleRecordNameString("test");
763 int res2 = moduleManager->GetExportObjectIndex(thread->GetEcmaVM(), module, key);
764 EXPECT_EQ(res2, 0);
765 }
766
HWTEST_F_L0(EcmaModuleTest,GetModuleNameSpaceFromFile)767 HWTEST_F_L0(EcmaModuleTest, GetModuleNameSpaceFromFile)
768 {
769 CString recordName1 = "a";
770 CString recordName2 = "module_test_module_test_B";
771 CString baseFileName = MODULE_ABC_PATH "module_test_module_test_B.abc";
772
773 // ExecuteFromAbcFile is success
774 JSHandle<JSTaggedValue> res2 = ecmascript::NapiModuleLoader::GetModuleNameSpace(thread, recordName2, baseFileName);
775 EXPECT_NE(res2, thread->GlobalConstants()->GetHandledUndefinedString());
776
777 // ExecuteFromAbcFile is fail
778 JSHandle<JSTaggedValue> res1 = ecmascript::NapiModuleLoader::GetModuleNameSpace(thread, recordName1, baseFileName);
779 EXPECT_EQ(res1.GetTaggedValue(), JSTaggedValue::Exception());
780 }
781
HWTEST_F_L0(EcmaModuleTest,TryGetImportedModule)782 HWTEST_F_L0(EcmaModuleTest, TryGetImportedModule)
783 {
784 // TryGetImportedModule can not found Module
785 CString moduleName = "moduleName";
786 ModuleManager *moduleManager = thread->GetModuleManager();
787 JSHandle<JSTaggedValue> res1 = moduleManager->TryGetImportedModule(moduleName);
788 EXPECT_EQ(res1, thread->GlobalConstants()->GetHandledUndefined());
789
790 // TryGetImportedModule can found Module
791 ObjectFactory *factory = instance->GetFactory();
792 JSHandle<SourceTextModule> module = factory->NewSourceTextModule();
793 JSHandle<JSTaggedValue> moduleRecord(thread, module.GetTaggedValue());
794 moduleManager->AddResolveImportedModule(moduleName, moduleRecord.GetTaggedValue());
795 JSHandle<JSTaggedValue> res2 = moduleManager->TryGetImportedModule(moduleName);
796 EXPECT_EQ(res2, moduleRecord);
797 }
798
HWTEST_F_L0(EcmaModuleTest,PreventExtensions_IsExtensible)799 HWTEST_F_L0(EcmaModuleTest, PreventExtensions_IsExtensible)
800 {
801 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
802 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
803 JSHandle<LocalExportEntry> localExportEntry1 = objectFactory->NewLocalExportEntry();
804 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry1, 0, 2);
805 JSHandle<LocalExportEntry> localExportEntry2 = objectFactory->NewLocalExportEntry();
806 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry2, 1, 2);
807 JSHandle<TaggedArray> localExportEntries(thread, module->GetLocalExportEntries(thread));
808 CString baseFileName = "a.abc";
809 module->SetEcmaModuleFilenameString(baseFileName);
810 ModuleManager *moduleManager = thread->GetModuleManager();
811 JSHandle<JSTaggedValue> moduleRecord = JSHandle<JSTaggedValue>::Cast(module);
812 moduleManager->AddResolveImportedModule(baseFileName, moduleRecord.GetTaggedValue());
813 JSHandle<ModuleNamespace> np =
814 ModuleNamespace::ModuleNamespaceCreate(thread, moduleRecord, localExportEntries);
815 EXPECT_FALSE(np->IsExtensible());
816 EXPECT_TRUE(ModuleNamespace::PreventExtensions());
817 }
818
HWTEST_F_L0(EcmaModuleTest,ConcatFileNameWithMerge1)819 HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge1)
820 {
821 CString baseFilename = "merge.abc";
822 const char *data = R"(
823 .language ECMAScript
824 .function any func_main_0(any a0, any a1, any a2) {
825 ldai 1
826 return
827 }
828 )";
829 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
830 Parser parser;
831 auto res = parser.Parse(data);
832 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
833 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
834
835 // Test moduleRequestName start with "@bundle"
836 CString moduleRecordName = "moduleTest1";
837 CString moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
838 CString result = "com.bundleName.test/moduleName/requestModuleName1";
839 CString entryPoint = ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFilename, moduleRecordName,
840 moduleRequestName);
841 EXPECT_EQ(result, entryPoint);
842
843 // Test moduleRequestName start with "@package:"
844 moduleRequestName = "@package:test";
845 result = "test";
846 entryPoint = ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFilename, moduleRecordName,
847 moduleRequestName);
848 EXPECT_EQ(result, entryPoint);
849
850 // Test cross application
851 moduleRecordName = "@bundle:com.bundleName1.test/moduleName/requestModuleName1";
852 CString newBaseFileName = "/data/storage/el1/bundle/com.bundleName.test/moduleName/moduleName/ets/modules.abc";
853 ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFilename, moduleRecordName, moduleRequestName);
854 EXPECT_EQ(baseFilename, newBaseFileName);
855 }
856
HWTEST_F_L0(EcmaModuleTest,ConcatFileNameWithMerge_Normalized)857 HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge_Normalized)
858 {
859 const CString baseFilename = "merge.abc";
860 CString baseFilename1 = baseFilename;
861 const char *data = R"(
862 .language ECMAScript
863 .function any func_main_0(any a0, any a1, any a2) {
864 ldai 1
865 return
866 }
867 )";
868 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
869 Parser parser;
870 auto res = parser.Parse(data);
871 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
872 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
873 // Test moduleRequestName start with "@normalized"
874 CString moduleRecordName1 = "moduleTest1";
875 CString moduleRequestName1 = "@normalized:N&&&entryPath&version";
876 CString result1 = "&entryPath&version";
877 CString entryPoint1 = ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFilename1, moduleRecordName1,
878 moduleRequestName1);
879 EXPECT_EQ(result1, entryPoint1);
880 EXPECT_EQ(baseFilename1, baseFilename);
881
882 // Test cross application
883 CMap<CString, CMap<CString, CVector<CString>>> pkgList;
884 CMap<CString, CVector<CString>> entryList;
885 entryList["entry"] = {
886 "packageName", "entry",
887 "bundleName", "",
888 "moduleName", "",
889 "version", "",
890 "entryPath", "src/main/",
891 "isSO", "false"
892 };
893 entryList["har"] = {
894 "packageName", "har",
895 "bundleName", "",
896 "moduleName", "",
897 "version", "1.2.0",
898 "entryPath", "Index.ets",
899 "isSO", "false"
900 };
901 pkgList["entry"] = entryList;
902 instance->SetpkgContextInfoList(pkgList);
903 CString moduleRequestName2 = "@normalized:N&moduleName&bundleNameBB&entryPath&version";
904 CString result2 = "bundleNameBB&entryPath&version";
905 CString newBaseFileName2 = "/data/storage/el1/bundle/bundleNameBB/moduleName/moduleName/ets/modules.abc";
906 CString entryPoint2 = ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFilename1, moduleRecordName1,
907 moduleRequestName2);
908 EXPECT_EQ(entryPoint2, result2);
909 EXPECT_EQ(baseFilename1, newBaseFileName2);
910 }
911
HWTEST_F_L0(EcmaModuleTest,ConcatFileNameWithMerge2)912 HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge2)
913 {
914 CString baseFilename = "merge.abc";
915 const char *data = R"(
916 .language ECMAScript
917 .function any func_main_0(any a0, any a1, any a2) {
918 ldai 1
919 return
920 }
921 )";
922 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
923 Parser parser;
924 auto res = parser.Parse(data);
925 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
926 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
927
928 // Test moduleRequestName start with "./"
929 CString moduleRecordName = "moduleTest2";
930 CString moduleRequestName = "./requestModule.js";
931 CString result = "requestModule";
932 pf->InsertJSRecordInfo(result);
933 CString entryPoint = ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFilename, moduleRecordName,
934 moduleRequestName);
935 EXPECT_EQ(result, entryPoint);
936
937 // Test moduleRecordName with "/"
938 moduleRecordName = "moduleName/moduleTest2";
939 moduleRequestName = "./requestModule.js";
940 result = "moduleName/requestModule";
941 pf->InsertJSRecordInfo(result);
942 entryPoint = ModulePathHelper::ConcatFileNameWithMerge(
943 thread, pf.get(), baseFilename, moduleRecordName, moduleRequestName);
944 EXPECT_EQ(result, entryPoint);
945 }
946
HWTEST_F_L0(EcmaModuleTest,ConcatFileNameWithMerge3)947 HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge3)
948 {
949 CString baseFilename = "merge.abc";
950 const char *data = R"(
951 .language ECMAScript
952 .function any func_main_0(any a0, any a1, any a2) {
953 ldai 1
954 return
955 }
956 )";
957 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
958 Parser parser;
959 auto res = parser.Parse(data);
960 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
961 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
962
963 // Test RecordName is not in JSPandaFile
964 CString moduleRecordName = "moduleTest3";
965 CString moduleRequestName = "./secord.js";
966 CString result = "secord";
967 CString requestFileName = "secord.abc";
968 CString entryPoint =
969 ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFilename, moduleRecordName, moduleRequestName);
970 EXPECT_EQ(baseFilename, requestFileName);
971 EXPECT_EQ(result, entryPoint);
972
973 // Test RecordName is not in JSPandaFile and baseFilename with "/" and moduleRequestName with "/"
974 baseFilename = "test/merge.abc";
975 std::unique_ptr<const File> pfPtr2 = pandasm::AsmEmitter::Emit(res.Value());
976 std::shared_ptr<JSPandaFile> pf2 = pfManager->NewJSPandaFile(pfPtr2.release(), baseFilename);
977
978 moduleRecordName = "moduleTest3";
979 moduleRequestName = "./test/secord.js";
980 result = "secord";
981 requestFileName = "test/test/secord.abc";
982 entryPoint = ModulePathHelper::ConcatFileNameWithMerge(thread, pf2.get(), baseFilename, moduleRecordName,
983 moduleRequestName);
984 EXPECT_EQ(baseFilename, requestFileName);
985 EXPECT_EQ(result, entryPoint);
986 }
987
HWTEST_F_L0(EcmaModuleTest,ConcatFileNameWithMerge4)988 HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge4)
989 {
990 CString baseFilename = "merge.abc";
991 const char *data = R"(
992 .language ECMAScript
993 .function any func_main_0(any a0, any a1, any a2) {
994 ldai 1
995 return
996 }
997 )";
998 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
999 Parser parser;
1000 auto res = parser.Parse(data);
1001 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
1002 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
1003 CUnorderedMap<std::string_view, JSPandaFile::JSRecordInfo*> &recordInfo =
1004 const_cast<CUnorderedMap<std::string_view, JSPandaFile::JSRecordInfo*>&>(pf->GetJSRecordInfo());
1005
1006 CString moduleRecordName = "node_modules/0/moduleTest4/index";
1007 CString moduleRequestName = "json/index";
1008 CString result = "node_modules/0/moduleTest4/node_modules/json/index";
1009 JSPandaFile::JSRecordInfo *info = new JSPandaFile::JSRecordInfo();
1010 info->npmPackageName = "node_modules/0/moduleTest4";
1011 recordInfo.insert({std::string_view(moduleRecordName.c_str(), moduleRecordName.size()), info});
1012 recordInfo.insert({std::string_view(result.c_str(), result.size()), info});
1013 CString entryPoint = ModulePathHelper::ConcatFileNameWithMerge(
1014 thread, pf.get(), baseFilename, moduleRecordName, moduleRequestName);
1015 EXPECT_EQ(result, entryPoint);
1016
1017 // delete info
1018 delete info;
1019 recordInfo.erase(std::string_view(moduleRecordName.c_str(), moduleRecordName.size()));
1020 recordInfo.erase(std::string_view(result.c_str(), result.size()));
1021 }
1022
HWTEST_F_L0(EcmaModuleTest,ConcatFileNameWithMerge5)1023 HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge5)
1024 {
1025 instance->SetBundleName("com.example.myapplication");
1026 CString baseFilename = "merge.abc";
1027 const char *data = R"(
1028 .language ECMAScript
1029 .function any func_main_0(any a0, any a1, any a2) {
1030 ldai 1
1031 return
1032 }
1033 )";
1034 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
1035 Parser parser;
1036 auto res = parser.Parse(data);
1037 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
1038 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
1039
1040 CString baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
1041 CString requestName = "ets/Test";
1042 CString recordName = "com.example.myapplication/entry/ets/pages/Index";
1043 CString expectRes = "com.example.myapplication/entry/ets/Test";
1044 CString result = ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFileName, recordName,
1045 requestName);
1046 EXPECT_EQ(result, "");
1047
1048 pf->InsertJSRecordInfo(expectRes);
1049 result = ModulePathHelper::ConcatFileNameWithMerge(thread, pf.get(), baseFileName, recordName,
1050 requestName);
1051 EXPECT_EQ(result, expectRes);
1052 }
1053
1054
HWTEST_F_L0(EcmaModuleTest,NormalizePath)1055 HWTEST_F_L0(EcmaModuleTest, NormalizePath)
1056 {
1057 CString res1 = "node_modules/0/moduleTest/index";
1058 CString moduleRecordName1 = "node_modules///0//moduleTest/index";
1059
1060 CString res2 = "node_modules/0/moduleTest/index";
1061 CString moduleRecordName2 = "./node_modules///0//moduleTest/index";
1062
1063 CString res3 = "node_modules/0/moduleTest/index";
1064 CString moduleRecordName3 = "../node_modules/0/moduleTest///index";
1065
1066 CString res4 = "moduleTest/index";
1067 CString moduleRecordName4 = "./node_modules/..//moduleTest////index";
1068
1069 CString res5 = "node_modules/moduleTest/index";
1070 CString moduleRecordName5 = "node_modules/moduleTest/index/";
1071
1072 CString normalName1 = PathHelper::NormalizePath(moduleRecordName1);
1073 CString normalName2 = PathHelper::NormalizePath(moduleRecordName2);
1074 CString normalName3 = PathHelper::NormalizePath(moduleRecordName3);
1075 CString normalName4 = PathHelper::NormalizePath(moduleRecordName4);
1076 CString normalName5 = PathHelper::NormalizePath(moduleRecordName5);
1077
1078 EXPECT_EQ(res1, normalName1);
1079 EXPECT_EQ(res2, normalName2);
1080 EXPECT_EQ(res3, normalName3);
1081 EXPECT_EQ(res4, normalName4);
1082 EXPECT_EQ(res5, normalName5);
1083 }
1084
HWTEST_F_L0(EcmaModuleTest,ParseAbcPathAndOhmUrl)1085 HWTEST_F_L0(EcmaModuleTest, ParseAbcPathAndOhmUrl)
1086 {
1087 // old pages url
1088 instance->SetBundleName("com.bundleName.test");
1089 instance->SetModuleName("moduleName");
1090 CString inputFileName = "moduleName/ets/pages/index.abc";
1091 CString outFileName = "";
1092 CString res1 = "com.bundleName.test/moduleName/ets/pages/index";
1093 CString entryPoint;
1094 ModulePathHelper::ParseAbcPathAndOhmUrl(instance, inputFileName, outFileName, entryPoint);
1095 EXPECT_EQ(entryPoint, res1);
1096 EXPECT_EQ(outFileName, "");
1097
1098 // new pages url
1099 inputFileName = "@bundle:com.bundleName.test/moduleName/ets/pages/index.abc";
1100 ModulePathHelper::ParseAbcPathAndOhmUrl(instance, inputFileName, outFileName, entryPoint);
1101 EXPECT_EQ(entryPoint, res1);
1102 EXPECT_EQ(outFileName, "/data/storage/el1/bundle/moduleName/ets/modules.abc");
1103
1104 // new pages url Intra-application cross hap
1105 inputFileName = "@bundle:com.bundleName.test/moduleName1/ets/pages/index.abc";
1106 CString outRes = "/data/storage/el1/bundle/moduleName1/ets/modules.abc";
1107 CString res2 = "com.bundleName.test/moduleName1/ets/pages/index";
1108 ModulePathHelper::ParseAbcPathAndOhmUrl(instance, inputFileName, outFileName, entryPoint);
1109 EXPECT_EQ(entryPoint, res2);
1110 EXPECT_EQ(outFileName, outRes);
1111
1112 // new pages url Cross-application
1113 inputFileName = "@bundle:com.bundleName.test1/moduleName1/ets/pages/index.abc";
1114 CString outRes1 = "/data/storage/el1/bundle/com.bundleName.test1/moduleName1/moduleName1/ets/modules.abc";
1115 CString res3 = "com.bundleName.test1/moduleName1/ets/pages/index";
1116 ModulePathHelper::ParseAbcPathAndOhmUrl(instance, inputFileName, outFileName, entryPoint);
1117 EXPECT_EQ(entryPoint, res3);
1118 EXPECT_EQ(outFileName, outRes1);
1119
1120 // worker url Intra-application cross hap
1121 inputFileName = "/data/storage/el1/bundle/entry/ets/mainAbility.abc";
1122 CString outRes2 = "/data/storage/el1/bundle/entry/ets/modules.abc";
1123 CString res4 = "com.bundleName.test/entry/ets/mainAbility";
1124 ModulePathHelper::ParseAbcPathAndOhmUrl(instance, inputFileName, outFileName, entryPoint);
1125 EXPECT_EQ(entryPoint, res4);
1126 EXPECT_EQ(outFileName, outRes2);
1127
1128 // worker url
1129 outFileName = "";
1130 inputFileName = "/data/storage/el1/bundle/moduleName/ets/mainAbility.abc";
1131 CString res5 = "com.bundleName.test/moduleName/ets/mainAbility";
1132 ModulePathHelper::ParseAbcPathAndOhmUrl(instance, inputFileName, outFileName, entryPoint);
1133 EXPECT_EQ(entryPoint, res5);
1134 EXPECT_EQ(outFileName, "/data/storage/el1/bundle/moduleName/ets/modules.abc");
1135
1136 CMap<CString, CMap<CString, CVector<CString>>> pkgList;
1137 CMap<CString, CVector<CString>> entryList;
1138 entryList["entry"] = {
1139 "packageName", "entry",
1140 "bundleName", "",
1141 "moduleName", "",
1142 "version", "",
1143 "entryPath", "src/main/",
1144 "isSO", "false"
1145 };
1146 entryList["har"] = {
1147 "packageName", "har",
1148 "bundleName", "",
1149 "moduleName", "",
1150 "version", "1.2.0",
1151 "entryPath", "Index.ets",
1152 "isSO", "false"
1153 };
1154 pkgList["entry"] = entryList;
1155 instance->SetpkgContextInfoList(pkgList);
1156
1157 inputFileName = "com.bundleName.test/moduleName/ets/pages/index";
1158 CString outRes3 = "/data/storage/el1/bundle/moduleName/ets/modules.abc";
1159 CString res6 = "com.bundleName.test/com.bundleName.test/moduleName/ets/pages/index";
1160 ModulePathHelper::ParseAbcPathAndOhmUrl(instance, inputFileName, outFileName, entryPoint);
1161 EXPECT_EQ(entryPoint, res6);
1162 EXPECT_EQ(outFileName, outRes3);
1163 }
1164
HWTEST_F_L0(EcmaModuleTest,CheckNativeModule)1165 HWTEST_F_L0(EcmaModuleTest, CheckNativeModule)
1166 {
1167 // load file
1168 CString requestName1 = "@bundle:bundleName/moduleName/ets/index";
1169
1170 // load native modules
1171 CString requestName2 = "@ohos:router";
1172 CString requestName3 = "@app:bundleName/moduleName/lib*.so";
1173 CString requestName4 = "@native:system.app";
1174 CString requestName5 = "@xxx:internal";
1175
1176 // load npm Packages
1177 CString requestName6 = "@package:pkg_modules/.ohpm/json5@2.2.3/pkg_modules/json5/dist/index";
1178 CString requestName7 = "@ohos/common";
1179
1180 EXPECT_EQ(SourceTextModule::IsNativeModule(requestName1), false);
1181 EXPECT_EQ(SourceTextModule::IsNativeModule(requestName6), false);
1182 EXPECT_EQ(SourceTextModule::IsNativeModule(requestName7), false);
1183
1184 EXPECT_EQ(SourceTextModule::IsNativeModule(requestName2), true);
1185 EXPECT_EQ(SourceTextModule::GetNativeModuleType(requestName2), ModuleTypes::OHOS_MODULE);
1186
1187 EXPECT_EQ(SourceTextModule::IsNativeModule(requestName3), true);
1188 EXPECT_EQ(SourceTextModule::GetNativeModuleType(requestName3), ModuleTypes::APP_MODULE);
1189
1190 EXPECT_EQ(SourceTextModule::IsNativeModule(requestName4), true);
1191 EXPECT_EQ(SourceTextModule::GetNativeModuleType(requestName4), ModuleTypes::NATIVE_MODULE);
1192
1193 EXPECT_EQ(SourceTextModule::IsNativeModule(requestName5), true);
1194 EXPECT_EQ(SourceTextModule::GetNativeModuleType(requestName5), ModuleTypes::INTERNAL_MODULE);
1195 }
1196
HWTEST_F_L0(EcmaModuleTest,ResolveDirPath)1197 HWTEST_F_L0(EcmaModuleTest, ResolveDirPath)
1198 {
1199 CString inputFileName = "moduleName/ets/pages/index.abc";
1200 CString resName1 = "moduleName/ets/pages/";
1201 CString outFileName = PathHelper::ResolveDirPath(inputFileName);
1202 EXPECT_EQ(outFileName, resName1);
1203
1204 inputFileName = "moduleName\\ets\\pages\\index.abc";
1205 CString resName2 = "moduleName\\ets\\pages\\";
1206 outFileName = PathHelper::ResolveDirPath(inputFileName);
1207 EXPECT_EQ(outFileName, resName2);
1208
1209 inputFileName = "cjs";
1210 CString resName3 = "";
1211 outFileName = PathHelper::ResolveDirPath(inputFileName);
1212 EXPECT_EQ(outFileName, resName3);
1213 }
1214
HWTEST_F_L0(EcmaModuleTest,DeleteNamespace)1215 HWTEST_F_L0(EcmaModuleTest, DeleteNamespace)
1216 {
1217 CString inputFileName = "moduleName@nameSpace";
1218 CString res1 = "moduleName";
1219 PathHelper::DeleteNamespace(inputFileName);
1220 EXPECT_EQ(inputFileName, res1);
1221
1222 inputFileName = "moduleName";
1223 CString res2 = "moduleName";
1224 PathHelper::DeleteNamespace(inputFileName);
1225 EXPECT_EQ(inputFileName, res2);
1226 }
1227
HWTEST_F_L0(EcmaModuleTest,AdaptOldIsaRecord)1228 HWTEST_F_L0(EcmaModuleTest, AdaptOldIsaRecord)
1229 {
1230 CString inputFileName = "bundleName/moduleName@namespace/moduleName";
1231 CString res1 = "moduleName";
1232 PathHelper::AdaptOldIsaRecord(inputFileName);
1233 EXPECT_EQ(inputFileName, res1);
1234 }
1235
HWTEST_F_L0(EcmaModuleTest,GetStrippedModuleName)1236 HWTEST_F_L0(EcmaModuleTest, GetStrippedModuleName)
1237 {
1238 CString inputFileName = "@ohos:hilog";
1239 CString res1 = "hilog";
1240 CString outFileName = PathHelper::GetStrippedModuleName(inputFileName);
1241 EXPECT_EQ(outFileName, res1);
1242 }
1243
HWTEST_F_L0(EcmaModuleTest,GetInternalModulePrefix)1244 HWTEST_F_L0(EcmaModuleTest, GetInternalModulePrefix)
1245 {
1246 CString inputFileName = "@ohos:hilog";
1247 CString res1 = "ohos";
1248 CString outFileName = PathHelper::GetInternalModulePrefix(inputFileName);
1249 EXPECT_EQ(outFileName, res1);
1250 }
1251
HWTEST_F_L0(EcmaModuleTest,IsNativeModuleRequest)1252 HWTEST_F_L0(EcmaModuleTest, IsNativeModuleRequest)
1253 {
1254 CString inputFileName = "json5";
1255 bool res1 = ModulePathHelper::IsNativeModuleRequest(inputFileName);
1256 EXPECT_TRUE(!res1);
1257
1258 inputFileName = "@ohos:hilog";
1259 bool res2 = ModulePathHelper::IsNativeModuleRequest(inputFileName);
1260 EXPECT_TRUE(res2);
1261
1262 inputFileName = "@app:xxxx";
1263 bool res3 = ModulePathHelper::IsNativeModuleRequest(inputFileName);
1264 EXPECT_TRUE(res3);
1265
1266 inputFileName = "@native:xxxx";
1267 bool res4 = ModulePathHelper::IsNativeModuleRequest(inputFileName);
1268 EXPECT_TRUE(res4);
1269 }
1270
HWTEST_F_L0(EcmaModuleTest,IsImportFile)1271 HWTEST_F_L0(EcmaModuleTest, IsImportFile)
1272 {
1273 CString inputFileName = "./test";
1274 bool res1 = ModulePathHelper::IsImportFile(inputFileName);
1275 EXPECT_TRUE(res1);
1276 CString outFileName = ModulePathHelper::RemoveSuffix(inputFileName);
1277 EXPECT_EQ(outFileName, inputFileName);
1278
1279 inputFileName = "test";
1280 bool res2 = ModulePathHelper::IsImportFile(inputFileName);
1281 EXPECT_TRUE(!res2);
1282 outFileName = ModulePathHelper::RemoveSuffix(inputFileName);
1283 EXPECT_EQ(outFileName, inputFileName);
1284
1285 CString result = "test";
1286 inputFileName = "test.js";
1287 bool res3 = ModulePathHelper::IsImportFile(inputFileName);
1288 EXPECT_TRUE(res3);
1289 outFileName = ModulePathHelper::RemoveSuffix(inputFileName);
1290 EXPECT_EQ(outFileName, result);
1291
1292 inputFileName = "test.ts";
1293 bool res4 = ModulePathHelper::IsImportFile(inputFileName);
1294 EXPECT_TRUE(res4);
1295 outFileName = ModulePathHelper::RemoveSuffix(inputFileName);
1296 EXPECT_EQ(outFileName, result);
1297
1298 inputFileName = "test.ets";
1299 bool res5 = ModulePathHelper::IsImportFile(inputFileName);
1300 EXPECT_TRUE(res5);
1301 outFileName = ModulePathHelper::RemoveSuffix(inputFileName);
1302 EXPECT_EQ(outFileName, result);
1303
1304 inputFileName = "test.json";
1305 bool res6 = ModulePathHelper::IsImportFile(inputFileName);
1306 EXPECT_TRUE(res6);
1307 outFileName = ModulePathHelper::RemoveSuffix(inputFileName);
1308 EXPECT_EQ(outFileName, result);
1309 }
1310
HWTEST_F_L0(EcmaModuleTest,GetModuleNameWithPath)1311 HWTEST_F_L0(EcmaModuleTest, GetModuleNameWithPath)
1312 {
1313 CString inputPath1 = "com.example.application/entry";
1314 CString res1 = "entry";
1315 CString outFileName1 = ModulePathHelper::GetModuleNameWithPath(inputPath1);
1316 EXPECT_EQ(outFileName1, res1);
1317
1318 CString inputPath2 = "com.example.applicationentry";
1319 CString res2 = "";
1320 CString outFileName2 = ModulePathHelper::GetModuleNameWithPath(inputPath2);
1321 EXPECT_EQ(outFileName2, res2);
1322 }
1323
HWTEST_F_L0(EcmaModuleTest,ConcatPandaFilePath)1324 HWTEST_F_L0(EcmaModuleTest, ConcatPandaFilePath)
1325 {
1326 CString inputPath1 = "entry";
1327 CString res1 = "/data/storage/el1/bundle/entry/ets/modules.abc";
1328 CString outFileName1 = ModulePathHelper::ConcatPandaFilePath(inputPath1);
1329 EXPECT_EQ(outFileName1, res1);
1330
1331 CString inputPath2 = "";
1332 CString res2 = "";
1333 CString outFileName2 = ModulePathHelper::ConcatPandaFilePath(inputPath2);
1334 EXPECT_EQ(outFileName2, res2);
1335
1336 CString inputPath3 = "entry1";
1337 CString res3 = "/data/storage/el1/bundle/entry1/ets/modules.abc";
1338 CString outFileName3 = ModulePathHelper::ConcatPandaFilePath(inputPath3);
1339 EXPECT_EQ(outFileName3, res3);
1340 }
1341
HWTEST_F_L0(EcmaModuleTest,ParseFileNameToVMAName)1342 HWTEST_F_L0(EcmaModuleTest, ParseFileNameToVMAName)
1343 {
1344 CString inputFileName = "test.abc";
1345 CString outFileName = ModulePathHelper::ParseFileNameToVMAName(inputFileName);
1346 CString exceptOutFileName = "ArkTS Code:test.abc";
1347 EXPECT_EQ(outFileName, exceptOutFileName);
1348
1349 inputFileName = "";
1350 outFileName = ModulePathHelper::ParseFileNameToVMAName(inputFileName);
1351 exceptOutFileName = "ArkTS Code";
1352 EXPECT_EQ(outFileName, exceptOutFileName);
1353
1354 inputFileName = "libutil.z.so/util.js";
1355 outFileName = ModulePathHelper::ParseFileNameToVMAName(inputFileName);
1356 exceptOutFileName = "ArkTS Code:libutil.z.so/util.js";
1357 EXPECT_EQ(outFileName, exceptOutFileName);
1358
1359 inputFileName = "libutil.HashMap.z.so/util.HashMap.js";
1360 outFileName = ModulePathHelper::ParseFileNameToVMAName(inputFileName);
1361 exceptOutFileName = "ArkTS Code:libhashmap.z.so/HashMap.js";
1362 EXPECT_EQ(outFileName, exceptOutFileName);
1363
1364 inputFileName = "/data/storage/el1/bundle/com.example.application/ets/modules.abc";
1365 outFileName = ModulePathHelper::ParseFileNameToVMAName(inputFileName);
1366 exceptOutFileName = "ArkTS Code:com.example.application/ets/modules.abc";
1367 EXPECT_EQ(outFileName, exceptOutFileName);
1368 }
1369
HWTEST_F_L0(EcmaModuleTest,ConcatUnifiedOhmUrl)1370 HWTEST_F_L0(EcmaModuleTest, ConcatUnifiedOhmUrl)
1371 {
1372 CString pkgName = "entry";
1373 CString path = "/Index";
1374 CString version = "1.0.0";
1375 CString outFileName = ModulePathHelper::ConcatUnifiedOhmUrl("", pkgName, "", path, version);
1376 CString exceptOutFileName = "&entry/src/main/Index&1.0.0";
1377 EXPECT_EQ(outFileName, exceptOutFileName);
1378
1379 CString path2 = "Index";
1380 outFileName = ModulePathHelper::ConcatUnifiedOhmUrl("", path2, version);
1381 exceptOutFileName = "&Index&1.0.0";
1382 EXPECT_EQ(outFileName, exceptOutFileName);
1383 }
1384
HWTEST_F_L0(EcmaModuleTest,ConcatImportFileNormalizedOhmurl)1385 HWTEST_F_L0(EcmaModuleTest, ConcatImportFileNormalizedOhmurl)
1386 {
1387 CString recordPath = "&entry/ets/";
1388 CString requestName = "test";
1389 CString outFileName = ModulePathHelper::ConcatImportFileNormalizedOhmurl(recordPath, requestName, "");
1390 CString exceptOutFileName = "&entry/ets/test&";
1391 EXPECT_EQ(outFileName, exceptOutFileName);
1392 }
1393
HWTEST_F_L0(EcmaModuleTest,ConcatNativeSoNormalizedOhmurl)1394 HWTEST_F_L0(EcmaModuleTest, ConcatNativeSoNormalizedOhmurl)
1395 {
1396 CString pkgName = "libentry.so";
1397 CString outFileName = ModulePathHelper::ConcatNativeSoNormalizedOhmurl("", "", pkgName, "");
1398 CString exceptOutFileName = "@normalized:Y&&&libentry.so&";
1399 EXPECT_EQ(outFileName, exceptOutFileName);
1400 }
1401
HWTEST_F_L0(EcmaModuleTest,ConcatNotSoNormalizedOhmurl)1402 HWTEST_F_L0(EcmaModuleTest, ConcatNotSoNormalizedOhmurl)
1403 {
1404 CString pkgName = "har";
1405 CString path = "Index";
1406 CString version = "1.0.0";
1407 CString outFileName = ModulePathHelper::ConcatNotSoNormalizedOhmurl("", "", pkgName, path, version);
1408 CString exceptOutFileName = "@normalized:N&&&har/Index&1.0.0";
1409 EXPECT_EQ(outFileName, exceptOutFileName);
1410 }
1411
HWTEST_F_L0(EcmaModuleTest,TransformToNormalizedOhmUrl2)1412 HWTEST_F_L0(EcmaModuleTest, TransformToNormalizedOhmUrl2)
1413 {
1414 CMap<CString, CMap<CString, CVector<CString>>> pkgList;
1415 CMap<CString, CVector<CString>> entryList;
1416 entryList["hsp"] = {
1417 "packageName", "hsp",
1418 "bundleName", "com.hsp.application",
1419 "moduleName", "",
1420 "version", "",
1421 "entryPath", "",
1422 "isSO", "false"
1423 };
1424 pkgList["entry"] = entryList;
1425 instance->SetpkgContextInfoList(pkgList);
1426
1427 CString inputFileName = "/data/storage/el1/bundle/hsp/ets/modules.abc";
1428 CString outBaseFileName = "/data/storage/el1/bundle/com.example.application/hsp/hsp/ets/modules.abc";
1429 CString entryPoint = "com.example.myapplication/hsp/ets/pages/Index";
1430 CString res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
1431 EXPECT_EQ(res, "com.example.myapplication/hsp/ets/pages/Index");
1432
1433 outBaseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
1434 entryPoint = "com.hsp.application/hsp/ets/pages/Index";
1435 res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
1436 EXPECT_EQ(res, "com.hsp.application&hsp/src/main/ets/pages/Index&");
1437 }
1438
HWTEST_F_L0(EcmaModuleTest,TransformToNormalizedOhmUrl3)1439 HWTEST_F_L0(EcmaModuleTest, TransformToNormalizedOhmUrl3)
1440 {
1441 // currentModuleName.size() is 0
1442 CString inputFileName = "/data/storage/el1/bundle";
1443 CString outBaseFileName = "/data/storage/el1/bundle";
1444 CString entryPoint = "com.example.myapplication/entry@har/ets/pages/Index";
1445 CString res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
1446 EXPECT_EQ(res, "com.example.myapplication/entry@har/ets/pages/Index");
1447
1448 // pkgname.size() is 0
1449 CMap<CString, CString> list;
1450 list["har"] = "";
1451 instance->SetPkgNameList(list);
1452 inputFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
1453 outBaseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
1454 entryPoint = "com.example.myapplication/entry@har/ets/pages/Index";
1455 res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
1456 EXPECT_EQ(res, entryPoint);
1457
1458 // oldEntryPoint equal ENTRY_MAIN_FUNCTION
1459 entryPoint = "_GLOBAL::func_main_0";
1460 res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
1461 EXPECT_EQ(res, "_GLOBAL::func_main_0");
1462
1463 // oldEntryPoint is not equal ENTRY_MAIN_FUNCTION but start with &
1464 entryPoint = "&test";
1465 res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
1466 EXPECT_EQ(res, "&test");
1467 }
1468
HWTEST_F_L0(EcmaModuleTest,TranslateExpressionToNormalized)1469 HWTEST_F_L0(EcmaModuleTest, TranslateExpressionToNormalized)
1470 {
1471 instance->SetBundleName("com.example.myapplication");
1472 CString baseFilename = "merge.abc";
1473 const char *data = R"(
1474 .language ECMAScript
1475 .function any func_main_0(any a0, any a1, any a2) {
1476 ldai 1
1477 return
1478 }
1479 )";
1480 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
1481 Parser parser;
1482 auto res = parser.Parse(data);
1483 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
1484 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
1485
1486 CString requestPath = "@native:system.app";
1487 CString baseFileName = "";
1488 CString recordName = "";
1489 ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, recordName, requestPath);
1490 EXPECT_EQ(requestPath, "@native:system.app");
1491
1492 requestPath = "@ohos:hilog";
1493 ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, recordName, requestPath);
1494 EXPECT_EQ(requestPath, "@ohos:hilog");
1495
1496 requestPath = "@normalized:N&&&har/Index&1.0.0";
1497 ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, recordName, requestPath);
1498 EXPECT_EQ(requestPath, "@normalized:N&&&har/Index&1.0.0");
1499
1500 requestPath = "@arkui-x.bridge";
1501 CString result = ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, recordName,
1502 requestPath);
1503 EXPECT_EQ(result, "@ohos:bridge");
1504
1505 requestPath = "ets/Test";
1506 recordName = "&entry/ets/pages/Index&";
1507 CString recordInfo = "&entry/ets/Test&";
1508 pf->InsertJSRecordInfo(recordInfo);
1509 result = ModulePathHelper::TranslateExpressionToNormalized(thread, pf.get(), baseFileName, recordName,
1510 requestPath);
1511 EXPECT_EQ(result, "&entry/ets/Test&");
1512 }
1513
HWTEST_F_L0(EcmaModuleTest,TranslateExpressionToNormalized2)1514 HWTEST_F_L0(EcmaModuleTest, TranslateExpressionToNormalized2)
1515 {
1516 CMap<CString, CMap<CString, CVector<CString>>> pkgList;
1517 CMap<CString, CVector<CString>> entryList;
1518 entryList["entry"] = {
1519 "packageName", "entry",
1520 "bundleName", "",
1521 "moduleName", "",
1522 "version", "",
1523 "entryPath", "src/main/",
1524 "isSO", "false"
1525 };
1526 entryList["har"] = {
1527 "packageName", "har",
1528 "bundleName", "",
1529 "moduleName", "",
1530 "version", "1.2.0",
1531 "entryPath", "Index.ets",
1532 "isSO", "false"
1533 };
1534 pkgList["entry"] = entryList;
1535 instance->SetpkgContextInfoList(pkgList);
1536
1537 CString requestPath = "har";
1538 CString baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
1539 CString result = ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, "",
1540 requestPath);
1541 EXPECT_EQ(result, "@normalized:N&&&har/Index&1.2.0");
1542
1543 requestPath = "har/src/main/Test";
1544 result = ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, "",
1545 requestPath);
1546 EXPECT_EQ(result, "@normalized:N&&&har/src/main/Test&1.2.0");
1547 }
1548
HWTEST_F_L0(EcmaModuleTest,TranslateExpressionToNormalized3)1549 HWTEST_F_L0(EcmaModuleTest, TranslateExpressionToNormalized3)
1550 {
1551 instance->SetBundleName("com.example.myapplication");
1552 CString baseFilename = "merge.abc";
1553 const char *data = R"(
1554 .language ECMAScript
1555 .function any func_main_0(any a0, any a1, any a2) {
1556 ldai 1
1557 return
1558 }
1559 )";
1560 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
1561 Parser parser;
1562 auto res = parser.Parse(data);
1563 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
1564 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
1565
1566 CString requestPath = "./@normalized:N&&&har/Index&1.0.0";
1567 CString baseFileName = "";
1568 CString recordName = "";
1569 CString recordInfo = "@normalized:N&&&har/Index&1.0.0&";
1570 pf->InsertJSRecordInfo(recordInfo);
1571 CString result = ModulePathHelper::TranslateExpressionToNormalized(thread, pf.get(), baseFileName, recordName,
1572 requestPath);
1573 EXPECT_EQ(result, "./@normalized:N&&&har/Index&1.0.0");
1574
1575 requestPath = "ets/Test";
1576 recordName = "&entry/ets/pages/Index&";
1577 result = ModulePathHelper::TranslateExpressionToNormalized(thread, pf.get(), baseFileName, recordName,
1578 requestPath);
1579 EXPECT_EQ(result, "&entry/ets/Test&");
1580 }
1581
HWTEST_F_L0(EcmaModuleTest,TranslateExpressionToNormalized4)1582 HWTEST_F_L0(EcmaModuleTest, TranslateExpressionToNormalized4)
1583 {
1584 CMap<CString, CMap<CString, CVector<CString>>> pkgList;
1585 CMap<CString, CVector<CString>> entryList;
1586 entryList["entry"] = {
1587 "packageName", "entry",
1588 "bundleName", "",
1589 "moduleName", "",
1590 "version", "",
1591 "entryPath", "src/main/",
1592 "isSO", "false"
1593 };
1594 entryList["har"] = {
1595 "packageName", "har",
1596 "bundleName", "",
1597 "moduleName", "",
1598 "version", "1.2.0",
1599 "entryPath", "./Index.ets",
1600 "isSO", "true"
1601 };
1602 pkgList["entry"] = entryList;
1603 instance->SetpkgContextInfoList(pkgList);
1604
1605 // ConcatNormalizedOhmurlWithData testcase
1606 CString requestPath = "har";
1607 CString baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
1608 CString result = ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, "",
1609 requestPath);
1610 EXPECT_EQ(result, "@normalized:Y&&&har&1.2.0");
1611
1612 baseFileName = "D:\\test\\entry\\.preview\\default\\intermediates\\assets\\default\\ets\\modules.abc";
1613 instance->SetModuleName("entry");
1614 result = ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, "",
1615 requestPath);
1616 EXPECT_EQ(result, "@normalized:Y&&&har&1.2.0");
1617 }
1618
HWTEST_F_L0(EcmaModuleTest,TranslateExpressionToNormalized5)1619 HWTEST_F_L0(EcmaModuleTest, TranslateExpressionToNormalized5)
1620 {
1621 CMap<CString, CMap<CString, CVector<CString>>> pkgList;
1622 CMap<CString, CVector<CString>> entryList;
1623 entryList["har"] = {
1624 "packageName", "har",
1625 "bundleName", "",
1626 "moduleName", "",
1627 "version", "1.2.0",
1628 "entryPath", "./Index.ets",
1629 "isSO", "false"
1630 };
1631 pkgList["entry"] = entryList;
1632 instance->SetpkgContextInfoList(pkgList);
1633
1634 CMap<CString, CString> aliasMap;
1635 aliasMap["@ohos/library"] = "har";
1636 instance->SetPkgAliasList(aliasMap);
1637
1638 CString requestPath = "@ohos/library/src/main/ets/Test";
1639 CString baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
1640 CString result = ModulePathHelper::TranslateExpressionToNormalized(thread, nullptr, baseFileName, "",
1641 requestPath);
1642 EXPECT_EQ(result, "@normalized:N&&&har/src/main/ets/Test&1.2.0");
1643 }
1644
HWTEST_F_L0(EcmaModuleTest,TranslateNapiFileRequestPath)1645 HWTEST_F_L0(EcmaModuleTest, TranslateNapiFileRequestPath)
1646 {
1647 CString modulePath = "modulePath";
1648 CString requestName = "requestName";
1649 CString result = ModulePathHelper::TranslateNapiFileRequestPath(thread, modulePath, requestName);
1650 EXPECT_EQ(result, "modulePath/requestName");
1651
1652 CMap<CString, CMap<CString, CVector<CString>>> list;
1653 CMap<CString, CVector<CString>> childList;
1654 list["hsp"] = childList;
1655 instance->SetpkgContextInfoList(list);
1656
1657 result = ModulePathHelper::TranslateNapiFileRequestPath(thread, modulePath, requestName);
1658 EXPECT_EQ(result, "&/src/main/requestName&");
1659 }
1660
HWTEST_F_L0(EcmaModuleTest,SplitNormalizedRecordName)1661 HWTEST_F_L0(EcmaModuleTest, SplitNormalizedRecordName)
1662 {
1663 CString requestPath = "&har/Index&1.0.0";
1664 CVector<CString> res = ModulePathHelper::SplitNormalizedRecordName(requestPath);
1665 int exceptCount = 5;
1666 EXPECT_EQ(res.size(), exceptCount);
1667 CString emptyStr = "";
1668 EXPECT_EQ(res[0], emptyStr);
1669 EXPECT_EQ(res[1], emptyStr);
1670 EXPECT_EQ(res[2], emptyStr);
1671
1672 CString importPath = "har/Index";
1673 EXPECT_EQ(res[3], importPath);
1674 CString version = "1.0.0";
1675 EXPECT_EQ(res[4], version);
1676 }
1677
HWTEST_F_L0(EcmaModuleTest,SplitNormalizedRecordName2)1678 HWTEST_F_L0(EcmaModuleTest, SplitNormalizedRecordName2)
1679 {
1680 CString requestPath = "har/Index";
1681 CVector<CString> res = ModulePathHelper::SplitNormalizedRecordName(requestPath);
1682 int exceptCount = 5;
1683 EXPECT_EQ(res.size(), exceptCount);
1684 CString emptyStr = "";
1685 EXPECT_EQ(res[0], emptyStr);
1686 EXPECT_EQ(res[1], emptyStr);
1687 EXPECT_EQ(res[2], emptyStr);
1688 EXPECT_EQ(res[3], emptyStr);
1689 CString importPath = "har/Index";
1690 EXPECT_EQ(res[4], importPath);
1691 }
1692
HWTEST_F_L0(EcmaModuleTest,ConcatPreviewTestUnifiedOhmUrl)1693 HWTEST_F_L0(EcmaModuleTest, ConcatPreviewTestUnifiedOhmUrl)
1694 {
1695 CString bundleName = "";
1696 CString pkgName = "entry";
1697 CString path = "/.test/testability/pages/Index";
1698 CString version = "";
1699 CString exceptOutUrl = "&entry/.test/testability/pages/Index&";
1700 CString res = ModulePathHelper::ConcatPreviewTestUnifiedOhmUrl(bundleName, pkgName, path, version);
1701 EXPECT_EQ(res, exceptOutUrl);
1702 }
1703
HWTEST_F_L0(EcmaModuleTest,NeedTranslateToNormalized)1704 HWTEST_F_L0(EcmaModuleTest, NeedTranslateToNormalized)
1705 {
1706 CString requestName = "@ohos:hilog";
1707 bool res = ModulePathHelper::NeedTranslateToNormalized(requestName);
1708 EXPECT_EQ(res, false);
1709
1710 requestName = "@app:com.example.myapplication/entry";
1711 res = ModulePathHelper::NeedTranslateToNormalized(requestName);
1712 EXPECT_EQ(res, false);
1713
1714 requestName = "@bundle:com.example.myapplication/library";
1715 res = ModulePathHelper::NeedTranslateToNormalized(requestName);
1716 EXPECT_EQ(res, false);
1717
1718 requestName = "@package:pkg_modules/.ohpm/json5@2.2.3/pkg_modules/json5/dist/index";
1719 res = ModulePathHelper::NeedTranslateToNormalized(requestName);
1720 EXPECT_EQ(res, false);
1721
1722 requestName = "@normalized:N&&&har/Index&1.0.0";
1723 res = ModulePathHelper::NeedTranslateToNormalized(requestName);
1724 EXPECT_EQ(res, false);
1725
1726 requestName = "json5";
1727 res = ModulePathHelper::NeedTranslateToNormalized(requestName);
1728 EXPECT_EQ(res, true);
1729
1730 requestName = "library";
1731 res = ModulePathHelper::NeedTranslateToNormalized(requestName);
1732 EXPECT_EQ(res, true);
1733 }
1734
HWTEST_F_L0(EcmaModuleTest,GetCurrentModuleName)1735 HWTEST_F_L0(EcmaModuleTest, GetCurrentModuleName)
1736 {
1737 ecmascript::ThreadNativeScope nativeScope(thread);
1738 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_module.abc";
1739 JSNApi::EnableUserUncaughtErrorHandler(instance);
1740 JSNApi::Execute(instance, baseFileName, "module_test_module_test_module");
1741 Local<ObjectRef> res = JSNApi::GetExportObject(instance, "module_test_module_test_module", "moduleName");
1742 JSHandle<JSTaggedValue> result = JSNApiHelper::ToJSHandle(res);
1743 CString moduleName = ConvertToString(thread, result.GetTaggedValue());
1744 EXPECT_EQ(moduleName, "");
1745 }
1746
HWTEST_F_L0(EcmaModuleTest,ReviseLoadedModuleCount2)1747 HWTEST_F_L0(EcmaModuleTest, ReviseLoadedModuleCount2) {
1748 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
1749 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
1750 CString recordName2 = "b";
1751 ModuleManager *moduleManager = thread->GetModuleManager();
1752 moduleManager->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
1753 module2->SetLoadingTypes(LoadingTypes::STABLE_MODULE);
1754
1755 ModuleDeregister::ReviseLoadedModuleCount(thread, recordName2);
1756 EXPECT_EQ(module2->GetLoadingTypes(), LoadingTypes::STABLE_MODULE);
1757 }
1758
HWTEST_F_L0(EcmaModuleTest,IncreaseRegisterCounts2)1759 HWTEST_F_L0(EcmaModuleTest, IncreaseRegisterCounts2)
1760 {
1761 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
1762 JSNApi::EnableUserUncaughtErrorHandler(instance);
1763 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
1764 EXPECT_TRUE(result);
1765 ModuleManager *moduleManager = thread->GetModuleManager();
1766 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
1767 std::set<CString> increaseModule;
1768 increaseModule.insert("module_test_module_test_B");
1769 increaseModule.insert("b");
1770 module->SetSharedType(SharedTypes::SHARED_MODULE);
1771 ModuleDeregister::IncreaseRegisterCounts(thread, module, increaseModule);
1772 EXPECT_EQ(module->GetModuleRequests(thread).IsUndefined(), false);
1773 }
1774
HWTEST_F_L0(EcmaModuleTest,DecreaseRegisterCounts2)1775 HWTEST_F_L0(EcmaModuleTest, DecreaseRegisterCounts2)
1776 {
1777 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
1778 JSNApi::EnableUserUncaughtErrorHandler(instance);
1779 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
1780 EXPECT_TRUE(result);
1781 ModuleManager *moduleManager = thread->GetModuleManager();
1782 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
1783 std::set<CString> decreaseModule;
1784 decreaseModule.insert("module_test_module_test_B");
1785 decreaseModule.insert("b");
1786 module->SetSharedType(SharedTypes::SHARED_MODULE);
1787 ModuleDeregister::DecreaseRegisterCounts(thread, module, decreaseModule);
1788 EXPECT_EQ(module->GetModuleRequests(thread).IsUndefined(), false);
1789 }
1790
HWTEST_F_L0(EcmaModuleTest,GenerateSendableFuncModule)1791 HWTEST_F_L0(EcmaModuleTest, GenerateSendableFuncModule)
1792 {
1793 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
1794 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
1795 module->SetSharedType(SharedTypes::SHARED_MODULE);
1796 JSHandle<JSTaggedValue> moduleRecord = JSHandle<JSTaggedValue>::Cast(module);
1797 SendableClassModule::GenerateSendableFuncModule(thread, moduleRecord);
1798 JSHandle<SourceTextModule> currentModule = JSHandle<SourceTextModule>::Cast(moduleRecord);
1799 EXPECT_TRUE(SourceTextModule::IsModuleInSharedHeap(currentModule));
1800 }
1801
HWTEST_F_L0(EcmaModuleTest,ConcatMergeFileNameToNormalized)1802 HWTEST_F_L0(EcmaModuleTest, ConcatMergeFileNameToNormalized)
1803 {
1804 CString baseFilename = "merge.abc";
1805 const char *data = R"(
1806 .language ECMAScript
1807 .function any func_main_0(any a0, any a1, any a2) {
1808 ldai 1
1809 return
1810 }
1811 )";
1812 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
1813 Parser parser;
1814 auto res = parser.Parse(data);
1815 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
1816 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
1817
1818 CString requestPath = "@normalized:N&&&har/Index&1.0.0";
1819 CString recordName = "";
1820 CString result = "&har/Index&1.0.0";
1821 CString entryPoint = ModulePathHelper::ConcatMergeFileNameToNormalized(thread, pf.get(), baseFilename, recordName,
1822 requestPath);
1823 EXPECT_EQ(result, entryPoint);
1824
1825 requestPath = "&index";
1826 result = "&index";
1827 entryPoint = ModulePathHelper::ConcatMergeFileNameToNormalized(thread, pf.get(), baseFilename, recordName,
1828 requestPath);
1829 EXPECT_EQ(result, entryPoint);
1830
1831 requestPath = "./@normalized:N&&&har/Index&1.0.0";
1832 result = "@normalized:N&&&har/Index&1.0.0&";
1833 pf->InsertJSRecordInfo(result);
1834 entryPoint = ModulePathHelper::ConcatMergeFileNameToNormalized(thread, pf.get(), baseFilename, recordName,
1835 requestPath);
1836 EXPECT_EQ(result, entryPoint);
1837
1838 recordName = "pkg_modules/.ohpm/validator@13.12.0/pkg_modules/validator/index";
1839 requestPath = "./lib/toDate";
1840 result = "pkg_modules/.ohpm/validator@13.12.0/pkg_modules/validator/lib/toDate";
1841 pf->InsertJSRecordInfo(result);
1842 CUnorderedMap<std::string_view, JSPandaFile::JSRecordInfo*> &recordInfo =
1843 const_cast<CUnorderedMap<std::string_view, JSPandaFile::JSRecordInfo*>&>(pf->GetJSRecordInfo());
1844 JSPandaFile::JSRecordInfo *info = new JSPandaFile::JSRecordInfo();
1845 info->npmPackageName = result;
1846 recordInfo.insert({std::string_view(recordName.c_str(), recordName.size()), info});
1847
1848 entryPoint = ModulePathHelper::ConcatMergeFileNameToNormalized(thread, pf.get(), baseFilename, recordName,
1849 requestPath);
1850 EXPECT_EQ(result, entryPoint);
1851
1852 delete info;
1853 recordInfo.erase(std::string_view(recordName.c_str(), recordName.size()));
1854 }
1855
HWTEST_F_L0(EcmaModuleTest,ConcatImportFileNormalizedOhmurlWithRecordName)1856 HWTEST_F_L0(EcmaModuleTest, ConcatImportFileNormalizedOhmurlWithRecordName)
1857 {
1858 CString baseFilename = "merge.abc";
1859 const char *data = R"(
1860 .language ECMAScript
1861 .function any func_main_0(any a0, any a1, any a2) {
1862 ldai 1
1863 return
1864 }
1865 )";
1866 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
1867 Parser parser;
1868 auto res = parser.Parse(data);
1869 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
1870 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
1871
1872 CString requestPath = "@normalized:N&&&har/Index&1.0.0";
1873 CString recordName = "";
1874 CString entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(),
1875 baseFilename, recordName, requestPath);
1876 EXPECT_EQ(CString(), entryPoint);
1877
1878 requestPath = "@normalized:N&&&har/Index&1.0.0";
1879 CString result = "&har/Index&1:0.0";
1880 pf->InsertJSRecordInfo(result);
1881 entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(), baseFilename,
1882 recordName, requestPath);
1883 EXPECT_EQ(result, entryPoint);
1884
1885 requestPath = "@normalized:N&&&har/Index&1.0.0";
1886 result = "@normalized:N&&&har/Index&1.0.0/index&";
1887 pf->InsertJSRecordInfo(result);
1888 entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(), baseFilename,
1889 recordName, requestPath);
1890 EXPECT_EQ(result, entryPoint);
1891
1892 requestPath = "@normalized:N&&&har/Index&1.0.0";
1893 result = "@normalized:N&&&har/Index&1.0.0&";
1894 pf->InsertJSRecordInfo(result);
1895 entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(), baseFilename,
1896 recordName, requestPath);
1897 EXPECT_EQ(result, entryPoint);
1898
1899 requestPath = "./@normalized:N&&&har/Index&1.0.0";
1900 entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(), baseFilename,
1901 recordName, requestPath);
1902 EXPECT_EQ(result, entryPoint);
1903
1904 requestPath = "./Test2";
1905 recordName = "&entry/ets/pages/Index&";
1906 result = "&entry/ets/pages/Test2&";
1907 pf->InsertJSRecordInfo(result);
1908 entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(), baseFilename,
1909 recordName, requestPath);
1910 EXPECT_EQ(result, entryPoint);
1911 }
1912
HWTEST_F_L0(EcmaModuleTest,ConcatImportFileNormalizedOhmurlWithRecordName2)1913 HWTEST_F_L0(EcmaModuleTest, ConcatImportFileNormalizedOhmurlWithRecordName2)
1914 {
1915 CString baseFilename = "merge.abc";
1916 const char *data = R"(
1917 .language ECMAScript
1918 .function any func_main_0(any a0, any a1, any a2) {
1919 ldai 1
1920 return
1921 }
1922 )";
1923 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
1924 Parser parser;
1925 auto res = parser.Parse(data);
1926 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
1927 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
1928
1929 CString requestPath = "./Test";
1930 CString recordName = "com.demo.application&hsp/Index&";
1931 CString result = "com.demo.application&hsp/Test&";
1932 pf->InsertJSRecordInfo(result);
1933 CString entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(),
1934 baseFilename, recordName, requestPath);
1935 EXPECT_EQ(result, entryPoint);
1936
1937 requestPath = "../Test2";
1938 recordName = "com.demo.application&hsp/src/main/ets/pages/Index&";
1939 result = "com.demo.application&hsp/src/main/ets/Test2&";
1940 pf->InsertJSRecordInfo(result);
1941 entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(),
1942 baseFilename, recordName, requestPath);
1943 EXPECT_EQ(result, entryPoint);
1944
1945 requestPath = "../Test3";
1946 recordName = "com.demo.application&hsp/src/main/ets/pages/Index&1.0.1";
1947 result = "com.demo.application&hsp/src/main/ets/Test3&1.0.1";
1948 pf->InsertJSRecordInfo(result);
1949 entryPoint = ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(thread, pf.get(),
1950 baseFilename, recordName, requestPath);
1951 EXPECT_EQ(result, entryPoint);
1952 }
1953
HWTEST_F_L0(EcmaModuleTest,HostResolveImportedModuleWithMerge)1954 HWTEST_F_L0(EcmaModuleTest, HostResolveImportedModuleWithMerge)
1955 {
1956 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
1957 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
1958 module1->SetEcmaModuleRecordNameString("test");
1959 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
1960 CString recordName2 = "@ohos:hilog";
1961 module2->SetEcmaModuleRecordNameString(recordName2);
1962 module2->SetTypes(ModuleTypes::NATIVE_MODULE);
1963
1964 JSHandle<JSTaggedValue> nativeName = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("@ohos:hilog"));
1965 JSHandle<JSTaggedValue> res1 =
1966 ModuleResolver::HostResolveImportedModule(thread, module1, nativeName);
1967 EXPECT_TRUE(res1->IsSourceTextModule());
1968
1969 thread->GetModuleManager()->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
1970 JSHandle<JSTaggedValue> res2 =
1971 ModuleResolver::HostResolveImportedModule(thread, module1, nativeName);
1972 EXPECT_TRUE(res2->IsSourceTextModule());
1973 }
1974
HWTEST_F_L0(EcmaModuleTest,ModuleResolverHostResolveImportedModule)1975 HWTEST_F_L0(EcmaModuleTest, ModuleResolverHostResolveImportedModule)
1976 {
1977 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
1978 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
1979
1980 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
1981 CString recordName2 = "@ohos:hilog";
1982 module2->SetEcmaModuleRecordNameString(recordName2);
1983 module2->SetTypes(ModuleTypes::NATIVE_MODULE);
1984
1985 JSHandle<JSTaggedValue> nativeName = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("@ohos:hilog"));
1986 thread->GetModuleManager()->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
1987 JSHandle<JSTaggedValue> res1 =
1988 ModuleResolver::HostResolveImportedModule(thread, module1, nativeName);
1989 EXPECT_TRUE(res1->IsSourceTextModule());
1990 }
1991
HWTEST_F_L0(EcmaModuleTest,ResolveExportObject)1992 HWTEST_F_L0(EcmaModuleTest, ResolveExportObject)
1993 {
1994 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
1995 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
1996
1997 JSHandle<JSTaggedValue> exportName = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("notExist"));
1998 JSHandle<NativeModuleFailureInfo> nativeModuleFailureInfo = objectFactory->NewNativeModuleFailureInfo();
1999 JSHandle<JSTaggedValue> res1 = SourceTextModule::ResolveExportObject(
2000 thread, module1, JSHandle<JSTaggedValue>::Cast(nativeModuleFailureInfo), exportName);
2001 EXPECT_TRUE(res1->IsResolvedIndexBinding());
2002
2003 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
2004 JSHandle<JSObject> obj(objectFactory->NewJSObjectByConstructor(ctor));
2005 JSHandle<TaggedArray> exportArr = objectFactory->NewTaggedArray(2);
2006 obj->SetProperties(thread, exportArr);
2007 JSHandle<JSHClass> jsHclass(thread, obj->GetJSHClass());
2008 JSHandle<LayoutInfo> layout = objectFactory->CreateLayoutInfo(0, MemSpaceType::OLD_SPACE, GrowMode::KEEP);
2009 jsHclass->SetLayout(thread, layout);
2010 JSHandle<JSTaggedValue> res2 = SourceTextModule::ResolveExportObject(
2011 thread, module1, JSHandle<JSTaggedValue>::Cast(obj), exportName);
2012 EXPECT_TRUE(res2->IsHole());
2013
2014 JSHandle<JSObject> obj1(objectFactory->NewJSObjectByConstructor(ctor));
2015 JSHandle<NameDictionary> dict = NameDictionary::Create(thread, NameDictionary::ComputeHashTableSize(2));
2016 obj1->SetProperties(thread, JSHandle<JSTaggedValue>::Cast(dict));
2017 JSHandle<JSTaggedValue> res3 = SourceTextModule::ResolveExportObject(
2018 thread, module1, JSHandle<JSTaggedValue>::Cast(obj1), exportName);
2019 EXPECT_TRUE(res3->IsHole());
2020 }
2021
HWTEST_F_L0(EcmaModuleTest,ResolveNativeStarExport)2022 HWTEST_F_L0(EcmaModuleTest, ResolveNativeStarExport)
2023 {
2024 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2025 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2026 CString recordName = "@ohos:hilog";
2027 module->SetEcmaModuleRecordNameString(recordName);
2028 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2029 JSHandle<LocalExportEntry> localExportEntry =
2030 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2031 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2032 localExportEntries->Set(thread, 0, localExportEntry);
2033 module->SetLocalExportEntries(thread, localExportEntries);
2034 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2035 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2036
2037 JSHandle<JSTaggedValue> res1 = SourceTextModule::ResolveNativeStarExport(thread, module, val);
2038 EXPECT_TRUE(res1->IsNull());
2039
2040 module->SetStatus(ModuleStatus::EVALUATED);
2041 JSHandle<JSTaggedValue> res2 = SourceTextModule::ResolveNativeStarExport(thread, module, val);
2042 EXPECT_TRUE(res2->IsNull());
2043 }
2044
HWTEST_F_L0(EcmaModuleTest,MakeInternalArgs)2045 HWTEST_F_L0(EcmaModuleTest, MakeInternalArgs)
2046 {
2047 auto vm = thread->GetEcmaVM();
2048 CString soName = "@ohos:hilig";
2049 JSHandle<JSTaggedValue> func(vm->GetFactory()->NewJSFunction(vm->GetGlobalEnv(),
2050 reinterpret_cast<void *>(Callback::RegisterCallback)));
2051 SourceTextModule::MakeInternalArgs(vm, func, soName, soName);
2052 EXPECT_TRUE(!thread->HasPendingException());
2053 }
2054
HWTEST_F_L0(EcmaModuleTest,LoadNativeModuleImpl)2055 HWTEST_F_L0(EcmaModuleTest, LoadNativeModuleImpl)
2056 {
2057 auto vm = thread->GetEcmaVM();
2058 ObjectFactory *objectFactory = vm->GetFactory();
2059 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2060 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2061 JSHandle<LocalExportEntry> localExportEntry =
2062 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2063 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2064 localExportEntries->Set(thread, 0, localExportEntry);
2065 module->SetLocalExportEntries(thread, localExportEntries);
2066 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2067 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2068 ModuleLogger *moduleLogger = new ModuleLogger(vm);
2069 thread->SetModuleLogger(moduleLogger);
2070 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2071 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2072 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2073 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2074 reinterpret_cast<void *>(Callback::RegisterCallback)));
2075 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiValue),
2076 nullptr, nullptr, 0);
2077 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2078 // app module
2079 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2080 SourceTextModule::LoadNativeModuleImpl(vm, thread, module, ModuleTypes::APP_MODULE);
2081 EXPECT_TRUE(!thread->HasPendingException());
2082
2083 // ohos module
2084 module->SetEcmaModuleRecordNameString("@ohos:xxxxx");
2085 SourceTextModule::LoadNativeModuleImpl(vm, thread, module, ModuleTypes::OHOS_MODULE);
2086 EXPECT_TRUE(!thread->HasPendingException());
2087
2088 // internal module
2089 module->SetEcmaModuleRecordNameString("@hms:xxxxx");
2090 SourceTextModule::LoadNativeModuleImpl(vm, thread, module, ModuleTypes::INTERNAL_MODULE);
2091 EXPECT_TRUE(!thread->HasPendingException());
2092
2093 thread->SetModuleLogger(nullptr);
2094 delete moduleLogger;
2095 SourceTextModule::LoadNativeModuleImpl(vm, thread, module, ModuleTypes::INTERNAL_MODULE);
2096 EXPECT_TRUE(!thread->HasPendingException());
2097 }
2098
HWTEST_F_L0(EcmaModuleTest,LoadNativeModuleMayThrowError1)2099 HWTEST_F_L0(EcmaModuleTest, LoadNativeModuleMayThrowError1)
2100 {
2101 auto vm = thread->GetEcmaVM();
2102 ObjectFactory *objectFactory = vm->GetFactory();
2103 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2104 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2105 JSHandle<LocalExportEntry> localExportEntry =
2106 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2107 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2108 localExportEntries->Set(thread, 0, localExportEntry);
2109 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2110 module->SetLocalExportEntries(thread, localExportEntries);
2111 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2112 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2113 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2114 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2115 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2116 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2117 reinterpret_cast<void *>(Callback::RegisterCallback)));
2118 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiFailure),
2119 nullptr, nullptr, 0);
2120 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2121 SourceTextModule::LoadNativeModuleMayThrowError(thread, module, ModuleTypes::APP_MODULE);
2122 EXPECT_TRUE(thread->HasPendingException());
2123 }
2124
HWTEST_F_L0(EcmaModuleTest,LoadNativeModuleMayThrowError2)2125 HWTEST_F_L0(EcmaModuleTest, LoadNativeModuleMayThrowError2)
2126 {
2127 auto vm = thread->GetEcmaVM();
2128 ObjectFactory *objectFactory = vm->GetFactory();
2129 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2130 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2131 JSHandle<LocalExportEntry> localExportEntry =
2132 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2133 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2134 localExportEntries->Set(thread, 0, localExportEntry);
2135 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2136 module->SetLocalExportEntries(thread, localExportEntries);
2137 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2138 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2139 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2140 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2141 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2142 JSTaggedValue::SetProperty(thread, global, keyValue, thread->GlobalConstants()->GetHandledUndefined());
2143 SourceTextModule::LoadNativeModuleMayThrowError(thread, module, ModuleTypes::APP_MODULE);
2144 EXPECT_TRUE(thread->HasPendingException());
2145 }
2146
HWTEST_F_L0(EcmaModuleTest,LoadNativeModuleMayThrowError3)2147 HWTEST_F_L0(EcmaModuleTest, LoadNativeModuleMayThrowError3)
2148 {
2149 auto vm = thread->GetEcmaVM();
2150 ObjectFactory *objectFactory = vm->GetFactory();
2151 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2152 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2153 JSHandle<LocalExportEntry> localExportEntry =
2154 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2155 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2156 localExportEntries->Set(thread, 0, localExportEntry);
2157 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2158 module->SetLocalExportEntries(thread, localExportEntries);
2159 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2160 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2161 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2162 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2163 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2164 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2165 reinterpret_cast<void *>(Callback::RegisterCallback)));
2166 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiException),
2167 nullptr, nullptr, 0);
2168 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2169 SourceTextModule::LoadNativeModuleMayThrowError(thread, module, ModuleTypes::APP_MODULE);
2170 EXPECT_TRUE(thread->HasPendingException());
2171 }
2172
HWTEST_F_L0(EcmaModuleTest,LoadNativeModuleMayThrowError4)2173 HWTEST_F_L0(EcmaModuleTest, LoadNativeModuleMayThrowError4)
2174 {
2175 auto vm = thread->GetEcmaVM();
2176 ObjectFactory *objectFactory = vm->GetFactory();
2177 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2178 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2179 JSHandle<LocalExportEntry> localExportEntry =
2180 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2181 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2182 localExportEntries->Set(thread, 0, localExportEntry);
2183 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2184 module->SetLocalExportEntries(thread, localExportEntries);
2185 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2186 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2187 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2188 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2189 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2190 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2191 reinterpret_cast<void *>(Callback::RegisterCallback)));
2192 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiValue),
2193 nullptr, nullptr, 0);
2194 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2195 SourceTextModule::LoadNativeModuleMayThrowError(thread, module, ModuleTypes::APP_MODULE);
2196 EXPECT_TRUE(!thread->HasPendingException());
2197 }
2198
HWTEST_F_L0(EcmaModuleTest,LoadNativeModule1)2199 HWTEST_F_L0(EcmaModuleTest, LoadNativeModule1)
2200 {
2201 auto vm = thread->GetEcmaVM();
2202 ObjectFactory *objectFactory = vm->GetFactory();
2203 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2204 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2205 JSHandle<LocalExportEntry> localExportEntry =
2206 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2207 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2208 localExportEntries->Set(thread, 0, localExportEntry);
2209 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2210 module->SetLocalExportEntries(thread, localExportEntries);
2211 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2212 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2213 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2214 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2215 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2216 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2217 reinterpret_cast<void *>(Callback::RegisterCallback)));
2218 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiValue),
2219 nullptr, nullptr, 0);
2220 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2221 SourceTextModule::LoadNativeModule(thread, module, ModuleTypes::APP_MODULE);
2222 EXPECT_TRUE(!thread->HasPendingException());
2223 }
2224
HWTEST_F_L0(EcmaModuleTest,LoadNativeModule2)2225 HWTEST_F_L0(EcmaModuleTest, LoadNativeModule2)
2226 {
2227 auto vm = thread->GetEcmaVM();
2228 ObjectFactory *objectFactory = vm->GetFactory();
2229 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2230 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2231 JSHandle<LocalExportEntry> localExportEntry =
2232 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2233 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2234 localExportEntries->Set(thread, 0, localExportEntry);
2235 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2236 module->SetLocalExportEntries(thread, localExportEntries);
2237 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2238 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2239 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2240 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2241 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2242 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2243 reinterpret_cast<void *>(Callback::RegisterCallback)));
2244 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiFailure),
2245 nullptr, nullptr, 0);
2246 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2247 SourceTextModule::LoadNativeModule(thread, module, ModuleTypes::APP_MODULE);
2248 EXPECT_TRUE(!thread->HasPendingException());
2249 }
2250
HWTEST_F_L0(EcmaModuleTest,EvaluateNativeModule1)2251 HWTEST_F_L0(EcmaModuleTest, EvaluateNativeModule1)
2252 {
2253 auto vm = thread->GetEcmaVM();
2254 ObjectFactory *objectFactory = vm->GetFactory();
2255 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2256 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2257 module->SetStatus(ModuleStatus::EVALUATED);
2258 SourceTextModule::EvaluateNativeModule(thread, module, ModuleTypes::APP_MODULE);
2259 EXPECT_TRUE(!thread->HasPendingException());
2260 }
2261
HWTEST_F_L0(EcmaModuleTest,EvaluateNativeModule2)2262 HWTEST_F_L0(EcmaModuleTest, EvaluateNativeModule2)
2263 {
2264 auto vm = thread->GetEcmaVM();
2265 ObjectFactory *objectFactory = vm->GetFactory();
2266 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2267 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2268 JSHandle<LocalExportEntry> localExportEntry =
2269 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2270 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2271 localExportEntries->Set(thread, 0, localExportEntry);
2272 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2273 module->SetLocalExportEntries(thread, localExportEntries);
2274 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2275 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2276 module->SetStatus(ModuleStatus::INSTANTIATED);
2277 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2278 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2279 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2280 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2281 reinterpret_cast<void *>(Callback::RegisterCallback)));
2282 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiFailure),
2283 nullptr, nullptr, 0);
2284 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2285 SourceTextModule::EvaluateNativeModule(thread, module, ModuleTypes::APP_MODULE);
2286 EXPECT_TRUE(!thread->HasPendingException());
2287 }
2288
HWTEST_F_L0(EcmaModuleTest,EvaluateNativeModule3)2289 HWTEST_F_L0(EcmaModuleTest, EvaluateNativeModule3)
2290 {
2291 auto vm = thread->GetEcmaVM();
2292 ObjectFactory *objectFactory = vm->GetFactory();
2293 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2294 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2295 JSHandle<LocalExportEntry> localExportEntry =
2296 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2297 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2298 localExportEntries->Set(thread, 0, localExportEntry);
2299 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2300 module->SetLocalExportEntries(thread, localExportEntries);
2301 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2302 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2303 module->SetStatus(ModuleStatus::INSTANTIATED);
2304 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
2305 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
2306 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
2307 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
2308 reinterpret_cast<void *>(Callback::RegisterCallback)));
2309 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiValue),
2310 nullptr, nullptr, 0);
2311 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
2312 SourceTextModule::EvaluateNativeModule(thread, module, ModuleTypes::APP_MODULE);
2313 EXPECT_TRUE(!thread->HasPendingException());
2314 }
2315
2316
HWTEST_F_L0(EcmaModuleTest,ModuleInstantiation)2317 HWTEST_F_L0(EcmaModuleTest, ModuleInstantiation)
2318 {
2319 auto vm = thread->GetEcmaVM();
2320 ObjectFactory *objectFactory = vm->GetFactory();
2321 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2322 module->SetEcmaModuleFilenameString("modules.abc");
2323 module->SetEcmaModuleRecordNameString("b");
2324 module->SetTypes(ModuleTypes::ECMA_MODULE);
2325 module->SetStatus(ModuleStatus::UNINSTANTIATED);
2326 module->SetIsNewBcVersion(false);
2327 CVector<JSHandle<SourceTextModule>> stack;
2328 SourceTextModule::PreModuleInstantiation(thread, module, ExecuteTypes::STATIC);
2329 JSHandle<JSTaggedValue> exception(thread, thread->GetException());
2330 int index = SourceTextModule::FinishModuleInstantiation(thread, module, stack, 1, exception);
2331 EXPECT_EQ(index, 2);
2332 }
2333
HWTEST_F_L0(EcmaModuleTest,ModuleDeclarationEnvironmentSetup)2334 HWTEST_F_L0(EcmaModuleTest, ModuleDeclarationEnvironmentSetup)
2335 {
2336 auto vm = thread->GetEcmaVM();
2337 ObjectFactory *objectFactory = vm->GetFactory();
2338 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2339 CString baseFileName = "modules.abc";
2340 CString recordName = "a";
2341 CString recordName1 = "@ohos:hilog";
2342 module->SetEcmaModuleFilenameString(baseFileName);
2343 module->SetEcmaModuleRecordNameString(recordName);
2344 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2345 module->SetStatus(ModuleStatus::UNINSTANTIATED);
2346 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2347 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
2348 JSHandle<TaggedArray> requestedModules = objectFactory->NewTaggedArray(2);
2349 requestedModules->Set(thread, 0, module1);
2350 requestedModules->Set(thread, 1, module1);
2351 module->SetRequestedModules(thread, requestedModules.GetTaggedValue());
2352 JSHandle<JSTaggedValue> importName = val;
2353 JSHandle<JSTaggedValue> localName = val;
2354 JSHandle<ImportEntry> importEntry1 =
2355 objectFactory->NewImportEntry(0, importName, localName, SharedTypes::UNSENDABLE_MODULE);
2356 SourceTextModule::AddImportEntry(thread, module, importEntry1, 0, 2);
2357 JSHandle<JSTaggedValue> starString = thread->GlobalConstants()->GetHandledStarString();
2358 JSHandle<ImportEntry> importEntry2 =
2359 objectFactory->NewImportEntry(1, starString, localName, SharedTypes::UNSENDABLE_MODULE);
2360 SourceTextModule::AddImportEntry(thread, module, importEntry2, 1, 2);
2361
2362 module1->SetEcmaModuleFilenameString(baseFileName);
2363 module1->SetEcmaModuleRecordNameString(recordName1);
2364 JSHandle<LocalExportEntry> localExportEntry =
2365 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2366 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2367 localExportEntries->Set(thread, 0, localExportEntry);
2368 module1->SetLocalExportEntries(thread, localExportEntries);
2369 module1->SetTypes(ModuleTypes::NATIVE_MODULE);
2370 module1->SetStatus(ModuleStatus::EVALUATED);
2371
2372 ModuleManager *moduleManager = thread->GetModuleManager();
2373 moduleManager->AddResolveImportedModule(recordName.c_str(), module.GetTaggedValue());
2374 moduleManager->AddResolveImportedModule(recordName1.c_str(), module1.GetTaggedValue());
2375 CVector<JSHandle<SourceTextModule>> stack;
2376 SourceTextModule::ModuleDeclarationEnvironmentSetup(thread, module);
2377 EXPECT_TRUE(!thread->HasPendingException());
2378
2379 module->SetEcmaModuleRecordNameString("");
2380 SourceTextModule::ModuleDeclarationEnvironmentSetup(thread, module);
2381 EXPECT_TRUE(!thread->HasPendingException());
2382 }
2383
HWTEST_F_L0(EcmaModuleTest,ModuleDeclarationArrayEnvironmentSetup)2384 HWTEST_F_L0(EcmaModuleTest, ModuleDeclarationArrayEnvironmentSetup)
2385 {
2386 auto vm = thread->GetEcmaVM();
2387 ObjectFactory *objectFactory = vm->GetFactory();
2388 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2389 SourceTextModule::ModuleDeclarationArrayEnvironmentSetup(thread, module);
2390 EXPECT_TRUE(!thread->HasPendingException());
2391
2392 module->SetSharedType(SharedTypes::SHARED_MODULE);
2393 SourceTextModule::ModuleDeclarationArrayEnvironmentSetup(thread, module);
2394 EXPECT_TRUE(!thread->HasPendingException());
2395
2396 module->SetStatus(ModuleStatus::EVALUATED);
2397 SourceTextModule::ModuleDeclarationArrayEnvironmentSetup(thread, module);
2398 EXPECT_TRUE(!thread->HasPendingException());
2399
2400 module->SetSharedType(SharedTypes::UNSENDABLE_MODULE);
2401 SourceTextModule::ModuleDeclarationArrayEnvironmentSetup(thread, module);
2402 EXPECT_TRUE(!thread->HasPendingException());
2403 }
2404
HWTEST_F_L0(EcmaModuleTest,Evaluate)2405 HWTEST_F_L0(EcmaModuleTest, Evaluate)
2406 {
2407 auto vm = thread->GetEcmaVM();
2408 ObjectFactory *objectFactory = vm->GetFactory();
2409 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2410 CString recordName = "a";
2411 module->SetEcmaModuleRecordNameString(recordName);
2412 module->SetStatus(ModuleStatus::EVALUATED);
2413 module->SetCycleRoot(thread, module);
2414 SourceTextModule::Evaluate(thread, module, nullptr, 0, ExecuteTypes::STATIC);
2415 EXPECT_TRUE(!thread->HasPendingException());
2416 SourceTextModule::Evaluate(thread, module, nullptr, 0, ExecuteTypes::DYNAMIC);
2417 EXPECT_TRUE(!thread->HasPendingException());
2418 ModuleLogger *moduleLogger = new ModuleLogger(vm);
2419 thread->SetModuleLogger(moduleLogger);
2420 SourceTextModule::Evaluate(thread, module, nullptr, 0, ExecuteTypes::STATIC);
2421 EXPECT_TRUE(!thread->HasPendingException());
2422 SourceTextModule::Evaluate(thread, module, nullptr, 0, ExecuteTypes::DYNAMIC);
2423 EXPECT_TRUE(!thread->HasPendingException());
2424 thread->SetModuleLogger(nullptr);
2425 delete moduleLogger;
2426 }
2427
HWTEST_F_L0(EcmaModuleTest,LoadNativeModule)2428 HWTEST_F_L0(EcmaModuleTest, LoadNativeModule)
2429 {
2430 auto vm = thread->GetEcmaVM();
2431 ObjectFactory *objectFactory = vm->GetFactory();
2432 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2433 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2434 JSHandle<LocalExportEntry> localExportEntry =
2435 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2436 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2437 localExportEntries->Set(thread, 0, localExportEntry);
2438 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
2439 module->SetLocalExportEntries(thread, localExportEntries);
2440 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2441 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2442 ModuleManager *moduleManager = thread->GetModuleManager();
2443 JSHandle<JSTaggedValue> res = moduleManager->LoadNativeModule(
2444 thread, "@app:bundleName/moduleName/lib*.so");
2445 EXPECT_EQ(res.GetTaggedValue(), JSTaggedValue::Undefined());
2446 }
2447
HWTEST_F_L0(EcmaModuleTest,ExecuteNativeModuleMayThrowError)2448 HWTEST_F_L0(EcmaModuleTest, ExecuteNativeModuleMayThrowError)
2449 {
2450 auto vm = thread->GetEcmaVM();
2451 ObjectFactory *objectFactory = vm->GetFactory();
2452 CString recordName = "@app:bundleName/moduleName/lib*.so";
2453 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2454 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2455 JSHandle<LocalExportEntry> localExportEntry =
2456 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2457 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2458 localExportEntries->Set(thread, 0, localExportEntry);
2459 module->SetEcmaModuleRecordNameString(recordName);
2460 module->SetLocalExportEntries(thread, localExportEntries);
2461 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2462 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2463 module->SetStatus(ModuleStatus::EVALUATED);
2464 ModuleManager *moduleManager = thread->GetModuleManager();
2465 JSHandle<JSTaggedValue> res = moduleManager->ExecuteNativeModuleMayThrowError(
2466 thread, recordName);
2467 EXPECT_EQ(res.GetTaggedValue(), JSTaggedValue::Undefined());
2468
2469 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
2470 JSHandle<JSTaggedValue> res2 = moduleManager->ExecuteNativeModuleMayThrowError(
2471 thread, recordName);
2472 EXPECT_NE(res2.GetTaggedValue(), JSTaggedValue::Undefined());
2473 }
2474
HWTEST_F_L0(EcmaModuleTest,ExecuteNativeModule)2475 HWTEST_F_L0(EcmaModuleTest, ExecuteNativeModule)
2476 {
2477 auto vm = thread->GetEcmaVM();
2478 CString recordName = "@app:bundleName/moduleName/lib*.so";
2479 ObjectFactory *objectFactory = vm->GetFactory();
2480 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2481 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2482 JSHandle<LocalExportEntry> localExportEntry =
2483 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2484 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2485 localExportEntries->Set(thread, 0, localExportEntry);
2486 module->SetEcmaModuleRecordNameString(recordName);
2487 module->SetLocalExportEntries(thread, localExportEntries);
2488 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2489 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2490
2491 ModuleManager *moduleManager = thread->GetModuleManager();
2492 module->SetStatus(ecmascript::ModuleStatus::INSTANTIATED);
2493 moduleManager->AddResolveImportedModule(
2494 recordName, module.GetTaggedValue());
2495 moduleManager->ExecuteNativeModule(thread, recordName);
2496 module->SetStatus(ModuleStatus::EVALUATED);
2497 JSHandle<JSTaggedValue> res = moduleManager->ExecuteNativeModule(thread, recordName);
2498 EXPECT_NE(res.GetTaggedValue(), JSTaggedValue::Undefined());
2499 }
2500
HWTEST_F_L0(EcmaModuleTest,ExecuteNativeModule2)2501 HWTEST_F_L0(EcmaModuleTest, ExecuteNativeModule2)
2502 {
2503 auto vm = thread->GetEcmaVM();
2504 CString recordName = "@app:bundleName/moduleName/lib*.so";
2505 ObjectFactory *objectFactory = vm->GetFactory();
2506 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2507 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
2508 JSHandle<LocalExportEntry> localExportEntry =
2509 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
2510 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
2511 localExportEntries->Set(thread, 0, localExportEntry);
2512 module->SetEcmaModuleRecordNameString(recordName);
2513 module->SetLocalExportEntries(thread, localExportEntries);
2514 SourceTextModule::StoreModuleValue(thread, module, 0, val);
2515 module->SetTypes(ModuleTypes::NATIVE_MODULE);
2516
2517 ModuleManager *moduleManager = thread->GetModuleManager();
2518 JSHandle<JSTaggedValue> res = moduleManager->ExecuteNativeModule(thread, recordName);
2519 EXPECT_NE(res.GetTaggedValue(), JSTaggedValue::Undefined());
2520 }
2521
HWTEST_F_L0(EcmaModuleTest,ModuleLogger)2522 HWTEST_F_L0(EcmaModuleTest, ModuleLogger) {
2523 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2524 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
2525 CString baseFileName = "modules.abc";
2526 module1->SetEcmaModuleFilenameString(baseFileName);
2527 CString recordName1 = "a";
2528 module1->SetEcmaModuleRecordNameString(recordName1);
2529 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
2530 module2->SetEcmaModuleFilenameString(baseFileName);
2531 CString recordName2 = "b";
2532 module2->SetEcmaModuleRecordNameString(recordName2);
2533 JSHandle<JSTaggedValue> importName = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("ccc"));
2534 JSHandle<JSTaggedValue> localName = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("ccc"));
2535 JSHandle<SourceTextModule> module3 = objectFactory->NewSourceTextModule();
2536 module2->SetEcmaModuleFilenameString(baseFileName);
2537 CString recordName3 = "c";
2538 module2->SetEcmaModuleRecordNameString(recordName3);
2539 JSHandle<TaggedArray> requestedModules = objectFactory->NewTaggedArray(1);
2540 requestedModules->Set(thread, 0, module3);
2541 module1->SetRequestedModules(thread, requestedModules.GetTaggedValue());
2542 JSHandle<ImportEntry> importEntry = objectFactory->NewImportEntry(0, importName,
2543 localName, SharedTypes::UNSENDABLE_MODULE);
2544 SourceTextModule::AddImportEntry(thread, module2, importEntry, 0, 1);
2545
2546 ModuleLogger *moduleLogger = new ModuleLogger(thread->GetEcmaVM());
2547 moduleLogger->SetStartTime(recordName1);
2548 moduleLogger->SetEndTime(recordName1);
2549 moduleLogger->SetStartTime(recordName2);
2550 moduleLogger->SetEndTime(recordName2);
2551 moduleLogger->SetStartTime(recordName3);
2552 moduleLogger->InsertEntryPointModule(module1);
2553 moduleLogger->InsertParentModule(module1, module2);
2554 moduleLogger->InsertModuleLoadInfo(module2, module3, -1);
2555 moduleLogger->InsertModuleLoadInfo(module2, module3, 0);
2556 moduleLogger->PrintModuleLoadInfo();
2557 auto globalConstants = thread->GetEcmaVM()->GetJSThread()->GlobalConstants();
2558 auto funcName = (module3->GetTypes() == ModuleTypes::NATIVE_MODULE) ?
2559 globalConstants->GetHandledRequireNativeModuleString() :
2560 globalConstants->GetHandledRequireNapiString();
2561 JSTaggedValue nativeFunc = funcName.GetTaggedValue();
2562 bool isFunc = nativeFunc.IsJSFunction();
2563 EXPECT_EQ(isFunc, false);
2564 }
2565
HWTEST_F_L0(EcmaModuleTest,GetRequireNativeModuleFunc)2566 HWTEST_F_L0(EcmaModuleTest, GetRequireNativeModuleFunc) {
2567 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2568 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
2569 uint16_t registerNum = module->GetRegisterCounts();
2570 module->SetStatus(ecmascript::ModuleStatus::INSTANTIATED);
2571 module->SetRegisterCounts(registerNum);
2572 auto globalConstants = thread->GetEcmaVM()->GetJSThread()->GlobalConstants();
2573 auto funcName = (module->GetTypes() == ModuleTypes::NATIVE_MODULE) ?
2574 globalConstants->GetHandledRequireNativeModuleString() :
2575 globalConstants->GetHandledRequireNapiString();
2576 JSTaggedValue nativeFunc = funcName.GetTaggedValue();
2577 bool isFunc = nativeFunc.IsJSFunction();
2578 EXPECT_EQ(isFunc, false);
2579 }
2580
2581 /*
2582 * Feature: Module
2583 * Function: StoreModuleValue
2584 * SubFunction: StoreModuleValue/GetModuleValue
2585 * FunctionPoints: store a module export item in module
2586 * CaseDescription: Simulated implementation of "export foo as bar", set foo as "hello world",
2587 * use "import bar" in same js file
2588 */
HWTEST_F_L0(EcmaModuleTest,StoreModuleValue2)2589 HWTEST_F_L0(EcmaModuleTest, StoreModuleValue2)
2590 {
2591 ObjectFactory* objFactory = thread->GetEcmaVM()->GetFactory();
2592 CString localName = "foo";
2593 CString exportName = "bar";
2594 CString value = "hello world";
2595 CString value2 = "hello world1";
2596 int32_t index = 1;
2597
2598 JSHandle<JSTaggedValue> localNameHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName));
2599 JSHandle<JSTaggedValue> exportNameHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(exportName));
2600 JSHandle<LocalExportEntry> localExportEntry =
2601 objFactory->NewLocalExportEntry(exportNameHandle, localNameHandle, LocalExportEntry::LOCAL_DEFAULT_INDEX,
2602 SharedTypes::UNSENDABLE_MODULE);
2603 JSHandle<SourceTextModule> module = objFactory->NewSourceTextModule();
2604 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry, 0, 1);
2605
2606 JSHandle<JSTaggedValue> storeKey = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName));
2607 JSHandle<JSTaggedValue> valueHandle = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(value));
2608 JSHandle<JSTaggedValue> valueHandle1 = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(value2));
2609 SourceTextModule::StoreModuleValue(thread, module, storeKey, valueHandle);
2610 SourceTextModule::StoreModuleValue(thread, module, index, valueHandle1);
2611 JSHandle<JSTaggedValue> loadKey = JSHandle<JSTaggedValue>::Cast(objFactory->NewFromUtf8(localName));
2612 JSTaggedValue loadValue = module->GetModuleValue(thread, loadKey.GetTaggedValue(), false);
2613 JSTaggedValue loadValue1 = module->GetModuleValue(thread, index, false);
2614 EXPECT_EQ(valueHandle.GetTaggedValue(), loadValue);
2615 EXPECT_EQ(valueHandle1.GetTaggedValue(), loadValue1);
2616 }
2617
HWTEST_F_L0(EcmaModuleTest,MakeAppArgs1)2618 HWTEST_F_L0(EcmaModuleTest, MakeAppArgs1) {
2619 auto vm = thread->GetEcmaVM();
2620 CString soPath = "@normalized:Y&&&libentry.so&";
2621 CString moduleName = "entry";
2622 CString requestName = "@normalized:";
2623 JSHandle<JSTaggedValue> func(vm->GetFactory()->NewJSFunction(vm->GetGlobalEnv(),
2624 reinterpret_cast<void *>(Callback::RegisterCallback)));
2625 EcmaRuntimeCallInfo* info = SourceTextModule::MakeAppArgs(vm, func, soPath, moduleName, requestName);
2626 std::string res1 = EcmaStringAccessor(JSTaggedValue::ToString(thread, info->GetCallArg(0))).ToStdString(thread);
2627 std::string res2 = EcmaStringAccessor(JSTaggedValue::ToString(thread, info->GetCallArg(1))).ToStdString(thread);
2628 std::string res3 = EcmaStringAccessor(JSTaggedValue::ToString(thread, info->GetCallArg(2))).ToStdString(thread);
2629 EXPECT_TRUE(res1 == "entry");
2630 EXPECT_TRUE(res2 == "true");
2631 EXPECT_TRUE(res3 == "/entry");
2632 }
2633
HWTEST_F_L0(EcmaModuleTest,MakeAppArgs2)2634 HWTEST_F_L0(EcmaModuleTest, MakeAppArgs2) {
2635 auto vm = thread->GetEcmaVM();
2636 CString soPath = "@app:com.example.myapplication/entry";
2637 CString moduleName = "entry";
2638 CString requestName = "@app:";
2639 JSHandle<JSTaggedValue> func(vm->GetFactory()->NewJSFunction(vm->GetGlobalEnv(),
2640 reinterpret_cast<void *>(Callback::RegisterCallback)));
2641 EcmaRuntimeCallInfo* info = SourceTextModule::MakeAppArgs(vm, func, soPath, moduleName, requestName);
2642 std::string res1 = EcmaStringAccessor(JSTaggedValue::ToString(thread, info->GetCallArg(0))).ToStdString(thread);
2643 std::string res2 = EcmaStringAccessor(JSTaggedValue::ToString(thread, info->GetCallArg(1))).ToStdString(thread);
2644 std::string res3 = EcmaStringAccessor(JSTaggedValue::ToString(thread, info->GetCallArg(2))).ToStdString(thread);
2645 EXPECT_TRUE(res1 == "entry");
2646 EXPECT_TRUE(res2 == "true");
2647 EXPECT_TRUE(res3 == "@app:com.example.myapplication");
2648 }
2649
HWTEST_F_L0(EcmaModuleTest,ConcatHspFileNameCrossBundle)2650 HWTEST_F_L0(EcmaModuleTest, ConcatHspFileNameCrossBundle)
2651 {
2652 CString bundleName = "com.example.application";
2653 CString moduleName = "entry";
2654 CString expectRes = "/data/storage/el1/bundle/com.example.application/entry/entry/ets/modules.abc";
2655 CString res = ModulePathHelper::ConcatHspFileNameCrossBundle(bundleName, moduleName);
2656 EXPECT_EQ(res, expectRes);
2657 }
2658
HWTEST_F_L0(EcmaModuleTest,ConcatHspFileName)2659 HWTEST_F_L0(EcmaModuleTest, ConcatHspFileName)
2660 {
2661 CString moduleName = "entry";
2662 CString expectRes = "/data/storage/el1/bundle/entry/ets/modules.abc";
2663 CString res = ModulePathHelper::ConcatHspFileName(moduleName);
2664 EXPECT_EQ(res, expectRes);
2665 }
2666
HWTEST_F_L0(EcmaModuleTest,ParseNormalizedOhmUrl)2667 HWTEST_F_L0(EcmaModuleTest, ParseNormalizedOhmUrl)
2668 {
2669 CString baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2670 CString recordName = "&har/Index&1.0.0";
2671 CString requestName = "@normalized:N&&&har/src/main/page/Test&1.0.0";
2672 CString expectRes = "&har/src/main/page/Test&1.0.0";
2673 CString exceptBaseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2674 CString res = ModulePathHelper::ParseNormalizedOhmUrl(thread, baseFileName, recordName, requestName);
2675 EXPECT_EQ(res, expectRes);
2676 EXPECT_EQ(baseFileName, exceptBaseFileName);
2677
2678 requestName = "@normalized:N&&har/src/main/page/Test&1.0.0";
2679 res = ModulePathHelper::ParseNormalizedOhmUrl(thread, baseFileName, recordName, requestName);
2680 EXPECT_TRUE((thread)->HasPendingException());
2681 EXPECT_EQ(res, requestName);
2682
2683 baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2684 requestName = "@normalized:N&hsp&&hsp/src/main/page/Test&1.0.0";
2685 expectRes = "&hsp/src/main/page/Test&1.0.0";
2686 exceptBaseFileName = "/data/storage/el1/bundle/hsp/ets/modules.abc";
2687 CString res2 = ModulePathHelper::ParseNormalizedOhmUrl(thread, baseFileName, recordName, requestName);
2688 EXPECT_EQ(res2, expectRes);
2689 EXPECT_EQ(baseFileName, exceptBaseFileName);
2690
2691 baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2692 requestName = "@normalized:N&hsp&com.example.application&hsp/src/main/page/Test&1.0.0";
2693 exceptBaseFileName = "/data/storage/el1/bundle/com.example.application/hsp/hsp/ets/modules.abc";
2694 expectRes = "com.example.application&hsp/src/main/page/Test&1.0.0";
2695 CString res3 = ModulePathHelper::ParseNormalizedOhmUrl(thread, baseFileName, recordName, requestName);
2696 EXPECT_EQ(res3, expectRes);
2697 EXPECT_EQ(baseFileName, exceptBaseFileName);
2698
2699 baseFileName = "";
2700 recordName = "&har/Index&1.0.0";
2701 requestName = "@normalized:N&&&har/src/main/page/Test&1.0.0";
2702 CString res4 = ModulePathHelper::ParseNormalizedOhmUrl(thread, baseFileName, recordName, requestName);
2703 EXPECT_EQ(baseFileName, "");
2704
2705 baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2706 requestName = "@normalized:N&&com.example.application&hsp/src/main/page/Test&1.0.0";
2707 expectRes = "com.example.application&hsp/src/main/page/Test&1.0.0";
2708 CString res5 = ModulePathHelper::ParseNormalizedOhmUrl(thread, baseFileName, recordName, requestName);
2709 EXPECT_EQ(res5, expectRes);
2710 }
2711
HWTEST_F_L0(EcmaModuleTest,GetModuleNameWithBaseFile)2712 HWTEST_F_L0(EcmaModuleTest, GetModuleNameWithBaseFile)
2713 {
2714 CString baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2715 CString expectRes = "entry";
2716 CString res = ModulePathHelper::GetModuleNameWithBaseFile(baseFileName);
2717 EXPECT_EQ(res, expectRes);
2718
2719 baseFileName = "/data/storage/el1/bundle/com.example.application/hsp/hsp/ets/modules.abc";
2720 expectRes = "hsp";
2721 res = ModulePathHelper::GetModuleNameWithBaseFile(baseFileName);
2722 EXPECT_EQ(res, expectRes);
2723 }
2724
2725
HWTEST_F_L0(EcmaModuleTest,GetBundleNameWithRecordName)2726 HWTEST_F_L0(EcmaModuleTest, GetBundleNameWithRecordName)
2727 {
2728 CString recordName = "com.example.myapplication/library";
2729 CString expectRes = "com.example.myapplication";
2730 CString res = ModulePathHelper::GetBundleNameWithRecordName(instance, recordName);
2731 EXPECT_EQ(res, expectRes);
2732
2733 CMap<CString, CMap<CString, CVector<CString>>> list;
2734 CMap<CString, CVector<CString>> childList;
2735 list["hsp"] = childList;
2736 instance->SetpkgContextInfoList(list);
2737
2738 recordName = "&hsp&com.example.application&hsp/src/main/page/Test&1.0.0";
2739 expectRes = "com.example.application";
2740 res = ModulePathHelper::GetBundleNameWithRecordName(instance, recordName);
2741 EXPECT_EQ(res, expectRes);
2742
2743 instance->SetBundleName("com.example1.application");
2744 recordName = "&har/src/main/page/Test&1.0.0";
2745 expectRes = "com.example1.application";
2746 res = ModulePathHelper::GetBundleNameWithRecordName(instance, recordName);
2747 EXPECT_EQ(res, expectRes);
2748 }
2749
HWTEST_F_L0(EcmaModuleTest,ModuleInstantiation_ReEnterTest)2750 HWTEST_F_L0(EcmaModuleTest, ModuleInstantiation_ReEnterTest)
2751 {
2752 auto vm = thread->GetEcmaVM();
2753 ObjectFactory *objectFactory = vm->GetFactory();
2754 JSHandle<SourceTextModule> module = objectFactory->NewSSourceTextModule();
2755 module->SetEcmaModuleFilenameString("modules.abc");
2756 module->SetEcmaModuleRecordNameString("b");
2757 module->SetTypes(ModuleTypes::ECMA_MODULE);
2758 module->SetStatus(ModuleStatus::EVALUATING);
2759 module->SetIsNewBcVersion(true);
2760 module->SetSharedType(SharedTypes::SHARED_MODULE);
2761 CVector<JSHandle<SourceTextModule>> stack;
2762 SourceTextModule::PreModuleInstantiation(thread, module, ExecuteTypes::STATIC);
2763 JSHandle<JSTaggedValue> exception(thread, thread->GetException());
2764 int index = SourceTextModule::FinishModuleInstantiation(thread, module, stack, 1, exception);
2765 EXPECT_EQ(index, 1);
2766 module->SetStatus(ModuleStatus::EVALUATING);
2767 module->SetSharedType(SharedTypes::UNSENDABLE_MODULE);
2768 SourceTextModule::PreModuleInstantiation(thread, module, ExecuteTypes::STATIC);
2769 index = SourceTextModule::FinishModuleInstantiation(thread, module, stack, 1, exception);
2770 EXPECT_EQ(index, 2);
2771 }
2772
HWTEST_F_L0(EcmaModuleTest,TransformToNormalizedOhmUrl)2773 HWTEST_F_L0(EcmaModuleTest, TransformToNormalizedOhmUrl)
2774 {
2775 CMap<CString, CMap<CString, CVector<CString>>> pkgList;
2776 CMap<CString, CVector<CString>> entryList;
2777 entryList["entry"] = {
2778 "packageName", "entry",
2779 "bundleName", "",
2780 "moduleName", "",
2781 "version", "",
2782 "entryPath", "src/main/",
2783 "isSO", "false"
2784 };
2785 entryList["har"] = {
2786 "packageName", "har",
2787 "bundleName", "",
2788 "moduleName", "",
2789 "version", "1.2.0",
2790 "entryPath", "",
2791 "isSO", "false"
2792 };
2793 pkgList["entry"] = entryList;
2794 CMap<CString, CVector<CString>> ohosTestList;
2795 ohosTestList["ohosTest"] = {
2796 "packageName", "ohosTest",
2797 "bundleName", "",
2798 "moduleName", "",
2799 "version", "",
2800 "entryPath", "src/",
2801 "isSO", "false"
2802 };
2803 pkgList["ohosTest"] = ohosTestList;
2804 instance->SetpkgContextInfoList(pkgList);
2805
2806 CString inputFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2807 CString outBaseFileName = "";
2808 CString entryPoint = "ENTRY_MAIN_FUNCTION";
2809 CString res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
2810 EXPECT_EQ(res, "ENTRY_MAIN_FUNCTION");
2811
2812 outBaseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2813 entryPoint = "com.example.myapplication/entry@har/ets/pages/Index";
2814 res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
2815 EXPECT_EQ(res, "&har/src/main/ets/pages/Index&1.2.0");
2816
2817 outBaseFileName = "/data/storage/el1/bundle/ohosTest/ets/modules.abc";
2818 entryPoint = "com.example.myapplication/ohosTest/ets/pages/Index";
2819 res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
2820 EXPECT_EQ(res, "&ohosTest/src/ets/pages/Index&");
2821
2822 outBaseFileName = "/data/storage/el1/bundle/entry/.test/ets/modules.abc";
2823 entryPoint = "com.example.myapplication/entry/.test/ets/pages/Index";
2824 res = ModulePathHelper::TransformToNormalizedOhmUrl(instance, inputFileName, outBaseFileName, entryPoint);
2825 EXPECT_EQ(res, "&entry/.test/ets/pages/Index&");
2826 }
2827
HWTEST_F_L0(EcmaModuleTest,TranslateExpressionInputWithEts)2828 HWTEST_F_L0(EcmaModuleTest, TranslateExpressionInputWithEts)
2829 {
2830 instance->SetBundleName("com.example.myapplication");
2831 CString baseFilename = "merge.abc";
2832 const char *data = R"(
2833 .language ECMAScript
2834 .function any func_main_0(any a0, any a1, any a2) {
2835 ldai 1
2836 return
2837 }
2838 )";
2839 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
2840 Parser parser;
2841 auto res = parser.Parse(data);
2842 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
2843 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
2844
2845 CString baseFileName = "/data/storage/el1/bundle/entry/ets/modules.abc";
2846 CString requestName = "ets/Test";
2847 CString recordName = "com.example.myapplication/entry/ets/pages/Index";
2848 CString expectRes = "com.example.myapplication/entry/ets/Test";
2849 CString result = ModulePathHelper::TranslateExpressionInputWithEts(thread, pf.get(), baseFileName, requestName);
2850 EXPECT_EQ(result, "");
2851
2852 pf->InsertJSRecordInfo(expectRes);
2853 result = ModulePathHelper::TranslateExpressionInputWithEts(thread, pf.get(), baseFileName, requestName);
2854 EXPECT_EQ(result, expectRes);
2855 }
2856
HWTEST_F_L0(EcmaModuleTest,ReviseLoadedModuleCount1)2857 HWTEST_F_L0(EcmaModuleTest, ReviseLoadedModuleCount1) {
2858 CString moduleName = "testModule";
2859 ModuleDeregister::ReviseLoadedModuleCount(thread, moduleName);
2860 ModuleManager *moduleManager = thread->GetModuleManager();
2861 bool res = moduleManager->IsLocalModuleLoaded(moduleName);
2862 EXPECT_EQ(res, false);
2863 }
2864
HWTEST_F_L0(EcmaModuleTest,IncreaseRegisterCounts)2865 HWTEST_F_L0(EcmaModuleTest, IncreaseRegisterCounts)
2866 {
2867 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
2868 JSNApi::EnableUserUncaughtErrorHandler(instance);
2869 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
2870 EXPECT_TRUE(result);
2871 ModuleManager *moduleManager = thread->GetModuleManager();
2872 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
2873 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2874 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
2875 std::set<CString> increaseModule;
2876
2877 ModuleDeregister::IncreaseRegisterCounts(thread, module, increaseModule);
2878 EXPECT_EQ(module->GetModuleRequests(thread).IsUndefined(), false);
2879
2880 module->SetRegisterCounts(INT8_MAX);
2881 ModuleDeregister::IncreaseRegisterCounts(thread, module, increaseModule);
2882 EXPECT_EQ(module->GetModuleRequests(thread).IsUndefined(), false);
2883
2884 module2->SetRegisterCounts(INT8_MAX);
2885 ModuleDeregister::IncreaseRegisterCounts(thread, module2, increaseModule);
2886 EXPECT_EQ(module2->GetModuleRequests(thread).IsUndefined(), true);
2887
2888 module2->SetLoadingTypes(LoadingTypes::STABLE_MODULE);
2889 ModuleDeregister::IncreaseRegisterCounts(thread, module2, increaseModule);
2890 bool res = module2->GetLoadingTypes() == LoadingTypes::STABLE_MODULE;
2891 EXPECT_EQ(res, true);
2892 }
2893
HWTEST_F_L0(EcmaModuleTest,DecreaseRegisterCounts)2894 HWTEST_F_L0(EcmaModuleTest, DecreaseRegisterCounts)
2895 {
2896 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
2897 JSNApi::EnableUserUncaughtErrorHandler(instance);
2898 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
2899 EXPECT_TRUE(result);
2900 ModuleManager *moduleManager = thread->GetModuleManager();
2901 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
2902 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2903 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
2904 std::set<CString> decreaseModule;
2905
2906 ModuleDeregister::DecreaseRegisterCounts(thread, module, decreaseModule);
2907 bool res1 = module->GetLoadingTypes() != LoadingTypes::DYNAMITC_MODULE;
2908 EXPECT_EQ(res1, true);
2909
2910 module->SetRegisterCounts(INT8_MAX);
2911 ModuleDeregister::DecreaseRegisterCounts(thread, module, decreaseModule);
2912 EXPECT_EQ(module->GetModuleRequests(thread).IsUndefined(), false);
2913
2914 module2->SetLoadingTypes(LoadingTypes::DYNAMITC_MODULE);
2915 ModuleDeregister::DecreaseRegisterCounts(thread, module2, decreaseModule);
2916 bool res2 = module2->GetLoadingTypes() != LoadingTypes::DYNAMITC_MODULE;
2917 EXPECT_EQ(res2, false);
2918 }
2919
HWTEST_F_L0(EcmaModuleTest,GetSendableModuleValueImpl)2920 HWTEST_F_L0(EcmaModuleTest, GetSendableModuleValueImpl) {
2921 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2922 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
2923 int32_t index = 2;
2924 JSTaggedValue currentModule1 = module1.GetTaggedValue();
2925 JSTaggedValue res1 = MockModuleValueAccessor::GetSendableModuleValueOuterInternal<false>(
2926 thread, index, currentModule1);
2927 EXPECT_EQ(res1, thread->GlobalConstants()->GetUndefined());
2928
2929 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
2930 JSNApi::EnableUserUncaughtErrorHandler(instance);
2931 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
2932 EXPECT_TRUE(result);
2933 ModuleManager *moduleManager = thread->GetModuleManager();
2934 JSHandle<SourceTextModule> module2 = moduleManager->HostGetImportedModule("module_test_module_test_C");
2935 JSTaggedValue currentModule2 = module2.GetTaggedValue();
2936 JSTaggedValue res2 = MockModuleValueAccessor::GetSendableModuleValueOuterInternal<false>(
2937 thread, index, currentModule2);
2938 EXPECT_NE(res2, thread->GlobalConstants()->GetUndefined());
2939 }
2940
HWTEST_F_L0(EcmaModuleTest,GetLazySendableModuleValueImpl)2941 HWTEST_F_L0(EcmaModuleTest, GetLazySendableModuleValueImpl) {
2942 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2943 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
2944 int32_t index = 2;
2945 JSTaggedValue currentModule1 = module1.GetTaggedValue();
2946 JSTaggedValue res1 = MockModuleValueAccessor::GetSendableModuleValueOuterInternal<true>(
2947 thread, index, currentModule1);
2948 EXPECT_EQ(res1, thread->GlobalConstants()->GetUndefined());
2949 }
2950
HWTEST_F_L0(EcmaModuleTest,ResolveImportedModuleWithMerge)2951 HWTEST_F_L0(EcmaModuleTest, ResolveImportedModuleWithMerge) {
2952 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
2953 JSNApi::EnableUserUncaughtErrorHandler(instance);
2954 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
2955 EXPECT_TRUE(result);
2956 ModuleManager *moduleManager = thread->GetModuleManager();
2957 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
2958 module->SetSharedType(SharedTypes::SHARED_MODULE);
2959
2960 CString recordName2 = "testModule";
2961 ExecuteTypes executeType = ExecuteTypes::STATIC;
2962 JSHandle<JSTaggedValue> res = ModuleResolver::HostResolveImportedModule(
2963 thread, baseFileName.c_str(), recordName2, nullptr, executeType);
2964 EXPECT_EQ(res.GetTaggedValue(), JSTaggedValue::Exception());
2965 }
2966
HWTEST_F_L0(EcmaModuleTest,ResolveImportedModuleWithMerge2)2967 HWTEST_F_L0(EcmaModuleTest, ResolveImportedModuleWithMerge2) {
2968 CString moduleName1;
2969 CString recordName1;
2970
2971 ExecuteTypes executeType = ExecuteTypes::STATIC;
2972 JSHandle<JSTaggedValue> res = ModuleResolver::HostResolveImportedModule(
2973 thread, moduleName1, recordName1, nullptr, executeType);
2974 EXPECT_EQ(res.GetTaggedValue(), JSTaggedValue::Exception());
2975 }
2976
HWTEST_F_L0(EcmaModuleTest,IsInstantiatedSModule)2977 HWTEST_F_L0(EcmaModuleTest, IsInstantiatedSModule) {
2978 SharedModuleManager* manager1 = SharedModuleManager::GetInstance();
2979 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
2980 JSNApi::EnableUserUncaughtErrorHandler(instance);
2981 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
2982 EXPECT_TRUE(result);
2983 ModuleManager *moduleManager = thread->GetModuleManager();
2984 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
2985 bool res = manager1->IsInstantiatedSModule(thread, module);
2986 EXPECT_EQ(res, true);
2987 }
2988
HWTEST_F_L0(EcmaModuleTest,ToStringWithPrecision)2989 HWTEST_F_L0(EcmaModuleTest, ToStringWithPrecision)
2990 {
2991 std::string res = ModuleLogger::ToStringWithPrecision(4.550, 3);
2992 EXPECT_EQ(res, "4.55");
2993 }
2994
HWTEST_F_L0(EcmaModuleTest,GetResolvedRecordIndexBindingModule)2995 HWTEST_F_L0(EcmaModuleTest, GetResolvedRecordIndexBindingModule)
2996 {
2997 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
2998
2999 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
3000 std::string baseFileNameStr = MODULE_ABC_PATH "module_unexecute.abc";
3001 CString baseFileName = baseFileNameStr.c_str();
3002 module1->SetEcmaModuleFilenameString(baseFileName);
3003 CString recordName1 = "module_unexecute";
3004 module1->SetEcmaModuleRecordNameString(recordName1);
3005 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3006 JSHandle<ImportEntry> importEntry =
3007 objectFactory->NewImportEntry(0, val, val, SharedTypes::UNSENDABLE_MODULE);
3008 SourceTextModule::AddImportEntry(thread, module1, importEntry, 0, 1);
3009
3010 // test GetResolvedRecordIndexBindingModule
3011 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName1);
3012 JSHandle<EcmaString> baseFileNameHdl = objectFactory->NewFromUtf8(baseFileName);
3013 JSHandle<ResolvedRecordIndexBinding> recordIndexBinding =
3014 objectFactory->NewSResolvedRecordIndexBindingRecord(recordNameHdl, baseFileNameHdl, 0);
3015
3016 JSHandle<SourceTextModule> resolvedModule = MockModuleValueAccessor::
3017 GetResolvedModuleFromRecordIndexBinding<false>(thread, module1, recordIndexBinding);
3018 EXPECT_TRUE(resolvedModule->GetStatus() == ModuleStatus::EVALUATED);
3019 }
3020
HWTEST_F_L0(EcmaModuleTest,GetResolvedRecordBindingModule)3021 HWTEST_F_L0(EcmaModuleTest, GetResolvedRecordBindingModule)
3022 {
3023 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3024 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
3025 std::string baseFileNameStr = MODULE_ABC_PATH "module_unexecute_A.abc";
3026 CString baseFileName = baseFileNameStr.c_str();
3027 module1->SetEcmaModuleFilenameString(baseFileName);
3028 CString recordName1 = "module_unexecute_A";
3029 module1->SetEcmaModuleRecordNameString(recordName1);
3030
3031 // test GetResolvedRecordBindingModule
3032 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName1);
3033 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3034 JSHandle<ResolvedRecordBinding> nameBinding =
3035 objectFactory->NewSResolvedRecordBindingRecord(recordNameHdl, val);
3036
3037 JSHandle<SourceTextModule> resolvedModule = MockModuleValueAccessor::
3038 GetResolvedModuleFromRecordBinding<false>(thread, module1, nameBinding);
3039 EXPECT_TRUE(resolvedModule->GetStatus() == ModuleStatus::EVALUATED);
3040 }
3041
HWTEST_F_L0(EcmaModuleTest,GetLazyModuleValueFromIndexBindingTest)3042 HWTEST_F_L0(EcmaModuleTest, GetLazyModuleValueFromIndexBindingTest)
3043 {
3044 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3045
3046 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
3047 std::string baseFileNameStr = MODULE_ABC_PATH "module_unexecute.abc";
3048 CString baseFileName = baseFileNameStr.c_str();
3049 module1->SetEcmaModuleFilenameString(baseFileName);
3050 CString recordName1 = "module_unexecute";
3051 module1->SetEcmaModuleRecordNameString(recordName1);
3052 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("stringOut"));
3053 JSHandle<ImportEntry> importEntry =
3054 objectFactory->NewImportEntry(0, val, val, SharedTypes::UNSENDABLE_MODULE);
3055 SourceTextModule::AddImportEntry(thread, module1, importEntry, 0, 1);
3056
3057 // test GetLazyModuleValueFromIndexBinding
3058 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName1);
3059 JSHandle<EcmaString> baseFileNameHdl = objectFactory->NewFromUtf8(baseFileName);
3060 JSHandle<ResolvedRecordIndexBinding> recordIndexBinding =
3061 objectFactory->NewSResolvedRecordIndexBindingRecord(recordNameHdl, baseFileNameHdl, 0);
3062
3063 JSTaggedValue value = MockModuleValueAccessor::GetModuleValueFromRecordIndexBinding<true>(
3064 thread, module1, recordIndexBinding.GetTaggedValue(), false);
3065
3066 EXPECT_TRUE(value.IsString());
3067 }
3068
HWTEST_F_L0(EcmaModuleTest,GetLazyModuleValueFromRecordBindingTest)3069 HWTEST_F_L0(EcmaModuleTest, GetLazyModuleValueFromRecordBindingTest)
3070 {
3071 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3072 JSHandle<SourceTextModule> module1 = objectFactory->NewSSourceTextModule();
3073 std::string baseFileNameStr1 = MODULE_ABC_PATH "module_unexecute_C.abc";
3074 CString baseFileName1 = baseFileNameStr1.c_str();
3075 module1->SetEcmaModuleFilenameString(baseFileName1);
3076 CString recordName1 = "module_unexecute_C";
3077 module1->SetEcmaModuleRecordNameString(recordName1);
3078 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("default"));
3079
3080 // test GetLazyModuleValueFromRecordBinding
3081 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName1);
3082 JSHandle<ResolvedRecordBinding> nameBinding =
3083 objectFactory->NewSResolvedRecordBindingRecord(recordNameHdl, val);
3084
3085 JSTaggedValue resolvedModuleVal1 = MockModuleValueAccessor::
3086 GetModuleValueFromRecordBinding<true>(thread, module1, nameBinding.GetTaggedValue(), 0, false);
3087 EXPECT_TRUE(resolvedModuleVal1.IsString());
3088 }
3089
HWTEST_F_L0(EcmaModuleTest,ExecuteCjsModule)3090 HWTEST_F_L0(EcmaModuleTest, ExecuteCjsModule)
3091 {
3092 std::string baseFileName = MODULE_ABC_PATH "module_unexecute_C.abc";
3093 const CString baseFileNameStr = baseFileName.c_str();
3094 CString recordName = "module_unexecute_C";
3095 JSNApi::EnableUserUncaughtErrorHandler(instance);
3096 JSNApi::Execute(instance, baseFileName, "module_unexecute_C");
3097
3098 std::shared_ptr<JSPandaFile> jsPandaFile =
3099 JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, baseFileNameStr, recordName, false);
3100 ModuleManager *moduleManager = thread->GetModuleManager();
3101 moduleManager->ExecuteCjsModule(thread, recordName, jsPandaFile.get());
3102 EXPECT_TRUE(moduleManager->IsEvaluatedModule(recordName));
3103 }
3104
HWTEST_F_L0(EcmaModuleTest,GetModuleNamespace)3105 HWTEST_F_L0(EcmaModuleTest, GetModuleNamespace)
3106 {
3107 CString localName1 = "foo";
3108 CString exportName1 = "bar";
3109 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3110 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3111 JSHandle<JSTaggedValue> localNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(localName1));
3112 JSHandle<JSTaggedValue> exportNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(exportName1));
3113 JSHandle<LocalExportEntry> localExportEntry1 =
3114 objectFactory->NewLocalExportEntry(exportNameHandle1, localNameHandle1, LocalExportEntry::LOCAL_DEFAULT_INDEX,
3115 SharedTypes::UNSENDABLE_MODULE);
3116 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry1, 0, 1);
3117 JSHandle<JSTaggedValue> key = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(localName1));
3118 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3119 ctor->SetModule(thread, module);
3120 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3121 JSTaggedValue res = DeprecatedModuleValueAccessor::GetModuleNamespace(thread, key.GetTaggedValue(), jsFunc);
3122 EXPECT_EQ(res, JSTaggedValue::Undefined());
3123 }
3124
HWTEST_F_L0(EcmaModuleTest,GetModuleValueInner3)3125 HWTEST_F_L0(EcmaModuleTest, GetModuleValueInner3)
3126 {
3127 CString localName1 = "foo";
3128 CString exportName1 = "bar";
3129 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3130 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3131 JSHandle<JSTaggedValue> localNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(localName1));
3132 JSHandle<JSTaggedValue> exportNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(exportName1));
3133 JSHandle<LocalExportEntry> localExportEntry1 =
3134 objectFactory->NewLocalExportEntry(exportNameHandle1, localNameHandle1, LocalExportEntry::LOCAL_DEFAULT_INDEX,
3135 SharedTypes::UNSENDABLE_MODULE);
3136 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry1, 0, 1);
3137 JSHandle<JSTaggedValue> key = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(exportName1));
3138 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3139 ctor->SetModule(thread, module);
3140 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3141 DeprecatedModuleValueAccessor::GetModuleValueInner(thread, key.GetTaggedValue(), jsFunc);
3142 JSTaggedValue res = DeprecatedModuleValueAccessor::GetModuleValueOuter(thread, key.GetTaggedValue(), jsFunc);
3143 EXPECT_EQ(res, JSTaggedValue::Undefined());
3144 }
3145
HWTEST_F_L0(EcmaModuleTest,GetModuleValueOuter)3146 HWTEST_F_L0(EcmaModuleTest, GetModuleValueOuter)
3147 {
3148 CString localName1 = "foo";
3149 CString exportName1 = "bar";
3150 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3151 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3152 JSHandle<JSTaggedValue> localNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(localName1));
3153 JSHandle<JSTaggedValue> exportNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(exportName1));
3154 JSHandle<LocalExportEntry> localExportEntry1 =
3155 objectFactory->NewLocalExportEntry(exportNameHandle1, localNameHandle1, LocalExportEntry::LOCAL_DEFAULT_INDEX,
3156 SharedTypes::UNSENDABLE_MODULE);
3157 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry1, 0, 1);
3158 JSHandle<JSTaggedValue> key = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(exportName1));
3159
3160
3161 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3162
3163 JSHandle<NameDictionary> map(NameDictionary::Create(thread, NameDictionary::ComputeHashTableSize(1)));
3164 module->SetEnvironment(thread, map);
3165
3166 ctor->SetModule(thread, module);
3167 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3168 DeprecatedModuleValueAccessor::GetModuleValueInner(thread, key.GetTaggedValue(), jsFunc);
3169 JSTaggedValue res = DeprecatedModuleValueAccessor::GetModuleValueOuter(thread, key.GetTaggedValue(), jsFunc);
3170 EXPECT_EQ(res, JSTaggedValue::Undefined());
3171 }
3172
HWTEST_F_L0(EcmaModuleTest,StoreModuleValue3)3173 HWTEST_F_L0(EcmaModuleTest, StoreModuleValue3)
3174 {
3175 CString localName1 = "foo";
3176 CString exportName1 = "bar";
3177 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3178 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3179 JSHandle<JSTaggedValue> localNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(localName1));
3180 JSHandle<JSTaggedValue> exportNameHandle1 = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(exportName1));
3181 JSHandle<LocalExportEntry> localExportEntry1 =
3182 objectFactory->NewLocalExportEntry(exportNameHandle1, localNameHandle1, LocalExportEntry::LOCAL_DEFAULT_INDEX,
3183 SharedTypes::UNSENDABLE_MODULE);
3184 SourceTextModule::AddLocalExportEntry(thread, module, localExportEntry1, 0, 1);
3185 JSHandle<JSTaggedValue> key = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(exportName1));
3186 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3187
3188 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3189
3190 JSHandle<NameDictionary> map(NameDictionary::Create(thread, NameDictionary::ComputeHashTableSize(1)));
3191 module->SetEnvironment(thread, map);
3192
3193 ctor->SetModule(thread, module);
3194 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3195 DeprecatedModuleValueAccessor::StoreModuleValue(thread, key.GetTaggedValue(), val.GetTaggedValue(), jsFunc);
3196 EXPECT_TRUE(!thread->HasPendingException());
3197 }
3198
HWTEST_F_L0(EcmaModuleTest,GetLazyModuleValueFromRecordBinding)3199 HWTEST_F_L0(EcmaModuleTest, GetLazyModuleValueFromRecordBinding)
3200 {
3201 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3202 CString baseFileName = "modules.abc";
3203 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3204
3205 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
3206 module2->SetEcmaModuleFilenameString(baseFileName);
3207 CString recordName2 = "b";
3208 module2->SetEcmaModuleRecordNameString(recordName2);
3209 JSHandle<LocalExportEntry> localExportEntry =
3210 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
3211 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
3212 localExportEntries->Set(thread, 0, localExportEntry);
3213 module2->SetLocalExportEntries(thread, localExportEntries);
3214 SourceTextModule::StoreModuleValue(thread, module2, 0, val);
3215 module2->SetStatus(ModuleStatus::EVALUATED);
3216 module2->SetTypes(ModuleTypes::NATIVE_MODULE);
3217 ModuleManager *moduleManager = thread->GetModuleManager();
3218 moduleManager->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
3219
3220 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName2);
3221 JSHandle<ResolvedRecordBinding> nameBinding =
3222 objectFactory->NewSResolvedRecordBindingRecord(recordNameHdl, val);
3223 JSHandle<JSTaggedValue> key = JSHandle<JSTaggedValue>::Cast(nameBinding);
3224 MockModuleValueAccessor::GetModuleValueFromRecordBinding<true>(thread, module2, key.GetTaggedValue(), 0, false);
3225 MockModuleValueAccessor::GetModuleValueFromRecordBinding<false>(thread, module2, key.GetTaggedValue(), 0, false);
3226 EXPECT_TRUE(!thread->HasPendingException());
3227 }
3228
HWTEST_F_L0(EcmaModuleTest,ReplaceModuleThroughFeature1)3229 HWTEST_F_L0(EcmaModuleTest, ReplaceModuleThroughFeature1)
3230 {
3231 auto vm = thread->GetEcmaVM();
3232 CString moduleName = "a";
3233 CString mockName = "a_mock";
3234 std::map<std::string, std::string> list;
3235 list.emplace(moduleName, mockName);
3236 vm->SetMockModuleList(list);
3237 ModuleResolver::ReplaceModuleThroughFeature(thread, moduleName);
3238 EXPECT_EQ(moduleName, mockName);
3239 }
3240
HWTEST_F_L0(EcmaModuleTest,ReplaceModuleThroughFeature2)3241 HWTEST_F_L0(EcmaModuleTest, ReplaceModuleThroughFeature2)
3242 {
3243 auto vm = thread->GetEcmaVM();
3244 CString moduleName = "a";
3245 std::vector<panda::HmsMap> map;
3246 HmsMap tmp;
3247 tmp.targetPath = "a_target";
3248 tmp.originalPath = "a";
3249 map.push_back(tmp);
3250 vm->SetHmsModuleList(map);
3251 ModuleResolver::ReplaceModuleThroughFeature(thread, moduleName);
3252 EXPECT_EQ(moduleName, tmp.targetPath.c_str());
3253 }
3254
HWTEST_F_L0(EcmaModuleTest,CheckResolvedBinding)3255 HWTEST_F_L0(EcmaModuleTest, CheckResolvedBinding)
3256 {
3257 auto vm = thread->GetEcmaVM();
3258 ObjectFactory *objectFactory = vm->GetFactory();
3259 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3260 CString recordName = "a";
3261 module->SetEcmaModuleRecordNameString(recordName);
3262 module->SetStatus(ModuleStatus::EVALUATED);
3263 ModuleManager *moduleManager = thread->GetModuleManager();
3264 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3265
3266 SourceTextModule::CheckResolvedBinding(thread, module);
3267 EXPECT_TRUE(!thread->HasPendingException());
3268
3269 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
3270 CString recordName2 = "@ohos:hilog";
3271 module2->SetEcmaModuleRecordNameString(recordName2);
3272 module2->SetTypes(ModuleTypes::NATIVE_MODULE);
3273 module2->SetStatus(ModuleStatus::EVALUATED);
3274 moduleManager->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
3275 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3276 JSHandle<IndirectExportEntry> indirectExportEntry = objectFactory->NewIndirectExportEntry(val,
3277 0, val, SharedTypes::UNSENDABLE_MODULE);
3278 JSHandle<TaggedArray> indirectExportEntries = objectFactory->NewTaggedArray(1);
3279 indirectExportEntries->Set(thread, 0, indirectExportEntry);
3280 module->SetIndirectExportEntries(thread, indirectExportEntries);
3281
3282 JSHandle<TaggedArray> requestedModules = objectFactory->NewTaggedArray(1);
3283 requestedModules->Set(thread, 0, module2);
3284 module->SetRequestedModules(thread, requestedModules.GetTaggedValue());
3285
3286 JSHandle<LocalExportEntry> localExportEntry =
3287 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
3288 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
3289 localExportEntries->Set(thread, 0, localExportEntry);
3290 module2->SetLocalExportEntries(thread, localExportEntries);
3291 SourceTextModule::CheckResolvedBinding(thread, module);
3292 EXPECT_TRUE(!thread->HasPendingException());
3293
3294 module->SetEcmaModuleRecordNameString("");
3295 module->SetEcmaModuleFilenameString(recordName);
3296 JSHandle<TaggedArray> moduleRequests = objectFactory->NewTaggedArray(1);
3297 JSHandle<JSTaggedValue> name = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(recordName2.c_str()));
3298 moduleRequests->Set(thread, 0, name.GetTaggedValue());
3299 module->SetModuleRequests(thread, moduleRequests.GetTaggedValue());
3300 module2->SetLocalExportEntries(thread, thread->GlobalConstants()->GetUndefined());
3301 SourceTextModule::CheckResolvedBinding(thread, module);
3302 EXPECT_TRUE(thread->HasPendingException());
3303 }
3304
HWTEST_F_L0(EcmaModuleTest,CheckResolvedIndexBinding)3305 HWTEST_F_L0(EcmaModuleTest, CheckResolvedIndexBinding)
3306 {
3307 auto vm = thread->GetEcmaVM();
3308 ObjectFactory *objectFactory = vm->GetFactory();
3309 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3310 CString recordName = "a";
3311 module->SetEcmaModuleFilenameString(recordName);
3312 module->SetStatus(ModuleStatus::EVALUATED);
3313 CString recordName2 = "@ohos:hilog";
3314 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
3315 module2->SetEcmaModuleRecordNameString(recordName2);
3316 module2->SetTypes(ModuleTypes::NATIVE_MODULE);
3317 module2->SetStatus(ModuleStatus::EVALUATED);
3318
3319 JSHandle<TaggedArray> moduleRequests = objectFactory->NewTaggedArray(1);
3320 JSHandle<JSTaggedValue> name = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(recordName2.c_str()));
3321 moduleRequests->Set(thread, 0, name.GetTaggedValue());
3322 module->SetModuleRequests(thread, moduleRequests.GetTaggedValue());
3323 JSHandle<TaggedArray> requestedModules = objectFactory->NewTaggedArray(1);
3324 requestedModules->Set(thread, 0, module2);
3325 module->SetRequestedModules(thread, requestedModules.GetTaggedValue());
3326
3327 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3328 JSHandle<IndirectExportEntry> indirectExportEntry = objectFactory->NewIndirectExportEntry(val,
3329 0, val, SharedTypes::UNSENDABLE_MODULE);
3330 JSHandle<TaggedArray> indirectExportEntries = objectFactory->NewTaggedArray(1);
3331 indirectExportEntries->Set(thread, 0, indirectExportEntry);
3332 module->SetIndirectExportEntries(thread, indirectExportEntries);
3333 ModuleManager *moduleManager = thread->GetModuleManager();
3334 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3335 moduleManager->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
3336 SourceTextModule::CheckResolvedIndexBinding(thread, module);
3337 EXPECT_TRUE(thread->HasPendingException());
3338 }
3339
HWTEST_F_L0(EcmaModuleTest,SetExportName)3340 HWTEST_F_L0(EcmaModuleTest, SetExportName)
3341 {
3342 auto vm = thread->GetEcmaVM();
3343 ObjectFactory *objectFactory = vm->GetFactory();
3344 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3345 CString recordName = "@ohos:hilog";
3346 module->SetEcmaModuleFilenameString(recordName);
3347 CVector<std::string> exportNames;
3348 JSHandle<TaggedArray> exportStarSet = objectFactory->NewTaggedArray(2);
3349 SourceTextModule::SetExportName(thread, module, exportNames, exportStarSet);
3350 EXPECT_TRUE(!thread->HasPendingException());
3351 }
3352
HWTEST_F_L0(EcmaModuleTest,IsCircular)3353 HWTEST_F_L0(EcmaModuleTest, IsCircular)
3354 {
3355 CList<CString> referenceList;
3356 CString moduleName = "a";
3357 bool res1 = SourceTextModule::IsCircular(referenceList, moduleName);
3358 EXPECT_EQ(res1, false);
3359
3360 referenceList.push_back(moduleName);
3361 referenceList.push_back("b");
3362 bool res2 = SourceTextModule::IsCircular(referenceList, moduleName);
3363 EXPECT_EQ(res2, true);
3364
3365 bool res3 = SourceTextModule::IsCircular(referenceList, "c");
3366 EXPECT_EQ(res3, false);
3367 }
3368
HWTEST_F_L0(EcmaModuleTest,SearchCircularImport)3369 HWTEST_F_L0(EcmaModuleTest, SearchCircularImport)
3370 {
3371 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3372 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3373 CString baseFileName = "modules.abc";
3374 module->SetEcmaModuleFilenameString(baseFileName);
3375 CString recordName = "a";
3376 CString recordName2 = "@ohos:hilog";
3377 module->SetEcmaModuleRecordNameString(recordName);
3378 JSHandle<TaggedArray> requestArr = objectFactory->NewTaggedArray(1);
3379 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8(recordName2.c_str()));
3380 requestArr->Set(thread, 0, val.GetTaggedValue());
3381 module->SetModuleRequests(thread, requestArr);
3382
3383 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
3384 module2->SetEcmaModuleRecordNameString(recordName2);
3385 module2->SetTypes(ModuleTypes::NATIVE_MODULE);
3386 module2->SetStatus(ModuleStatus::EVALUATED);
3387 ModuleManager *moduleManager = thread->GetModuleManager();
3388 moduleManager->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
3389
3390 CList<CString> referenceList;
3391 referenceList.push_back(recordName);
3392 referenceList.push_back("b");
3393 referenceList.push_back(recordName2);
3394 SourceTextModule::SearchCircularImport(thread, recordName, module, referenceList, recordName2, true);
3395 EXPECT_TRUE(!thread->HasPendingException());
3396 }
3397
HWTEST_F_L0(EcmaModuleTest,IsDynamicModule)3398 HWTEST_F_L0(EcmaModuleTest, IsDynamicModule)
3399 {
3400 bool res = SourceTextModule::IsDynamicModule(LoadingTypes::DYNAMITC_MODULE);
3401 EXPECT_EQ(res, true);
3402 }
3403
HWTEST_F_L0(EcmaModuleTest,StoreModuleValue4)3404 HWTEST_F_L0(EcmaModuleTest, StoreModuleValue4)
3405 {
3406 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3407 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3408 module->SetEcmaModuleRecordNameString("a");
3409 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3410 JSHandle<LocalExportEntry> localExportEntry =
3411 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
3412 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
3413 localExportEntries->Set(thread, 0, localExportEntry);
3414 module->SetLocalExportEntries(thread, localExportEntries);
3415 module->SetSharedType(SharedTypes::SHARED_MODULE);
3416 SourceTextModule::StoreModuleValue(thread, module, 0, val);
3417 EXPECT_TRUE(!thread->HasPendingException());
3418 }
3419
HWTEST_F_L0(EcmaModuleTest,GetModuleValue1)3420 HWTEST_F_L0(EcmaModuleTest, GetModuleValue1)
3421 {
3422 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3423 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3424 module->GetModuleValue(thread, 0, true);
3425 EXPECT_TRUE(thread->HasPendingException());
3426 }
3427
HWTEST_F_L0(EcmaModuleTest,ModuleExecution)3428 HWTEST_F_L0(EcmaModuleTest, ModuleExecution)
3429 {
3430 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3431 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3432 JSHandle<TaggedArray> arr = objectFactory->NewTaggedArray(1);
3433 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3434 JSHandle<ImportEntry> importEntry = objectFactory->NewImportEntry(0, val, val, SharedTypes::UNSENDABLE_MODULE);
3435 module->SetImportEntries(thread, arr);
3436 module->AddImportEntry(thread, module, importEntry, 2, 3);
3437 EXPECT_TRUE(!thread->HasPendingException());
3438 }
3439
HWTEST_F_L0(EcmaModuleTest,AddAsyncParentModule)3440 HWTEST_F_L0(EcmaModuleTest, AddAsyncParentModule)
3441 {
3442 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3443 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
3444 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
3445 SourceTextModule::AddAsyncParentModule(thread, module1, module2);
3446 EXPECT_TRUE(!thread->HasPendingException());
3447 SourceTextModule::AddAsyncParentModule(thread, module1, module2);
3448 EXPECT_TRUE(!thread->HasPendingException());
3449 }
3450
HWTEST_F_L0(EcmaModuleTest,AsyncModuleExecutionFulfilled)3451 HWTEST_F_L0(EcmaModuleTest, AsyncModuleExecutionFulfilled)
3452 {
3453 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3454 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3455 module->SetStatus(ModuleStatus::ERRORED);
3456 module->SetException(thread, JSTaggedValue(2));
3457 SourceTextModule::AsyncModuleExecutionFulfilled(thread, module);
3458 EXPECT_TRUE(!thread->HasPendingException());
3459
3460 SourceTextModule::AsyncModuleExecutionRejected(thread, module, JSTaggedValue::Exception());
3461 EXPECT_TRUE(!thread->HasPendingException());
3462 }
3463
HWTEST_F_L0(EcmaModuleTest,GatherAvailableAncestors)3464 HWTEST_F_L0(EcmaModuleTest, GatherAvailableAncestors)
3465 {
3466 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3467 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
3468 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
3469 module2->SetPendingAsyncDependencies(1);
3470 module2->SetCycleRoot(thread, module2);
3471 SourceTextModule::AddAsyncParentModule(thread, module1, module2);
3472 SourceTextModule::AsyncParentCompletionSet execList1;
3473 module2->SetStatus(ModuleStatus::ERRORED);
3474 SourceTextModule::GatherAvailableAncestors(thread, module1, execList1);
3475 EXPECT_TRUE(!thread->HasPendingException());
3476
3477 execList1.insert(module2);
3478 SourceTextModule::GatherAvailableAncestors(thread, module1, execList1);
3479 EXPECT_TRUE(!thread->HasPendingException());
3480
3481 module2->SetStatus(ModuleStatus::EVALUATING_ASYNC);
3482 SourceTextModule::GatherAvailableAncestors(thread, module1, execList1);
3483 EXPECT_TRUE(!thread->HasPendingException());
3484
3485 SourceTextModule::AsyncParentCompletionSet execList2;
3486 module2->SetStatus(ModuleStatus::EVALUATING_ASYNC);
3487 module2->SetAsyncEvaluatingOrdinal(3);
3488 SourceTextModule::GatherAvailableAncestors(thread, module1, execList2);
3489 EXPECT_TRUE(!thread->HasPendingException());
3490
3491 SourceTextModule::AsyncParentCompletionSet execList3;
3492 module2->SetPendingAsyncDependencies(2);
3493 SourceTextModule::GatherAvailableAncestors(thread, module1, execList3);
3494 EXPECT_TRUE(!thread->HasPendingException());
3495
3496 module2->SetHasTLA(true);
3497 SourceTextModule::GatherAvailableAncestors(thread, module1, execList3);
3498 EXPECT_TRUE(!thread->HasPendingException());
3499 }
3500
HWTEST_F_L0(EcmaModuleTest,ExecuteCjsModuleTest)3501 HWTEST_F_L0(EcmaModuleTest, ExecuteCjsModuleTest)
3502 {
3503 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3504 CString baseFileName = "modules.abc";
3505 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3506 module->SetEcmaModuleFilenameString(baseFileName);
3507 CString recordName = "modules.abc";
3508 module->SetEcmaModuleRecordNameString(recordName);
3509 module->SetStatus(ModuleStatus::EVALUATED);
3510 ModuleManager *moduleManager = thread->GetModuleManager();
3511 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3512
3513 const char *data = R"(
3514 .language ECMAScript
3515 .function any func_main_0(any a0, any a1, any a2) {
3516 ldai 1
3517 return
3518 }
3519 )";
3520 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
3521 Parser parser;
3522 auto res = parser.Parse(data);
3523 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
3524 std::shared_ptr<JSPandaFile> jsPandaFile = pfManager->NewJSPandaFile(pfPtr.release(), baseFileName);
3525
3526 CString recordName2 = "testModule";
3527 moduleManager->ExecuteCjsModule(thread, recordName2, jsPandaFile.get());
3528 EXPECT_TRUE(!thread->HasPendingException());
3529 }
3530
HWTEST_F_L0(EcmaModuleTest,ExecuteCjsModuleTest2)3531 HWTEST_F_L0(EcmaModuleTest, ExecuteCjsModuleTest2)
3532 {
3533 const char *fileName = "__JSPandaFileExecutorTest1.abc";
3534 const char *data = R"(
3535 .language ECMAScript
3536 .function any func_main_0(any a0, any a1, any a2) {
3537 ldai 1
3538 return
3539 }
3540 )";
3541 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
3542 Parser parser;
3543 auto res = parser.Parse(data);
3544 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
3545 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), CString(fileName));
3546 const uint8_t *typeDesc = utf::CStringAsMutf8("L_GLOBAL;");
3547 const File *file = pf->GetPandaFile();
3548 File::EntityId classId = file->GetClassId(typeDesc);
3549 ClassDataAccessor cda(*file, classId);
3550 std::vector<File::EntityId> methodId {};
3551 cda.EnumerateMethods([&](panda_file::MethodDataAccessor &mda) {
3552 methodId.push_back(mda.GetMethodId());
3553 });
3554 pf->UpdateMainMethodIndex(methodId[0].GetOffset());
3555 MethodLiteral *method = new MethodLiteral(methodId[0]);
3556 method->Initialize(pf.get());
3557 pf->SetMethodLiteralToMap(method);
3558 pfManager->AddJSPandaFile(pf);
3559 CString recordName = "testModule";
3560 ModuleManager *moduleManager = thread->GetModuleManager();
3561 moduleManager->ExecuteCjsModule(thread, recordName, pf.get());
3562 EXPECT_TRUE(!thread->HasPendingException());
3563 }
3564
3565
HWTEST_F_L0(EcmaModuleTest,GetLazyModuleValueOuter)3566 HWTEST_F_L0(EcmaModuleTest, GetLazyModuleValueOuter)
3567 {
3568 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3569 CString baseFileName = "modules.abc";
3570 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3571 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3572 module->SetEcmaModuleFilenameString(baseFileName);
3573 CString recordName = "cjs";
3574 module->SetEcmaModuleRecordNameString(recordName);
3575 module->SetTypes(ModuleTypes::NATIVE_MODULE);
3576 module->SetStatus(ModuleStatus::EVALUATED);
3577 ModuleManager *moduleManager = thread->GetModuleManager();
3578 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3579 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3580 JSHandle<JSTaggedValue> resolution =
3581 JSHandle<JSTaggedValue>::Cast(objectFactory->NewResolvedBindingRecord(module, val));
3582 envRec->Set(thread, 0, resolution);
3583 module->SetEnvironment(thread, envRec);
3584 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3585 ctor->SetModule(thread, module);
3586 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3587 ModuleValueAccessor::GetLazyModuleValueOuter(thread, 0, jsFunc);
3588 EXPECT_TRUE(thread->HasPendingException());
3589 }
3590
HWTEST_F_L0(EcmaModuleTest,GetLazyModuleValueOuter2)3591 HWTEST_F_L0(EcmaModuleTest, GetLazyModuleValueOuter2)
3592 {
3593 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3594 CString baseFileName = "modules.abc";
3595 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3596 module->SetEcmaModuleFilenameString(baseFileName);
3597 CString recordName = "cjs";
3598 module->SetEcmaModuleRecordNameString(recordName);
3599 module->SetTypes(ModuleTypes::CJS_MODULE);
3600 module->SetStatus(ModuleStatus::EVALUATED);
3601 ModuleManager *moduleManager = thread->GetModuleManager();
3602 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3603
3604 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3605 ctor->SetModule(thread, module);
3606 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3607 ModuleValueAccessor::GetLazyModuleValueOuter(thread, 0, jsFunc);
3608 EXPECT_TRUE(!thread->HasPendingException());
3609
3610 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName);
3611 JSHandle<EcmaString> baseFileNameHdl = objectFactory->NewFromUtf8(baseFileName);
3612 JSHandle<ResolvedRecordIndexBinding> recordIndexBinding =
3613 objectFactory->NewSResolvedRecordIndexBindingRecord(recordNameHdl, baseFileNameHdl, 0);
3614 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3615 JSHandle<JSTaggedValue> resolution = JSHandle<JSTaggedValue>::Cast(recordIndexBinding);
3616 envRec->Set(thread, 0, resolution);
3617 module->SetEnvironment(thread, envRec);
3618 ctor->SetModule(thread, module);
3619 jsFunc = ctor.GetTaggedValue();
3620 ModuleValueAccessor::GetLazyModuleValueOuter(thread, 0, jsFunc);
3621 EXPECT_TRUE(thread->HasPendingException());
3622 }
3623
HWTEST_F_L0(EcmaModuleTest,GetLazyModuleValueOuter3)3624 HWTEST_F_L0(EcmaModuleTest, GetLazyModuleValueOuter3)
3625 {
3626 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3627 CString baseFileName = "modules.abc";
3628 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3629 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3630 module->SetEcmaModuleFilenameString(baseFileName);
3631 CString recordName = "cjs";
3632 module->SetEcmaModuleRecordNameString(recordName);
3633 module->SetTypes(ModuleTypes::CJS_MODULE);
3634 module->SetStatus(ModuleStatus::EVALUATED);
3635 ModuleManager *moduleManager = thread->GetModuleManager();
3636 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3637 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName);
3638 JSHandle<ResolvedRecordBinding> nameBinding =
3639 objectFactory->NewSResolvedRecordBindingRecord(recordNameHdl, val);
3640
3641 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3642 JSHandle<JSTaggedValue> resolution = JSHandle<JSTaggedValue>::Cast(nameBinding);
3643 envRec->Set(thread, 0, resolution);
3644 module->SetEnvironment(thread, envRec);
3645 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3646 ctor->SetModule(thread, module);
3647 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3648 ModuleValueAccessor::GetLazyModuleValueOuter(thread, 0, jsFunc);
3649 EXPECT_TRUE(thread->HasPendingException());
3650 }
3651
HWTEST_F_L0(EcmaModuleTest,GetModuleValueOuter1)3652 HWTEST_F_L0(EcmaModuleTest, GetModuleValueOuter1)
3653 {
3654 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3655 CString baseFileName = "modules.abc";
3656 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3657 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3658 module->SetEcmaModuleFilenameString(baseFileName);
3659 CString recordName = "cjs";
3660 module->SetEcmaModuleRecordNameString(recordName);
3661 module->SetTypes(ModuleTypes::NATIVE_MODULE);
3662 module->SetStatus(ModuleStatus::EVALUATED);
3663 ModuleManager *moduleManager = thread->GetModuleManager();
3664 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3665 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3666 JSHandle<JSTaggedValue> resolution =
3667 JSHandle<JSTaggedValue>::Cast(objectFactory->NewResolvedBindingRecord(module, val));
3668 envRec->Set(thread, 0, resolution);
3669 module->SetEnvironment(thread, envRec);
3670 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3671 ctor->SetModule(thread, module);
3672 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3673 ModuleValueAccessor::GetModuleValueOuter(thread, 0, jsFunc);
3674 EXPECT_TRUE(thread->HasPendingException());
3675 }
3676
HWTEST_F_L0(EcmaModuleTest,GetModuleValueOuter2)3677 HWTEST_F_L0(EcmaModuleTest, GetModuleValueOuter2)
3678 {
3679 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3680 CString baseFileName = "modules.abc";
3681 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3682 module->SetEcmaModuleFilenameString(baseFileName);
3683 CString recordName = "cjs";
3684 module->SetEcmaModuleRecordNameString(recordName);
3685 module->SetTypes(ModuleTypes::CJS_MODULE);
3686 module->SetStatus(ModuleStatus::EVALUATED);
3687 ModuleManager *moduleManager = thread->GetModuleManager();
3688 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3689 EXPECT_TRUE(!thread->HasPendingException());
3690
3691 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3692 ctor->SetModule(thread, module);
3693 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3694 ModuleValueAccessor::GetModuleValueOuter(thread, 0, jsFunc);
3695
3696 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName);
3697 JSHandle<EcmaString> baseFileNameHdl = objectFactory->NewFromUtf8(baseFileName);
3698 JSHandle<ResolvedRecordIndexBinding> recordIndexBinding =
3699 objectFactory->NewSResolvedRecordIndexBindingRecord(recordNameHdl, baseFileNameHdl, 0);
3700 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3701 JSHandle<JSTaggedValue> resolution = JSHandle<JSTaggedValue>::Cast(recordIndexBinding);
3702 envRec->Set(thread, 0, resolution);
3703 module->SetEnvironment(thread, envRec);
3704 ctor->SetModule(thread, module);
3705 jsFunc = ctor.GetTaggedValue();
3706 ModuleValueAccessor::GetModuleValueOuter(thread, 0, jsFunc);
3707 EXPECT_TRUE(thread->HasPendingException());
3708 }
3709
HWTEST_F_L0(EcmaModuleTest,GetModuleValueOuter3)3710 HWTEST_F_L0(EcmaModuleTest, GetModuleValueOuter3)
3711 {
3712 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3713 CString baseFileName = "modules.abc";
3714 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3715 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3716 module->SetEcmaModuleFilenameString(baseFileName);
3717 CString recordName = "cjs";
3718 module->SetEcmaModuleRecordNameString(recordName);
3719 module->SetTypes(ModuleTypes::CJS_MODULE);
3720 module->SetStatus(ModuleStatus::EVALUATED);
3721 ModuleManager *moduleManager = thread->GetModuleManager();
3722 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3723 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName);
3724 JSHandle<ResolvedRecordBinding> nameBinding =
3725 objectFactory->NewSResolvedRecordBindingRecord(recordNameHdl, val);
3726
3727 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3728 JSHandle<JSTaggedValue> resolution = JSHandle<JSTaggedValue>::Cast(nameBinding);
3729 envRec->Set(thread, 0, resolution);
3730 module->SetEnvironment(thread, envRec);
3731 JSHandle<JSFunction> ctor(thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction());
3732 ctor->SetModule(thread, module);
3733 JSTaggedValue jsFunc = ctor.GetTaggedValue();
3734 ModuleValueAccessor::GetModuleValueOuter(thread, 0, jsFunc);
3735 EXPECT_TRUE(thread->HasPendingException());
3736 }
3737
HWTEST_F_L0(EcmaModuleTest,GetSendableModuleValueImpl2)3738 HWTEST_F_L0(EcmaModuleTest, GetSendableModuleValueImpl2) {
3739 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3740 CString baseFileName = "modules.abc";
3741 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3742 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3743 module->SetEcmaModuleFilenameString(baseFileName);
3744 CString recordName = "cjs";
3745 module->SetEcmaModuleRecordNameString(recordName);
3746 module->SetTypes(ModuleTypes::CJS_MODULE);
3747 module->SetStatus(ModuleStatus::EVALUATED);
3748 ModuleManager *moduleManager = thread->GetModuleManager();
3749 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3750 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName);
3751 JSHandle<ResolvedRecordBinding> nameBinding =
3752 objectFactory->NewSResolvedRecordBindingRecord(recordNameHdl, val);
3753 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3754 JSHandle<JSTaggedValue> resolution = JSHandle<JSTaggedValue>::Cast(nameBinding);
3755 envRec->Set(thread, 0, resolution);
3756 module->SetEnvironment(thread, envRec);
3757 MockModuleValueAccessor::GetSendableModuleValueOuterInternal<false>(thread, 0, module.GetTaggedValue());
3758 EXPECT_TRUE(thread->HasPendingException());
3759 }
3760
HWTEST_F_L0(EcmaModuleTest,GetLazySendableModuleValueImpl2)3761 HWTEST_F_L0(EcmaModuleTest, GetLazySendableModuleValueImpl2) {
3762 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3763 CString baseFileName = "modules.abc";
3764 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3765 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3766 module->SetEcmaModuleFilenameString(baseFileName);
3767 CString recordName = "cjs";
3768 module->SetEcmaModuleRecordNameString(recordName);
3769 module->SetTypes(ModuleTypes::CJS_MODULE);
3770 module->SetStatus(ModuleStatus::EVALUATED);
3771 ModuleManager *moduleManager = thread->GetModuleManager();
3772 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
3773 JSHandle<EcmaString> recordNameHdl = objectFactory->NewFromUtf8(recordName);
3774 JSHandle<ResolvedRecordBinding> nameBinding =
3775 objectFactory->NewSResolvedRecordBindingRecord(recordNameHdl, val);
3776 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3777 JSHandle<JSTaggedValue> resolution = JSHandle<JSTaggedValue>::Cast(nameBinding);
3778 envRec->Set(thread, 0, resolution);
3779 module->SetEnvironment(thread, envRec);
3780 MockModuleValueAccessor::GetSendableModuleValueOuterInternal<true>(thread, 0, module.GetTaggedValue());
3781 EXPECT_TRUE(thread->HasPendingException());
3782 }
3783
HWTEST_F_L0(EcmaModuleTest,GenerateSendableFuncModule2)3784 HWTEST_F_L0(EcmaModuleTest, GenerateSendableFuncModule2)
3785 {
3786 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3787 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3788 module->SetTypes(ModuleTypes::NATIVE_MODULE);
3789 JSHandle<JSTaggedValue> moduleRecord = JSHandle<JSTaggedValue>::Cast(module);
3790 SendableClassModule::GenerateSendableFuncModule(thread, moduleRecord);
3791 JSHandle<SourceTextModule> currentModule = JSHandle<SourceTextModule>::Cast(moduleRecord);
3792 EXPECT_FALSE(SourceTextModule::IsModuleInSharedHeap(currentModule));
3793 }
3794
HWTEST_F_L0(EcmaModuleTest,CloneEnvForSModule1)3795 HWTEST_F_L0(EcmaModuleTest, CloneEnvForSModule1)
3796 {
3797 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3798 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
3799 CString baseFileName = "modules.abc";
3800 module1->SetEcmaModuleFilenameString(baseFileName);
3801 CString recordName1 = "a";
3802 module1->SetEcmaModuleRecordNameString(recordName1);
3803 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3804 JSHandle<ImportEntry> importEntry =
3805 objectFactory->NewImportEntry(0, val, val, SharedTypes::UNSENDABLE_MODULE);
3806 SourceTextModule::AddImportEntry(thread, module1, importEntry, 0, 1);
3807 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
3808 JSHandle<JSTaggedValue> resolution = JSHandle<JSTaggedValue>::Cast(
3809 objectFactory->NewResolvedBindingRecord(module1, val));
3810 envRec->Set(thread, 0, resolution);
3811 module1->SetEnvironment(thread, envRec);
3812 module1->SetTypes(ModuleTypes::NATIVE_MODULE);
3813 JSHandle<TaggedArray> elements = JSSharedModule::CloneEnvForSModule(thread, module1, envRec);
3814 EXPECT_TRUE(elements->GetLength() == 1U);
3815 }
3816
HWTEST_F_L0(EcmaModuleTest,TransferFromLocalToSharedModuleMapAndGetInsertedSModule)3817 HWTEST_F_L0(EcmaModuleTest, TransferFromLocalToSharedModuleMapAndGetInsertedSModule) {
3818 SharedModuleManager* manager1 = SharedModuleManager::GetInstance();
3819 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3820 JSHandle<SourceTextModule> module1 = objectFactory->NewSSourceTextModule();
3821 CString recordName = "test";
3822 module1->SetEcmaModuleRecordNameString(recordName);
3823 module1->SetSharedType(SharedTypes::SHARED_MODULE);
3824 // success
3825 JSHandle<SourceTextModule> res =
3826 manager1->TransferFromLocalToSharedModuleMapAndGetInsertedSModule(thread, module1);
3827 EXPECT_EQ(res, module1);
3828 // insert fail
3829 JSHandle<SourceTextModule> module2 = objectFactory->NewSSourceTextModule();
3830 module2->SetEcmaModuleRecordNameString(recordName);
3831 module2->SetSharedType(SharedTypes::SHARED_MODULE);
3832 res = manager1->TransferFromLocalToSharedModuleMapAndGetInsertedSModule(thread, module2);
3833 EXPECT_EQ(res, module1);
3834 }
3835
HWTEST_F_L0(EcmaModuleTest,FindModuleMutexWithLock)3836 HWTEST_F_L0(EcmaModuleTest, FindModuleMutexWithLock) {
3837 SharedModuleManager* manager1 = SharedModuleManager::GetInstance();
3838 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3839 JSHandle<SourceTextModule> module1 = objectFactory->NewSSourceTextModule();
3840 std::string baseFileNameStr = MODULE_ABC_PATH "module_unexecute.abc";
3841 CString baseFileName = baseFileNameStr.c_str();
3842 module1->SetEcmaModuleFilenameString(baseFileName);
3843 CString recordName1 = "module_unexecute";
3844 module1->SetEcmaModuleRecordNameString(recordName1);
3845 manager1->AddToResolvedModulesAndCreateSharedModuleMutex(thread, recordName1, module1.GetTaggedValue());
3846 manager1->FindModuleMutexWithLock(thread, module1);
3847 EXPECT_FALSE(thread->HasPendingException());
3848 }
3849
HWTEST_F_L0(EcmaModuleTest,GetRecordName3)3850 HWTEST_F_L0(EcmaModuleTest, GetRecordName3)
3851 {
3852 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_module_base.abc";
3853
3854 JSNApi::EnableUserUncaughtErrorHandler(instance);
3855
3856 int arkProperties = thread->GetEcmaVM()->GetJSOptions().GetArkProperties();
3857 thread->GetEcmaVM()->GetJSOptions().SetArkProperties(arkProperties | ArkProperties::ENABLE_ESM_TRACE);
3858 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_module_base");
3859 EXPECT_TRUE(result);
3860 }
3861
HWTEST_F_L0(EcmaModuleTest,GetExportObjectIndex3)3862 HWTEST_F_L0(EcmaModuleTest, GetExportObjectIndex3)
3863 {
3864 ecmascript::ThreadNativeScope nativeScope(thread);
3865 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
3866
3867 JSNApi::EnableUserUncaughtErrorHandler(instance);
3868
3869 ModuleLogger *moduleLogger = new ModuleLogger(thread->GetEcmaVM());
3870 thread->SetModuleLogger(moduleLogger);
3871 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
3872 JSNApi::GetExportObject(instance, "module_test_module_test_B", "a");
3873 EXPECT_TRUE(result);
3874 thread->SetModuleLogger(nullptr);
3875 delete moduleLogger;
3876 }
3877
HWTEST_F_L0(EcmaModuleTest,GetModuleValueOuterInternal2)3878 HWTEST_F_L0(EcmaModuleTest, GetModuleValueOuterInternal2)
3879 {
3880 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
3881 JSNApi::EnableUserUncaughtErrorHandler(instance);
3882 int arkProperties = thread->GetEcmaVM()->GetJSOptions().GetArkProperties();
3883 thread->GetEcmaVM()->GetJSOptions().SetArkProperties(arkProperties | ArkProperties::ENABLE_ESM_TRACE);
3884 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
3885 EXPECT_TRUE(result);
3886 }
3887
HWTEST_F_L0(EcmaModuleTest,RemoveModule)3888 HWTEST_F_L0(EcmaModuleTest, RemoveModule)
3889 {
3890 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
3891 JSNApi::EnableUserUncaughtErrorHandler(instance);
3892 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
3893 EXPECT_TRUE(result);
3894 ModuleManager *moduleManager = thread->GetModuleManager();
3895 thread->GetEcmaVM()->GetJSOptions().SetIsWorker(false);
3896
3897 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
3898 module->SetTypes(ModuleTypes::APP_MODULE);
3899
3900 JSHandle<JSTaggedValue> res = moduleManager->TryGetImportedModule("module_test_module_test_C");
3901 EXPECT_NE(res, thread->GlobalConstants()->GetHandledUndefined());
3902 ModuleDeregister::RemoveModule(thread, module);
3903
3904 res = moduleManager->TryGetImportedModule("module_test_module_test_C");
3905 EXPECT_EQ(res, thread->GlobalConstants()->GetHandledUndefined());
3906 }
3907
HWTEST_F_L0(EcmaModuleTest,RemoveModule2)3908 HWTEST_F_L0(EcmaModuleTest, RemoveModule2)
3909 {
3910 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
3911 JSNApi::EnableUserUncaughtErrorHandler(instance);
3912 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
3913 EXPECT_TRUE(result);
3914 ModuleManager *moduleManager = thread->GetModuleManager();
3915 thread->GetEcmaVM()->GetJSOptions().SetIsWorker(false);
3916
3917 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
3918 module->SetTypes(ModuleTypes::OHOS_MODULE);
3919
3920 JSHandle<JSTaggedValue> res = moduleManager->TryGetImportedModule("module_test_module_test_C");
3921 EXPECT_NE(res, thread->GlobalConstants()->GetHandledUndefined());
3922 ModuleDeregister::RemoveModule(thread, module);
3923
3924 res = moduleManager->TryGetImportedModule("module_test_module_test_C");
3925 EXPECT_EQ(res, thread->GlobalConstants()->GetHandledUndefined());
3926 }
3927
HWTEST_F_L0(EcmaModuleTest,IsEvaluatedModule)3928 HWTEST_F_L0(EcmaModuleTest, IsEvaluatedModule)
3929 {
3930 std::string baseFileName = MODULE_ABC_PATH "module_test_module_test_C.abc";
3931 JSNApi::EnableUserUncaughtErrorHandler(instance);
3932 bool result = JSNApi::Execute(instance, baseFileName, "module_test_module_test_C");
3933 EXPECT_TRUE(result);
3934 ModuleManager *moduleManager = thread->GetModuleManager();
3935 JSHandle<SourceTextModule> module = moduleManager->HostGetImportedModule("module_test_module_test_C");
3936 StateVisit stateVisit;
3937 bool res = SourceTextModule::IsEvaluatedModule(thread, stateVisit, module);
3938 EXPECT_TRUE(res);
3939 }
3940
HWTEST_F_L0(EcmaModuleTest,ResolveNativeStarExport2)3941 HWTEST_F_L0(EcmaModuleTest, ResolveNativeStarExport2)
3942 {
3943 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
3944 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3945 CString recordName = "@ohos:hilog";
3946 module->SetEcmaModuleRecordNameString(recordName);
3947 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3948 JSHandle<LocalExportEntry> localExportEntry =
3949 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
3950 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
3951 localExportEntries->Set(thread, 0, localExportEntry);
3952 module->SetLocalExportEntries(thread, localExportEntries);
3953 SourceTextModule::StoreModuleValue(thread, module, 0, val);
3954 module->SetTypes(ModuleTypes::NATIVE_MODULE);
3955
3956 int arkProperties = thread->GetEcmaVM()->GetJSOptions().GetArkProperties();
3957 thread->GetEcmaVM()->GetJSOptions().SetArkProperties(arkProperties | ArkProperties::ENABLE_ESM_TRACE);
3958 JSHandle<JSTaggedValue> res1 = SourceTextModule::ResolveNativeStarExport(thread, module, val);
3959 EXPECT_TRUE(res1->IsNull());
3960 }
3961
HWTEST_F_L0(EcmaModuleTest,LoadNativeModuleImpl2)3962 HWTEST_F_L0(EcmaModuleTest, LoadNativeModuleImpl2)
3963 {
3964 auto vm = thread->GetEcmaVM();
3965 ObjectFactory *objectFactory = vm->GetFactory();
3966 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3967 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3968 JSHandle<LocalExportEntry> localExportEntry =
3969 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
3970 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
3971 localExportEntries->Set(thread, 0, localExportEntry);
3972 module->SetLocalExportEntries(thread, localExportEntries);
3973 SourceTextModule::StoreModuleValue(thread, module, 0, val);
3974 module->SetTypes(ModuleTypes::NATIVE_MODULE);
3975 ModuleLogger *moduleLogger = new ModuleLogger(vm);
3976 thread->SetModuleLogger(moduleLogger);
3977
3978 // internal module
3979 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
3980 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
3981 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
3982 JSTaggedValue::SetProperty(thread, global, keyValue, thread->GlobalConstants()->GetHandledUndefined());
3983 module->SetEcmaModuleRecordNameString("@hms:xxxxx");
3984 int arkProperties = thread->GetEcmaVM()->GetJSOptions().GetArkProperties();
3985 thread->GetEcmaVM()->GetJSOptions().SetArkProperties(arkProperties | ArkProperties::ENABLE_ESM_TRACE);
3986 SourceTextModule::LoadNativeModuleImpl(vm, thread, module, ModuleTypes::INTERNAL_MODULE);
3987 EXPECT_TRUE(!thread->HasPendingException());
3988 thread->SetModuleLogger(nullptr);
3989 delete moduleLogger;
3990 }
3991
HWTEST_F_L0(EcmaModuleTest,LoadNativeModule3)3992 HWTEST_F_L0(EcmaModuleTest, LoadNativeModule3)
3993 {
3994 auto vm = thread->GetEcmaVM();
3995 ObjectFactory *objectFactory = vm->GetFactory();
3996 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
3997 JSHandle<JSTaggedValue> val = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("val"));
3998 JSHandle<LocalExportEntry> localExportEntry =
3999 objectFactory->NewLocalExportEntry(val, val, 0, SharedTypes::UNSENDABLE_MODULE);
4000 JSHandle<TaggedArray> localExportEntries = objectFactory->NewTaggedArray(1);
4001 localExportEntries->Set(thread, 0, localExportEntry);
4002 module->SetEcmaModuleRecordNameString("@app:bundleName/moduleName/lib*.so");
4003 module->SetLocalExportEntries(thread, localExportEntries);
4004 SourceTextModule::StoreModuleValue(thread, module, 0, val);
4005 module->SetTypes(ModuleTypes::NATIVE_MODULE);
4006 JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
4007 JSHandle<JSTaggedValue> global(thread, globalEnv->GetGlobalObject());
4008 JSHandle<JSTaggedValue> keyValue = JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromUtf8("requireNapi"));
4009 JSHandle<JSFunction> current(objectFactory->NewJSFunction(globalEnv,
4010 reinterpret_cast<void *>(Callback::RegisterCallback)));
4011 JSFunction::SetFunctionExtraInfo(thread, current, reinterpret_cast<void *>(MockRequireNapiValue),
4012 nullptr, nullptr, 0);
4013 JSTaggedValue::SetProperty(thread, global, keyValue, JSHandle<JSTaggedValue>(current));
4014 int arkProperties = thread->GetEcmaVM()->GetJSOptions().GetArkProperties();
4015 thread->GetEcmaVM()->GetJSOptions().SetArkProperties(arkProperties | ArkProperties::ENABLE_ESM_TRACE);
4016 SourceTextModule::LoadNativeModule(thread, module, ModuleTypes::APP_MODULE);
4017 EXPECT_TRUE(!thread->HasPendingException());
4018 }
4019
HWTEST_F_L0(EcmaModuleTest,EvaluateForConcurrent)4020 HWTEST_F_L0(EcmaModuleTest, EvaluateForConcurrent)
4021 {
4022 // Mock create sendable function
4023 auto objectFactory = thread->GetEcmaVM()->GetFactory();
4024 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
4025
4026 uint32_t methodOffset = 100;
4027 MethodLiteral *methodLiteral = new MethodLiteral(EntityId(methodOffset));
4028 methodLiteral->SetIsShared(true);
4029 JSHandle<Method> method = objectFactory->NewSMethod(methodLiteral);
4030
4031 module->SetStatus(ModuleStatus::INSTANTIATED);
4032 int res = SourceTextModule::EvaluateForConcurrent(thread, module, method);
4033 EXPECT_EQ(res, SourceTextModule::UNDEFINED_INDEX);
4034
4035 module->SetStatus(ModuleStatus::EVALUATED);
4036 res = SourceTextModule::EvaluateForConcurrent(thread, module, method);
4037 EXPECT_EQ(res, SourceTextModule::UNDEFINED_INDEX);
4038
4039 JSHandle<JSObject> error = objectFactory->GetJSError(
4040 base::ErrorType::RANGE_ERROR, "Stack overflow!", StackCheck::NO);
4041 thread->SetException(error.GetTaggedValue());
4042 res = SourceTextModule::EvaluateForConcurrent(thread, module, method);
4043 EXPECT_EQ(res, 0);
4044 }
4045
HWTEST_F_L0(EcmaModuleTest,ModuleDeclarationArrayEnvironmentSetup2)4046 HWTEST_F_L0(EcmaModuleTest, ModuleDeclarationArrayEnvironmentSetup2)
4047 {
4048 auto vm = thread->GetEcmaVM();
4049 ObjectFactory *objectFactory = vm->GetFactory();
4050 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
4051 int arkProperties = thread->GetEcmaVM()->GetJSOptions().GetArkProperties();
4052 thread->GetEcmaVM()->GetJSOptions().SetArkProperties(arkProperties | ArkProperties::ENABLE_ESM_TRACE);
4053 SourceTextModule::ModuleDeclarationArrayEnvironmentSetup(thread, module);
4054 EXPECT_TRUE(!thread->HasPendingException());
4055
4056 module->SetStatus(ModuleStatus::EVALUATED);
4057 SourceTextModule::ModuleDeclarationArrayEnvironmentSetup(thread, module);
4058 EXPECT_TRUE(!thread->HasPendingException());
4059 }
4060
HWTEST_F_L0(EcmaModuleTest,IsOhmUrl)4061 HWTEST_F_L0(EcmaModuleTest, IsOhmUrl)
4062 {
4063 CString ohmUrl = "@bundle:com.bundleName.test/moduleName/requestModuleName";
4064 bool res = ModulePathHelper::IsOhmUrl(ohmUrl);
4065 EXPECT_EQ(res, true);
4066
4067 ohmUrl = "@package:pkg_modules@entry.@hw-agconnect.hmcore";
4068 res = ModulePathHelper::IsOhmUrl(ohmUrl);
4069 EXPECT_EQ(res, true);
4070
4071 ohmUrl = "@normalized:N&&&har/Index&1.0.0";
4072 res = ModulePathHelper::IsOhmUrl(ohmUrl);
4073 EXPECT_EQ(res, true);
4074
4075 ohmUrl = "ets/Test";
4076 res = ModulePathHelper::IsOhmUrl(ohmUrl);
4077 EXPECT_EQ(res, false);
4078 }
4079
HWTEST_F_L0(EcmaModuleTest,CheckAndGetRecordName)4080 HWTEST_F_L0(EcmaModuleTest, CheckAndGetRecordName)
4081 {
4082 CString recordName = "";
4083 CString ohmUrl = "@bundle:com.bundleName.test/moduleName/requestModuleName";
4084 bool res = ModulePathHelper::CheckAndGetRecordName(thread, ohmUrl, recordName);
4085 EXPECT_EQ(res, true);
4086
4087 ohmUrl = "@package:pkg_modules@entry.@hw-agconnect.hmcore";
4088 res = ModulePathHelper::CheckAndGetRecordName(thread, ohmUrl, recordName);
4089 EXPECT_EQ(res, true);
4090
4091 ohmUrl = "@normalized:N&&&har/Index&1.0.0";
4092 res = ModulePathHelper::CheckAndGetRecordName(thread, ohmUrl, recordName);
4093 EXPECT_EQ(res, true);
4094
4095 ohmUrl = "ets/Test";
4096 res = ModulePathHelper::CheckAndGetRecordName(thread, ohmUrl, recordName);
4097 EXPECT_EQ(res, false);
4098 }
4099
HWTEST_F_L0(EcmaModuleTest,ValidateAbcPath)4100 HWTEST_F_L0(EcmaModuleTest, ValidateAbcPath)
4101 {
4102 CString baseFileName = "/data/storage/el1/bundle/com.bundleName.test/moduleName/moduleName/ets/modules.abc";
4103 bool res = ModulePathHelper::ValidateAbcPath(baseFileName, ValidateFilePath::ETS_MODULES);
4104 EXPECT_EQ(res, true);
4105
4106 baseFileName = "";
4107 res = ModulePathHelper::ValidateAbcPath(baseFileName, ValidateFilePath::ETS_MODULES);
4108 EXPECT_EQ(res, false);
4109
4110 baseFileName = "/data/storage/el1/bundle1/com.bundleName.test";
4111 res = ModulePathHelper::ValidateAbcPath(baseFileName, ValidateFilePath::ETS_MODULES);
4112 EXPECT_EQ(res, false);
4113
4114 baseFileName = "/data/storage/el1/bundle/";
4115 res = ModulePathHelper::ValidateAbcPath(baseFileName, ValidateFilePath::ETS_MODULES);
4116 EXPECT_EQ(res, false);
4117
4118 baseFileName = "/data/storage/el1/bundle/com.bundleName.test/moduleName/moduleName/ets/modules.ab";
4119 res = ModulePathHelper::ValidateAbcPath(baseFileName, ValidateFilePath::ETS_MODULES);
4120 EXPECT_EQ(res, false);
4121
4122 baseFileName = "/data/storage/el1/bundle/com.bundleName.test/moduleName/moduleName/ets/modules.ab";
4123 res = ModulePathHelper::ValidateAbcPath(baseFileName, ValidateFilePath::ABC);
4124 EXPECT_EQ(res, false);
4125 }
4126
4127
HWTEST_F_L0(EcmaModuleTest,ParseCrossModuleFile)4128 HWTEST_F_L0(EcmaModuleTest, ParseCrossModuleFile)
4129 {
4130 CString baseFilename = "merge.abc";
4131 const char *data = R"(
4132 .language ECMAScript
4133 .function any func_main_0(any a0, any a1, any a2) {
4134 ldai 1
4135 return
4136 }
4137 )";
4138 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
4139 Parser parser;
4140 auto res = parser.Parse(data);
4141 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
4142 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
4143 CString requestPath = "moduleName/src/main/a/b/c";
4144 ModulePathHelper::ParseCrossModuleFile(pf.get(), requestPath);
4145 EXPECT_EQ(requestPath, "moduleName/src/main/a/b/c");
4146
4147 requestPath="moduleName/src";
4148 ModulePathHelper::ParseCrossModuleFile(pf.get(), requestPath);
4149 EXPECT_EQ(requestPath, "moduleName/src");
4150
4151 requestPath="moduleName/src";
4152 CString recordInfo1 = "moduleName";
4153 CString fieldInfo1 = "/src";
4154 pf->InsertNpmEntries(recordInfo1, fieldInfo1);
4155 ModulePathHelper::ParseCrossModuleFile(pf.get(), requestPath);
4156 EXPECT_EQ(requestPath, "/src");
4157
4158 requestPath="moduleName/src/main/a/b/c";
4159 CString recordInfo2 = "moduleName";
4160 CString fieldInfo2 = "/src/main/a/b/c";
4161 pf->InsertNpmEntries(recordInfo2, fieldInfo2);
4162 ModulePathHelper::ParseCrossModuleFile(pf.get(), requestPath);
4163 EXPECT_EQ(requestPath, "/a/b/c");
4164 }
4165
HWTEST_F_L0(EcmaModuleTest,CheckAndThrowModuleError)4166 HWTEST_F_L0(EcmaModuleTest, CheckAndThrowModuleError)
4167 {
4168 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
4169 CString baseFileName = "modules.abc";
4170 JSHandle<SourceTextModule> module1 = objectFactory->NewSourceTextModule();
4171 JSHandle<SourceTextModule> module2 = objectFactory->NewSourceTextModule();
4172 module1->SetEcmaModuleFilenameString(baseFileName);
4173 module2->SetEcmaModuleFilenameString(baseFileName);
4174 CString recordName1 = "a";
4175 CString recordName2 = "b";
4176 module1->SetEcmaModuleRecordNameString(recordName1);
4177 module2->SetEcmaModuleRecordNameString(recordName2);
4178 module1->SetSharedType(SharedTypes::SHARED_MODULE);
4179 module1->SetStatus(ModuleStatus::EVALUATED);
4180 module2->SetStatus(ModuleStatus::EVALUATED);
4181 ModuleManager *moduleManager = thread->GetModuleManager();
4182 moduleManager->AddResolveImportedModule(recordName1, module1.GetTaggedValue());
4183 moduleManager->AddResolveImportedModule(recordName2, module2.GetTaggedValue());
4184 JSHandle<SourceTextModule> moduleRecord1 = moduleManager->HostGetImportedModule(recordName1);
4185 moduleRecord1->CheckAndThrowModuleError(thread);
4186 EXPECT_TRUE(!thread->HasPendingException());
4187 JSHandle<SourceTextModule> moduleRecord2 = moduleManager->HostGetImportedModule(recordName2);
4188 moduleRecord2->CheckAndThrowModuleError(thread);
4189 EXPECT_TRUE(!thread->HasPendingException());
4190 }
4191
HWTEST_F_L0(EcmaModuleTest,ModuleStatusOrder)4192 HWTEST_F_L0(EcmaModuleTest, ModuleStatusOrder)
4193 {
4194 EXPECT_EQ(static_cast<int>(ModuleStatus::UNINSTANTIATED), 0x00);
4195 EXPECT_EQ(static_cast<int>(ModuleStatus::PREINSTANTIATING), 0x01);
4196 EXPECT_EQ(static_cast<int>(ModuleStatus::INSTANTIATING), 0x02);
4197 EXPECT_EQ(static_cast<int>(ModuleStatus::INSTANTIATED), 0x03);
4198 EXPECT_EQ(static_cast<int>(ModuleStatus::EVALUATING), 0x04);
4199 EXPECT_EQ(static_cast<int>(ModuleStatus::EVALUATING_ASYNC), 0x05);
4200 EXPECT_EQ(static_cast<int>(ModuleStatus::EVALUATED), 0x06);
4201 EXPECT_EQ(static_cast<int>(ModuleStatus::ERRORED), 0x07);
4202 }
4203
HWTEST_F_L0(EcmaModuleTest,FindOhpmEntryPoint)4204 HWTEST_F_L0(EcmaModuleTest, FindOhpmEntryPoint)
4205 {
4206 CString baseFilename = "merge.abc";
4207 const char *data = R"(
4208 .language ECMAScript
4209 .function any func_main_0(any a0, any a1, any a2) {
4210 ldai 1
4211 return
4212 }
4213 )";
4214 JSPandaFileManager *pfManager = JSPandaFileManager::GetInstance();
4215 Parser parser;
4216 auto res = parser.Parse(data);
4217 std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
4218 std::shared_ptr<JSPandaFile> pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
4219
4220 //test requestName is empty string
4221 CString ohpmPath = "pkg_modules/0";
4222 CString requestName = "";
4223 CString result = "";
4224 CString entryPoint = ModulePathHelper::FindOhpmEntryPoint(pf.get(), ohpmPath, requestName);
4225 EXPECT_EQ(entryPoint, result);
4226 }
4227
HWTEST_F_L0(EcmaModuleTest,ResolveOhmUrlStartWithBundle)4228 HWTEST_F_L0(EcmaModuleTest, ResolveOhmUrlStartWithBundle)
4229 {
4230 std::string ohmUrl = "@bundle:com.bundleName.test/moduleName/requestModuleName";
4231 auto result = ModulePathHelper::ResolveOhmUrl(ohmUrl);
4232 EXPECT_EQ(result.first, "requestModuleName");
4233 EXPECT_EQ(result.second, "com.bundleName.test/moduleName");
4234 }
4235
HWTEST_F_L0(EcmaModuleTest,ResolveOhmUrlStartWithNormalized)4236 HWTEST_F_L0(EcmaModuleTest, ResolveOhmUrlStartWithNormalized)
4237 {
4238 std::string ohmUrl = "@normalized:N&hsp&com.example.application&hsp/src/main/page/Test&1.0.0";
4239 auto result = ModulePathHelper::ResolveOhmUrl(ohmUrl);
4240 EXPECT_EQ(result.first, "hsp/src/main/page/Test");
4241 EXPECT_EQ(result.second, "com.example.application/hsp");
4242 }
4243
HWTEST_F_L0(EcmaModuleTest,GetResolvedModulesSize)4244 HWTEST_F_L0(EcmaModuleTest, GetResolvedModulesSize)
4245 {
4246 ModuleManager *moduleManager = thread->GetModuleManager();
4247 EXPECT_EQ(moduleManager->GetResolvedModulesSize(), 0);
4248
4249 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
4250 CString recordName = "test";
4251 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
4252 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
4253 EXPECT_EQ(moduleManager->GetResolvedModulesSize(), 1);
4254 }
4255
HWTEST_F_L0(EcmaModuleTest,AddNormalSerializeModule)4256 HWTEST_F_L0(EcmaModuleTest, AddNormalSerializeModule)
4257 {
4258 ModuleManager *moduleManager = thread->GetModuleManager();
4259 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
4260
4261 CString recordName = "@ohos:hilog";
4262 JSHandle<TaggedArray> serializerArray = objectFactory->NewTaggedArray(1);
4263 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
4264
4265 moduleManager->AddResolveImportedModule(recordName, module.GetTaggedValue());
4266 moduleManager->AddNormalSerializeModule(thread, serializerArray, 0);
4267 EXPECT_EQ(serializerArray->Get(thread, 0), module.GetTaggedValue());
4268 }
4269
HWTEST_F_L0(EcmaModuleTest,RestoreMutableFields)4270 HWTEST_F_L0(EcmaModuleTest, RestoreMutableFields)
4271 {
4272 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
4273 JSHandle<SourceTextModule> module = objectFactory->NewSourceTextModule();
4274 JSTaggedValue undefinedValue = thread->GlobalConstants()->GetUndefined();
4275 SourceTextModule::MutableFields fields;
4276
4277 fields.TopLevelCapability = JSTaggedValue(1);
4278 fields.NameDictionary = JSTaggedValue(2);
4279 fields.CycleRoot = JSTaggedValue(3);
4280 fields.AsyncParentModules = JSTaggedValue(4);
4281 fields.SendableEnv = JSTaggedValue(5);
4282 fields.Exception = JSTaggedValue(6);
4283 fields.Namespace = JSTaggedValue(7);
4284
4285 SourceTextModule::RestoreMutableFields(thread, module, fields);
4286
4287 EXPECT_EQ(module->GetTopLevelCapability(thread), fields.TopLevelCapability);
4288 EXPECT_EQ(module->GetNameDictionary(thread), fields.NameDictionary);
4289 EXPECT_EQ(module->GetCycleRoot(thread), fields.CycleRoot);
4290 EXPECT_EQ(module->GetAsyncParentModules(thread), fields.AsyncParentModules);
4291 EXPECT_EQ(module->GetSendableEnv(thread), fields.SendableEnv);
4292 EXPECT_EQ(module->GetException(thread), fields.Exception);
4293 EXPECT_EQ(module->GetNamespace(thread), fields.Namespace);
4294
4295 SourceTextModule::StoreAndResetMutableFields(thread, module, fields);
4296
4297 EXPECT_EQ(module->GetTopLevelCapability(thread), undefinedValue);
4298 EXPECT_EQ(module->GetNameDictionary(thread), undefinedValue);
4299 EXPECT_EQ(module->GetCycleRoot(thread), undefinedValue);
4300 EXPECT_EQ(module->GetAsyncParentModules(thread), undefinedValue);
4301 EXPECT_EQ(module->GetSendableEnv(thread), undefinedValue);
4302 EXPECT_EQ(module->GetException(thread), undefinedValue);
4303 EXPECT_EQ(module->GetNamespace(thread), undefinedValue);
4304 }
4305
HWTEST_F_L0(EcmaModuleTest,UpdateSharedModule)4306 HWTEST_F_L0(EcmaModuleTest, UpdateSharedModule)
4307 {
4308 ObjectFactory *objectFactory = thread->GetEcmaVM()->GetFactory();
4309 JSHandle<SourceTextModule> curmodule = objectFactory->NewSourceTextModule();
4310 JSHandle<SourceTextModule> resolvedModule = objectFactory->NewSSourceTextModule();
4311 resolvedModule->SetEcmaModuleRecordNameString("updateSharedModule");
4312 resolvedModule->SetSharedType(SharedTypes::SHARED_MODULE);
4313 JSHandle<TaggedArray> envRec = objectFactory->NewTaggedArray(1);
4314 JSHandle<JSTaggedValue> resolvedBinding = JSHandle<JSTaggedValue>::Cast(
4315 objectFactory->NewResolvedIndexBindingRecord(resolvedModule, 0));
4316 envRec->Set(thread, 0, resolvedBinding);
4317 curmodule->SetEnvironment(thread, envRec);
4318 JSTaggedValue res = MockModuleValueAccessor::GetModuleValueFromIndexBinding<false>(
4319 thread, curmodule, resolvedBinding.GetTaggedValue(), false);
4320 EXPECT_TRUE(res.IsHole());
4321
4322 JSHandle<SourceTextModule> resolvedModule2 = objectFactory->NewSSourceTextModule();
4323 CString recordName = "updateSharedModule";
4324 resolvedModule2->SetEcmaModuleRecordNameString(recordName);
4325 resolvedModule2->SetSharedType(SharedTypes::SHARED_MODULE);
4326 JSHandle<LocalExportEntry> localExportEntry =
4327 objectFactory->NewSLocalExportEntry(JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromASCII("exportName")),
4328 JSHandle<JSTaggedValue>::Cast(objectFactory->NewFromASCII("localName")), 1);
4329 JSHandle<TaggedArray> localExportEntries = objectFactory->NewSTaggedArray(1);
4330 localExportEntries->Set(thread, 0, localExportEntry);
4331 resolvedModule2->SetLocalExportEntries(thread, localExportEntries);
4332 JSHandle<JSTaggedValue> val(objectFactory->NewFromUtf8("exportVal"));
4333
4334 SharedModuleManager::GetInstance()->
4335 TransferFromLocalToSharedModuleMapAndGetInsertedSModule(thread, resolvedModule2);
4336 SourceTextModule::StoreModuleValue(thread, resolvedModule2, 0, val);
4337 res = MockModuleValueAccessor::GetModuleValueFromIndexBinding<false>(
4338 thread, curmodule, resolvedBinding.GetTaggedValue(), false);
4339 EXPECT_EQ(res, val.GetTaggedValue());
4340 }
4341
HWTEST_F_L0(EcmaModuleTest,DeregisterModuleList)4342 HWTEST_F_L0(EcmaModuleTest, DeregisterModuleList)
4343 {
4344 EcmaVM *vm = thread->GetEcmaVM();
4345 vm->PushToDeregisterModuleList("@ohos:hilog");
4346 vm->PushToDeregisterModuleList("com.bundleName.test/moduleName/requestModuleName");
4347 vm->PushToDeregisterModuleList("&hsp&com.example.application&hsp/src/main/page/Test&1.0.0");
4348 EXPECT_EQ(vm->ContainInDeregisterModuleList("@ohos:hilog"), true);
4349 EXPECT_EQ(vm->ContainInDeregisterModuleList("com.bundleName.test/moduleName/requestModuleName"), true);
4350 EXPECT_EQ(vm->ContainInDeregisterModuleList("com.bundleName.test/moduleName/requestModuleName1"), false);
4351
4352 vm->RemoveFromDeregisterModuleList("@ohos:hilog");
4353 vm->RemoveFromDeregisterModuleList("com.bundleName.test/moduleName/requestModuleName");
4354 EXPECT_EQ(vm->ContainInDeregisterModuleList("@ohos:hilog"), false);
4355 EXPECT_EQ(vm->ContainInDeregisterModuleList("com.bundleName.test/moduleName/requestModuleName"), false);
4356 }
4357 } // namespace panda::test
4358