• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 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 <gtest/gtest.h>
17 #include <cstring>
18 
19 #include "libabckit/include/c/abckit.h"
20 #include "helpers/helpers.h"
21 #include "helpers/helpers_runtime.h"
22 #include "libabckit/include/c/metadata_core.h"
23 #include "libabckit/include/c/extensions/arkts/metadata_arkts.h"
24 #include "ir_impl.h"
25 #include "libabckit/include/c/isa/isa_dynamic.h"
26 #include "libabckit/include/c/statuses.h"
27 
28 // NOLINTBEGIN(readability-magic-numbers)
29 namespace libabckit::test {
30 
31 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
33 static auto g_implM = AbckitGetModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
34 static auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
35 static auto g_dynG = AbckitGetIsaApiDynamicImpl(ABCKIT_VERSION_RELEASE_1_0_0);
36 
37 class LibAbcKitIsaDynamicModulesTest : public ::testing::Test {};
38 
39 // ========================================
40 // Helpers
41 // ========================================
42 
IsetModuleTest(AbckitGraph * graph,AbckitCoreModule * module,AbckitIsaApiDynamicOpcode opcode,bool negative=false,bool wrongCtx=false)43 static void IsetModuleTest(AbckitGraph *graph, AbckitCoreModule *module, AbckitIsaApiDynamicOpcode opcode,
44                            bool negative = false, bool wrongCtx = false)
45 {
46     auto moduleRequestIdx = 0x2;
47     AbckitInst *instWithModule = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
48         auto imm = g_implG->iGetImmediate(inst, 0);
49         return imm == moduleRequestIdx;
50     });
51 
52     g_dynG->iSetModule(instWithModule, module);
53     if (negative) {
54         if (wrongCtx) {
55             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_WRONG_CTX);
56             return;
57         }
58         ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
59         return;
60     }
61     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
62 }
63 
IsetImportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode,bool negative=false,AbckitCoreImportDescriptor * importToRemove=nullptr)64 static void IsetImportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode,
65                                      bool negative = false, AbckitCoreImportDescriptor *importToRemove = nullptr)
66 {
67     auto moduleRequestIdx = 0x2;
68     AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
69         auto imm = g_implG->iGetImmediate(inst, 0);
70         return imm == moduleRequestIdx;
71     });
72     ASSERT_NE(instWithID, nullptr);
73 
74     if (importToRemove == nullptr) {
75         helpers::ImportByAliasContext importFinder = {nullptr, "MF1M2"};
76         g_implI->moduleEnumerateImports(m, &importFinder, helpers::ImportByAliasFinder);
77         ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
78         ASSERT_NE(importFinder.id, nullptr);
79         importToRemove = importFinder.id;
80     }
81 
82     g_dynG->iSetImportDescriptor(instWithID, importToRemove);
83     if (negative) {
84         ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
85         return;
86     }
87     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
88 }
89 
IsetExportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode,bool negative=false,AbckitCoreExportDescriptor * exportToRemove=nullptr)90 static void IsetExportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode,
91                                      bool negative = false, AbckitCoreExportDescriptor *exportToRemove = nullptr)
92 {
93     auto moduleRequestIdx = 0x3;
94     AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
95         auto imm = g_implG->iGetImmediate(inst, 0);
96         return imm == moduleRequestIdx;
97     });
98     ASSERT_NE(instWithID, nullptr);
99 
100     if (exportToRemove == nullptr) {
101         helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportLet"};
102         g_implI->moduleEnumerateExports(m, &exportFinder, helpers::ExportByAliasFinder);
103         ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
104         ASSERT_NE(exportFinder.ed, nullptr);
105         exportToRemove = exportFinder.ed;
106     }
107 
108     g_dynG->iSetExportDescriptor(instWithID, exportToRemove);
109     if (negative) {
110         ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
111         return;
112     }
113     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
114 }
115 
IgetModuleTest(AbckitGraph * graph,AbckitIsaApiDynamicOpcode opcode)116 static void IgetModuleTest(AbckitGraph *graph, AbckitIsaApiDynamicOpcode opcode)
117 {
118     auto moduleRequestIdx = 0x0;
119     AbckitInst *instWithModule = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
120         auto imm = g_implG->iGetImmediate(inst, 0);
121         return imm == moduleRequestIdx;
122     });
123 
124     ASSERT_NE(instWithModule, nullptr);
125     auto moduleI = g_dynG->iGetModule(instWithModule);
126     if (opcode != ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE) {
127         ASSERT_NE(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
128         return;
129     }
130     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
131     helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module1"};
132     g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
133     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
134     ASSERT_NE(ctxFinder.module, nullptr);
135     auto *module = ctxFinder.module;
136     ASSERT_EQ(moduleI, module);
137 }
138 
IgetImportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode)139 static void IgetImportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode)
140 {
141     auto moduleRequestIdx = 0x3;
142     AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
143         auto imm = g_implG->iGetImmediate(inst, 0);
144         return imm == moduleRequestIdx;
145     });
146 
147     ASSERT_NE(instWithID, nullptr);
148     auto importI = g_dynG->iGetImportDescriptor(instWithID);
149     if (opcode != ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR) {
150         ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
151         return;
152     }
153     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
154 
155     helpers::ImportByAliasContext importFinder = {nullptr, "regularImportFunc1FromModule1"};
156     g_implI->moduleEnumerateImports(m, &importFinder, helpers::ImportByAliasFinder);
157     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
158     ASSERT_NE(importFinder.id, nullptr);
159 
160     ASSERT_EQ(importFinder.id, importI);
161 }
162 
IgetExportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode,size_t moduleRequestIdx)163 static void IgetExportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode,
164                                      size_t moduleRequestIdx)
165 {
166     AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [&](AbckitInst *inst) {
167         auto imm = g_implG->iGetImmediate(inst, 0);
168         return imm == moduleRequestIdx;
169     });
170 
171     ASSERT_NE(instWithID, nullptr);
172     auto exportI = g_dynG->iGetExportDescriptor(instWithID);
173     if (opcode != ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR) {
174         ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
175         return;
176     }
177     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
178 
179     helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportLet"};
180     g_implI->moduleEnumerateExports(m, &exportFinder, helpers::ExportByAliasFinder);
181     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
182     ASSERT_NE(exportFinder.ed, nullptr);
183 
184     ASSERT_EQ(exportFinder.ed, exportI);
185 }
186 
TransformIrGetModuleNamespace(AbckitGraph * graph,AbckitString * funcName,bool isWide=false)187 static void TransformIrGetModuleNamespace(AbckitGraph *graph, AbckitString *funcName, bool isWide = false)
188 {
189     helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module2"};
190     g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
191     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
192     ASSERT_NE(ctxFinder.module, nullptr);
193 
194     AbckitBasicBlock *mainBB = g_implG->bbGetSuccBlock(g_implG->gGetStartBasicBlock(graph), 0);
195     AbckitInst *lastInst = g_implG->bbGetLastInst(mainBB);
196     auto getModuleNamespaceInst = isWide ? g_dynG->iCreateWideGetmodulenamespace(graph, ctxFinder.module)
197                                          : g_dynG->iCreateGetmodulenamespace(graph, ctxFinder.module);
198     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
199     auto ldObjByNameInst = g_dynG->iCreateLdobjbyname(graph, getModuleNamespaceInst, funcName);
200     auto callInst = g_dynG->iCreateCallthis0(graph, ldObjByNameInst, getModuleNamespaceInst);
201     g_implG->iInsertBefore(getModuleNamespaceInst, lastInst);
202     g_implG->iInsertBefore(ldObjByNameInst, lastInst);
203     g_implG->iInsertBefore(callInst, lastInst);
204 }
205 
TransformIrLdExternalModuleVar(AbckitGraph * graph,AbckitString * funcName,bool isWide=false)206 static void TransformIrLdExternalModuleVar(AbckitGraph *graph, AbckitString *funcName, bool isWide = false)
207 {
208     helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
209     g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
210     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
211     ASSERT_NE(ctxFinder.module, nullptr);
212     helpers::ImportByAliasContext importFinder = {nullptr, "MF1M2"};
213     g_implI->moduleEnumerateImports(ctxFinder.module, &importFinder, helpers::ImportByAliasFinder);
214     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
215     ASSERT_NE(importFinder.id, nullptr);
216 
217     AbckitBasicBlock *mainBB = g_implG->bbGetSuccBlock(g_implG->gGetStartBasicBlock(graph), 0);
218     AbckitInst *lastInst = g_implG->bbGetLastInst(mainBB);
219     auto ldExternalModuleVarInst = isWide ? g_dynG->iCreateWideLdexternalmodulevar(graph, importFinder.id)
220                                           : g_dynG->iCreateLdexternalmodulevar(graph, importFinder.id);
221     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
222     auto throwUndef = g_dynG->iCreateThrowUndefinedifholewithname(graph, ldExternalModuleVarInst, funcName);
223     auto callInst = g_dynG->iCreateCallarg0(graph, ldExternalModuleVarInst);
224     g_implG->iInsertBefore(ldExternalModuleVarInst, lastInst);
225     g_implG->iInsertBefore(throwUndef, lastInst);
226     g_implG->iInsertBefore(callInst, lastInst);
227 }
228 
TransformIrLdLocalModuleVar(AbckitGraph * graph,AbckitString * localVarName,AbckitString * funcName,bool isWide=false)229 static void TransformIrLdLocalModuleVar(AbckitGraph *graph, AbckitString *localVarName, AbckitString *funcName,
230                                         bool isWide = false)
231 {
232     helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
233     g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
234     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
235     ASSERT_NE(ctxFinder.module, nullptr);
236     helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportLet"};
237     g_implI->moduleEnumerateExports(ctxFinder.module, &exportFinder, helpers::ExportByAliasFinder);
238     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
239     ASSERT_NE(exportFinder.ed, nullptr);
240 
241     AbckitBasicBlock *mainBB = g_implG->bbGetSuccBlock(g_implG->gGetStartBasicBlock(graph), 0);
242     AbckitInst *lastInst = g_implG->bbGetLastInst(mainBB);
243     auto tryLdGlobalByNameInst = g_dynG->iCreateTryldglobalbyname(graph, funcName);
244     auto ldLocalModuleVarInst = isWide ? g_dynG->iCreateWideLdlocalmodulevar(graph, exportFinder.ed)
245                                        : g_dynG->iCreateLdlocalmodulevar(graph, exportFinder.ed);
246     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
247     auto throwUndef = g_dynG->iCreateThrowUndefinedifholewithname(graph, ldLocalModuleVarInst, localVarName);
248     auto callInst = g_dynG->iCreateCallarg1(graph, tryLdGlobalByNameInst, ldLocalModuleVarInst);
249     g_implG->iInsertBefore(tryLdGlobalByNameInst, lastInst);
250     g_implG->iInsertBefore(ldLocalModuleVarInst, lastInst);
251     g_implG->iInsertBefore(throwUndef, lastInst);
252     g_implG->iInsertBefore(callInst, lastInst);
253 }
254 
TransformIrStModuleVar(AbckitGraph * graph,AbckitString * localVarName,AbckitString * funcName,bool isWide=false)255 static void TransformIrStModuleVar(AbckitGraph *graph, AbckitString *localVarName, AbckitString *funcName,
256                                    bool isWide = false)
257 {
258     helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
259     g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
260     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
261     ASSERT_NE(ctxFinder.module, nullptr);
262     helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportConst"};
263     g_implI->moduleEnumerateExports(ctxFinder.module, &exportFinder, helpers::ExportByAliasFinder);
264     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
265     ASSERT_NE(exportFinder.ed, nullptr);
266 
267     auto *startBB = g_implG->gGetStartBasicBlock(graph);
268     auto *const1Inst = g_implG->bbGetLastInst(startBB);
269     auto *mainBB = g_implG->bbGetSuccBlock(startBB, 0);
270     auto *lastInst = g_implG->bbGetLastInst(mainBB);
271     auto tryLdGlobalByNameInst = g_dynG->iCreateTryldglobalbyname(graph, funcName);
272     auto stModuleVarInst = isWide ? g_dynG->iCreateWideStmodulevar(graph, const1Inst, exportFinder.ed)
273                                   : g_dynG->iCreateStmodulevar(graph, const1Inst, exportFinder.ed);
274     auto ldLocalModuleVarInst = isWide ? g_dynG->iCreateWideLdlocalmodulevar(graph, exportFinder.ed)
275                                        : g_dynG->iCreateLdlocalmodulevar(graph, exportFinder.ed);
276     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
277     auto throwUndef = g_dynG->iCreateThrowUndefinedifholewithname(graph, ldLocalModuleVarInst, localVarName);
278     auto callInst = g_dynG->iCreateCallarg1(graph, tryLdGlobalByNameInst, ldLocalModuleVarInst);
279     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
280     g_implG->iInsertBefore(tryLdGlobalByNameInst, lastInst);
281     g_implG->iInsertBefore(stModuleVarInst, lastInst);
282     g_implG->iInsertBefore(ldLocalModuleVarInst, lastInst);
283     g_implG->iInsertBefore(throwUndef, lastInst);
284     g_implG->iInsertBefore(callInst, lastInst);
285 }
286 
287 static std::vector<helpers::InstSchema<AbckitIsaApiDynamicOpcode>> g_bb2Insts {
288     {12, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC, {}},
289     {13, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {12}},
290     {10, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDUNDEFINED, {}},
291     {11, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {10}},
292     {14, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
293     {15, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
294     {16, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
295     {17, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
296     {18, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {17}},
297     {19, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDHOLE, {}},
298     {20, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINECLASSWITHBUFFER, {19}},
299     {21, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {20}},
300     {22, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {20}},
301     {23, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {3}},
302     {24, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {4}},
303     {25, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDHOLE, {}},
304     {26, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINECLASSWITHBUFFER, {25}},
305     {27, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {26}},
306     {28, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {26}},
307     {29, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
308     {30, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {29}},
309     {31, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {29}},
310     {32, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
311     {33, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {32}},
312     {34, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {32}},
313     {35, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
314     {36, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {35}},
315     {37, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {35}},
316     {38, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
317     {39, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {38}},
318     {40, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {38}},
319     {41, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {14}},
320     {42, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {41, 14}},
321     {43, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {14}},
322     {44, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {43, 14}},
323     {45, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}},
324     {46, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}},
325     {47, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {46}},
326     {48, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {45, 46}},
327     {49, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}},
328     {50, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}},
329     {51, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {50}},
330     {52, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {49, 50}},
331     {53, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {15}},
332     {54, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {53, 15}},
333     {55, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {16}},
334     {56, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {55, 16}},
335     {57, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED, {}}};
336 
CreateBBSchemaForModules()337 static std::vector<helpers::BBSchema<AbckitIsaApiDynamicOpcode>> CreateBBSchemaForModules()
338 {
339     return {{{},
340              {1},
341              {{0, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
342               {1, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
343               {2, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
344               {3, ABCKIT_ISA_API_DYNAMIC_OPCODE_CONSTANT, {}},
345               {4, ABCKIT_ISA_API_DYNAMIC_OPCODE_CONSTANT, {}}}},
346             {
347                 {0},
348                 {2},
349                 g_bb2Insts,
350             },
351             {{1}, {}, {}}};
352 }
353 
354 // ========================================
355 // Modules Tests
356 // ========================================
357 
358 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetModule, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetModule)359 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetModule)
360 {
361     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
362                                              "isa_dynamic_modules");
363     auto expected =
364         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
365         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
366         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
367     EXPECT_TRUE(helpers::Match(output, expected));
368 
369     helpers::TransformMethod(
370         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
371         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
372         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
373             helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module1"};
374             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
375             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
376             ASSERT_NE(ctxFinder.module, nullptr);
377 
378             IsetModuleTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE);
379         });
380 
381     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
382                                         "isa_dynamic_modules");
383     expected =
384         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
385         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
386         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module1\n";
387     EXPECT_TRUE(helpers::Match(output, expected));
388 }
389 
390 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetModule, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetModuleWrongInst)391 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetModuleWrongInst)
392 {
393     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
394                                              "isa_dynamic_modules");
395     auto expected =
396         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
397         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
398         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
399     EXPECT_TRUE(helpers::Match(output, expected));
400 
401     helpers::TransformMethod(
402         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
403         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
404         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
405             helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module1"};
406             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
407             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
408             ASSERT_NE(ctxFinder.module, nullptr);
409 
410             IsetModuleTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, true);
411         });
412 
413     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
414                                         "isa_dynamic_modules");
415     expected =
416         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
417         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
418         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
419     EXPECT_TRUE(helpers::Match(output, expected));
420 }
421 
422 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetModule, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetModuleWrongModule)423 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetModuleWrongModule)
424 {
425     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
426                                              "isa_dynamic_modules");
427     auto expected =
428         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
429         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
430         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
431     EXPECT_TRUE(helpers::Match(output, expected));
432 
433     helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
434                              ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
435                              "isa_dynamic_modules.func_main_0",
436                              [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
437                                  auto newM = new AbckitCoreModule();
438                                  newM->impl = std::make_unique<AbckitArktsModule>();
439                                  IsetModuleTest(graph, newM, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, true, true);
440                                  delete newM;
441                              });
442 
443     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
444                                         "isa_dynamic_modules");
445     expected =
446         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
447         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
448         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
449     EXPECT_TRUE(helpers::Match(output, expected));
450 }
451 
452 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetImportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetImportDescriptor)453 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetImportDescriptor)
454 {
455     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
456                                              "isa_dynamic_modules");
457     auto expected =
458         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
459         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
460         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
461     EXPECT_TRUE(helpers::Match(output, expected));
462 
463     helpers::TransformMethod(
464         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
465         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
466         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
467             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
468             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
469             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
470             ASSERT_NE(ctxFinder.module, nullptr);
471             IsetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR);
472         });
473 
474     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
475                                         "isa_dynamic_modules");
476     expected =
477         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
478         "module3\nregular import func1 from module2\nnamespace import func2 from module1\nnamespace import func3 from "
479         "module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
480     EXPECT_TRUE(helpers::Match(output, expected));
481 }
482 
483 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetImportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetImportDescriptorWrongInst)484 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetImportDescriptorWrongInst)
485 {
486     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
487                                              "isa_dynamic_modules");
488     auto expected =
489         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
490         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
491         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
492     EXPECT_TRUE(helpers::Match(output, expected));
493 
494     helpers::TransformMethod(
495         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
496         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
497         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
498             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
499             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
500             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
501             ASSERT_NE(ctxFinder.module, nullptr);
502             IsetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, true);
503         });
504 
505     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
506                                         "isa_dynamic_modules");
507     expected =
508         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
509         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
510         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
511     EXPECT_TRUE(helpers::Match(output, expected));
512 }
513 
514 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetImportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetImportDescriptorWrongImport)515 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetImportDescriptorWrongImport)
516 {
517     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
518                                              "isa_dynamic_modules");
519     auto expected =
520         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
521         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
522         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
523     EXPECT_TRUE(helpers::Match(output, expected));
524 
525     helpers::TransformMethod(
526         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
527         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
528         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
529             auto *newID = new AbckitCoreImportDescriptor();
530             newID->impl = std::make_unique<AbckitArktsImportDescriptor>();
531             IsetImportDescriptorTest(graph, nullptr, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, true, newID);
532             delete newID;
533         });
534 
535     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
536                                         "isa_dynamic_modules");
537     expected =
538         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
539         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
540         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
541     EXPECT_TRUE(helpers::Match(output, expected));
542 }
543 
544 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetExportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetExportDescriptor)545 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetExportDescriptor)
546 {
547     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
548                                              "isa_dynamic_modules");
549     auto expected =
550         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
551         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
552         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
553     EXPECT_TRUE(helpers::Match(output, expected));
554 
555     helpers::TransformMethod(
556         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
557         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
558         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
559             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
560             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
561             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
562             ASSERT_NE(ctxFinder.module, nullptr);
563             IsetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR);
564         });
565 
566     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
567                                         "isa_dynamic_modules");
568     expected =
569         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
570         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
571         "func3 from module1\n2\n2\nnamespace import func3 from module2\nthe same func from module3\n";
572     EXPECT_TRUE(helpers::Match(output, expected));
573 }
574 
575 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetExportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetExportDescriptorWrongInst)576 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetExportDescriptorWrongInst)
577 {
578     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
579                                              "isa_dynamic_modules");
580     auto expected =
581         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
582         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
583         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
584     EXPECT_TRUE(helpers::Match(output, expected));
585 
586     helpers::TransformMethod(
587         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
588         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
589         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
590             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
591             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
592             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
593             ASSERT_NE(ctxFinder.module, nullptr);
594             IsetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, true);
595         });
596 
597     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
598                                         "isa_dynamic_modules");
599     expected =
600         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
601         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
602         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
603     EXPECT_TRUE(helpers::Match(output, expected));
604 }
605 
606 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetExportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetExportDescriptorWrongExport)607 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetExportDescriptorWrongExport)
608 {
609     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
610                                              "isa_dynamic_modules");
611     auto expected =
612         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
613         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
614         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
615     EXPECT_TRUE(helpers::Match(output, expected));
616 
617     helpers::TransformMethod(
618         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
619         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
620         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
621             auto *newED = new AbckitCoreExportDescriptor();
622             newED->impl = std::make_unique<AbckitArktsExportDescriptor>();
623             IsetExportDescriptorTest(graph, nullptr, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, true, newED);
624             delete newED;
625         });
626 
627     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
628                                         "isa_dynamic_modules");
629     expected =
630         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
631         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
632         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
633     EXPECT_TRUE(helpers::Match(output, expected));
634 }
635 
636 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetModule, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetModule)637 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetModule)
638 {
639     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
640                                              "isa_dynamic_modules");
641     auto expected =
642         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
643         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
644         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
645     EXPECT_TRUE(helpers::Match(output, expected));
646 
647     helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
648                              ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
649                              "isa_dynamic_modules.func_main_0",
650                              [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
651                                  IgetModuleTest(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE);
652                              });
653 
654     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
655                                         "isa_dynamic_modules");
656     expected =
657         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
658         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
659         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
660     EXPECT_TRUE(helpers::Match(output, expected));
661 }
662 
663 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetModule, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetModuleWrongInst)664 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetModuleWrongInst)
665 {
666     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
667                                              "isa_dynamic_modules");
668     auto expected =
669         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
670         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
671         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
672     EXPECT_TRUE(helpers::Match(output, expected));
673 
674     helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
675                              ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
676                              "isa_dynamic_modules.func_main_0",
677                              [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
678                                  IgetModuleTest(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR);
679                              });
680 
681     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
682                                         "isa_dynamic_modules");
683     expected =
684         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
685         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
686         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
687     EXPECT_TRUE(helpers::Match(output, expected));
688 }
689 
690 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetImportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetImportDescriptor)691 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetImportDescriptor)
692 {
693     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
694                                              "isa_dynamic_modules");
695     auto expected =
696         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
697         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
698         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
699     EXPECT_TRUE(helpers::Match(output, expected));
700     helpers::TransformMethod(
701         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
702         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
703         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
704             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
705             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
706             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
707             ASSERT_NE(ctxFinder.module, nullptr);
708             IgetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR);
709         });
710 
711     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
712                                         "isa_dynamic_modules");
713     expected =
714         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
715         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
716         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
717     EXPECT_TRUE(helpers::Match(output, expected));
718 }
719 
720 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetImportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetImportDescriptorWrongInst)721 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetImportDescriptorWrongInst)
722 {
723     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
724                                              "isa_dynamic_modules");
725     auto expected =
726         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
727         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
728         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
729     EXPECT_TRUE(helpers::Match(output, expected));
730 
731     helpers::TransformMethod(
732         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
733         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
734         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
735             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
736             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
737             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
738             ASSERT_NE(ctxFinder.module, nullptr);
739             IgetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR);
740         });
741 
742     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
743                                         "isa_dynamic_modules");
744     expected =
745         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
746         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
747         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
748     EXPECT_TRUE(helpers::Match(output, expected));
749 }
750 
751 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetExportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetExportDescriptor)752 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetExportDescriptor)
753 {
754     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
755                                              "isa_dynamic_modules");
756     auto expected =
757         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
758         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
759         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
760     EXPECT_TRUE(helpers::Match(output, expected));
761 
762     helpers::TransformMethod(
763         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
764         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
765         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
766             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
767             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
768             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
769             ASSERT_NE(ctxFinder.module, nullptr);
770             IgetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, 0X5);
771         });
772 
773     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
774                                         "isa_dynamic_modules");
775     expected =
776         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
777         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
778         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
779     EXPECT_TRUE(helpers::Match(output, expected));
780 }
781 
782 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetExportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetExportDescriptorWrongInst)783 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetExportDescriptorWrongInst)
784 {
785     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
786                                              "isa_dynamic_modules");
787     auto expected =
788         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
789         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
790         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
791     EXPECT_TRUE(helpers::Match(output, expected));
792 
793     helpers::TransformMethod(
794         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
795         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
796         [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
797             helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
798             g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
799             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
800             ASSERT_NE(ctxFinder.module, nullptr);
801             IgetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, 0X3);
802         });
803 
804     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
805                                         "isa_dynamic_modules");
806     expected =
807         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
808         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
809         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
810     EXPECT_TRUE(helpers::Match(output, expected));
811 }
812 
813 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateGetmodulenamespace, abc-kind=ArkTS1, category=positive,
814 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynGetmodulenamespace)815 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynGetmodulenamespace)
816 {
817     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
818                                              "isa_dynamic_modules");
819     std::string expected =
820         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
821         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
822         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
823     EXPECT_TRUE(helpers::Match(output, expected));
824 
825     helpers::TransformMethod(
826         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
827         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
828         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
829             AbckitString *abckitstr =
830                 g_implM->createString(file, "sameFuncInDifferentModules", strlen("sameFuncInDifferentModules"));
831 
832             TransformIrGetModuleNamespace(graph, abckitstr);
833         },
834         [](AbckitGraph *graph) {
835             auto bbSchema = CreateBBSchemaForModules();
836             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
837                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}});
838             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
839                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {59}});
840             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
841                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {60, 59}});
842             helpers::VerifyGraph(graph, bbSchema);
843         });
844 
845     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
846                                         "isa_dynamic_modules");
847     expected += "the same func from module2\n";
848     EXPECT_TRUE(helpers::Match(output, expected));
849 }
850 
851 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideGetmodulenamespace, abc-kind=ArkTS1, category=positive,
852 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideGetmodulenamespace)853 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideGetmodulenamespace)
854 {
855     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
856                                              "isa_dynamic_modules");
857     std::string expected =
858         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
859         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
860         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
861     EXPECT_TRUE(helpers::Match(output, expected));
862 
863     helpers::TransformMethod(
864         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
865         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
866         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
867             AbckitString *abckitstr =
868                 g_implM->createString(file, "sameFuncInDifferentModules", strlen("sameFuncInDifferentModules"));
869 
870             TransformIrGetModuleNamespace(graph, abckitstr, true);
871         },
872         [](AbckitGraph *graph) {
873             auto bbSchema = CreateBBSchemaForModules();
874             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
875                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_GETMODULENAMESPACE, {}});
876             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
877                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {59}});
878             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
879                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {60, 59}});
880             helpers::VerifyGraph(graph, bbSchema);
881         });
882 
883     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
884                                         "isa_dynamic_modules");
885     expected += "the same func from module2\n";
886     EXPECT_TRUE(helpers::Match(output, expected));
887 }
888 
889 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateLdexternalmodulevar, abc-kind=ArkTS1, category=positive,
890 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynLdexternalmodulevar)891 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynLdexternalmodulevar)
892 {
893     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
894                                              "isa_dynamic_modules");
895     std::string expected =
896         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
897         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
898         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
899     EXPECT_TRUE(helpers::Match(output, expected));
900 
901     helpers::TransformMethod(
902         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
903         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
904         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
905             AbckitString *abckitstr = g_implM->createString(file, "MF1M2", strlen("MF1M2"));
906 
907             TransformIrLdExternalModuleVar(graph, abckitstr);
908         },
909         [](AbckitGraph *graph) {
910             auto bbSchema = CreateBBSchemaForModules();
911             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
912                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}});
913             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
914                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {59}});
915             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
916                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {59}});
917             helpers::VerifyGraph(graph, bbSchema);
918         });
919 
920     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
921                                         "isa_dynamic_modules");
922     expected += "regular import func1 from module2\n";
923     EXPECT_TRUE(helpers::Match(output, expected));
924 }
925 
926 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideLdexternalmodulevar, abc-kind=ArkTS1, category=positive,
927 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideLdexternalmodulevar)928 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideLdexternalmodulevar)
929 {
930     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
931                                              "isa_dynamic_modules");
932     std::string expected =
933         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
934         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
935         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
936     EXPECT_TRUE(helpers::Match(output, expected));
937 
938     helpers::TransformMethod(
939         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
940         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
941         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
942             AbckitString *abckitstr = g_implM->createString(file, "MF1M2", strlen("MF1M2"));
943 
944             TransformIrLdExternalModuleVar(graph, abckitstr, true);
945         },
946         [](AbckitGraph *graph) {
947             auto bbSchema = CreateBBSchemaForModules();
948             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
949                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_LDEXTERNALMODULEVAR, {}});
950             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
951                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {59}});
952             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
953                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {59}});
954             helpers::VerifyGraph(graph, bbSchema);
955         });
956 
957     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
958                                         "isa_dynamic_modules");
959     expected += "regular import func1 from module2\n";
960     EXPECT_TRUE(helpers::Match(output, expected));
961 }
962 
963 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateLdlocalmodulevar, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynLdlocalmodulevar)964 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynLdlocalmodulevar)
965 {
966     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
967                                              "isa_dynamic_modules");
968     std::string expected =
969         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
970         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
971         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
972     EXPECT_TRUE(helpers::Match(output, expected));
973 
974     helpers::TransformMethod(
975         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
976         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
977         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
978             AbckitString *abckitstr = g_implM->createString(file, "LocalExportLet", strlen("LocalExportLet"));
979             AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
980 
981             TransformIrLdLocalModuleVar(graph, abckitstr, abckitcallStr);
982         },
983         [](AbckitGraph *graph) {
984             auto bbSchema = CreateBBSchemaForModules();
985             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
986                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
987             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
988                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}});
989             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
990                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {60}});
991             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
992                                            {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 60}});
993             helpers::VerifyGraph(graph, bbSchema);
994         });
995 
996     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
997                                         "isa_dynamic_modules");
998     expected += "2\n";
999     EXPECT_TRUE(helpers::Match(output, expected));
1000 }
1001 
1002 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideLdlocalmodulevar, abc-kind=ArkTS1, category=positive,
1003 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideLdlocalmodulevar)1004 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideLdlocalmodulevar)
1005 {
1006     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1007                                              "isa_dynamic_modules");
1008     std::string expected =
1009         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
1010         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
1011         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
1012     EXPECT_TRUE(helpers::Match(output, expected));
1013 
1014     helpers::TransformMethod(
1015         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1016         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
1017         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
1018             AbckitString *abckitstr = g_implM->createString(file, "LocalExportLet", strlen("LocalExportLet"));
1019             AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
1020 
1021             TransformIrLdLocalModuleVar(graph, abckitstr, abckitcallStr, true);
1022         },
1023         [](AbckitGraph *graph) {
1024             auto bbSchema = CreateBBSchemaForModules();
1025             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
1026                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
1027             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
1028                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_LDLOCALMODULEVAR, {}});
1029             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
1030                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {60}});
1031             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
1032                                            {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 60}});
1033             helpers::VerifyGraph(graph, bbSchema);
1034         });
1035 
1036     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
1037                                         "isa_dynamic_modules");
1038     expected += "2\n";
1039     EXPECT_TRUE(helpers::Match(output, expected));
1040 }
1041 
1042 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateStmodulevar, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynStmodulevar)1043 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynStmodulevar)
1044 {
1045     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1046                                              "isa_dynamic_modules");
1047     std::string expected =
1048         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
1049         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
1050         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
1051     EXPECT_TRUE(helpers::Match(output, expected));
1052 
1053     helpers::TransformMethod(
1054         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1055         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
1056         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
1057             AbckitString *abckitstr = g_implM->createString(file, "LocalExportConst", strlen("LocalExportConst"));
1058             AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
1059 
1060             TransformIrStModuleVar(graph, abckitstr, abckitcallStr);
1061         },
1062         [](AbckitGraph *graph) {
1063             auto bbSchema = CreateBBSchemaForModules();
1064             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
1065                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
1066             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
1067                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {4}});
1068             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
1069                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}});
1070             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
1071                                            {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {61}});
1072             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 51,
1073                                            {63, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 61}});
1074             helpers::VerifyGraph(graph, bbSchema);
1075         });
1076 
1077     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
1078                                         "isa_dynamic_modules");
1079     expected += "1\n";
1080     EXPECT_TRUE(helpers::Match(output, expected));
1081 }
1082 
1083 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideStmodulevar, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideStmodulevar)1084 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideStmodulevar)
1085 {
1086     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1087                                              "isa_dynamic_modules");
1088     std::string expected =
1089         "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
1090         "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
1091         "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
1092     EXPECT_TRUE(helpers::Match(output, expected));
1093 
1094     helpers::TransformMethod(
1095         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1096         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
1097         [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
1098             AbckitString *abckitstr = g_implM->createString(file, "LocalExportConst", strlen("LocalExportConst"));
1099             AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
1100 
1101             TransformIrStModuleVar(graph, abckitstr, abckitcallStr, true);
1102         },
1103         [](AbckitGraph *graph) {
1104             auto bbSchema = CreateBBSchemaForModules();
1105             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
1106                                            {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
1107             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
1108                                            {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_STMODULEVAR, {4}});
1109             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
1110                                            {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_LDLOCALMODULEVAR, {}});
1111             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
1112                                            {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {61}});
1113             bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 51,
1114                                            {63, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 61}});
1115             helpers::VerifyGraph(graph, bbSchema);
1116         });
1117 
1118     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
1119                                         "isa_dynamic_modules");
1120     expected += "1\n";
1121     EXPECT_TRUE(helpers::Match(output, expected));
1122 }
1123 
1124 }  // namespace libabckit::test
1125 // NOLINTEND(readability-magic-numbers)
1126