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 "libabckit/include/c/metadata_core.h"
17 #include "libabckit/include/c/ir_core.h"
18 #include "libabckit/include/c/isa/isa_dynamic.h"
19 #include "libabckit/include/c/abckit.h"
20
21 #include "helpers/helpers.h"
22 #include "helpers/helpers_runtime.h"
23
24 #include <gtest/gtest.h>
25
26 // NOLINTBEGIN(readability-magic-numbers)
27 namespace libabckit::test {
28
29 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
30 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
31 static auto g_implM = AbckitGetModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32 static auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
33 static auto g_dynG = AbckitGetIsaApiDynamicImpl(ABCKIT_VERSION_RELEASE_1_0_0);
34
35 class LibAbcKitCreateDynamicImport : public ::testing::Test {};
36
37 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateDynamicimport, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateDynamicImport,IcreateDynamicimport_1)38 TEST_F(LibAbcKitCreateDynamicImport, IcreateDynamicimport_1)
39 {
40 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
41 "dynamicimport_dynamic");
42 EXPECT_TRUE(helpers::Match(output, ""));
43
44 helpers::TransformMethod(
45 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
46 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
47 "dynamicimport_dynamic.func_main_0",
48 [&](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
49 auto *inst = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER);
50 auto *dynamicimport = g_dynG->iCreateDynamicimport(graph, inst);
51 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
52 auto *returnundefined = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
53 g_implG->iInsertBefore(dynamicimport, returnundefined);
54 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
55 },
56 [&](AbckitGraph *graph) {
57 std::vector<helpers::BBSchema<AbckitIsaApiDynamicOpcode>> bbSchemas {
58 {{},
59 {1},
60 {{0, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
61 {1, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
62 {2, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}}}},
63 {{0},
64 {2},
65 {{3, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER, {}},
66 {4, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC, {}},
67 {5, ABCKIT_ISA_API_DYNAMIC_OPCODE_DYNAMICIMPORT, {3}},
68 {6, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED, {}}}},
69 {{1}, {}, {}}};
70 helpers::VerifyGraph(graph, bbSchemas);
71 });
72
73 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
74 "dynamicimport_dynamic");
75 EXPECT_TRUE(helpers::Match(output, ""));
76 }
77
78 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateDynamicimport, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateDynamicImport,IcreateDynamicimport_2)79 TEST_F(LibAbcKitCreateDynamicImport, IcreateDynamicimport_2)
80 {
81 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
82 "dynamicimport_dynamic");
83 EXPECT_TRUE(helpers::Match(output, ""));
84
85 helpers::TransformMethod(
86 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
87 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
88 "dynamicimport_dynamic.func_main_0",
89 [&](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
90 auto *moduleStr = g_implM->createString(file, "./modules/moduleB.js", strlen("./modules/moduleB.js"));
91 auto *loadString = g_dynG->iCreateLoadString(graph, moduleStr);
92 auto *dynamicimport = g_dynG->iCreateDynamicimport(graph, loadString);
93 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
94 auto *returnundefined = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
95 g_implG->iInsertBefore(loadString, returnundefined);
96 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
97 g_implG->iInsertBefore(dynamicimport, returnundefined);
98 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
99 },
100 [&](AbckitGraph *graph) {
101 std::vector<helpers::BBSchema<AbckitIsaApiDynamicOpcode>> bbSchemas {
102 {{},
103 {1},
104 {{0, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
105 {1, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
106 {2, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}}}},
107 {{0},
108 {2},
109 {{3, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER, {}},
110 {4, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC, {}},
111 {5, ABCKIT_ISA_API_DYNAMIC_OPCODE_LOADSTRING, {}},
112 {6, ABCKIT_ISA_API_DYNAMIC_OPCODE_DYNAMICIMPORT, {5}},
113 {7, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED, {}}}},
114 {{1}, {}, {}}};
115 helpers::VerifyGraph(graph, bbSchemas);
116 });
117
118 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
119 "dynamicimport_dynamic");
120 EXPECT_TRUE(helpers::Match(output, ""));
121 }
122
123 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateDynamicimport, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateDynamicImport,IcreateDynamicimport_3)124 TEST_F(LibAbcKitCreateDynamicImport, IcreateDynamicimport_3)
125 {
126 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
127 "dynamicimport_dynamic");
128 EXPECT_TRUE(helpers::Match(output, ""));
129
130 helpers::TransformMethod(
131 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
132 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
133 "dynamicimport_dynamic.func_main_0",
134 [&](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
135 auto *moduleStr = g_implM->createString(file, "module", strlen("module"));
136 auto *loadString = g_dynG->iCreateLoadString(graph, moduleStr);
137 auto *dynamicimport = g_dynG->iCreateDynamicimport(graph, loadString);
138 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
139 auto *returnundefined = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
140 g_implG->iInsertBefore(loadString, returnundefined);
141 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
142 g_implG->iInsertBefore(dynamicimport, returnundefined);
143 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
144 },
145 [&](AbckitGraph *graph) {
146 std::vector<helpers::BBSchema<AbckitIsaApiDynamicOpcode>> bbSchemas {
147 {{},
148 {1},
149 {{0, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
150 {1, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
151 {2, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}}}},
152 {{0},
153 {2},
154 {{3, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER, {}},
155 {4, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC, {}},
156 {5, ABCKIT_ISA_API_DYNAMIC_OPCODE_LOADSTRING, {}},
157 {6, ABCKIT_ISA_API_DYNAMIC_OPCODE_DYNAMICIMPORT, {5}},
158 {7, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED, {}}}},
159 {{1}, {}, {}}};
160 helpers::VerifyGraph(graph, bbSchemas);
161 });
162
163 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
164 "dynamicimport_dynamic");
165 EXPECT_TRUE(helpers::Match(output, ""));
166 }
167
GetSchema()168 static std::vector<helpers::BBSchema<AbckitIsaApiDynamicOpcode>> GetSchema()
169 {
170 return {{{},
171 {1},
172 {{0, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
173 {1, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
174 {2, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}}}},
175 {{0},
176 {2},
177 {{3, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER, {}},
178 {4, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC, {}},
179 {5, ABCKIT_ISA_API_DYNAMIC_OPCODE_DYNAMICIMPORT, {3}},
180 {6, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {5}},
181 {7, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS1, {6, 5, 4}},
182 {8, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {7}},
183 {9, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {8, 7}},
184 {10, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {9}},
185 {11, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {10, 9}},
186 {12, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED, {}}}},
187 {{1}, {}, {}}};
188 }
189
190 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateDynamicimport, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateDynamicImport,IcreateDynamicimport_4)191 TEST_F(LibAbcKitCreateDynamicImport, IcreateDynamicimport_4)
192 {
193 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
194 "dynamicimport_dynamic");
195 EXPECT_TRUE(helpers::Match(output, ""));
196
197 helpers::TransformMethod(
198 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic.abc",
199 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
200 "dynamicimport_dynamic.func_main_0",
201 [&](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
202 auto *inst = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEOBJECTWITHBUFFER);
203 auto *dynamicimport = g_dynG->iCreateDynamicimport(graph, inst);
204
205 auto *deffunc = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC);
206 auto *thenStr = g_implM->createString(file, "then", strlen("then"));
207 auto *ldobjbyname = g_dynG->iCreateLdobjbyname(graph, dynamicimport, thenStr);
208 auto *callthis1 = g_dynG->iCreateCallthis1(graph, ldobjbyname, dynamicimport, deffunc);
209 auto *ldobjbyname2 = g_dynG->iCreateLdobjbyname(graph, callthis1, thenStr);
210 auto *callthis0 = g_dynG->iCreateCallthis0(graph, ldobjbyname2, callthis1);
211 auto *catchStr = g_implM->createString(file, "catch", strlen("catch"));
212 auto *ldobjbyname3 = g_dynG->iCreateLdobjbyname(graph, callthis0, catchStr);
213 auto *callthis03 = g_dynG->iCreateCallthis0(graph, ldobjbyname3, callthis0);
214 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
215 auto *returnundefined = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
216 g_implG->iInsertBefore(dynamicimport, returnundefined);
217 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
218 g_implG->iInsertBefore(ldobjbyname, returnundefined);
219 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
220 g_implG->iInsertBefore(callthis1, returnundefined);
221 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
222 g_implG->iInsertBefore(ldobjbyname2, returnundefined);
223 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
224 g_implG->iInsertBefore(callthis0, returnundefined);
225 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
226 g_implG->iInsertBefore(ldobjbyname3, returnundefined);
227 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
228 g_implG->iInsertBefore(callthis03, returnundefined);
229 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
230 },
231 [&](AbckitGraph *graph) { helpers::VerifyGraph(graph, GetSchema()); });
232
233 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/import/dynamicimport_dynamic_modified.abc",
234 "dynamicimport_dynamic");
235 EXPECT_TRUE(helpers::Match(output, "from moduleA: moduleB::a 6 36.6\n"));
236 }
237
238 } // namespace libabckit::test
239 // NOLINTEND(readability-magic-numbers)
240