• 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 "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