1 /*
2 * Copyright (c) 2023 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 <iostream>
17 #include <stdexcept>
18 #include "napi/native_api.h"
19 #include <bits/alltypes.h>
20 #include <ctime>
21 #include <native_vsync/native_vsync.h>
22 #include <stdexcept>
23 #include <cstdio>
24 #include <zconf.h>
25
26 #define SUCCESS 0
27 #define FAIL (-1)
28 #define PARAM_0 0
29 #define NUMBER_2 2
30 #define NUMBER_3 3
31 #define TIMEOUT_FIVE 10
32 #define NUMBER_254 254
33 #define NUMBER_256 256
34 #define NUMBER_500 500
35 #define NUMBER_40001000 40001000
36 static bool g_flag = false;
OnVSync(long long timestamp, void *data)37 static void OnVSync(long long timestamp, void *data) { g_flag = true; }
38
OHNativeVSyncCreate(napi_env env, napi_callback_info info)39 static napi_value OHNativeVSyncCreate(napi_env env, napi_callback_info info)
40 {
41 napi_value result = nullptr;
42 char name[] = "test";
43 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, sizeof(name));
44 if (nativeVSync != nullptr) {
45 napi_create_int32(env, SUCCESS, &result);
46 OH_NativeVSync_Destroy(nativeVSync);
47 } else {
48 napi_create_int32(env, FAIL, &result);
49 }
50 return result;
51 }
52
OHNativeVSyncCreateFOne(napi_env env, napi_callback_info info)53 static napi_value OHNativeVSyncCreateFOne(napi_env env, napi_callback_info info)
54 {
55 napi_value result = nullptr;
56 unsigned int length = 0;
57 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(nullptr, length);
58 if (nativeVSync != nullptr) {
59 napi_create_int32(env, FAIL, &result);
60 } else {
61 napi_create_int32(env, SUCCESS, &result);
62 }
63 return result;
64 }
65
OHNativeVSyncRequestFrame(napi_env env, napi_callback_info info)66 static napi_value OHNativeVSyncRequestFrame(napi_env env, napi_callback_info info)
67 {
68 napi_value result = nullptr;
69 char name[] = "test";
70 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, sizeof(name));
71 OH_NativeVSync_FrameCallback callback = OnVSync;
72 int ret = OH_NativeVSync_RequestFrame(nativeVSync, callback, nullptr);
73 if (ret == SUCCESS) {
74 napi_create_int32(env, SUCCESS, &result);
75 } else {
76 napi_create_int32(env, FAIL, &result);
77 }
78 if (nativeVSync) {
79 OH_NativeVSync_Destroy(nativeVSync);
80 }
81 return result;
82 }
83
OHNativeVSyncRequestFrameFOne(napi_env env, napi_callback_info info)84 static napi_value OHNativeVSyncRequestFrameFOne(napi_env env, napi_callback_info info)
85 {
86 napi_value result = nullptr;
87 int ret = OH_NativeVSync_RequestFrame(nullptr, nullptr, nullptr);
88 if (ret != SUCCESS) {
89 napi_create_int32(env, SUCCESS, &result);
90 } else {
91 napi_create_int32(env, FAIL, &result);
92 }
93 return result;
94 }
95
OHNativeVSyncRequestFrameFTwo(napi_env env, napi_callback_info info)96 static napi_value OHNativeVSyncRequestFrameFTwo(napi_env env, napi_callback_info info)
97 {
98 napi_value result = nullptr;
99 char name[] = "test";
100 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, sizeof(name));
101 int ret = OH_NativeVSync_RequestFrame(nativeVSync, nullptr, nullptr);
102 if (ret != SUCCESS) {
103 napi_create_int32(env, SUCCESS, &result);
104 } else {
105 napi_create_int32(env, FAIL, &result);
106 }
107 if (nativeVSync) {
108 OH_NativeVSync_Destroy(nativeVSync);
109 }
110 return result;
111 }
112
OHNativeVSyncGetPeriod(napi_env env, napi_callback_info info)113 static napi_value OHNativeVSyncGetPeriod(napi_env env, napi_callback_info info)
114 {
115 napi_value result = nullptr;
116 char name[] = "test";
117 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, sizeof(name));
118 OH_NativeVSync_FrameCallback callback = OnVSync;
119 OH_NativeVSync_RequestFrame(nativeVSync, callback, nullptr);
120 time_t startTime = time(PARAM_0);
121 double diffTime = 0;
122 while (!g_flag && diffTime < TIMEOUT_FIVE) {
123 time_t curTime = time(PARAM_0);
124 diffTime = difftime(curTime, startTime);
125 }
126 long long period;
127 int ret = OH_NativeVSync_GetPeriod(nativeVSync, &period);
128 if (ret == SUCCESS) {
129 napi_create_int32(env, SUCCESS, &result);
130 } else {
131 napi_create_int32(env, FAIL, &result);
132 }
133 if (nativeVSync) {
134 OH_NativeVSync_Destroy(nativeVSync);
135 }
136 return result;
137 }
138
OHNativeVSyncGetPeriodFOne(napi_env env, napi_callback_info info)139 static napi_value OHNativeVSyncGetPeriodFOne(napi_env env, napi_callback_info info)
140 {
141 napi_value result = nullptr;
142 long long period;
143 int ret = OH_NativeVSync_GetPeriod(nullptr, &period);
144 if (ret != SUCCESS) {
145 napi_create_int32(env, SUCCESS, &result);
146 } else {
147 napi_create_int32(env, FAIL, &result);
148 }
149 return result;
150 }
151
OHNativeVSyncCreateNull(napi_env env, napi_callback_info info)152 static napi_value OHNativeVSyncCreateNull(napi_env env, napi_callback_info info)
153 {
154 napi_value result = nullptr;
155 unsigned int length = 0;
156 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(nullptr, length);
157 if (nativeVSync == nullptr) {
158 napi_create_int32(env, FAIL, &result);
159 } else {
160 napi_create_int32(env, SUCCESS, &result);
161 }
162 return result;
163 }
164
OHNativeVSyncCreateNotEq(napi_env env, napi_callback_info info)165 static napi_value OHNativeVSyncCreateNotEq(napi_env env, napi_callback_info info)
166 {
167 napi_value result = nullptr;
168 char name[] = "testCase";
169 unsigned int length = NUMBER_2;
170 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, length);
171 if (nativeVSync == nullptr) {
172 napi_create_int32(env, FAIL, &result);
173 } else {
174 napi_create_int32(env, SUCCESS, &result);
175 }
176 OH_NativeVSync_Destroy(nativeVSync);
177 return result;
178 }
179
OHNativeVSyncCreateNormal(napi_env env, napi_callback_info info)180 static napi_value OHNativeVSyncCreateNormal(napi_env env, napi_callback_info info)
181 {
182 napi_value result = nullptr;
183 char name[] = "testCase";
184 unsigned int length = strlen(name);
185 OH_NativeVSync *nativeVSync1 = OH_NativeVSync_Create(name, length);
186 napi_create_array_with_length(env, NUMBER_2, &result);
187 napi_value result1 = nullptr;
188 napi_value result2 = nullptr;
189 if (nativeVSync1 == nullptr) {
190 napi_create_int32(env, FAIL, &result1);
191 } else {
192 napi_create_int32(env, SUCCESS, &result1);
193 }
194 napi_set_element(env, result, 0, result1);
195
196 OH_NativeVSync *nativeVSync2 = OH_NativeVSync_Create(name, length);
197 if (nativeVSync2 == nullptr) {
198 napi_create_int32(env, FAIL, &result2);
199 } else {
200 napi_create_int32(env, SUCCESS, &result2);
201 }
202
203 napi_set_element(env, result, 1, result2);
204 OH_NativeVSync_Destroy(nativeVSync1);
205 OH_NativeVSync_Destroy(nativeVSync2);
206 return result;
207 }
208
OHNativeVSyncCreateAbnormal(napi_env env, napi_callback_info info)209 static napi_value OHNativeVSyncCreateAbnormal(napi_env env, napi_callback_info info)
210 {
211 napi_value result = nullptr;
212 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(NULL, 0);
213 if (nativeVSync == nullptr) {
214 napi_create_int32(env, SUCCESS, &result);
215 } else {
216 napi_create_int32(env, FAIL, &result);
217 return result;
218 }
219 nativeVSync = OH_NativeVSync_Create(0, 0);
220 if (nativeVSync == nullptr) {
221 napi_create_int32(env, SUCCESS, &result);
222 } else {
223 napi_create_int32(env, FAIL, &result);
224 return result;
225 }
226 OH_NativeVSync_Destroy(nativeVSync);
227 return result;
228 }
229
MyFrameCallback(long long timestamp, void *data)230 void MyFrameCallback(long long timestamp, void *data)
231 {
232 int *myData = static_cast<int *>(data);
233 return;
234 }
235
OHNativeVSyncCreateDifLenth(napi_env env, napi_callback_info info)236 static napi_value OHNativeVSyncCreateDifLenth(napi_env env, napi_callback_info info)
237 {
238 napi_value result = nullptr;
239 std::vector<std::string> myArray = {
240 "0",
241 "a",
242 "你",
243 "!@#¥%^&*()_+",
244 " ",
245 " ",
246 "这里有好多好多字符qazwsxedcrfvtgbyhnujqazwsxedcrfvtgbyhnujqazwsxedcrfvtgbyhnujqazwsxedcrfvtgbyhnuj",
247 "ab_cdefghijklmnopqrstuvwxyz",
248 "abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde"};
249 napi_create_array_with_length(env, myArray.size(), &result);
250
251 for (uint32_t index = 0; index < myArray.size(); index++) {
252 unsigned int len = strlen(myArray[index].c_str());
253 OH_NativeVSync *nativeVSync = nullptr;
254 napi_value resultIndex = nullptr;
255 nativeVSync = OH_NativeVSync_Create(myArray[index].c_str(), len);
256 if (nativeVSync == nullptr) {
257 napi_create_int32(env, FAIL+index, &result);
258 OH_NativeVSync_Destroy(nativeVSync);
259 return result;
260 } else {
261 napi_create_int32(env, SUCCESS, &result);
262 OH_NativeVSync_Destroy(nativeVSync);
263 continue;
264 }
265 }
266 return result;
267 }
268
OHNativeVSyncCreateMuch(napi_env env, napi_callback_info info)269 static napi_value OHNativeVSyncCreateMuch(napi_env env, napi_callback_info info)
270 {
271 napi_value result = nullptr;
272 char name[] = "testcase";
273 unsigned int length = strlen(name);
274 OH_NativeVSync *nativeVSyncArr[NUMBER_500];
275 int success = 0;
276 for (uint32_t i = 0; i < NUMBER_500; i++) {
277 nativeVSyncArr[i] = OH_NativeVSync_Create(name, length);
278 if (nativeVSyncArr[i] != nullptr) {
279 success = success + 1;
280 continue;
281 }
282 }
283 if (success == NUMBER_254) {
284 napi_create_int32(env, SUCCESS, &result);
285 } else {
286 napi_create_int32(env, success, &result);
287 }
288 for (uint32_t i = 0; i < NUMBER_500; i++) {
289 OH_NativeVSync_Destroy(nativeVSyncArr[i]);
290 }
291 return result;
292 }
293
OHNativeVSyncGetPeriodNullptr(napi_env env, napi_callback_info info)294 static napi_value OHNativeVSyncGetPeriodNullptr(napi_env env, napi_callback_info info)
295 {
296 napi_value result = nullptr;
297 long long period;
298 int res = OH_NativeVSync_GetPeriod(nullptr, &period);
299 napi_create_int32(env, res, &result);
300 return result;
301 }
302
OHNativeVSyncRequestFrameNullptr(napi_env env, napi_callback_info info)303 static napi_value OHNativeVSyncRequestFrameNullptr(napi_env env, napi_callback_info info)
304 {
305 napi_value result = nullptr;
306 char name[] = "testcase";
307 unsigned int length = strlen(name);
308 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, length);
309 napi_create_array_with_length(env, NUMBER_3, &result);
310 int param = 0;
311 int res = OH_NativeVSync_RequestFrame(nullptr, MyFrameCallback, ¶m);
312 if (res != NUMBER_40001000) {
313 napi_create_int32(env, FAIL, &result);
314 return result;
315 }
316 res = OH_NativeVSync_RequestFrame(nativeVSync, nullptr, ¶m);
317 if (res != NUMBER_40001000) {
318 napi_create_int32(env, FAIL, &result);
319 return result;
320 }
321 res = OH_NativeVSync_RequestFrame(nativeVSync, MyFrameCallback, nullptr);
322 if (res != 0) {
323 napi_create_int32(env, FAIL, &result);
324 return result;
325 }
326 napi_create_int32(env, SUCCESS, &result);
327 return result;
328 }
329
OHNativeVSyncRequestFrameNormal(napi_env env, napi_callback_info info)330 static napi_value OHNativeVSyncRequestFrameNormal(napi_env env, napi_callback_info info)
331 {
332 napi_value result = nullptr;
333 char name[] = "testcase";
334 unsigned int length = strlen(name);
335 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, length);
336 int *param = nullptr;
337 int res = OH_NativeVSync_RequestFrame(nativeVSync, MyFrameCallback, param);
338 napi_create_int32(env, res, &result);
339 OH_NativeVSync_Destroy(nativeVSync);
340 return result;
341 }
342
OHNativeVSyncRequestFrameParamErr(napi_env env, napi_callback_info info)343 static napi_value OHNativeVSyncRequestFrameParamErr(napi_env env, napi_callback_info info)
344 {
345 napi_value result = nullptr;
346 char name[] = "testcase";
347 unsigned int length = strlen(name);
348 OH_NativeVSync *nativeVSync = OH_NativeVSync_Create(name, length);
349 char param[] = "test";
350 int res = OH_NativeVSync_RequestFrame(nativeVSync, MyFrameCallback, ¶m);
351 napi_create_int32(env, res, &result);
352 OH_NativeVSync_Destroy(nativeVSync);
353 return result;
354 }
355
356 EXTERN_C_START
Init(napi_env env, napi_value exports)357 static napi_value Init(napi_env env, napi_value exports)
358 {
359 napi_property_descriptor desc[] = {
360 {"oHNativeVSyncCreate", nullptr, OHNativeVSyncCreate, nullptr, nullptr, nullptr, napi_default, nullptr},
361 {"oHNativeVSyncCreateFOne", nullptr, OHNativeVSyncCreateFOne, nullptr, nullptr, nullptr, napi_default, nullptr},
362 {"oHNativeVSyncRequestFrame", nullptr, OHNativeVSyncRequestFrame, nullptr, nullptr, nullptr, napi_default,
363 nullptr},
364 {"oHNativeVSyncRequestFrameFOne", nullptr, OHNativeVSyncRequestFrameFOne, nullptr, nullptr, nullptr,
365 napi_default, nullptr},
366 {"oHNativeVSyncRequestFrameFTwo", nullptr, OHNativeVSyncRequestFrameFTwo, nullptr, nullptr, nullptr,
367 napi_default, nullptr},
368 {"oHNativeVSyncGetPeriod", nullptr, OHNativeVSyncGetPeriod, nullptr, nullptr, nullptr, napi_default, nullptr},
369 {"oHNativeVSyncGetPeriodFOne", nullptr, OHNativeVSyncGetPeriodFOne, nullptr, nullptr, nullptr, napi_default,
370 nullptr},
371 {"oHNativeVSyncCreateNull", nullptr, OHNativeVSyncCreateNull, nullptr, nullptr, nullptr, napi_default, nullptr},
372 {"oHNativeVSyncCreateNotEq", nullptr, OHNativeVSyncCreateNotEq, nullptr, nullptr, nullptr, napi_default,
373 nullptr},
374 {"oHNativeVSyncCreateNormal", nullptr, OHNativeVSyncCreateNormal, nullptr, nullptr, nullptr, napi_default,
375 nullptr},
376 {"oHNativeVSyncCreateAbnormal", nullptr, OHNativeVSyncCreateAbnormal, nullptr, nullptr, nullptr, napi_default,
377 nullptr},
378 {"oHNativeVSyncCreateDifLenth", nullptr, OHNativeVSyncCreateDifLenth, nullptr, nullptr, nullptr, napi_default,
379 nullptr},
380 {"oHNativeVSyncCreateMuch", nullptr, OHNativeVSyncCreateMuch, nullptr, nullptr, nullptr, napi_default, nullptr},
381 {"oHNativeVSyncGetPeriodNullptr", nullptr, OHNativeVSyncGetPeriodNullptr, nullptr, nullptr, nullptr,
382 napi_default, nullptr},
383 {"oHNativeVSyncRequestFrameNullptr", nullptr, OHNativeVSyncRequestFrameNullptr, nullptr, nullptr, nullptr,
384 napi_default, nullptr},
385 {"oHNativeVSyncRequestFrameNormal", nullptr, OHNativeVSyncRequestFrameNormal, nullptr, nullptr, nullptr,
386 napi_default, nullptr},
387 {"oHNativeVSyncRequestFrameParamErr", nullptr, OHNativeVSyncRequestFrameParamErr, nullptr, nullptr, nullptr,
388 napi_default, nullptr},
389 };
390 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
391 return exports;
392 }
393 EXTERN_C_END
394
395 static napi_module demoModule = {
396 .nm_version = 1,
397 .nm_flags = 0,
398 .nm_filename = nullptr,
399 .nm_register_func = Init,
400 .nm_modname = "nativevsync",
401 .nm_priv = ((void *)0),
402 .reserved = {0},
403 };
404
RegisterModule(void)405 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); };
406