1 /* 2 * Copyright (c) 2021 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 "test.h" 17 #include "gtest/gtest.h" 18 #include "napi/native_api.h" 19 #include "napi/native_node_api.h" 20 #include "securec.h" 21 #include "utils/log.h" 22 23 class NapiBasicTest : public NativeEngineTest { 24 public: SetUpTestCase()25 static void SetUpTestCase() 26 { 27 GTEST_LOG_(INFO) << "NapiBasicTest SetUpTestCase"; 28 } 29 TearDownTestCase()30 static void TearDownTestCase() 31 { 32 GTEST_LOG_(INFO) << "NapiBasicTest TearDownTestCase"; 33 } 34 SetUp()35 void SetUp() override {} TearDown()36 void TearDown() override {} 37 }; 38 39 /** 40 * @tc.name: UndefinedTest001 41 * @tc.desc: Test undefined type. 42 * @tc.type: FUNC 43 */ 44 HWTEST_F(NapiBasicTest, UndefinedTest001, testing::ext::TestSize.Level1) 45 { 46 napi_env env = (napi_env)engine_; 47 napi_value result = nullptr; 48 ASSERT_CHECK_CALL(napi_get_undefined(env, &result)); 49 ASSERT_CHECK_VALUE_TYPE(env, result, napi_undefined); 50 } 51 52 /** 53 * @tc.name: NullTest001 54 * @tc.desc: Test null type. 55 * @tc.type: FUNC 56 */ 57 HWTEST_F(NapiBasicTest, NullTest001, testing::ext::TestSize.Level1) 58 { 59 napi_env env = (napi_env)engine_; 60 napi_value result = nullptr; 61 ASSERT_CHECK_CALL(napi_get_null(env, &result)); 62 ASSERT_CHECK_VALUE_TYPE(env, result, napi_null); 63 } 64 65 /** 66 * @tc.name: BooleanTest001 67 * @tc.desc: Test boolean type. 68 * @tc.type: FUNC 69 */ 70 HWTEST_F(NapiBasicTest, BooleanTest001, testing::ext::TestSize.Level1) 71 { 72 napi_env env = (napi_env)engine_; 73 napi_value result = nullptr; 74 ASSERT_CHECK_CALL(napi_get_boolean(env, true, &result)); 75 ASSERT_CHECK_VALUE_TYPE(env, result, napi_boolean); 76 77 bool resultValue = false; 78 ASSERT_CHECK_CALL(napi_get_value_bool(env, result, &resultValue)); 79 ASSERT_TRUE(resultValue); 80 } 81 82 /** 83 * @tc.name: NumberTest001 84 * @tc.desc: Test number type. 85 * @tc.type: FUNC 86 */ 87 HWTEST_F(NapiBasicTest, NumberTest001, testing::ext::TestSize.Level1) 88 { 89 napi_env env = (napi_env)engine_; 90 { 91 int32_t testValue = INT32_MAX; 92 napi_value result = nullptr; 93 ASSERT_CHECK_CALL(napi_create_int32(env, testValue, &result)); 94 ASSERT_CHECK_VALUE_TYPE(env, result, napi_number); 95 96 int32_t resultValue = 0; 97 ASSERT_CHECK_CALL(napi_get_value_int32(env, result, &resultValue)); 98 ASSERT_EQ(resultValue, INT32_MAX); 99 } 100 { 101 uint32_t testValue = UINT32_MAX; 102 napi_value result = nullptr; 103 ASSERT_CHECK_CALL(napi_create_uint32(env, testValue, &result)); 104 ASSERT_CHECK_VALUE_TYPE(env, result, napi_number); 105 106 uint32_t resultValue = 0; 107 ASSERT_CHECK_CALL(napi_get_value_uint32(env, result, &resultValue)); 108 ASSERT_EQ(resultValue, UINT32_MAX); 109 } 110 { 111 int64_t testValue = 9007199254740991; 112 napi_value result = nullptr; 113 ASSERT_CHECK_CALL(napi_create_int64(env, testValue, &result)); 114 ASSERT_CHECK_VALUE_TYPE(env, result, napi_number); 115 116 int64_t resultValue = 0; 117 ASSERT_CHECK_CALL(napi_get_value_int64(env, result, &resultValue)); 118 ASSERT_EQ(resultValue, testValue); 119 } 120 { 121 double testValue = DBL_MAX; 122 napi_value result = nullptr; 123 ASSERT_CHECK_CALL(napi_create_double(env, testValue, &result)); 124 ASSERT_CHECK_VALUE_TYPE(env, result, napi_number); 125 126 double resultValue = 0; 127 ASSERT_CHECK_CALL(napi_get_value_double(env, result, &resultValue)); 128 ASSERT_EQ(resultValue, DBL_MAX); 129 } 130 } 131 132 /** 133 * @tc.name: StringTest001 134 * @tc.desc: Test string type. 135 * @tc.type: FUNC 136 */ 137 HWTEST_F(NapiBasicTest, StringTest001, testing::ext::TestSize.Level1) 138 { 139 napi_env env = (napi_env)engine_; 140 const char testStr[] = "中文,English,123456,!@#$%$#^%&"; 141 size_t testStrLength = strlen(testStr); 142 napi_value result = nullptr; 143 ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, testStrLength, &result)); 144 ASSERT_CHECK_VALUE_TYPE(env, result, napi_string); 145 146 char* buffer = nullptr; 147 size_t bufferSize = 0; 148 size_t strLength = 0; 149 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, result, nullptr, 0, &bufferSize)); 150 ASSERT_GT(bufferSize, (size_t)0); __anon8a3d7f070102null151 buffer = new char[bufferSize + 1]{ 0 }; 152 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, result, buffer, bufferSize + 1, &strLength)); 153 ASSERT_STREQ(testStr, buffer); 154 ASSERT_EQ(testStrLength, strLength); 155 delete []buffer; 156 buffer = nullptr; 157 } 158 159 /** 160 * @tc.name: SymbolTest001 161 * @tc.desc: Test symbol type. 162 * @tc.type: FUNC 163 */ 164 HWTEST_F(NapiBasicTest, SymbolTest001, testing::ext::TestSize.Level1) 165 { 166 napi_env env = (napi_env)engine_; 167 168 const char testStr[] = "testSymbol"; 169 napi_value result = nullptr; 170 171 napi_create_string_latin1(env, testStr, strlen(testStr), &result); 172 173 napi_value symbolVal = nullptr; 174 napi_create_symbol(env, result, &symbolVal); 175 176 ASSERT_CHECK_VALUE_TYPE(env, symbolVal, napi_symbol); 177 } 178 179 /** 180 * @tc.name: ExternalTest001 181 * @tc.desc: Test external type. 182 * @tc.type: FUNC 183 */ 184 HWTEST_F(NapiBasicTest, ExternalTest001, testing::ext::TestSize.Level1) 185 { 186 napi_env env = (napi_env)engine_; 187 const char testStr[] = "test"; 188 napi_value external = nullptr; 189 napi_create_external( 190 env, (void*)testStr, __anon8a3d7f070202(napi_env env, void* data, void* hint) 191 [](napi_env env, void* data, void* hint) { ASSERT_STREQ((const char*)data, (const char*)hint); }, 192 (void*)testStr, &external); 193 194 ASSERT_CHECK_VALUE_TYPE(env, external, napi_external); 195 void* tmpExternal = nullptr; 196 napi_get_value_external(env, external, &tmpExternal); 197 ASSERT_TRUE(tmpExternal); 198 ASSERT_EQ(tmpExternal, testStr); 199 } 200 201 /** 202 * @tc.name: ObjectTest001 203 * @tc.desc: Test object type. 204 * @tc.type: FUNC 205 */ 206 HWTEST_F(NapiBasicTest, ObjectTest001, testing::ext::TestSize.Level1) 207 { 208 napi_env env = (napi_env)engine_; 209 210 napi_value result = nullptr; 211 ASSERT_CHECK_CALL(napi_create_object(env, &result)); 212 ASSERT_CHECK_VALUE_TYPE(env, result, napi_object); 213 214 const char testStr[] = "1234567"; 215 napi_value strAttribute = nullptr; 216 ASSERT_CHECK_CALL(napi_create_string_utf8(env, testStr, strlen(testStr), &strAttribute)); 217 ASSERT_CHECK_VALUE_TYPE(env, strAttribute, napi_string); 218 ASSERT_CHECK_CALL(napi_set_named_property(env, result, "strAttribute", strAttribute)); 219 220 napi_value retStrAttribute = nullptr; 221 ASSERT_CHECK_CALL(napi_get_named_property(env, result, "strAttribute", &retStrAttribute)); 222 ASSERT_CHECK_VALUE_TYPE(env, retStrAttribute, napi_string); 223 224 int32_t testNumber = 12345; 225 napi_value numberAttribute = nullptr; 226 ASSERT_CHECK_CALL(napi_create_int32(env, testNumber, &numberAttribute)); 227 ASSERT_CHECK_VALUE_TYPE(env, numberAttribute, napi_number); 228 ASSERT_CHECK_CALL(napi_set_named_property(env, result, "numberAttribute", numberAttribute)); 229 230 napi_value propNames = nullptr; 231 ASSERT_CHECK_CALL(napi_get_property_names(env, result, &propNames)); 232 ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object); 233 bool isArray = false; 234 ASSERT_CHECK_CALL(napi_is_array(env, propNames, &isArray)); 235 ASSERT_TRUE(isArray); 236 uint32_t arrayLength = 0; 237 ASSERT_CHECK_CALL(napi_get_array_length(env, propNames, &arrayLength)); 238 ASSERT_EQ(arrayLength, (uint32_t)2); 239 240 for (uint32_t i = 0; i < arrayLength; i++) { 241 bool hasElement = false; 242 ASSERT_CHECK_CALL(napi_has_element(env, propNames, i, &hasElement)); 243 244 napi_value propName = nullptr; 245 ASSERT_CHECK_CALL(napi_get_element(env, propNames, i, &propName)); 246 ASSERT_CHECK_VALUE_TYPE(env, propName, napi_string); 247 248 bool hasProperty = false; 249 napi_has_property(env, result, propName, &hasProperty); 250 ASSERT_TRUE(hasProperty); 251 252 napi_value propValue = nullptr; 253 napi_get_property(env, result, propName, &propValue); 254 ASSERT_TRUE(propValue != nullptr); 255 } 256 } 257 258 /** 259 * @tc.name: FunctionTest001 260 * @tc.desc: Test function type. 261 * @tc.type: FUNC 262 */ 263 HWTEST_F(NapiBasicTest, FunctionTest001, testing::ext::TestSize.Level1) 264 { 265 napi_env env = (napi_env)engine_; 266 __anon8a3d7f070302(napi_env env, napi_callback_info info) 267 auto func = [](napi_env env, napi_callback_info info) -> napi_value { 268 napi_value thisVar; 269 napi_value* argv = nullptr; 270 size_t argc = 0; 271 void* data = nullptr; 272 273 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 274 if (argc > 0) { 275 argv = new napi_value[argc]; 276 } 277 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); 278 279 napi_value result = nullptr; 280 napi_create_object(env, &result); 281 282 napi_value messageKey = nullptr; 283 const char* messageKeyStr = "message"; 284 napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey); 285 napi_value messageValue = nullptr; 286 const char* messageValueStr = "OK"; 287 napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue); 288 napi_set_property(env, result, messageKey, messageValue); 289 290 if (argv != nullptr) { 291 delete []argv; 292 } 293 294 return result; 295 }; 296 297 napi_value recv = nullptr; 298 napi_value funcValue = nullptr; 299 napi_get_undefined(env, &recv); 300 ASSERT_NE(recv, nullptr); 301 302 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue); 303 ASSERT_NE(funcValue, nullptr); 304 305 napi_handle_scope parentScope = nullptr; 306 napi_open_handle_scope(env, &parentScope); 307 ASSERT_NE(parentScope, nullptr); 308 309 napi_escapable_handle_scope childScope = nullptr; 310 napi_open_escapable_handle_scope(env, &childScope); 311 ASSERT_NE(childScope, nullptr); 312 313 napi_value funcResultValue = nullptr; 314 napi_value newFuncResultValue = nullptr; 315 napi_call_function(env, recv, funcValue, 0, nullptr, &funcResultValue); 316 ASSERT_NE(funcResultValue, nullptr); 317 318 napi_escape_handle(env, childScope, funcResultValue, &newFuncResultValue); 319 napi_close_escapable_handle_scope(env, childScope); 320 ASSERT_TRUE(newFuncResultValue != nullptr); 321 ASSERT_CHECK_VALUE_TYPE(env, newFuncResultValue, napi_object); 322 napi_close_handle_scope(env, parentScope); 323 } 324 325 /** 326 * @tc.name: ArrayTest001 327 * @tc.desc: Test array type. 328 * @tc.type: FUNC 329 */ 330 HWTEST_F(NapiBasicTest, ArrayTest001, testing::ext::TestSize.Level1) { 331 napi_env env = (napi_env) engine_; 332 333 napi_value array = nullptr; 334 napi_create_array(env, &array); 335 ASSERT_NE(array, nullptr); 336 bool isArray = false; 337 napi_is_array(env, array, &isArray); 338 ASSERT_TRUE(isArray); 339 340 for (size_t i = 0; i < 10; i++) { 341 napi_value num = nullptr; 342 napi_create_uint32(env, i, &num); 343 napi_set_element(env, array, i, num); 344 } 345 346 uint32_t arrayLength = 0; 347 napi_get_array_length(env, array, &arrayLength); 348 349 ASSERT_EQ(arrayLength, (uint32_t) 10); 350 351 for (size_t i = 0; i < arrayLength; i++) { 352 bool hasIndex = false; 353 napi_has_element(env, array, i, &hasIndex); 354 ASSERT_TRUE(hasIndex); 355 } 356 357 for (size_t i = 0; i < arrayLength; i++) { 358 bool isDelete = false; 359 napi_delete_element(env, array, i, &isDelete); 360 ASSERT_TRUE(isDelete); 361 } 362 } 363 364 /** 365 * @tc.name: ArrayBufferTest001 366 * @tc.desc: Test array buffer type. 367 * @tc.type: FUNC 368 */ 369 HWTEST_F(NapiBasicTest, ArrayBufferTest001, testing::ext::TestSize.Level1) 370 { 371 napi_env env = (napi_env)engine_; 372 373 napi_value arrayBuffer = nullptr; 374 void* arrayBufferPtr = nullptr; 375 size_t arrayBufferSize = 1024; 376 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer); 377 378 void* tmpArrayBufferPtr = nullptr; 379 size_t arrayBufferLength = 0; 380 napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength); 381 382 ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr); 383 ASSERT_EQ(arrayBufferSize, arrayBufferLength); 384 } 385 386 /** 387 * @tc.name: TypedArrayTest001 388 * @tc.desc: Test typed array type. 389 * @tc.type: FUNC 390 */ 391 HWTEST_F(NapiBasicTest, TypedArrayTest001, testing::ext::TestSize.Level1) 392 { 393 napi_env env = (napi_env)engine_; 394 395 { 396 napi_value arrayBuffer = nullptr; 397 void* arrayBufferPtr = nullptr; 398 size_t arrayBufferSize = 1024; 399 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer); 400 401 void* tmpArrayBufferPtr = nullptr; 402 size_t arrayBufferLength = 0; 403 napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength); 404 405 ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr); 406 ASSERT_EQ(arrayBufferSize, arrayBufferLength); 407 408 napi_value typedarray = nullptr; 409 napi_create_typedarray(env, napi_int8_array, arrayBufferSize, arrayBuffer, 0, &typedarray); 410 ASSERT_NE(typedarray, nullptr); 411 bool isTypedArray = false; 412 napi_is_typedarray(env, typedarray, &isTypedArray); 413 ASSERT_TRUE(isTypedArray); 414 415 napi_typedarray_type typedarrayType; 416 size_t typedarrayLength = 0; 417 void* typedarrayBufferPtr = nullptr; 418 napi_value tmpArrayBuffer = nullptr; 419 size_t byteOffset = 0; 420 421 napi_get_typedarray_info(env, typedarray, &typedarrayType, &typedarrayLength, &typedarrayBufferPtr, 422 &tmpArrayBuffer, &byteOffset); 423 424 ASSERT_EQ(typedarrayBufferPtr, arrayBufferPtr); 425 ASSERT_EQ(arrayBufferSize, typedarrayLength); 426 } 427 } 428 429 /** 430 * @tc.name: DataViewTest001 431 * @tc.desc: Test data view type. 432 * @tc.type: FUNC 433 */ 434 HWTEST_F(NapiBasicTest, DataViewTest001, testing::ext::TestSize.Level1) 435 { 436 napi_env env = (napi_env)engine_; 437 438 napi_value arrayBuffer = nullptr; 439 void* arrayBufferPtr = nullptr; 440 size_t arrayBufferSize = 1024; 441 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer); 442 ASSERT_NE(arrayBuffer, nullptr); 443 ASSERT_NE(arrayBufferPtr, nullptr); 444 bool isArrayBuffer = false; 445 napi_is_arraybuffer(env, arrayBuffer, &isArrayBuffer); 446 ASSERT_TRUE(isArrayBuffer); 447 448 napi_value result = nullptr; 449 napi_create_dataview(env, arrayBufferSize, arrayBuffer, 0, &result); 450 451 bool isDataView = false; 452 napi_is_dataview(env, result, &isDataView); 453 454 napi_value retArrayBuffer = nullptr; 455 void* data = nullptr; 456 size_t byteLength = 0; 457 size_t byteOffset = 0; 458 napi_get_dataview_info(env, result, &byteLength, &data, &retArrayBuffer, &byteOffset); 459 460 bool retIsArrayBuffer = false; 461 napi_is_arraybuffer(env, arrayBuffer, &retIsArrayBuffer); 462 ASSERT_TRUE(retIsArrayBuffer); 463 ASSERT_EQ(arrayBufferPtr, data); 464 ASSERT_EQ(arrayBufferSize, byteLength); 465 ASSERT_EQ((size_t)0, byteOffset); 466 } 467 468 /** 469 * @tc.name: PromiseTest001 470 * @tc.desc: Test promise type. 471 * @tc.type: FUNC 472 */ 473 HWTEST_F(NapiBasicTest, PromiseTest001, testing::ext::TestSize.Level1) 474 { 475 napi_env env = (napi_env)engine_; 476 { 477 napi_deferred deferred = nullptr; 478 napi_value promise = nullptr; 479 napi_create_promise(env, &deferred, &promise); 480 ASSERT_NE(deferred, nullptr); 481 ASSERT_NE(promise, nullptr); 482 483 bool isPromise = false; 484 napi_is_promise(env, promise, &isPromise); 485 ASSERT_TRUE(isPromise); 486 487 napi_value undefined = nullptr; 488 napi_get_undefined(env, &undefined); 489 napi_resolve_deferred(env, deferred, undefined); 490 } 491 { 492 napi_deferred deferred = nullptr; 493 napi_value promise = nullptr; 494 napi_create_promise(env, &deferred, &promise); 495 ASSERT_NE(deferred, nullptr); 496 ASSERT_NE(promise, nullptr); 497 498 bool isPromise = false; 499 napi_is_promise(env, promise, &isPromise); 500 ASSERT_TRUE(isPromise); 501 502 napi_value undefined = nullptr; 503 napi_get_undefined(env, &undefined); 504 napi_reject_deferred(env, deferred, undefined); 505 } 506 } 507 508 /** 509 * @tc.name: ErrorTest001 510 * @tc.desc: Test error type. 511 * @tc.type: FUNC 512 */ 513 HWTEST_F(NapiBasicTest, ErrorTest001, testing::ext::TestSize.Level1) 514 { 515 napi_env env = (napi_env)engine_; 516 517 { 518 napi_value code = nullptr; 519 napi_value message = nullptr; 520 521 napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code); 522 napi_create_string_latin1(env, "common error", NAPI_AUTO_LENGTH, &message); 523 524 napi_value error = nullptr; 525 napi_create_error(env, code, message, &error); 526 ASSERT_TRUE(error != nullptr); 527 bool isError = false; 528 napi_is_error(env, error, &isError); 529 ASSERT_TRUE(isError); 530 napi_throw(env, error); 531 } 532 533 { 534 napi_value code = nullptr; 535 napi_value message = nullptr; 536 napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code); 537 napi_create_string_latin1(env, "range error", NAPI_AUTO_LENGTH, &message); 538 napi_value error = nullptr; 539 napi_create_range_error(env, code, message, &error); 540 ASSERT_TRUE(error != nullptr); 541 bool isError = false; 542 napi_is_error(env, error, &isError); 543 ASSERT_TRUE(isError); 544 } 545 546 { 547 napi_value code = nullptr; 548 napi_value message = nullptr; 549 napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code); 550 napi_create_string_latin1(env, "type error", NAPI_AUTO_LENGTH, &message); 551 napi_value error = nullptr; 552 napi_create_type_error(env, code, message, &error); 553 ASSERT_TRUE(error != nullptr); 554 bool isError = false; 555 napi_is_error(env, error, &isError); 556 ASSERT_TRUE(isError); 557 } 558 559 napi_throw_error(env, "500", "Common error"); 560 napi_throw_range_error(env, "500", "Range error"); 561 napi_throw_type_error(env, "500", "Type error"); 562 bool isExceptionPending = false; 563 napi_is_exception_pending(env, &isExceptionPending); 564 ASSERT_TRUE(isExceptionPending); 565 } 566 567 /** 568 * @tc.name: ReferenceTest001 569 * @tc.desc: Test reference type. 570 * @tc.type: FUNC 571 */ 572 HWTEST_F(NapiBasicTest, ReferenceTest001, testing::ext::TestSize.Level1) 573 { 574 napi_env env = (napi_env)engine_; 575 576 napi_value result = nullptr; 577 napi_ref resultRef = nullptr; 578 579 napi_create_object(env, &result); 580 napi_create_reference(env, result, 1, &resultRef); 581 582 uint32_t resultRefCount = 0; 583 584 napi_reference_ref(env, resultRef, &resultRefCount); 585 ASSERT_EQ(resultRefCount, (uint32_t)2); 586 587 napi_reference_unref(env, resultRef, &resultRefCount); 588 ASSERT_EQ(resultRefCount, (uint32_t)1); 589 590 napi_value refValue = nullptr; 591 napi_get_reference_value(env, resultRef, &refValue); 592 593 ASSERT_NE(refValue, nullptr); 594 595 napi_delete_reference(env, resultRef); 596 } 597 598 /** 599 * @tc.name: CustomClassTest001 600 * @tc.desc: Test define class. 601 * @tc.type: FUNC 602 */ 603 HWTEST_F(NapiBasicTest, CustomClassTest001, testing::ext::TestSize.Level1) 604 { 605 napi_env env = (napi_env)engine_; 606 __anon8a3d7f070402(napi_env env, napi_callback_info info) 607 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value { 608 napi_value thisVar = nullptr; 609 napi_value* argv = nullptr; 610 size_t argc = 0; 611 void* data = nullptr; 612 napi_value constructor = nullptr; 613 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 614 if (argc > 0) { 615 argv = new napi_value[argc]; 616 } 617 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); 618 napi_get_new_target(env, info, &constructor); 619 if (constructor == nullptr) { 620 napi_throw_error(env, nullptr, "is not new instance"); 621 } 622 if (argv != nullptr) { 623 delete []argv; 624 } 625 return thisVar; 626 }; 627 628 napi_value ln2 = nullptr; 629 napi_value e = nullptr; 630 631 napi_create_double(env, 2.718281828459045, &e); 632 napi_create_double(env, 0.6931471805599453, &ln2); 633 634 napi_property_descriptor desc[] = { __anon8a3d7f070502() 635 DECLARE_NAPI_FUNCTION("add", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), __anon8a3d7f070602() 636 DECLARE_NAPI_FUNCTION("sub", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), __anon8a3d7f070702() 637 DECLARE_NAPI_FUNCTION("mul", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), __anon8a3d7f070802() 638 DECLARE_NAPI_FUNCTION("div", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), 639 DECLARE_NAPI_STATIC_FUNCTION("getTime", __anon8a3d7f070902() 640 [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), 641 DECLARE_NAPI_GETTER_SETTER( __anon8a3d7f070a02() 642 "pi", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }, __anon8a3d7f070b02() 643 [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), 644 645 }; 646 647 napi_value customClass = nullptr; 648 649 ASSERT_CHECK_CALL(napi_define_class(env, "CustomClass", NAPI_AUTO_LENGTH, constructor, nullptr, 650 sizeof(desc) / sizeof(desc[0]), desc, &customClass)); 651 ASSERT_CHECK_VALUE_TYPE(env, customClass, napi_function); 652 napi_value customClassPrototype = nullptr; 653 napi_get_prototype(env, customClass, &customClassPrototype); 654 ASSERT_CHECK_VALUE_TYPE(env, customClassPrototype, napi_function); 655 656 napi_value customInstance = nullptr; 657 ASSERT_CHECK_CALL(napi_new_instance(env, customClass, 0, nullptr, &customInstance)); 658 659 bool isInstanceOf = false; 660 ASSERT_CHECK_CALL(napi_instanceof(env, customInstance, customClass, &isInstanceOf)); 661 ASSERT_TRUE(isInstanceOf); 662 } 663 664 /** 665 * @tc.name: AsyncWorkTest001 666 * @tc.desc: Test async work. 667 * @tc.type: FUNC 668 */ 669 HWTEST_F(NapiBasicTest, AsyncWorkTest001, testing::ext::TestSize.Level1) 670 { 671 struct AsyncWorkContext { 672 napi_async_work work = nullptr; 673 }; 674 napi_env env = (napi_env)engine_; 675 { 676 auto asyncWorkContext = new AsyncWorkContext(); 677 napi_value resourceName = nullptr; 678 napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName); 679 napi_create_async_work( __anon8a3d7f070c02(napi_env value, void* data) 680 env, nullptr, resourceName, [](napi_env value, void* data) {}, __anon8a3d7f070d02(napi_env env, napi_status status, void* data) 681 [](napi_env env, napi_status status, void* data) { 682 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data; 683 napi_delete_async_work(env, asyncWorkContext->work); 684 delete asyncWorkContext; 685 }, 686 asyncWorkContext, &asyncWorkContext->work); 687 napi_queue_async_work(env, asyncWorkContext->work); 688 } 689 { 690 auto asyncWorkContext = new AsyncWorkContext(); 691 napi_value resourceName = nullptr; 692 napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName); 693 napi_create_async_work( __anon8a3d7f070e02(napi_env value, void* data) 694 env, nullptr, resourceName, [](napi_env value, void* data) {}, __anon8a3d7f070f02(napi_env env, napi_status status, void* data) 695 [](napi_env env, napi_status status, void* data) { 696 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data; 697 napi_delete_async_work(env, asyncWorkContext->work); 698 delete asyncWorkContext; 699 }, 700 asyncWorkContext, &asyncWorkContext->work); 701 napi_queue_async_work(env, asyncWorkContext->work); 702 napi_cancel_async_work(env, asyncWorkContext->work); 703 } 704 } 705 706 /** 707 * @tc.name: ObjectWrapperTest001 708 * @tc.desc: Test object wrapper. 709 * @tc.type: FUNC 710 */ 711 HWTEST_F(NapiBasicTest, ObjectWrapperTest001, testing::ext::TestSize.Level1) 712 { 713 napi_env env = (napi_env)engine_; 714 715 napi_value testClass = nullptr; 716 napi_define_class( 717 env, "TestClass", NAPI_AUTO_LENGTH, __anon8a3d7f071002(napi_env env, napi_callback_info info) 718 [](napi_env env, napi_callback_info info) -> napi_value { 719 napi_value thisVar = nullptr; 720 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr); 721 722 return thisVar; 723 }, 724 nullptr, 0, nullptr, &testClass); 725 726 napi_value instanceValue = nullptr; 727 napi_new_instance(env, testClass, 0, nullptr, &instanceValue); 728 729 const char* testStr = "test"; 730 napi_wrap( __anon8a3d7f071102(napi_env env, void* data, void* hint) 731 env, instanceValue, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr, nullptr); 732 733 char* tmpTestStr = nullptr; 734 napi_unwrap(env, instanceValue, (void**)&tmpTestStr); 735 ASSERT_STREQ(testStr, tmpTestStr); 736 737 char* tmpTestStr1 = nullptr; 738 napi_remove_wrap(env, instanceValue, (void**)&tmpTestStr1); 739 ASSERT_STREQ(testStr, tmpTestStr1); 740 } 741 742 /** 743 * @tc.name: StrictEqualsTest001 744 * @tc.desc: Test date type. 745 * @tc.type: FUNC 746 */ 747 HWTEST_F(NapiBasicTest, StrictEqualsTest001, testing::ext::TestSize.Level1) 748 { 749 napi_env env = (napi_env)engine_; 750 751 const char* testStringStr = "test"; 752 napi_value testString = nullptr; 753 napi_create_string_utf8(env, testStringStr, strlen(testStringStr), &testString); 754 bool isStrictEquals = false; 755 napi_strict_equals(env, testString, testString, &isStrictEquals); 756 ASSERT_TRUE(isStrictEquals); 757 758 napi_value testObject = nullptr; 759 napi_create_object(env, &testObject); 760 isStrictEquals = false; 761 napi_strict_equals(env, testObject, testObject, &isStrictEquals); 762 ASSERT_TRUE(isStrictEquals); 763 } 764 765 /** 766 * @tc.name: CreateRuntimeTest001 767 * @tc.desc: Test create runtime. 768 * @tc.type: FUNC 769 */ 770 HWTEST_F(NapiBasicTest, CreateRuntimeTest001, testing::ext::TestSize.Level1) 771 { 772 napi_env env = (napi_env)engine_; 773 774 napi_env newEnv = nullptr; 775 napi_create_runtime(env, &newEnv); 776 #ifdef USE_V8_ENGINE 777 ASSERT_NE(newEnv, nullptr); 778 #elif USE_QUICKJS_ENGINE 779 ASSERT_EQ(newEnv, nullptr); 780 #endif 781 } 782 783 /** 784 * @tc.name: SerializeDeSerializeTest001 785 * @tc.desc: Test serialize & deserialize. 786 * @tc.type: FUNC 787 */ 788 HWTEST_F(NapiBasicTest, SerializeDeSerializeTest001, testing::ext::TestSize.Level1) 789 { 790 napi_env env = (napi_env)engine_; 791 792 napi_value undefined = nullptr; 793 napi_get_undefined(env, &undefined); 794 795 napi_value num = nullptr; 796 uint32_t value = 1000; 797 napi_create_uint32(env, value, &num); 798 napi_value data = nullptr; 799 napi_serialize(env, num, undefined, &data); 800 ASSERT_NE(data, nullptr); 801 802 napi_value result = nullptr; 803 napi_deserialize(env, data, &result); 804 ASSERT_CHECK_VALUE_TYPE(env, result, napi_number); 805 int32_t resultData = 0; 806 napi_get_value_int32(env, result, &resultData); 807 ASSERT_EQ(resultData, 1000); 808 } 809 810 /** 811 * @tc.name: IsCallableTest001 812 * @tc.desc: Test is callable. 813 * @tc.type: FUNC 814 */ 815 HWTEST_F(NapiBasicTest, IsCallableTest001, testing::ext::TestSize.Level1) 816 { 817 napi_env env = (napi_env)engine_; 818 __anon8a3d7f071202(napi_env env, napi_callback_info info) 819 auto func = [](napi_env env, napi_callback_info info) -> napi_value { 820 napi_value thisVar; 821 napi_value* argv = nullptr; 822 size_t argc = 0; 823 void* data = nullptr; 824 825 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 826 if (argc > 0) { 827 argv = new napi_value[argc]; 828 } 829 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); 830 831 napi_value result = nullptr; 832 napi_create_object(env, &result); 833 834 napi_value messageKey = nullptr; 835 const char* messageKeyStr = "message"; 836 napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey); 837 napi_value messageValue = nullptr; 838 const char* messageValueStr = "OK"; 839 napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue); 840 napi_set_property(env, result, messageKey, messageValue); 841 842 if (argv != nullptr) { 843 delete []argv; 844 } 845 return result; 846 }; 847 848 napi_value funcValue = nullptr; 849 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue); 850 ASSERT_NE(funcValue, nullptr); 851 852 bool result = false; 853 napi_is_callable(env, funcValue, &result); 854 ASSERT_TRUE(result); 855 } 856 857 /** 858 * @tc.name: EncodeToUtf8Test001 859 * @tc.desc: Test EncodeToUtf8 Func. 860 * @tc.type: FUNC 861 */ 862 HWTEST_F(NapiBasicTest, EncodeToUtf8Test001, testing::ext::TestSize.Level1) 863 { 864 std::string str = "encode"; 865 auto testStr = engine_->CreateString(str.c_str(), str.length()); 866 char* buffer = new char[str.length()]; 867 size_t bufferSize = str.length(); 868 int32_t written = 0; 869 int32_t nchars = 0; 870 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 871 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 872 ASSERT_EQ(written, 6); 873 ASSERT_EQ(nchars, 6); 874 delete[] buffer; 875 876 str = "encode\xc2\xab\xe2\x98\x80"; 877 testStr = engine_->CreateString(str.c_str(), str.length()); 878 buffer = new char[str.length()]; 879 bufferSize = str.length(); 880 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 881 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 882 ASSERT_EQ(written, 11); 883 ASSERT_EQ(nchars, 8); 884 delete[] buffer; 885 886 buffer = new char[str.length()]; 887 bufferSize = str.length(); 888 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 889 bufferSize--; 890 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 891 ASSERT_EQ(written, 8); 892 ASSERT_EQ(nchars, 7); 893 delete[] buffer; 894 895 buffer = new char[str.length()]; 896 bufferSize = str.length(); 897 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 898 bufferSize -= 4; 899 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 900 ASSERT_EQ(written, 6); 901 ASSERT_EQ(nchars, 6); 902 delete[] buffer; 903 904 str = "encode\xc2\xab\xe2\x98\x80t"; 905 testStr = engine_->CreateString(str.c_str(), str.length()); 906 buffer = new char[str.length()]; 907 bufferSize = str.length(); 908 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 909 bufferSize--; 910 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 911 ASSERT_EQ(written, 11); 912 ASSERT_EQ(nchars, 8); 913 delete[] buffer; 914 915 str = ""; 916 testStr = engine_->CreateString(str.c_str(), str.length()); 917 buffer = new char[str.length() + 1]; 918 bufferSize = str.length() + 1; 919 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 920 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 921 ASSERT_EQ(written, 0); 922 ASSERT_EQ(nchars, 0); 923 delete[] buffer; 924 } 925 926 /** 927 * @tc.name: WrapWithSizeTest001 928 * @tc.desc: Test wrap with size. 929 * @tc.type: FUNC 930 */ 931 HWTEST_F(NapiBasicTest, WrapWithSizeTest001, testing::ext::TestSize.Level1) 932 { 933 napi_env env = (napi_env)engine_; 934 935 napi_value testWrapClass = nullptr; 936 napi_define_class( 937 env, "TestWrapClass", NAPI_AUTO_LENGTH, __anon8a3d7f071302(napi_env env, napi_callback_info info) 938 [](napi_env env, napi_callback_info info) -> napi_value { 939 napi_value thisVar = nullptr; 940 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr); 941 942 return thisVar; 943 }, 944 nullptr, 0, nullptr, &testWrapClass); 945 946 napi_value instanceValue = nullptr; 947 napi_new_instance(env, testWrapClass, 0, nullptr, &instanceValue); 948 949 const char* testWrapStr = "testWrapStr"; 950 size_t size = sizeof(*testWrapStr) / sizeof(char); 951 napi_wrap_with_size( __anon8a3d7f071402(napi_env env, void* data, void* hint) 952 env, instanceValue, (void*)testWrapStr, [](napi_env env, void* data, void* hint) {}, nullptr, nullptr, size); 953 954 char* tempTestStr = nullptr; 955 napi_unwrap(env, instanceValue, (void**)&tempTestStr); 956 ASSERT_STREQ(testWrapStr, tempTestStr); 957 958 char* tempTestStr1 = nullptr; 959 napi_remove_wrap(env, instanceValue, (void**)&tempTestStr1); 960 ASSERT_STREQ(testWrapStr, tempTestStr1); 961 962 } 963 964 /** 965 * @tc.name: CreateExternalWithSizeTest001 966 * @tc.desc: Test create external with size. 967 * @tc.type: FUNC 968 */ 969 HWTEST_F(NapiBasicTest, CreateExternalWithSizeTest001, testing::ext::TestSize.Level1) 970 { 971 napi_env env = (napi_env)engine_; 972 const char testStr[] = "test"; 973 size_t size = sizeof(testStr) / sizeof(char); 974 napi_value external = nullptr; 975 napi_create_external_with_size( 976 env, (void*)testStr, __anon8a3d7f071502(napi_env env, void* data, void* hint) 977 [](napi_env env, void* data, void* hint) { ASSERT_STREQ((const char*)data, (const char*)hint); }, 978 (void*)testStr, &external, size); 979 980 ASSERT_CHECK_VALUE_TYPE(env, external, napi_external); 981 void* tempExternal = nullptr; 982 napi_get_value_external(env, external, &tempExternal); 983 ASSERT_TRUE(tempExternal); 984 ASSERT_EQ(tempExternal, testStr); 985 } 986 987 /** 988 * @tc.name: BigArrayTest001 989 * @tc.desc: Test is big int64 array and big uint64 array. 990 * @tc.type: FUNC 991 */ 992 HWTEST_F(NapiBasicTest, BigArrayTest001, testing::ext::TestSize.Level1) { 993 napi_env env = (napi_env) engine_; 994 995 napi_value array = nullptr; 996 napi_create_array(env, &array); 997 ASSERT_NE(array, nullptr); 998 bool isArray = false; 999 napi_is_array(env, array, &isArray); 1000 ASSERT_TRUE(isArray); 1001 1002 bool isBigInt64Array = true; 1003 napi_is_big_int64_array(env, array, &isBigInt64Array); 1004 ASSERT_EQ(isBigInt64Array, false); 1005 1006 bool isBigUInt64Array = true; 1007 napi_is_big_uint64_array(env, array, &isBigUInt64Array); 1008 ASSERT_EQ(isBigUInt64Array, false); 1009 } 1010 1011 /** 1012 * @tc.name: SharedArrayBufferTest001 1013 * @tc.desc: Test is shared array buffer. 1014 * @tc.type: FUNC 1015 */ 1016 HWTEST_F(NapiBasicTest, SharedArrayBufferTest001, testing::ext::TestSize.Level1) { 1017 napi_env env = (napi_env) engine_; 1018 1019 napi_value arrayBuffer = nullptr; 1020 void* arrayBufferPtr = nullptr; 1021 size_t arrayBufferSize = 1024; 1022 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer); 1023 1024 bool isSharedArrayBuffer = true; 1025 napi_is_shared_array_buffer(env, arrayBuffer, &isSharedArrayBuffer); 1026 ASSERT_EQ(isSharedArrayBuffer, false); 1027 }