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