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 "libabckit/include/c/extensions/js/metadata_js.h"
21 #include "helpers/helpers.h"
22 #include "libabckit/include/c/metadata_core.h"
23 #include "libabckit/include/c/statuses.h"
24
25 namespace libabckit::test {
26
27 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
28 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
29 static auto g_implJsI = AbckitGetJsInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
30
31 class LibAbcKitJSInspectApiCasts : public ::testing::Test {};
32
ProcessClass(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)33 static void ProcessClass(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
34 {
35 AbckitCoreClass *klass = g_implI->functionGetParentClass(method);
36 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
37 AbckitJsClass *klassJS = g_implJsI->coreClassToJsClass(klass);
38 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
39 AbckitCoreClass *klassCast = g_implJsI->jsClassToCoreClass(klassJS);
40 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
41 EXPECT_EQ(klass, klassCast);
42 }
43
ProcessClassNeg(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)44 static void ProcessClassNeg(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
45 {
46 AbckitCoreClass *klass = g_implI->functionGetParentClass(method);
47 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
48 AbckitJsClass *klassJS = g_implJsI->coreClassToJsClass(klass);
49 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_WRONG_TARGET);
50 EXPECT_EQ(klassJS, nullptr);
51 }
52
ProcessMethod(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)53 static void ProcessMethod(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
54 {
55 AbckitJsFunction *methodJS = g_implJsI->coreFunctionToJsFunction(method);
56 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
57 AbckitCoreFunction *methodCast = g_implJsI->jsFunctionToCoreFunction(methodJS);
58 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
59 EXPECT_EQ(method, methodCast);
60 }
61
ProcessMethodNeg(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)62 static void ProcessMethodNeg(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
63 {
64 AbckitJsFunction *methodJS = g_implJsI->coreFunctionToJsFunction(method);
65 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_WRONG_TARGET);
66 EXPECT_EQ(methodJS, nullptr);
67 }
68
ProcessModule(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)69 static void ProcessModule(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
70 {
71 AbckitCoreModule *module = g_implI->functionGetModule(method);
72 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
73 AbckitJsModule *moduleJS = g_implJsI->coreModuleToJsModule(module);
74 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
75 AbckitCoreModule *moduleCast = g_implJsI->jsModuleToCoreModule(moduleJS);
76 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
77 EXPECT_EQ(module, moduleCast);
78 }
79
ProcessModuleNeg(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)80 static void ProcessModuleNeg(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
81 {
82 AbckitCoreModule *module = g_implI->functionGetModule(method);
83 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
84 AbckitJsModule *moduleJS = g_implJsI->coreModuleToJsModule(module);
85 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_WRONG_TARGET);
86 EXPECT_EQ(moduleJS, nullptr);
87 }
88
ProcessImportDescriptor(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)89 static void ProcessImportDescriptor(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
90 {
91 AbckitCoreModule *module = g_implI->functionGetModule(method);
92 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
93 bool isVisitedAny = false;
94 g_implI->moduleEnumerateImports(module, &isVisitedAny, [](AbckitCoreImportDescriptor *id, void *data) {
95 AbckitJsImportDescriptor *idJS = g_implJsI->coreImportDescriptorToJsImportDescriptor(id);
96 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
97 AbckitCoreImportDescriptor *idCast = g_implJsI->jsImportDescriptorToCoreImportDescriptor(idJS);
98 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
99 EXPECT_EQ(id, idCast);
100 *reinterpret_cast<bool *>(data) = true;
101 return true;
102 });
103 ASSERT_TRUE(isVisitedAny);
104 }
105
ProcessImportDescriptorNeg(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)106 static void ProcessImportDescriptorNeg(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
107 {
108 AbckitCoreModule *module = g_implI->functionGetModule(method);
109 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
110 bool isVisitedAny = false;
111 g_implI->moduleEnumerateImports(module, &isVisitedAny, [](AbckitCoreImportDescriptor *id, void *data) {
112 AbckitJsImportDescriptor *idJS = g_implJsI->coreImportDescriptorToJsImportDescriptor(id);
113 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_WRONG_TARGET);
114 EXPECT_EQ(idJS, nullptr);
115 *reinterpret_cast<bool *>(data) = true;
116 return true;
117 });
118 ASSERT_TRUE(isVisitedAny);
119 }
120
ProcessExportDescriptor(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)121 static void ProcessExportDescriptor(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
122 {
123 AbckitCoreModule *module = g_implI->functionGetModule(method);
124 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
125 bool isVisitedAny = false;
126 g_implI->moduleEnumerateExports(module, &isVisitedAny, [](AbckitCoreExportDescriptor *ed, void *data) {
127 AbckitJsExportDescriptor *edJS = g_implJsI->coreExportDescriptorToJsExportDescriptor(ed);
128 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
129 AbckitCoreExportDescriptor *edCast = g_implJsI->jsExportDescriptorToCoreExportDescriptor(edJS);
130 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
131 EXPECT_EQ(ed, edCast);
132 *reinterpret_cast<bool *>(data) = true;
133 return true;
134 });
135 ASSERT_TRUE(isVisitedAny);
136 }
137
ProcessExportDescriptorNeg(AbckitFile *,AbckitCoreFunction * method,AbckitGraph *)138 static void ProcessExportDescriptorNeg(AbckitFile * /*file*/, AbckitCoreFunction *method, AbckitGraph * /*graph*/)
139 {
140 AbckitCoreModule *module = g_implI->functionGetModule(method);
141 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
142 bool isVisitedAny = false;
143 g_implI->moduleEnumerateExports(module, &isVisitedAny, [](AbckitCoreExportDescriptor *ed, void *data) {
144 AbckitJsExportDescriptor *edJS = g_implJsI->coreExportDescriptorToJsExportDescriptor(ed);
145 EXPECT_EQ(g_impl->getLastError(), ABCKIT_STATUS_WRONG_TARGET);
146 EXPECT_EQ(edJS, nullptr);
147 *reinterpret_cast<bool *>(data) = true;
148 return true;
149 });
150 ASSERT_TRUE(isVisitedAny);
151 }
152
153 // Test: test-kind=api, api=JsInspectApiImpl::coreClassToJsClass, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,CoreClassToJsClass)154 TEST_F(LibAbcKitJSInspectApiCasts, CoreClassToJsClass)
155 {
156 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
157 ProcessClass);
158 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
159 }
160
161 // Test: test-kind=api, api=JsInspectApiImpl::jsClassToCoreClass, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,JsClassToCoreClass)162 TEST_F(LibAbcKitJSInspectApiCasts, JsClassToCoreClass)
163 {
164 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
165 ProcessClass);
166 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
167 }
168
169 // Test: test-kind=api, api=JsInspectApiImpl::coreClassToJsClass, abc-kind=JS, category=negative
TEST_F(LibAbcKitJSInspectApiCasts,CoreClassToJsClassNeg)170 TEST_F(LibAbcKitJSInspectApiCasts, CoreClassToJsClassNeg)
171 {
172 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/arkts/inspect_api/api_casts/api_casts.abc", "foo",
173 ProcessClassNeg);
174 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
175 }
176
177 // Test: test-kind=api, api=JsInspectApiImpl::coreFunctionToJsFunction, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,CoreFunctionToJsFunction)178 TEST_F(LibAbcKitJSInspectApiCasts, CoreFunctionToJsFunction)
179 {
180 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
181 ProcessMethod);
182 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
183 }
184
185 // Test: test-kind=api, api=JsInspectApiImpl::jsFunctionToCoreFunction, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,JsFunctionToCoreFunction)186 TEST_F(LibAbcKitJSInspectApiCasts, JsFunctionToCoreFunction)
187 {
188 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
189 ProcessMethod);
190 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
191 }
192
193 // Test: test-kind=api, api=JsInspectApiImpl::coreFunctionToJsFunction, abc-kind=JS, category=negative
TEST_F(LibAbcKitJSInspectApiCasts,CoreFunctionToJsFunctionNeg)194 TEST_F(LibAbcKitJSInspectApiCasts, CoreFunctionToJsFunctionNeg)
195 {
196 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/arkts/inspect_api/api_casts/api_casts.abc", "foo",
197 ProcessMethodNeg);
198 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
199 }
200
201 // Test: test-kind=api, api=JsInspectApiImpl::coreModuleToJsModule, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,CoreModuleToJsModule)202 TEST_F(LibAbcKitJSInspectApiCasts, CoreModuleToJsModule)
203 {
204 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
205 ProcessModule);
206 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
207 }
208
209 // Test: test-kind=api, api=JsInspectApiImpl::jsModuleToCoreModule, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,JsModuleToCoreModule)210 TEST_F(LibAbcKitJSInspectApiCasts, JsModuleToCoreModule)
211 {
212 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
213 ProcessModule);
214 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
215 }
216
217 // Test: test-kind=api, api=JsInspectApiImpl::coreModuleToJsModule, abc-kind=JS, category=negative
TEST_F(LibAbcKitJSInspectApiCasts,CoreModuleToJsModuleNeg)218 TEST_F(LibAbcKitJSInspectApiCasts, CoreModuleToJsModuleNeg)
219 {
220 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/arkts/inspect_api/api_casts/api_casts.abc", "foo",
221 ProcessModuleNeg);
222 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
223 }
224
225 // Test: test-kind=api, api=JsInspectApiImpl::coreImportDescriptorToJsImportDescriptor, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,CoreImportDescriptorToJsImportDescriptor)226 TEST_F(LibAbcKitJSInspectApiCasts, CoreImportDescriptorToJsImportDescriptor)
227 {
228 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
229 ProcessImportDescriptor);
230 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
231 }
232
233 // Test: test-kind=api, api=JsInspectApiImpl::jsImportDescriptorToCoreImportDescriptor, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,JsImportDescriptorToCoreImportDescriptor)234 TEST_F(LibAbcKitJSInspectApiCasts, JsImportDescriptorToCoreImportDescriptor)
235 {
236 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
237 ProcessImportDescriptor);
238 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
239 }
240
241 // Test: test-kind=api, api=JsInspectApiImpl::coreImportDescriptorToJsImportDescriptor, abc-kind=JS, category=negative
TEST_F(LibAbcKitJSInspectApiCasts,CoreImportDescriptorToJsImportDescriptorNeg)242 TEST_F(LibAbcKitJSInspectApiCasts, CoreImportDescriptorToJsImportDescriptorNeg)
243 {
244 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/arkts/inspect_api/api_casts/api_casts.abc", "foo",
245 ProcessImportDescriptorNeg);
246 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
247 }
248
249 // Test: test-kind=api, api=JsInspectApiImpl::coreExportDescriptorToJsExportDescriptor, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,CoreExportDescriptorToJsExportDescriptor)250 TEST_F(LibAbcKitJSInspectApiCasts, CoreExportDescriptorToJsExportDescriptor)
251 {
252 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
253 ProcessExportDescriptor);
254 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
255 }
256
257 // Test: test-kind=api, api=JsInspectApiImpl::coreExportDescriptorToJsExportDescriptor, abc-kind=JS, category=negative
TEST_F(LibAbcKitJSInspectApiCasts,CoreExportDescriptorToJsExportDescriptorNeg)258 TEST_F(LibAbcKitJSInspectApiCasts, CoreExportDescriptorToJsExportDescriptorNeg)
259 {
260 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/arkts/inspect_api/api_casts/api_casts.abc", "foo",
261 ProcessExportDescriptorNeg);
262 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
263 }
264
265 // Test: test-kind=api, api=JsInspectApiImpl::jsExportDescriptorToCoreExportDescriptor, abc-kind=JS, category=positive
TEST_F(LibAbcKitJSInspectApiCasts,JsExportDescriptorToCoreExportDescriptor)266 TEST_F(LibAbcKitJSInspectApiCasts, JsExportDescriptorToCoreExportDescriptor)
267 {
268 helpers::InspectMethod(ABCKIT_ABC_DIR "ut/extensions/js/inspect_api/api_casts/JSapi_casts.abc", "foo",
269 ProcessExportDescriptor);
270 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
271 }
272
273 } // namespace libabckit::test
274