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); __anon01784ab90102null151 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, __anon01784ab90202(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_property_descriptor desc[] = { __anon01784ab90302() 231 DECLARE_NAPI_FUNCTION("add", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), __anon01784ab90402() 232 DECLARE_NAPI_FUNCTION("sub", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }) 233 }; 234 235 ASSERT_CHECK_CALL(napi_define_properties(env, result, sizeof(desc) / sizeof(desc[0]), desc)); 236 237 napi_value propNames = nullptr; 238 ASSERT_CHECK_CALL(napi_get_property_names(env, result, &propNames)); 239 ASSERT_CHECK_VALUE_TYPE(env, propNames, napi_object); 240 bool isArray = false; 241 ASSERT_CHECK_CALL(napi_is_array(env, propNames, &isArray)); 242 ASSERT_TRUE(isArray); 243 uint32_t arrayLength = 0; 244 ASSERT_CHECK_CALL(napi_get_array_length(env, propNames, &arrayLength)); 245 ASSERT_EQ(arrayLength, (uint32_t)2); 246 247 for (uint32_t i = 0; i < arrayLength; i++) { 248 bool hasElement = false; 249 ASSERT_CHECK_CALL(napi_has_element(env, propNames, i, &hasElement)); 250 251 napi_value propName = nullptr; 252 ASSERT_CHECK_CALL(napi_get_element(env, propNames, i, &propName)); 253 ASSERT_CHECK_VALUE_TYPE(env, propName, napi_string); 254 255 bool hasProperty = false; 256 napi_has_property(env, result, propName, &hasProperty); 257 ASSERT_TRUE(hasProperty); 258 259 napi_value propValue = nullptr; 260 napi_get_property(env, result, propName, &propValue); 261 ASSERT_TRUE(propValue != nullptr); 262 } 263 } 264 265 /** 266 * @tc.name: FunctionTest001 267 * @tc.desc: Test function type. 268 * @tc.type: FUNC 269 */ 270 HWTEST_F(NapiBasicTest, FunctionTest001, testing::ext::TestSize.Level1) 271 { 272 napi_env env = (napi_env)engine_; 273 __anon01784ab90502(napi_env env, napi_callback_info info) 274 auto func = [](napi_env env, napi_callback_info info) -> napi_value { 275 napi_value thisVar; 276 napi_value* argv = nullptr; 277 size_t argc = 0; 278 void* data = nullptr; 279 280 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 281 if (argc > 0) { 282 argv = new napi_value[argc]; 283 } 284 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); 285 286 napi_value result = nullptr; 287 napi_create_object(env, &result); 288 289 napi_value messageKey = nullptr; 290 const char* messageKeyStr = "message"; 291 napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey); 292 napi_value messageValue = nullptr; 293 const char* messageValueStr = "OK"; 294 napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue); 295 napi_set_property(env, result, messageKey, messageValue); 296 297 if (argv != nullptr) { 298 delete []argv; 299 } 300 301 return result; 302 }; 303 304 napi_value recv = nullptr; 305 napi_value funcValue = nullptr; 306 napi_get_undefined(env, &recv); 307 ASSERT_NE(recv, nullptr); 308 309 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue); 310 ASSERT_NE(funcValue, nullptr); 311 312 napi_handle_scope parentScope = nullptr; 313 napi_open_handle_scope(env, &parentScope); 314 ASSERT_NE(parentScope, nullptr); 315 316 napi_escapable_handle_scope childScope = nullptr; 317 napi_open_escapable_handle_scope(env, &childScope); 318 ASSERT_NE(childScope, nullptr); 319 320 napi_value funcResultValue = nullptr; 321 napi_value newFuncResultValue = nullptr; 322 napi_call_function(env, recv, funcValue, 0, nullptr, &funcResultValue); 323 ASSERT_NE(funcResultValue, nullptr); 324 325 napi_escape_handle(env, childScope, funcResultValue, &newFuncResultValue); 326 napi_close_escapable_handle_scope(env, childScope); 327 ASSERT_TRUE(newFuncResultValue != nullptr); 328 ASSERT_CHECK_VALUE_TYPE(env, newFuncResultValue, napi_object); 329 napi_close_handle_scope(env, parentScope); 330 } 331 332 /** 333 * @tc.name: ArrayTest001 334 * @tc.desc: Test array type. 335 * @tc.type: FUNC 336 */ 337 HWTEST_F(NapiBasicTest, ArrayTest001, testing::ext::TestSize.Level1) { 338 napi_env env = (napi_env) engine_; 339 340 napi_value array = nullptr; 341 napi_create_array(env, &array); 342 ASSERT_NE(array, nullptr); 343 bool isArray = false; 344 napi_is_array(env, array, &isArray); 345 ASSERT_TRUE(isArray); 346 347 for (size_t i = 0; i < 10; i++) { 348 napi_value num = nullptr; 349 napi_create_uint32(env, i, &num); 350 napi_set_element(env, array, i, num); 351 } 352 353 uint32_t arrayLength = 0; 354 napi_get_array_length(env, array, &arrayLength); 355 356 ASSERT_EQ(arrayLength, (uint32_t) 10); 357 358 for (size_t i = 0; i < arrayLength; i++) { 359 bool hasIndex = false; 360 napi_has_element(env, array, i, &hasIndex); 361 ASSERT_TRUE(hasIndex); 362 } 363 364 for (size_t i = 0; i < arrayLength; i++) { 365 bool isDelete = false; 366 napi_delete_element(env, array, i, &isDelete); 367 ASSERT_TRUE(isDelete); 368 } 369 } 370 371 /** 372 * @tc.name: ArrayBufferTest001 373 * @tc.desc: Test array buffer type. 374 * @tc.type: FUNC 375 */ 376 HWTEST_F(NapiBasicTest, ArrayBufferTest001, testing::ext::TestSize.Level1) 377 { 378 napi_env env = (napi_env)engine_; 379 380 napi_value arrayBuffer = nullptr; 381 void* arrayBufferPtr = nullptr; 382 size_t arrayBufferSize = 1024; 383 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer); 384 385 void* tmpArrayBufferPtr = nullptr; 386 size_t arrayBufferLength = 0; 387 napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength); 388 389 ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr); 390 ASSERT_EQ(arrayBufferSize, arrayBufferLength); 391 } 392 393 /** 394 * @tc.name: TypedArrayTest001 395 * @tc.desc: Test typed array type. 396 * @tc.type: FUNC 397 */ 398 HWTEST_F(NapiBasicTest, TypedArrayTest001, testing::ext::TestSize.Level1) 399 { 400 napi_env env = (napi_env)engine_; 401 402 { 403 napi_value arrayBuffer = nullptr; 404 void* arrayBufferPtr = nullptr; 405 size_t arrayBufferSize = 1024; 406 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer); 407 408 void* tmpArrayBufferPtr = nullptr; 409 size_t arrayBufferLength = 0; 410 napi_get_arraybuffer_info(env, arrayBuffer, &tmpArrayBufferPtr, &arrayBufferLength); 411 412 ASSERT_EQ(arrayBufferPtr, tmpArrayBufferPtr); 413 ASSERT_EQ(arrayBufferSize, arrayBufferLength); 414 415 napi_value typedarray = nullptr; 416 napi_create_typedarray(env, napi_int8_array, arrayBufferSize, arrayBuffer, 0, &typedarray); 417 ASSERT_NE(typedarray, nullptr); 418 bool isTypedArray = false; 419 napi_is_typedarray(env, typedarray, &isTypedArray); 420 ASSERT_TRUE(isTypedArray); 421 422 napi_typedarray_type typedarrayType; 423 size_t typedarrayLength = 0; 424 void* typedarrayBufferPtr = nullptr; 425 napi_value tmpArrayBuffer = nullptr; 426 size_t byteOffset = 0; 427 428 napi_get_typedarray_info(env, typedarray, &typedarrayType, &typedarrayLength, &typedarrayBufferPtr, 429 &tmpArrayBuffer, &byteOffset); 430 431 ASSERT_EQ(typedarrayBufferPtr, arrayBufferPtr); 432 ASSERT_EQ(arrayBufferSize, typedarrayLength); 433 } 434 } 435 436 /** 437 * @tc.name: DataViewTest001 438 * @tc.desc: Test data view type. 439 * @tc.type: FUNC 440 */ 441 HWTEST_F(NapiBasicTest, DataViewTest001, testing::ext::TestSize.Level1) 442 { 443 napi_env env = (napi_env)engine_; 444 445 napi_value arrayBuffer = nullptr; 446 void* arrayBufferPtr = nullptr; 447 size_t arrayBufferSize = 1024; 448 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer); 449 ASSERT_NE(arrayBuffer, nullptr); 450 ASSERT_NE(arrayBufferPtr, nullptr); 451 bool isArrayBuffer = false; 452 napi_is_arraybuffer(env, arrayBuffer, &isArrayBuffer); 453 ASSERT_TRUE(isArrayBuffer); 454 455 napi_value result = nullptr; 456 napi_create_dataview(env, arrayBufferSize, arrayBuffer, 0, &result); 457 458 bool isDataView = false; 459 napi_is_dataview(env, result, &isDataView); 460 461 napi_value retArrayBuffer = nullptr; 462 void* data = nullptr; 463 size_t byteLength = 0; 464 size_t byteOffset = 0; 465 napi_get_dataview_info(env, result, &byteLength, &data, &retArrayBuffer, &byteOffset); 466 467 bool retIsArrayBuffer = false; 468 napi_is_arraybuffer(env, arrayBuffer, &retIsArrayBuffer); 469 ASSERT_TRUE(retIsArrayBuffer); 470 ASSERT_EQ(arrayBufferPtr, data); 471 ASSERT_EQ(arrayBufferSize, byteLength); 472 ASSERT_EQ((size_t)0, byteOffset); 473 } 474 475 /** 476 * @tc.name: PromiseTest001 477 * @tc.desc: Test promise type. 478 * @tc.type: FUNC 479 */ 480 HWTEST_F(NapiBasicTest, PromiseTest001, testing::ext::TestSize.Level1) 481 { 482 napi_env env = (napi_env)engine_; 483 { 484 napi_deferred deferred = nullptr; 485 napi_value promise = nullptr; 486 napi_create_promise(env, &deferred, &promise); 487 ASSERT_NE(deferred, nullptr); 488 ASSERT_NE(promise, nullptr); 489 490 bool isPromise = false; 491 napi_is_promise(env, promise, &isPromise); 492 ASSERT_TRUE(isPromise); 493 494 napi_value undefined = nullptr; 495 napi_get_undefined(env, &undefined); 496 napi_resolve_deferred(env, deferred, undefined); 497 } 498 { 499 napi_deferred deferred = nullptr; 500 napi_value promise = nullptr; 501 napi_create_promise(env, &deferred, &promise); 502 ASSERT_NE(deferred, nullptr); 503 ASSERT_NE(promise, nullptr); 504 505 bool isPromise = false; 506 napi_is_promise(env, promise, &isPromise); 507 ASSERT_TRUE(isPromise); 508 509 napi_value undefined = nullptr; 510 napi_get_undefined(env, &undefined); 511 napi_reject_deferred(env, deferred, undefined); 512 } 513 } 514 515 /** 516 * @tc.name: ErrorTest001 517 * @tc.desc: Test error type. 518 * @tc.type: FUNC 519 */ 520 HWTEST_F(NapiBasicTest, ErrorTest001, testing::ext::TestSize.Level1) 521 { 522 napi_env env = (napi_env)engine_; 523 524 { 525 napi_value code = nullptr; 526 napi_value message = nullptr; 527 528 napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code); 529 napi_create_string_latin1(env, "common error", NAPI_AUTO_LENGTH, &message); 530 531 napi_value error = nullptr; 532 napi_create_error(env, code, message, &error); 533 ASSERT_TRUE(error != nullptr); 534 bool isError = false; 535 napi_is_error(env, error, &isError); 536 ASSERT_TRUE(isError); 537 napi_throw(env, error); 538 } 539 540 { 541 napi_value code = nullptr; 542 napi_value message = nullptr; 543 napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code); 544 napi_create_string_latin1(env, "range error", NAPI_AUTO_LENGTH, &message); 545 napi_value error = nullptr; 546 napi_create_range_error(env, code, message, &error); 547 ASSERT_TRUE(error != nullptr); 548 bool isError = false; 549 napi_is_error(env, error, &isError); 550 ASSERT_TRUE(isError); 551 } 552 553 { 554 napi_value code = nullptr; 555 napi_value message = nullptr; 556 napi_create_string_latin1(env, "500", NAPI_AUTO_LENGTH, &code); 557 napi_create_string_latin1(env, "type error", NAPI_AUTO_LENGTH, &message); 558 napi_value error = nullptr; 559 napi_create_type_error(env, code, message, &error); 560 ASSERT_TRUE(error != nullptr); 561 bool isError = false; 562 napi_is_error(env, error, &isError); 563 ASSERT_TRUE(isError); 564 } 565 566 napi_throw_error(env, "500", "Common error"); 567 napi_throw_range_error(env, "500", "Range error"); 568 napi_throw_type_error(env, "500", "Type error"); 569 bool isExceptionPending = false; 570 napi_is_exception_pending(env, &isExceptionPending); 571 ASSERT_TRUE(isExceptionPending); 572 } 573 574 /** 575 * @tc.name: ReferenceTest001 576 * @tc.desc: Test reference type. 577 * @tc.type: FUNC 578 */ 579 HWTEST_F(NapiBasicTest, ReferenceTest001, testing::ext::TestSize.Level1) 580 { 581 napi_env env = (napi_env)engine_; 582 583 napi_value result = nullptr; 584 napi_ref resultRef = nullptr; 585 586 napi_create_object(env, &result); 587 napi_create_reference(env, result, 1, &resultRef); 588 589 uint32_t resultRefCount = 0; 590 591 napi_reference_ref(env, resultRef, &resultRefCount); 592 ASSERT_EQ(resultRefCount, (uint32_t)2); 593 594 napi_reference_unref(env, resultRef, &resultRefCount); 595 ASSERT_EQ(resultRefCount, (uint32_t)1); 596 597 napi_value refValue = nullptr; 598 napi_get_reference_value(env, resultRef, &refValue); 599 600 ASSERT_NE(refValue, nullptr); 601 602 napi_delete_reference(env, resultRef); 603 } 604 605 /** 606 * @tc.name: CustomClassTest001 607 * @tc.desc: Test define class. 608 * @tc.type: FUNC 609 */ 610 HWTEST_F(NapiBasicTest, CustomClassTest001, testing::ext::TestSize.Level1) 611 { 612 napi_env env = (napi_env)engine_; 613 __anon01784ab90602(napi_env env, napi_callback_info info) 614 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value { 615 napi_value thisVar = nullptr; 616 napi_value* argv = nullptr; 617 size_t argc = 0; 618 void* data = nullptr; 619 napi_value constructor = nullptr; 620 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 621 if (argc > 0) { 622 argv = new napi_value[argc]; 623 } 624 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); 625 napi_get_new_target(env, info, &constructor); 626 if (constructor == nullptr) { 627 napi_throw_error(env, nullptr, "is not new instance"); 628 } 629 if (argv != nullptr) { 630 delete []argv; 631 } 632 return thisVar; 633 }; 634 635 napi_value ln2 = nullptr; 636 napi_value e = nullptr; 637 638 napi_create_double(env, 2.718281828459045, &e); 639 napi_create_double(env, 0.6931471805599453, &ln2); 640 641 napi_property_descriptor desc[] = { __anon01784ab90702() 642 DECLARE_NAPI_FUNCTION("add", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), __anon01784ab90802() 643 DECLARE_NAPI_FUNCTION("sub", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), __anon01784ab90902() 644 DECLARE_NAPI_FUNCTION("mul", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), __anon01784ab90a02() 645 DECLARE_NAPI_FUNCTION("div", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), 646 DECLARE_NAPI_STATIC_FUNCTION("getTime", __anon01784ab90b02() 647 [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), 648 DECLARE_NAPI_GETTER_SETTER( __anon01784ab90c02() 649 "pi", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }, __anon01784ab90d02() 650 [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }), 651 652 }; 653 654 napi_value customClass = nullptr; 655 656 ASSERT_CHECK_CALL(napi_define_class(env, "CustomClass", NAPI_AUTO_LENGTH, constructor, nullptr, 657 sizeof(desc) / sizeof(desc[0]), desc, &customClass)); 658 ASSERT_CHECK_VALUE_TYPE(env, customClass, napi_function); 659 napi_value customClassPrototype = nullptr; 660 napi_get_prototype(env, customClass, &customClassPrototype); 661 ASSERT_CHECK_VALUE_TYPE(env, customClassPrototype, napi_function); 662 663 napi_value customInstance = nullptr; 664 ASSERT_CHECK_CALL(napi_new_instance(env, customClass, 0, nullptr, &customInstance)); 665 666 bool isInstanceOf = false; 667 ASSERT_CHECK_CALL(napi_instanceof(env, customInstance, customClass, &isInstanceOf)); 668 ASSERT_TRUE(isInstanceOf); 669 } 670 671 /** 672 * @tc.name: AsyncWorkTest001 673 * @tc.desc: Test async work. 674 * @tc.type: FUNC 675 */ 676 HWTEST_F(NapiBasicTest, AsyncWorkTest001, testing::ext::TestSize.Level1) 677 { 678 struct AsyncWorkContext { 679 napi_async_work work = nullptr; 680 }; 681 napi_env env = (napi_env)engine_; 682 { 683 auto asyncWorkContext = new AsyncWorkContext(); 684 napi_value resourceName = nullptr; 685 napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName); 686 napi_create_async_work( __anon01784ab90e02(napi_env value, void* data) 687 env, nullptr, resourceName, [](napi_env value, void* data) {}, __anon01784ab90f02(napi_env env, napi_status status, void* data) 688 [](napi_env env, napi_status status, void* data) { 689 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data; 690 napi_delete_async_work(env, asyncWorkContext->work); 691 delete asyncWorkContext; 692 }, 693 asyncWorkContext, &asyncWorkContext->work); 694 napi_queue_async_work(env, asyncWorkContext->work); 695 } 696 { 697 auto asyncWorkContext = new AsyncWorkContext(); 698 napi_value resourceName = nullptr; 699 napi_create_string_utf8(env, "AsyncWorkTest", NAPI_AUTO_LENGTH, &resourceName); 700 napi_create_async_work( __anon01784ab91002(napi_env value, void* data) 701 env, nullptr, resourceName, [](napi_env value, void* data) {}, __anon01784ab91102(napi_env env, napi_status status, void* data) 702 [](napi_env env, napi_status status, void* data) { 703 AsyncWorkContext* asyncWorkContext = (AsyncWorkContext*)data; 704 napi_delete_async_work(env, asyncWorkContext->work); 705 delete asyncWorkContext; 706 }, 707 asyncWorkContext, &asyncWorkContext->work); 708 napi_queue_async_work(env, asyncWorkContext->work); 709 napi_cancel_async_work(env, asyncWorkContext->work); 710 } 711 } 712 713 /** 714 * @tc.name: ObjectWrapperTest001 715 * @tc.desc: Test object wrapper. 716 * @tc.type: FUNC 717 */ 718 HWTEST_F(NapiBasicTest, ObjectWrapperTest001, testing::ext::TestSize.Level1) 719 { 720 napi_env env = (napi_env)engine_; 721 722 napi_value testClass = nullptr; 723 napi_define_class( 724 env, "TestClass", NAPI_AUTO_LENGTH, __anon01784ab91202(napi_env env, napi_callback_info info) 725 [](napi_env env, napi_callback_info info) -> napi_value { 726 napi_value thisVar = nullptr; 727 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr); 728 729 return thisVar; 730 }, 731 nullptr, 0, nullptr, &testClass); 732 733 napi_value instanceValue = nullptr; 734 napi_new_instance(env, testClass, 0, nullptr, &instanceValue); 735 736 const char* testStr = "test"; 737 napi_wrap( __anon01784ab91302(napi_env env, void* data, void* hint) 738 env, instanceValue, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr, nullptr); 739 740 char* tmpTestStr = nullptr; 741 napi_unwrap(env, instanceValue, (void**)&tmpTestStr); 742 ASSERT_STREQ(testStr, tmpTestStr); 743 744 char* tmpTestStr1 = nullptr; 745 napi_remove_wrap(env, instanceValue, (void**)&tmpTestStr1); 746 ASSERT_STREQ(testStr, tmpTestStr1); 747 } 748 749 /** 750 * @tc.name: RunScriptTest001 751 * @tc.desc: Test script running. 752 * @tc.type: FUNC 753 */ 754 HWTEST_F(NapiBasicTest, RunScriptTest001, testing::ext::TestSize.Level1) 755 { 756 napi_env env = (napi_env)engine_; 757 758 const char* tetScriptStr = "1+1;"; 759 napi_value testScript = nullptr; 760 napi_create_string_utf8(env, tetScriptStr, strlen(tetScriptStr), &testScript); 761 ASSERT_NE(testScript, nullptr); 762 napi_value result = nullptr; 763 napi_run_script(env, testScript, &result); 764 ASSERT_NE(result, nullptr); 765 ASSERT_CHECK_VALUE_TYPE(env, result, napi_number); 766 } 767 768 /** 769 * @tc.name: DateTest 770 * @tc.desc: Test date type. 771 * @tc.type: FUNC 772 */ 773 HWTEST_F(NapiBasicTest, DateTest001, testing::ext::TestSize.Level1) 774 { 775 napi_env env = (napi_env)engine_; 776 777 const char* tetScriptStr = "new Date();"; 778 napi_value testScript = nullptr; 779 780 napi_create_string_utf8(env, tetScriptStr, strlen(tetScriptStr), &testScript); 781 782 napi_value date = nullptr; 783 napi_run_script(env, testScript, &date); 784 ASSERT_CHECK_VALUE_TYPE(env, date, napi_object); 785 786 napi_value getTimeFunc = nullptr; 787 napi_get_named_property(env, date, "getTime", &getTimeFunc); 788 ASSERT_CHECK_VALUE_TYPE(env, getTimeFunc, napi_function); 789 790 napi_value getTimeResult = nullptr; 791 napi_call_function(env, date, getTimeFunc, 0, nullptr, &getTimeResult); 792 ASSERT_CHECK_VALUE_TYPE(env, getTimeResult, napi_number); 793 794 int64_t value = 0; 795 796 napi_get_value_int64(env, getTimeResult, &value); 797 } 798 799 /** 800 * @tc.name: StrictEqualsTest001 801 * @tc.desc: Test date type. 802 * @tc.type: FUNC 803 */ 804 HWTEST_F(NapiBasicTest, StrictEqualsTest001, testing::ext::TestSize.Level1) 805 { 806 napi_env env = (napi_env)engine_; 807 808 const char* testStringStr = "test"; 809 napi_value testString = nullptr; 810 napi_create_string_utf8(env, testStringStr, strlen(testStringStr), &testString); 811 bool isStrictEquals = false; 812 napi_strict_equals(env, testString, testString, &isStrictEquals); 813 ASSERT_TRUE(isStrictEquals); 814 815 napi_value testObject = nullptr; 816 napi_create_object(env, &testObject); 817 isStrictEquals = false; 818 napi_strict_equals(env, testObject, testObject, &isStrictEquals); 819 ASSERT_TRUE(isStrictEquals); 820 } 821 822 /** 823 * @tc.name: CreateRuntimeTest001 824 * @tc.desc: Test create runtime. 825 * @tc.type: FUNC 826 */ 827 HWTEST_F(NapiBasicTest, CreateRuntimeTest001, testing::ext::TestSize.Level1) 828 { 829 napi_env env = (napi_env)engine_; 830 831 napi_env newEnv = nullptr; 832 napi_create_runtime(env, &newEnv); 833 #ifdef USE_V8_ENGINE 834 ASSERT_NE(newEnv, nullptr); 835 #elif USE_QUICKJS_ENGINE 836 ASSERT_EQ(newEnv, nullptr); 837 #endif 838 } 839 840 /** 841 * @tc.name: SerializeDeSerializeTest001 842 * @tc.desc: Test serialize & deserialize. 843 * @tc.type: FUNC 844 */ 845 HWTEST_F(NapiBasicTest, SerializeDeSerializeTest001, testing::ext::TestSize.Level1) 846 { 847 napi_env env = (napi_env)engine_; 848 849 napi_value undefined = nullptr; 850 napi_get_undefined(env, &undefined); 851 #ifdef USE_V8_ENGINE 852 napi_value num = nullptr; 853 uint32_t value = 1000; 854 napi_create_uint32(env, value, &num); 855 napi_value data = nullptr; 856 napi_serialize(env, num, undefined, &data); 857 ASSERT_NE(data, nullptr); 858 859 napi_value result = nullptr; 860 napi_deserialize(env, data, &result); 861 ASSERT_CHECK_VALUE_TYPE(env, result, napi_number); 862 int32_t resultData = 0; 863 napi_get_value_int32(env, result, &resultData); 864 ASSERT_EQ(resultData, 1000); 865 866 napi_delete_serialization_data(env, data); 867 #endif 868 } 869 870 /** 871 * @tc.name: IsCallableTest001 872 * @tc.desc: Test is callable. 873 * @tc.type: FUNC 874 */ 875 HWTEST_F(NapiBasicTest, IsCallableTest001, testing::ext::TestSize.Level1) 876 { 877 napi_env env = (napi_env)engine_; 878 __anon01784ab91402(napi_env env, napi_callback_info info) 879 auto func = [](napi_env env, napi_callback_info info) -> napi_value { 880 napi_value thisVar; 881 napi_value* argv = nullptr; 882 size_t argc = 0; 883 void* data = nullptr; 884 885 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 886 if (argc > 0) { 887 argv = new napi_value[argc]; 888 } 889 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); 890 891 napi_value result = nullptr; 892 napi_create_object(env, &result); 893 894 napi_value messageKey = nullptr; 895 const char* messageKeyStr = "message"; 896 napi_create_string_latin1(env, messageKeyStr, strlen(messageKeyStr), &messageKey); 897 napi_value messageValue = nullptr; 898 const char* messageValueStr = "OK"; 899 napi_create_string_latin1(env, messageValueStr, strlen(messageValueStr), &messageValue); 900 napi_set_property(env, result, messageKey, messageValue); 901 902 if (argv != nullptr) { 903 delete []argv; 904 } 905 return result; 906 }; 907 908 napi_value funcValue = nullptr; 909 napi_create_function(env, "testFunc", NAPI_AUTO_LENGTH, func, nullptr, &funcValue); 910 ASSERT_NE(funcValue, nullptr); 911 912 bool result = false; 913 napi_is_callable(env, funcValue, &result); 914 ASSERT_TRUE(result); 915 } 916 917 /** 918 * @tc.name: LoadModuleTest001 919 * @tc.desc: Test LoadModule Func. 920 * @tc.type: FUNC 921 */ 922 HWTEST_F(NapiBasicTest, LoadModuleTest001, testing::ext::TestSize.Level1) 923 { 924 napi_env env = (napi_env)engine_; 925 std::string sourceText = "var a = 1; let b = 2;" 926 "export function getA() {return a};" 927 "export function getB() {return b};" 928 "export default {'val': 4};"; 929 auto sourceString = engine_->CreateString(sourceText.c_str(), sourceText.length()); 930 931 std::string file = "file.js"; 932 NativeValue *moduleValue = engine_->LoadModule(sourceString, file); 933 ASSERT_TRUE(moduleValue != nullptr); 934 auto moduleObject = reinterpret_cast<NativeObject*>(moduleValue->GetInterface(NativeObject::INTERFACE_ID)); 935 936 std::string key = "val"; 937 auto keyString = engine_->CreateString(key.c_str(), key.length()); 938 auto resultValue = moduleObject->GetProperty(keyString); 939 940 napi_value lvalue = reinterpret_cast<napi_value>(resultValue); 941 napi_value rvalue = nullptr; 942 napi_create_int32(env, 4, &rvalue); 943 944 bool result = false; 945 napi_strict_equals(env, lvalue, rvalue, &result); 946 ASSERT_TRUE(result); 947 } 948 949 /** 950 * @tc.name: EncodeToUtf8Test001 951 * @tc.desc: Test EncodeToUtf8 Func. 952 * @tc.type: FUNC 953 */ 954 HWTEST_F(NapiBasicTest, EncodeToUtf8Test001, testing::ext::TestSize.Level1) 955 { 956 std::string str = "encode"; 957 auto testStr = engine_->CreateString(str.c_str(), str.length()); 958 char* buffer = new char[str.length()]; 959 size_t bufferSize = str.length(); 960 int32_t written = 0; 961 int32_t nchars = 0; 962 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 963 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 964 ASSERT_EQ(written, 6); 965 ASSERT_EQ(nchars, 6); 966 delete[] buffer; 967 968 str = "encode\xc2\xab\xe2\x98\x80"; 969 testStr = engine_->CreateString(str.c_str(), str.length()); 970 buffer = new char[str.length()]; 971 bufferSize = str.length(); 972 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 973 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 974 ASSERT_EQ(written, 11); 975 ASSERT_EQ(nchars, 8); 976 delete[] buffer; 977 978 buffer = new char[str.length()]; 979 bufferSize = str.length(); 980 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 981 bufferSize--; 982 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 983 ASSERT_EQ(written, 8); 984 ASSERT_EQ(nchars, 7); 985 delete[] buffer; 986 987 buffer = new char[str.length()]; 988 bufferSize = str.length(); 989 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 990 bufferSize -= 4; 991 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 992 ASSERT_EQ(written, 6); 993 ASSERT_EQ(nchars, 6); 994 delete[] buffer; 995 996 str = "encode\xc2\xab\xe2\x98\x80t"; 997 testStr = engine_->CreateString(str.c_str(), str.length()); 998 buffer = new char[str.length()]; 999 bufferSize = str.length(); 1000 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 1001 bufferSize--; 1002 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 1003 ASSERT_EQ(written, 11); 1004 ASSERT_EQ(nchars, 8); 1005 delete[] buffer; 1006 1007 str = ""; 1008 testStr = engine_->CreateString(str.c_str(), str.length()); 1009 buffer = new char[str.length() + 1]; 1010 bufferSize = str.length() + 1; 1011 ASSERT_EQ(memset_s(buffer, str.length(), 0, str.length()), EOK); 1012 engine_->EncodeToUtf8(testStr, buffer, &written, bufferSize, &nchars); 1013 ASSERT_EQ(written, 0); 1014 ASSERT_EQ(nchars, 0); 1015 delete[] buffer; 1016 }