1 /*
2 * Copyright (c) 2021-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 <chrono>
17 #include <thread>
18
19 #include "test.h"
20 #include "test_common.h"
21 #include "gtest/gtest.h"
22 #include "napi/native_api.h"
23 #include "napi/native_node_api.h"
24 #include "napi/native_common.h"
25 #include "securec.h"
26 #include "utils/log.h"
27
28 static constexpr size_t TEST_STR_LENGTH = 30;
29
30 class NapiSendableTest : public NativeEngineTest {
31 public:
SetUpTestCase()32 static void SetUpTestCase()
33 {
34 GTEST_LOG_(INFO) << "NapiSendableTest SetUpTestCase";
35 }
36
TearDownTestCase()37 static void TearDownTestCase()
38 {
39 GTEST_LOG_(INFO) << "NapiSendableTest TearDownTestCase";
40 }
41
SetUp()42 void SetUp() override
43 {
44 napi_env env = reinterpret_cast<napi_env>(engine_);
45 napi_open_handle_scope(env, &scope_);
46 }
47
TearDown()48 void TearDown() override
49 {
50 napi_env env = reinterpret_cast<napi_env>(engine_);
51 napi_value exception = nullptr;
52 napi_get_and_clear_last_exception(env, &exception);
53 napi_close_handle_scope(env, scope_);
54 }
55 private:
56 napi_handle_scope scope_ = nullptr;
57 };
58
GetSendableClass(napi_env env)59 napi_value GetSendableClass(napi_env env)
60 {
61 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
62 napi_value thisVar = nullptr;
63 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
64 return thisVar;
65 };
66
67 napi_value static_str;
68 napi_value non_static_str;
69 napi_value instance_str;
70 napi_create_string_utf8(env, "static", NAPI_AUTO_LENGTH, &static_str);
71 napi_create_string_utf8(env, "nonStatic", NAPI_AUTO_LENGTH, &non_static_str);
72 napi_create_string_utf8(env, "instance", NAPI_AUTO_LENGTH, &instance_str);
73
74 napi_property_attributes napi_instance = static_cast<napi_property_attributes>(1 << 9 | 1 << 0);
75 napi_property_descriptor desc[] = { DECLARE_NAPI_STATIC_PROPERTY("static", static_str),
76 DECLARE_NAPI_DEFAULT_PROPERTY("nonStatic", non_static_str),
77 { "instance", nullptr, nullptr, nullptr, nullptr, instance_str, napi_instance,
78 nullptr } };
79
80 napi_value sendableClass = nullptr;
81 napi_define_sendable_class(env, "SendableClass", NAPI_AUTO_LENGTH, constructor, nullptr,
82 sizeof(desc) / sizeof(desc[0]), desc, nullptr, &sendableClass);
83
84 return sendableClass;
85 }
86
GetSendableChildClass(napi_env env,napi_value parentClass)87 napi_value GetSendableChildClass(napi_env env, napi_value parentClass)
88 {
89 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
90 napi_value thisVar = nullptr;
91 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
92 return thisVar;
93 };
94
95 napi_value static_str;
96 napi_value non_static_str;
97 napi_value instance_str;
98 napi_create_string_utf8(env, "static", NAPI_AUTO_LENGTH, &static_str);
99 napi_create_string_utf8(env, "nonStatic", NAPI_AUTO_LENGTH, &non_static_str);
100 napi_create_string_utf8(env, "instance", NAPI_AUTO_LENGTH, &instance_str);
101
102 napi_property_attributes napi_instance = static_cast<napi_property_attributes>(1 << 9 | 1 << 0);
103 napi_property_descriptor desc[] = { DECLARE_NAPI_STATIC_PROPERTY("static", static_str),
104 DECLARE_NAPI_DEFAULT_PROPERTY("nonStatic", non_static_str),
105 { "instance", nullptr, nullptr, nullptr, nullptr, instance_str, napi_instance,
106 nullptr } };
107
108 napi_value childClass = nullptr;
109 napi_define_sendable_class(env, "SendableClass", NAPI_AUTO_LENGTH, constructor, nullptr,
110 sizeof(desc) / sizeof(desc[0]), desc, parentClass, &childClass);
111
112 return childClass;
113 }
114
GetSendableParentClass(napi_env env)115 napi_value GetSendableParentClass(napi_env env)
116 {
117 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
118 napi_value thisVar = nullptr;
119 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
120 return thisVar;
121 };
122
123 napi_value parent_static_str;
124 napi_value parent_non_static_str;
125 napi_value parent_instance_str;
126 napi_create_string_utf8(env, "parentStatic", NAPI_AUTO_LENGTH, &parent_static_str);
127 napi_create_string_utf8(env, "parentNonStatic", NAPI_AUTO_LENGTH, &parent_non_static_str);
128 napi_create_string_utf8(env, "parentInstance", NAPI_AUTO_LENGTH, &parent_instance_str);
129
130 napi_property_attributes napi_instance = static_cast<napi_property_attributes>(1 << 9 | 1 << 0);
131 napi_property_descriptor parentDesc[] = { DECLARE_NAPI_STATIC_PROPERTY("parentStatic", parent_static_str),
132 DECLARE_NAPI_DEFAULT_PROPERTY("parentNonStatic", parent_non_static_str),
133 { "parentInstance", nullptr, nullptr, nullptr, nullptr,
134 parent_instance_str, napi_instance, nullptr } };
135
136 napi_value parentClass = nullptr;
137 napi_define_sendable_class(env, "ParentClass", NAPI_AUTO_LENGTH, constructor, nullptr,
138 sizeof(parentDesc) / sizeof(parentDesc[0]), parentDesc, nullptr, &parentClass);
139
140 return parentClass;
141 }
142
143 HWTEST_F(NapiSendableTest, IsSendableTest001, testing::ext::TestSize.Level1)
144 {
145 ASSERT_NE(engine_, nullptr);
146 napi_env env = reinterpret_cast<napi_env>(engine_);
147 napi_status res = napi_ok;
148
149 res = napi_create_sendable_map(env, nullptr);
150 ASSERT_EQ(res, napi_invalid_arg);
151
152 napi_value result = nullptr;
153 ASSERT_CHECK_CALL(napi_create_sendable_map(env, &result));
154
155 bool isShared = false;
156 ASSERT_CHECK_CALL(napi_is_sendable(env, result, &isShared));
157 ASSERT_EQ(isShared, true);
158 }
159
160 HWTEST_F(NapiSendableTest, IsSendableTest002, testing::ext::TestSize.Level1)
161 {
162 static size_t LENGTH = 1024;
163 ASSERT_NE(engine_, nullptr);
164 napi_env env = reinterpret_cast<napi_env>(engine_);
165 napi_status res = napi_ok;
166
167 void *data;
168 napi_value arraybuffer = nullptr;
169 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
170 ASSERT_EQ(res, napi_ok);
171
172 bool isShared = false;
173 res = napi_is_sendable(env, arraybuffer, &isShared);
174 ASSERT_EQ(res, napi_ok);
175 ASSERT_EQ(isShared, false);
176 }
177
178 HWTEST_F(NapiSendableTest, SendableClassTest001, testing::ext::TestSize.Level1)
179 {
180 napi_env env = (napi_env)engine_;
181
__anon5805f5640402(napi_env env, napi_callback_info info) 182 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
183 napi_value thisVar = nullptr;
184 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
185 return thisVar;
186 };
187
188 napi_value static_str;
189 napi_value non_static_str;
190 napi_value name_str;
191 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "static", NAPI_AUTO_LENGTH, &static_str));
192 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "nonStatic", NAPI_AUTO_LENGTH, &non_static_str));
193 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "name", NAPI_AUTO_LENGTH, &name_str));
194
195 napi_property_descriptor desc[] = {
196 DECLARE_NAPI_STATIC_PROPERTY("static", static_str),
197 DECLARE_NAPI_DEFAULT_PROPERTY("nonStatic", non_static_str),
198 DECLARE_NAPI_STATIC_FUNCTION("staticFunc",
__anon5805f5640502() 199 [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
__anon5805f5640602() 200 DECLARE_NAPI_FUNCTION("func", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
201 DECLARE_NAPI_GETTER_SETTER(
__anon5805f5640702() 202 "getterSetter", [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; },
__anon5805f5640802() 203 [](napi_env env, napi_callback_info info) -> napi_value { return nullptr; }),
204 };
205
206 napi_value sendableClass = nullptr;
207 ASSERT_CHECK_CALL(napi_define_sendable_class(env, "SendableClass", NAPI_AUTO_LENGTH, constructor, nullptr,
208 sizeof(desc) / sizeof(desc[0]), desc, nullptr, &sendableClass));
209
210 napi_value value = nullptr;
211 char* str = new char[TEST_STR_LENGTH];
212 size_t length;
213
214 ASSERT_CHECK_CALL(napi_get_property(env, sendableClass, name_str, &value));
215 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
216 ASSERT_STREQ("SendableClass", str);
217 ASSERT_CHECK_VALUE_TYPE(env, sendableClass, napi_function);
218 }
219
220
221 HWTEST_F(NapiSendableTest, SendableClassTest002, testing::ext::TestSize.Level1)
222 {
223 napi_env env = (napi_env)engine_;
224
__anon5805f5640902(napi_env env, napi_callback_info info) 225 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
226 napi_value thisVar = nullptr;
227 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
228 return thisVar;
229 };
230
231 napi_value static_str;
232 napi_value non_static_str;
233 napi_value invalid_str;
234 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "static", NAPI_AUTO_LENGTH, &static_str));
235 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "nonStatic", NAPI_AUTO_LENGTH, &non_static_str));
236 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "invalid", NAPI_AUTO_LENGTH, &invalid_str));
237
238 napi_property_attributes napi_writable_static = static_cast<napi_property_attributes>(napi_static | napi_writable);
239 napi_property_descriptor desc[] = {
240 { "static", nullptr, nullptr, nullptr, nullptr, static_str, napi_writable_static, nullptr },
241 DECLARE_NAPI_DEFAULT_PROPERTY("nonStatic", non_static_str),
242 };
243
244 napi_value sendableClass = nullptr;
245 ASSERT_CHECK_CALL(napi_define_sendable_class(env, "SendableClass", NAPI_AUTO_LENGTH, constructor, nullptr,
246 sizeof(desc) / sizeof(desc[0]), desc, nullptr, &sendableClass));
247
248 napi_value value = nullptr;
249 char* str = new char[TEST_STR_LENGTH];
250 size_t length;
251
252 // get static property from constructor
253 ASSERT_CHECK_CALL(napi_get_property(env, sendableClass, static_str, &value));
254 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
255 ASSERT_STREQ("static", str);
256 // get invalid property from constructor
257 ASSERT_CHECK_CALL(napi_get_property(env, sendableClass, invalid_str, &value));
258 ASSERT_CHECK_VALUE_TYPE(env, value, napi_undefined);
259
260 napi_value static_value;
261 napi_value non_static_value;
262 napi_value invalid_value;
263 napi_value exception = nullptr;
264 bool isExceptionPending = false;
265 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "static0", NAPI_AUTO_LENGTH, &static_value));
266 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "nonStatic0", NAPI_AUTO_LENGTH, &non_static_value));
267 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "invalid", NAPI_AUTO_LENGTH, &invalid_value));
268
269 // set static property on constructor
270 napi_set_property(env, sendableClass, static_str, static_value);
271 ASSERT_CHECK_CALL(napi_get_property(env, sendableClass, static_str, &value));
272 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
273 ASSERT_STREQ("static0", str);
274
275 // set invalid property on constructor
276 napi_is_exception_pending(env, &isExceptionPending);
277 ASSERT_FALSE(isExceptionPending);
278 napi_set_property(env, sendableClass, invalid_str, invalid_value);
279 napi_is_exception_pending(env, &isExceptionPending);
280 ASSERT_TRUE(isExceptionPending);
281 napi_get_and_clear_last_exception(env, &exception);
282 ASSERT_CHECK_CALL(napi_get_property(env, sendableClass, invalid_str, &value));
283 ASSERT_CHECK_VALUE_TYPE(env, value, napi_undefined);
284 }
285
286 HWTEST_F(NapiSendableTest, SendableClassTest003, testing::ext::TestSize.Level1)
287 {
288 napi_env env = (napi_env)engine_;
289
290 napi_value sendableClass = GetSendableClass(env);
291 napi_value non_static_str;
292 napi_value invalid_str;
293 napi_value instance_str;
294 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "nonStatic", NAPI_AUTO_LENGTH, &non_static_str));
295 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "invalid", NAPI_AUTO_LENGTH, &invalid_str));
296 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "instance", NAPI_AUTO_LENGTH, &instance_str));
297
298 // new instance
299 napi_value sendableInstance = nullptr;
300 ASSERT_CHECK_CALL(napi_new_instance(env, sendableClass, 0, nullptr, &sendableInstance));
301 bool isInstanceOf = false;
302 ASSERT_CHECK_CALL(napi_instanceof(env, sendableInstance, sendableClass, &isInstanceOf));
303 ASSERT_TRUE(isInstanceOf);
304
305 // get prototype
306 napi_value prototype = nullptr;
307 ASSERT_CHECK_CALL(napi_get_prototype(env, sendableInstance, &prototype));
308 ASSERT_CHECK_VALUE_TYPE(env, prototype, napi_object);
309
310 napi_value value = nullptr;
311 char* str = new char[TEST_STR_LENGTH];
312 size_t length;
313 napi_value instance_value;
314 napi_value non_static_value;
315 napi_value invalid_value;
316 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "instance", NAPI_AUTO_LENGTH, &instance_value));
317 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "nonStatic0", NAPI_AUTO_LENGTH, &non_static_value));
318 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "invalid", NAPI_AUTO_LENGTH, &invalid_value));
319
320 // get initial instance property
321 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, instance_str, &value));
322 ASSERT_CHECK_VALUE_TYPE(env, value, napi_undefined);
323 // set instance property
324 napi_set_property(env, sendableInstance, instance_str, instance_value);
325 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, instance_str, &value));
326 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
327 ASSERT_STREQ("instance", str);
328
329 // get non static property from instance
330 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, non_static_str, &value));
331 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
332 ASSERT_STREQ("nonStatic", str);
333 // set non static property on prototype and get from instance
334 napi_set_property(env, prototype, non_static_str, non_static_value);
335 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, non_static_str, &value));
336 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
337 ASSERT_STREQ("nonStatic0", str);
338 }
339
340 HWTEST_F(NapiSendableTest, SendableClassTest004, testing::ext::TestSize.Level1)
341 {
342 napi_env env = (napi_env)engine_;
343
344 napi_value sendableClass = GetSendableClass(env);
345 napi_value non_static_str;
346 napi_value invalid_str;
347 napi_value instance_str;
348 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "nonStatic", NAPI_AUTO_LENGTH, &non_static_str));
349 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "invalid", NAPI_AUTO_LENGTH, &invalid_str));
350 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "instance", NAPI_AUTO_LENGTH, &instance_str));
351
352 // new instance
353 napi_value sendableInstance = nullptr;
354 ASSERT_CHECK_CALL(napi_new_instance(env, sendableClass, 0, nullptr, &sendableInstance));
355 bool isInstanceOf = false;
356 ASSERT_CHECK_CALL(napi_instanceof(env, sendableInstance, sendableClass, &isInstanceOf));
357 ASSERT_TRUE(isInstanceOf);
358
359 napi_value value = nullptr;
360 char* str = new char[TEST_STR_LENGTH];
361 size_t length;
362 napi_value non_static_value;
363 napi_value invalid_value;
364 napi_value exception = nullptr;
365 bool isExceptionPending = false;
366 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "nonStatic0", NAPI_AUTO_LENGTH, &non_static_value));
367 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "invalid", NAPI_AUTO_LENGTH, &invalid_value));
368
369 // set non static property on instance
370 napi_is_exception_pending(env, &isExceptionPending);
371 ASSERT_FALSE(isExceptionPending);
372 napi_set_property(env, sendableInstance, non_static_str, non_static_value);
373 napi_is_exception_pending(env, &isExceptionPending);
374 ASSERT_TRUE(isExceptionPending);
375 napi_get_and_clear_last_exception(env, &exception);
376 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, non_static_str, &value));
377 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
378 ASSERT_STREQ("nonStatic", str);
379
380 // set invalid property on instance
381 napi_is_exception_pending(env, &isExceptionPending);
382 ASSERT_FALSE(isExceptionPending);
383 napi_set_property(env, sendableInstance, invalid_str, invalid_value);
384 napi_is_exception_pending(env, &isExceptionPending);
385 ASSERT_TRUE(isExceptionPending);
386 napi_get_and_clear_last_exception(env, &exception);
387 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, invalid_str, &value));
388 ASSERT_CHECK_VALUE_TYPE(env, value, napi_undefined);
389 }
390
391
392 HWTEST_F(NapiSendableTest, SendableClassTest005, testing::ext::TestSize.Level1)
393 {
394 napi_env env = (napi_env)engine_;
395
396 napi_value parentClass = GetSendableParentClass(env);
397 napi_value sendableClass = GetSendableChildClass(env, parentClass);
398 napi_value parent_static_str;
399 napi_value parent_non_static_str;
400 napi_value parent_instance_str;
401 napi_create_string_utf8(env, "parentStatic", NAPI_AUTO_LENGTH, &parent_static_str);
402 napi_create_string_utf8(env, "parentNonStatic", NAPI_AUTO_LENGTH, &parent_non_static_str);
403 napi_create_string_utf8(env, "parentInstance", NAPI_AUTO_LENGTH, &parent_instance_str);
404
405 // new instance
406 napi_value sendableInstance = nullptr;
407 ASSERT_CHECK_CALL(napi_new_instance(env, sendableClass, 0, nullptr, &sendableInstance));
408 bool isInstanceOf = false;
409 bool isInstanceOfParent = false;
410 ASSERT_CHECK_CALL(napi_instanceof(env, sendableInstance, sendableClass, &isInstanceOf));
411 ASSERT_CHECK_CALL(napi_instanceof(env, sendableInstance, parentClass, &isInstanceOfParent));
412 ASSERT_TRUE(isInstanceOf);
413 ASSERT_TRUE(isInstanceOfParent);
414
415 napi_value value = nullptr;
416 char* str = new char[TEST_STR_LENGTH];
417 size_t length;
418 napi_value parent_instance_value;
419 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "parentInstance", NAPI_AUTO_LENGTH, &parent_instance_value));
420
421 // get parent instance property on instance
422 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, parent_instance_str, &value));
423 ASSERT_CHECK_VALUE_TYPE(env, value, napi_undefined);
424 // set parent instance property on instance
425 napi_set_property(env, sendableInstance, parent_instance_str, parent_instance_value);
426 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, parent_instance_str, &value));
427 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
428 ASSERT_STREQ("parentInstance", str);
429
430 // get parent static property from constructor
431 ASSERT_CHECK_CALL(napi_get_property(env, sendableClass, parent_static_str, &value));
432 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
433 ASSERT_STREQ("parentStatic", str);
434
435 // get parent non static property from instance
436 ASSERT_CHECK_CALL(napi_get_property(env, sendableInstance, parent_non_static_str, &value));
437 ASSERT_CHECK_CALL(napi_get_value_string_utf8(env, value, str, TEST_STR_LENGTH, &length));
438 ASSERT_STREQ("parentNonStatic", str);
439 }
440
441 HWTEST_F(NapiSendableTest, SendableClassTest006, testing::ext::TestSize.Level1)
442 {
443 napi_env env = reinterpret_cast<napi_env>(engine_);
444 napi_value parentClass = nullptr;
445 napi_status parentStatus = napi_define_sendable_class(
446 env, "ParentClass", NAPI_AUTO_LENGTH,
__anon5805f5640a02(napi_env env, napi_callback_info info) 447 [](napi_env env, napi_callback_info info) -> napi_value {
448 napi_value thisVar = nullptr;
449 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
450 return thisVar;
451 },
452 nullptr, 0, nullptr, nullptr, &parentClass);
453 ASSERT_EQ(parentStatus, napi_ok);
454 napi_value childClass = nullptr;
455 napi_status childStatus = napi_define_sendable_class(
456 env, "ChildClass", NAPI_AUTO_LENGTH,
__anon5805f5640b02(napi_env env, napi_callback_info info) 457 [](napi_env env, napi_callback_info info) -> napi_value {
458 napi_value thisVar = nullptr;
459 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
460 return thisVar;
461 },
462 nullptr, 0, nullptr, parentClass, &childClass);
463 ASSERT_EQ(childStatus, napi_ok);
464
465 napi_value childInstance = nullptr;
466 ASSERT_CHECK_CALL(napi_new_instance(env, childClass, 0, nullptr, &childInstance));
467
468 bool isInstanceOfParent = false;
469 ASSERT_CHECK_CALL(napi_instanceof(env, childInstance, parentClass, &isInstanceOfParent));
470 ASSERT_TRUE(isInstanceOfParent);
471
472 bool isInstanceOfChild = false;
473 ASSERT_CHECK_CALL(napi_instanceof(env, childInstance, childClass, &isInstanceOfChild));
474 ASSERT_TRUE(isInstanceOfChild);
475 }
476
477 /**
478 * @tc.name: CreateSendableMap001
479 * @tc.desc: Test napi_create_sendable_map.
480 * @tc.type: FUNC
481 */
482 HWTEST_F(NapiSendableTest, CreateSendableMap001, testing::ext::TestSize.Level1)
483 {
484 ASSERT_NE(engine_, nullptr);
485 napi_env env = reinterpret_cast<napi_env>(engine_);
486 napi_status res = napi_ok;
487
488 res = napi_create_sendable_map(env, nullptr);
489 ASSERT_EQ(res, napi_invalid_arg);
490
491 napi_value result = nullptr;
492 ASSERT_CHECK_CALL(napi_create_sendable_map(env, &result));
493
494 bool isShared = false;
495 ASSERT_CHECK_CALL(napi_is_sendable(env, result, &isShared));
496 ASSERT_EQ(isShared, true);
497
498 bool isMap = false;
499 ASSERT_CHECK_CALL(napi_is_map(env, result, &isMap));
500 ASSERT_EQ(isMap, true);
501 }
502
503 /**
504 * @tc.name: CreateSendableMap002
505 * @tc.desc: Test napi_create_sendable_map.
506 * @tc.type: FUNC
507 */
508 HWTEST_F(NapiSendableTest, CreateSendableMap002, testing::ext::TestSize.Level1)
509 {
510 ASSERT_NE(engine_, nullptr);
511 napi_env env = reinterpret_cast<napi_env>(engine_);
512
513 napi_value result = nullptr;
514 ASSERT_CHECK_CALL(napi_create_sendable_map(env, &result));
515
516 uint32_t length = 0;
517 napi_value value = nullptr;
518 bool hasKey = false;
519
520 napi_value key = nullptr;
521 ASSERT_CHECK_CALL(napi_create_string_utf8(env, "null", NAPI_AUTO_LENGTH, &key));
522 napi_value null = nullptr;
523 ASSERT_CHECK_CALL(napi_get_null(env, &null));
524 napi_value undefined = nullptr;
525 ASSERT_CHECK_CALL(napi_get_undefined(env, &undefined));
526
527 ASSERT_CHECK_CALL(napi_map_set_property(env, result, key, null));
528 ASSERT_CHECK_CALL(napi_map_get_size(env, result, &length));
529 ASSERT_EQ(length, 1);
530 ASSERT_CHECK_CALL(napi_map_has_property(env, result, key, &hasKey));
531 ASSERT_TRUE(hasKey);
532 ASSERT_CHECK_CALL(napi_map_get_property(env, result, key, &value));
533 ASSERT_CHECK_VALUE_TYPE(env, value, napi_null);
534
535 ASSERT_CHECK_CALL(napi_map_delete_property(env, result, key));
536 ASSERT_CHECK_CALL(napi_map_get_size(env, result, &length));
537 ASSERT_EQ(length, 0);
538 ASSERT_CHECK_CALL(napi_map_has_property(env, result, key, &hasKey));
539 ASSERT_FALSE(hasKey);
540 ASSERT_CHECK_CALL(napi_map_get_property(env, result, key, &value));
541 ASSERT_CHECK_VALUE_TYPE(env, value, napi_undefined);
542 }
543
544 /**
545 * @tc.name: CreateSendableMap003
546 * @tc.desc: Test napi_create_sendable_map.
547 * @tc.type: FUNC
548 */
549 HWTEST_F(NapiSendableTest, CreateSendableMap003, testing::ext::TestSize.Level1)
550 {
551 ASSERT_NE(engine_, nullptr);
552 napi_env env = reinterpret_cast<napi_env>(engine_);
553
554 napi_value result = nullptr;
555 ASSERT_CHECK_CALL(napi_create_sendable_map(env, &result));
556
557 uint32_t length = 0;
558 napi_value value = nullptr;
559 bool hasKey = false;
560
561 const char* key = "null";
562 napi_value null = nullptr;
563 ASSERT_CHECK_CALL(napi_get_null(env, &null));
564 napi_value undefined = nullptr;
565 ASSERT_CHECK_CALL(napi_get_undefined(env, &undefined));
566
567 ASSERT_CHECK_CALL(napi_map_set_named_property(env, result, key, null));
568 ASSERT_CHECK_CALL(napi_map_get_size(env, result, &length));
569 ASSERT_EQ(length, 1);
570 ASSERT_CHECK_CALL(napi_map_has_named_property(env, result, key, &hasKey));
571 ASSERT_TRUE(hasKey);
572 ASSERT_CHECK_CALL(napi_map_get_named_property(env, result, key, &value));
573 ASSERT_CHECK_VALUE_TYPE(env, value, napi_null);
574
575 ASSERT_CHECK_CALL(napi_map_clear(env, result));
576 ASSERT_CHECK_CALL(napi_map_get_size(env, result, &length));
577 ASSERT_EQ(length, 0);
578 ASSERT_CHECK_CALL(napi_map_has_named_property(env, result, key, &hasKey));
579 ASSERT_FALSE(hasKey);
580 ASSERT_CHECK_CALL(napi_map_get_named_property(env, result, key, &value));
581 ASSERT_CHECK_VALUE_TYPE(env, value, napi_undefined);
582
583 bool isExceptionPending = false;
584 napi_is_exception_pending(env, &isExceptionPending);
585 ASSERT_FALSE(isExceptionPending);
586
587 napi_value object = nullptr;
588 ASSERT_CHECK_CALL(napi_create_object(env, &object));
589 napi_status res = napi_map_set_named_property(env, result, key, object);
590 ASSERT_TRUE(res == napi_pending_exception);
591 }
592
593 /**
594 * @tc.name: CreateSendableMap004
595 * @tc.desc: Test napi_create_sendable_map.
596 * @tc.type: FUNC
597 */
598 HWTEST_F(NapiSendableTest, CreateSendableMap004, testing::ext::TestSize.Level1)
599 {
600 ASSERT_NE(engine_, nullptr);
601 napi_env env = reinterpret_cast<napi_env>(engine_);
602
603 napi_value map = nullptr;
604 ASSERT_CHECK_CALL(napi_create_sendable_map(env, &map));
605
606 napi_value zero = nullptr;
607 ASSERT_CHECK_CALL(napi_create_int32(env, 0, &zero));
608 napi_value one = nullptr;
609 ASSERT_CHECK_CALL(napi_create_int32(env, 1, &one));
610
611 ASSERT_CHECK_CALL(napi_map_set_property(env, map, zero, one));
612
613 napi_value entries;
614 ASSERT_CHECK_CALL(napi_map_get_entries(env, map, &entries));
615
616 napi_value entries0;
617 ASSERT_CHECK_CALL(napi_map_iterator_get_next(env, entries, &entries0));
618 napi_value entries0Value = nullptr;
619 ASSERT_CHECK_CALL(napi_get_named_property(env, entries0, "value", &entries0Value));
620 napi_value key = nullptr;
621 ASSERT_CHECK_CALL(napi_get_element(env, entries0Value, 0, &key));
622 int32_t nativeKey;
623 ASSERT_CHECK_CALL(napi_get_value_int32(env, key, &nativeKey));
624 ASSERT_EQ(nativeKey, 0);
625 napi_value value = nullptr;
626 ASSERT_CHECK_CALL(napi_get_element(env, entries0Value, 1, &value));
627 int32_t nativeValue;
628 ASSERT_CHECK_CALL(napi_get_value_int32(env, value, &nativeValue));
629 ASSERT_EQ(nativeValue, 1);
630
631 napi_value end;
632 ASSERT_CHECK_CALL(napi_map_iterator_get_next(env, entries, &end));
633 napi_value done = nullptr;
634 ASSERT_CHECK_CALL(napi_get_named_property(env, end, "done", &done));
635 bool isDone;
636 ASSERT_CHECK_CALL(napi_get_value_bool(env, done, &isDone));
637 ASSERT_TRUE(isDone);
638 }
639
640 /**
641 * @tc.name: CreateSendableMap005
642 * @tc.desc: Test napi_create_sendable_map.
643 * @tc.type: FUNC
644 */
645 HWTEST_F(NapiSendableTest, CreateSendableMap005, testing::ext::TestSize.Level1)
646 {
647 ASSERT_NE(engine_, nullptr);
648 napi_env env = reinterpret_cast<napi_env>(engine_);
649
650 napi_value map = nullptr;
651 ASSERT_CHECK_CALL(napi_create_sendable_map(env, &map));
652
653 napi_value zero = nullptr;
654 ASSERT_CHECK_CALL(napi_create_int32(env, 0, &zero));
655 napi_value one = nullptr;
656 ASSERT_CHECK_CALL(napi_create_int32(env, 1, &one));
657
658 ASSERT_CHECK_CALL(napi_map_set_property(env, map, zero, one));
659
660 napi_value keys;
661 ASSERT_CHECK_CALL(napi_map_get_keys(env, map, &keys));
662
663 napi_value keys0;
664 ASSERT_CHECK_CALL(napi_map_iterator_get_next(env, keys, &keys0));
665 napi_value key = nullptr;
666 ASSERT_CHECK_CALL(napi_get_named_property(env, keys0, "value", &key));
667 int32_t nativeKey;
668 ASSERT_CHECK_CALL(napi_get_value_int32(env, key, &nativeKey));
669 ASSERT_EQ(nativeKey, 0);
670
671 napi_value end;
672 ASSERT_CHECK_CALL(napi_map_iterator_get_next(env, keys, &end));
673 napi_value done = nullptr;
674 ASSERT_CHECK_CALL(napi_get_named_property(env, end, "done", &done));
675 bool isDone;
676 ASSERT_CHECK_CALL(napi_get_value_bool(env, done, &isDone));
677 ASSERT_TRUE(isDone);
678 }
679
680 /**
681 * @tc.name: CreateSendableMap006
682 * @tc.desc: Test napi_create_sendable_map.
683 * @tc.type: FUNC
684 */
685 HWTEST_F(NapiSendableTest, CreateSendableMap006, testing::ext::TestSize.Level1)
686 {
687 ASSERT_NE(engine_, nullptr);
688 napi_env env = reinterpret_cast<napi_env>(engine_);
689
690 napi_value map = nullptr;
691 ASSERT_CHECK_CALL(napi_create_sendable_map(env, &map));
692
693 napi_value zero = nullptr;
694 ASSERT_CHECK_CALL(napi_create_int32(env, 0, &zero));
695 napi_value one = nullptr;
696 ASSERT_CHECK_CALL(napi_create_int32(env, 1, &one));
697
698 ASSERT_CHECK_CALL(napi_map_set_property(env, map, zero, one));
699
700 napi_value values;
701 ASSERT_CHECK_CALL(napi_map_get_values(env, map, &values));
702
703 napi_value values0;
704 ASSERT_CHECK_CALL(napi_map_iterator_get_next(env, values, &values0));
705 napi_value value = nullptr;
706 ASSERT_CHECK_CALL(napi_get_named_property(env, values0, "value", &value));
707 int32_t nativeValue;
708 ASSERT_CHECK_CALL(napi_get_value_int32(env, value, &nativeValue));
709 ASSERT_EQ(nativeValue, 1);
710
711 napi_value end;
712 ASSERT_CHECK_CALL(napi_map_iterator_get_next(env, values, &end));
713 napi_value done = nullptr;
714 ASSERT_CHECK_CALL(napi_get_named_property(env, end, "done", &done));
715 bool isDone;
716 ASSERT_CHECK_CALL(napi_get_value_bool(env, done, &isDone));
717 ASSERT_TRUE(isDone);
718 }
719
720 HWTEST_F(NapiSendableTest, WrapSendableTest001, testing::ext::TestSize.Level1)
721 {
722 napi_env env = (napi_env)engine_;
723 napi_status res = napi_ok;
724
725 napi_value testClass = nullptr;
726 res = napi_define_sendable_class(
727 env, "TestClass", NAPI_AUTO_LENGTH,
__anon5805f5640c02(napi_env env, napi_callback_info info) 728 [](napi_env env, napi_callback_info info) -> napi_value {
729 napi_value thisVar = nullptr;
730 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
731 return thisVar;
732 },
733 nullptr, 0, nullptr, nullptr, &testClass);
734 ASSERT_EQ(res, napi_ok);
735
736 napi_value instanceValue = nullptr;
737 res = napi_new_instance(env, testClass, 0, nullptr, &instanceValue);
738 ASSERT_EQ(res, napi_ok);
739
740 const char* testStr = "test";
741 res = napi_wrap_sendable(
__anon5805f5640d02(napi_env env, void* data, void* hint) 742 env, instanceValue, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr);
743 ASSERT_EQ(res, napi_ok);
744
745 char* tmpTestStr = nullptr;
746 res = napi_unwrap_sendable(env, instanceValue, (void**)&tmpTestStr);
747 ASSERT_EQ(res, napi_ok);
748 ASSERT_STREQ(testStr, tmpTestStr);
749
750 char* tmpTestStr1 = nullptr;
751 res = napi_remove_wrap_sendable(env, instanceValue, (void**)&tmpTestStr1);
752 ASSERT_EQ(res, napi_ok);
753 ASSERT_STREQ(testStr, tmpTestStr1);
754 }
755
756 HWTEST_F(NapiSendableTest, WrapSendableWithSizeTest001, testing::ext::TestSize.Level1)
757 {
758 napi_env env = (napi_env)engine_;
759
760 napi_value testWrapClass = nullptr;
761 napi_define_sendable_class(
762 env, "TestWrapClass", NAPI_AUTO_LENGTH,
__anon5805f5640e02(napi_env env, napi_callback_info info) 763 [](napi_env env, napi_callback_info info) -> napi_value {
764 napi_value thisVar = nullptr;
765 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
766 return thisVar;
767 },
768 nullptr, 0, nullptr, nullptr, &testWrapClass);
769
770 napi_value instanceValue = nullptr;
771 napi_new_instance(env, testWrapClass, 0, nullptr, &instanceValue);
772
773 const char* testWrapStr = "testWrapStr";
774 size_t size = sizeof(*testWrapStr) / sizeof(char);
775 napi_wrap_sendable_with_size(
__anon5805f5640f02(napi_env env, void* data, void* hint) 776 env, instanceValue, (void*)testWrapStr, [](napi_env env, void* data, void* hint) {}, nullptr, size);
777
778 char* tempTestStr = nullptr;
779 napi_unwrap_sendable(env, instanceValue, (void**)&tempTestStr);
780 ASSERT_STREQ(testWrapStr, tempTestStr);
781
782 char* tempTestStr1 = nullptr;
783 napi_remove_wrap_sendable(env, instanceValue, (void**)&tempTestStr1);
784 ASSERT_STREQ(testWrapStr, tempTestStr1);
785 }
786
787 /**
788 * @tc.name: SharedArrayBufferTest001
789 * @tc.desc: Test is shared array buffer.
790 * @tc.type: FUNC
791 */
792 HWTEST_F(NapiSendableTest, SharedArrayBufferTest001, testing::ext::TestSize.Level1) {
793 napi_env env = (napi_env) engine_;
794
795 napi_value arrayBuffer = nullptr;
796 void* arrayBufferPtr = nullptr;
797 size_t arrayBufferSize = 1024;
798 napi_create_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
799
800 bool isSharedArrayBuffer = true;
801 napi_is_shared_array_buffer(env, arrayBuffer, &isSharedArrayBuffer);
802 ASSERT_EQ(isSharedArrayBuffer, false);
803 }
804
805
806 /**
807 * @tc.name: CreateSendableArray001
808 * @tc.desc: Test napi_create_sendable_array abnormal argument.
809 * @tc.type: FUNC
810 */
811 HWTEST_F(NapiSendableTest, CreateSendableArray001, testing::ext::TestSize.Level1)
812 {
813 ASSERT_NE(engine_, nullptr);
814 napi_env env = reinterpret_cast<napi_env>(engine_);
815 napi_status res = napi_ok;
816
817 res = napi_create_sendable_array(env, nullptr);
818 ASSERT_EQ(res, napi_invalid_arg);
819 }
820
821 /**
822 * @tc.name: CreateSendableArray002
823 * @tc.desc: Test napi_create_sendable_array.
824 * @tc.type: FUNC
825 */
826 HWTEST_F(NapiSendableTest, CreateSendableArray002, testing::ext::TestSize.Level1)
827 {
828 ASSERT_NE(engine_, nullptr);
829 napi_env env = reinterpret_cast<napi_env>(engine_);
830 napi_status res = napi_ok;
831
832 napi_value result = nullptr;
833 res = napi_create_sendable_array(env, &result);
834 ASSERT_EQ(res, napi_ok);
835
836 bool isShared = false;
837 res = napi_is_sendable(env, result, &isShared);
838 ASSERT_EQ(res, napi_ok);
839 ASSERT_EQ(isShared, true);
840
841 bool isArray = false;
842 res = napi_is_array(env, result, &isArray);
843 ASSERT_EQ(res, napi_ok);
844 ASSERT_EQ(isArray, true);
845
846 uint32_t length = 0;
847 res = napi_get_array_length(env, result, &length);
848 ASSERT_EQ(res, napi_ok);
849 ASSERT_EQ(length, 0);
850
851 napi_value undefined = nullptr;
852 res = napi_get_undefined(env, &undefined);
853 ASSERT_EQ(res, napi_ok);
854
855 res = napi_set_element(env, result, 0, undefined);
856 ASSERT_EQ(res, napi_ok);
857 }
858
859 /**
860 * @tc.name: CreateSendableArrayWithLength001
861 * @tc.desc: Test napi_create_sendable_array_with_length.
862 * @tc.type: FUNC
863 */
864 HWTEST_F(NapiSendableTest, CreateSendableArrayWithLength001, testing::ext::TestSize.Level1)
865 {
866 ASSERT_NE(engine_, nullptr);
867 napi_env env = reinterpret_cast<napi_env>(engine_);
868 napi_status res = napi_ok;
869
870 res = napi_create_sendable_array_with_length(env, 0, nullptr);
871 ASSERT_EQ(res, napi_invalid_arg);
872 }
873
874 /**
875 * @tc.name: CreateSendableArrayWithLength002
876 * @tc.desc: Test napi_create_sendable_array_with_length.
877 * @tc.type: FUNC
878 */
879 HWTEST_F(NapiSendableTest, CreateSendableArrayWithLength002, testing::ext::TestSize.Level1)
880 {
881 ASSERT_NE(engine_, nullptr);
882 napi_env env = reinterpret_cast<napi_env>(engine_);
883 napi_status res = napi_ok;
884
885 napi_value result = nullptr;
886 res = napi_create_sendable_array_with_length(env, 0, &result);
887 ASSERT_EQ(res, napi_ok);
888
889 bool isShared = false;
890 res = napi_is_sendable(env, result, &isShared);
891 ASSERT_EQ(res, napi_ok);
892 ASSERT_EQ(isShared, true);
893
894 bool isArray = false;
895 res = napi_is_array(env, result, &isArray);
896 ASSERT_EQ(res, napi_ok);
897 ASSERT_EQ(isArray, true);
898
899 uint32_t length = 0;
900 res = napi_get_array_length(env, result, &length);
901 ASSERT_EQ(res, napi_ok);
902 ASSERT_EQ(length, 0);
903 }
904
905 /**
906 * @tc.name: CreateSendableArrayWithLength003
907 * @tc.desc: Test napi_create_sendable_array_with_length.
908 * @tc.type: FUNC
909 */
910 HWTEST_F(NapiSendableTest, CreateSendableArrayWithLength003, testing::ext::TestSize.Level1)
911 {
912 static uint32_t LENGTH = 1024;
913 ASSERT_NE(engine_, nullptr);
914 napi_env env = reinterpret_cast<napi_env>(engine_);
915 napi_status res = napi_ok;
916
917 napi_value result = nullptr;
918 res = napi_create_sendable_array_with_length(env, LENGTH, &result);
919 ASSERT_EQ(res, napi_ok);
920
921 bool isShared = false;
922 res = napi_is_sendable(env, result, &isShared);
923 ASSERT_EQ(res, napi_ok);
924 ASSERT_EQ(isShared, true);
925
926 bool isArray = false;
927 res = napi_is_array(env, result, &isArray);
928 ASSERT_EQ(res, napi_ok);
929 ASSERT_EQ(isArray, true);
930
931 uint32_t length = 0;
932 res = napi_get_array_length(env, result, &length);
933 ASSERT_EQ(res, napi_ok);
934 ASSERT_EQ(length, LENGTH);
935
936 napi_value value = nullptr;
937 napi_value boolTrue = nullptr;
938 bool ret = false;
939 res = napi_get_boolean(env, true, &boolTrue);
940 ASSERT_EQ(res, napi_ok);
941
942 res = napi_set_element(env, result, 0, boolTrue);
943 ASSERT_EQ(res, napi_ok);
944 res = napi_get_element(env, result, 0, &value);
945 ASSERT_EQ(res, napi_ok);
946 res = napi_get_value_bool(env, value, &ret);
947 ASSERT_EQ(res, napi_ok);
948 ASSERT_EQ(ret, true);
949
950 res = napi_set_element(env, result, LENGTH - 1, boolTrue);
951 ASSERT_EQ(res, napi_ok);
952 res = napi_get_element(env, result, LENGTH - 1, &value);
953 ASSERT_EQ(res, napi_ok);
954 res = napi_get_value_bool(env, value, &ret);
955 ASSERT_EQ(res, napi_ok);
956 ASSERT_EQ(ret, true);
957 }
958
959 /**
960 * @tc.name: CreateSendableArrayWithLength004
961 * @tc.desc: Test napi_create_sendable_array_with_length.
962 * @tc.type: FUNC
963 */
964 HWTEST_F(NapiSendableTest, CreateSendableArrayWithLength004, testing::ext::TestSize.Level1)
965 {
966 static uint32_t LENGTH = 1024;
967 ASSERT_NE(engine_, nullptr);
968 napi_env env = reinterpret_cast<napi_env>(engine_);
969 napi_status res = napi_ok;
970
971 napi_value result = nullptr;
972 res = napi_create_sendable_array_with_length(env, LENGTH, &result);
973 ASSERT_EQ(res, napi_ok);
974
975 bool isShared = false;
976 res = napi_is_sendable(env, result, &isShared);
977 ASSERT_EQ(res, napi_ok);
978 ASSERT_EQ(isShared, true);
979
980 bool isArray = false;
981 res = napi_is_array(env, result, &isArray);
982 ASSERT_EQ(res, napi_ok);
983 ASSERT_EQ(isArray, true);
984
985 uint32_t length = 0;
986 res = napi_get_array_length(env, result, &length);
987 ASSERT_EQ(res, napi_ok);
988 ASSERT_EQ(length, LENGTH);
989
990 napi_value value = nullptr;
991 napi_value boolTrue = nullptr;
992 bool ret = false;
993 res = napi_get_boolean(env, true, &boolTrue);
994 ASSERT_EQ(res, napi_ok);
995
996 res = napi_get_element(env, result, 1, &value);
997 ASSERT_EQ(res, napi_ok);
998 napi_valuetype type = napi_undefined;
999 res = napi_typeof(env, value, &type);
1000 ASSERT_EQ(res, napi_ok);
1001 ASSERT_EQ(napi_undefined, napi_undefined);
1002
1003 res = napi_set_element(env, result, LENGTH, boolTrue);
1004 ASSERT_EQ(res, napi_ok);
1005 res = napi_get_element(env, result, LENGTH, &value);
1006 ASSERT_EQ(res, napi_ok);
1007 res = napi_get_value_bool(env, value, &ret);
1008 ASSERT_EQ(res, napi_ok);
1009 ASSERT_EQ(ret, true);
1010
1011 res = napi_get_element(env, result, LENGTH + 1, &value);
1012 ASSERT_EQ(res, napi_ok);
1013 napi_valuetype getType = napi_undefined;
1014 res = napi_typeof(env, value, &getType);
1015 ASSERT_EQ(res, napi_ok);
1016 ASSERT_EQ(getType, napi_undefined);
1017 }
1018
1019 /**
1020 * @tc.name: CreateSendableArrayBuffer001
1021 * @tc.desc: Test napi_create_sendable_arraybuffer.
1022 * @tc.type: FUNC
1023 */
1024 HWTEST_F(NapiSendableTest, CreateSendableArrayBuffer001, testing::ext::TestSize.Level1)
1025 {
1026 static size_t LENGTH = 1024;
1027 ASSERT_NE(engine_, nullptr);
1028 napi_env env = reinterpret_cast<napi_env>(engine_);
1029 napi_status res = napi_ok;
1030
1031 napi_value result = nullptr;
1032 res = napi_create_sendable_arraybuffer(env, LENGTH, nullptr, &result);
1033 ASSERT_EQ(res, napi_invalid_arg);
1034
1035 void *data;
1036 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, nullptr);
1037 ASSERT_EQ(res, napi_invalid_arg);
1038
1039 res = napi_create_sendable_arraybuffer(env, LENGTH, nullptr, nullptr);
1040 ASSERT_EQ(res, napi_invalid_arg);
1041 }
1042
1043 /**
1044 * @tc.name: CreateSendableArrayBuffer002
1045 * @tc.desc: Test napi_create_sendable_arraybuffer.
1046 * @tc.type: FUNC
1047 */
1048 HWTEST_F(NapiSendableTest, CreateSendableArrayBuffer002, testing::ext::TestSize.Level1)
1049 {
1050 static size_t LENGTH = 1024;
1051 ASSERT_NE(engine_, nullptr);
1052 napi_env env = reinterpret_cast<napi_env>(engine_);
1053 napi_status res = napi_ok;
1054
1055 void *data;
1056 napi_value result = nullptr;
1057 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &result);
1058 ASSERT_EQ(res, napi_ok);
1059
1060 bool isShared = false;
1061 res = napi_is_sendable(env, result, &isShared);
1062 ASSERT_EQ(res, napi_ok);
1063 ASSERT_EQ(isShared, true);
1064
1065 bool isArrayBuffer = false;
1066 res = napi_is_arraybuffer(env, result, &isArrayBuffer);
1067 ASSERT_EQ(res, napi_ok);
1068 ASSERT_EQ(isArrayBuffer, true);
1069
1070 void *getData = nullptr;
1071 size_t length = 0;
1072 res = napi_get_arraybuffer_info(env, result, &getData, &length);
1073 ASSERT_EQ(res, napi_ok);
1074 ASSERT_EQ(length, LENGTH);
1075 ASSERT_EQ(getData, data);
1076 }
1077
1078 /**
1079 * @tc.name: CreateSendableTypedArray001
1080 * @tc.desc: Test napi_create_sendable_arraybuffer.
1081 * @tc.type: FUNC
1082 */
1083 HWTEST_F(NapiSendableTest, CreateSendableTypedArray001, testing::ext::TestSize.Level1)
1084 {
1085 static size_t LENGTH = 1024;
1086 ASSERT_NE(engine_, nullptr);
1087 napi_env env = reinterpret_cast<napi_env>(engine_);
1088 napi_status res = napi_ok;
1089
1090 void *data;
1091 napi_value arraybuffer = nullptr;
1092 napi_value result = nullptr;
1093 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1094 ASSERT_EQ(res, napi_ok);
1095
1096 bool isShared = false;
1097 res = napi_is_sendable(env, arraybuffer, &isShared);
1098 ASSERT_EQ(res, napi_ok);
1099 ASSERT_EQ(isShared, true);
1100
1101 res = napi_create_sendable_typedarray(env, napi_uint8_clamped_array, LENGTH / 2, arraybuffer, 1, &result);
1102 ASSERT_EQ(res, napi_ok);
1103
1104 res = napi_create_sendable_typedarray(env, napi_uint8_array, LENGTH / 2, arraybuffer, 1, nullptr);
1105 ASSERT_EQ(res, napi_invalid_arg);
1106
1107 res = napi_create_sendable_typedarray(env, napi_uint8_array, LENGTH / 2, nullptr, 1, &result);
1108 ASSERT_EQ(res, napi_invalid_arg);
1109
1110 res = napi_create_sendable_typedarray(env, napi_int8_array, LENGTH / 2, nullptr, 1, &result);
1111 ASSERT_EQ(res, napi_invalid_arg);
1112
1113 res = napi_create_sendable_typedarray(env, napi_int8_array, LENGTH / 2, nullptr, 1, &result);
1114 ASSERT_EQ(res, napi_invalid_arg);
1115
1116 res = napi_create_sendable_typedarray(env, napi_uint16_array, LENGTH / 2, nullptr, 1, &result);
1117 ASSERT_EQ(res, napi_invalid_arg);
1118
1119 res = napi_create_sendable_typedarray(env, napi_uint16_array, LENGTH / 2, nullptr, 1, &result);
1120 ASSERT_EQ(res, napi_invalid_arg);
1121
1122 res = napi_create_sendable_typedarray(env, napi_int32_array, LENGTH / 2, nullptr, 1, &result);
1123 ASSERT_EQ(res, napi_invalid_arg);
1124
1125 res = napi_create_sendable_typedarray(env, napi_int32_array, LENGTH / 2, nullptr, 1, &result);
1126 ASSERT_EQ(res, napi_invalid_arg);
1127
1128 res = napi_create_sendable_typedarray(env, napi_uint32_array, LENGTH / 2, nullptr, 1, &result);
1129 ASSERT_EQ(res, napi_invalid_arg);
1130
1131 res = napi_create_sendable_typedarray(env, napi_uint32_array, LENGTH / 2, nullptr, 1, &result);
1132 ASSERT_EQ(res, napi_invalid_arg);
1133
1134 res = napi_create_sendable_typedarray(env, napi_float32_array, LENGTH / 2, nullptr, 1, &result);
1135 ASSERT_EQ(res, napi_invalid_arg);
1136
1137 res = napi_create_sendable_typedarray(env, napi_float32_array, LENGTH / 2, nullptr, 1, &result);
1138 ASSERT_EQ(res, napi_invalid_arg);
1139 }
1140
1141 /**
1142 * @tc.name: CreateSendableTypedArray002
1143 * @tc.desc: Test napi_create_sendable_arraybuffer.
1144 * @tc.type: FUNC
1145 */
1146 HWTEST_F(NapiSendableTest, CreateSendableTypedArray002, testing::ext::TestSize.Level1)
1147 {
1148 static size_t LENGTH = 1024;
1149 static size_t OFFSET = 128;
1150 ASSERT_NE(engine_, nullptr);
1151 napi_env env = reinterpret_cast<napi_env>(engine_);
1152 napi_status res = napi_ok;
1153
1154 void *data;
1155 napi_value arraybuffer = nullptr;
1156 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1157 ASSERT_EQ(res, napi_ok);
1158
1159 napi_value result = nullptr;
1160 res = napi_create_sendable_typedarray(env, napi_uint8_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1161 ASSERT_EQ(res, napi_ok);
1162
1163 bool isShared = false;
1164 res = napi_is_sendable(env, result, &isShared);
1165 ASSERT_EQ(res, napi_ok);
1166 ASSERT_EQ(isShared, true);
1167
1168 bool isTypedArray = false;
1169 res = napi_is_typedarray(env, result, &isTypedArray);
1170 ASSERT_EQ(res, napi_ok);
1171 ASSERT_EQ(isTypedArray, true);
1172
1173 napi_typedarray_type type = napi_int8_array;
1174 size_t length = 0;
1175 void *getData = nullptr;
1176 napi_value getArrayBuffer = nullptr;
1177 size_t byteOffset = 0;
1178 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1179 ASSERT_EQ(res, napi_ok);
1180
1181 bool isEqual = false;
1182 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1183 ASSERT_EQ(res, napi_ok);
1184
1185 ASSERT_EQ(type, napi_uint8_array);
1186 ASSERT_EQ(length, LENGTH / 2);
1187 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1188 ASSERT_EQ(isEqual, true);
1189 ASSERT_EQ(byteOffset, OFFSET);
1190 }
1191
1192 /**
1193 * @tc.name: CreateSendableTypedArray003
1194 * @tc.desc: Test napi_create_sendable_arraybuffer.
1195 * @tc.type: FUNC
1196 */
1197 HWTEST_F(NapiSendableTest, CreateSendableTypedArray003, testing::ext::TestSize.Level1)
1198 {
1199 static size_t LENGTH = 1024;
1200 static size_t OFFSET = 128;
1201 ASSERT_NE(engine_, nullptr);
1202 napi_env env = reinterpret_cast<napi_env>(engine_);
1203 napi_status res = napi_ok;
1204
1205 void *data;
1206 napi_value arraybuffer = nullptr;
1207 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1208 ASSERT_EQ(res, napi_ok);
1209
1210 napi_value result = nullptr;
1211 res = napi_create_sendable_typedarray(env, napi_int8_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1212 ASSERT_EQ(res, napi_ok);
1213
1214 bool isShared = false;
1215 res = napi_is_sendable(env, result, &isShared);
1216 ASSERT_EQ(res, napi_ok);
1217 ASSERT_EQ(isShared, true);
1218
1219 bool isTypedArray = false;
1220 res = napi_is_typedarray(env, result, &isTypedArray);
1221 ASSERT_EQ(res, napi_ok);
1222 ASSERT_EQ(isTypedArray, true);
1223
1224 napi_typedarray_type type = napi_uint8_array;
1225 size_t length = 0;
1226 void *getData = nullptr;
1227 napi_value getArrayBuffer = nullptr;
1228 size_t byteOffset = 0;
1229 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1230 ASSERT_EQ(res, napi_ok);
1231
1232 bool isEqual = false;
1233 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1234 ASSERT_EQ(res, napi_ok);
1235
1236 ASSERT_EQ(type, napi_int8_array);
1237 ASSERT_EQ(length, LENGTH / 2);
1238 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1239 ASSERT_EQ(isEqual, true);
1240 ASSERT_EQ(byteOffset, OFFSET);
1241 }
1242
1243 /**
1244 * @tc.name: CreateSendableTypedArray004
1245 * @tc.desc: Test napi_create_sendable_arraybuffer.
1246 * @tc.type: FUNC
1247 */
1248 HWTEST_F(NapiSendableTest, CreateSendableTypedArray004, testing::ext::TestSize.Level1)
1249 {
1250 static size_t LENGTH = 1024;
1251 static size_t OFFSET = 0;
1252 ASSERT_NE(engine_, nullptr);
1253 napi_env env = reinterpret_cast<napi_env>(engine_);
1254 napi_status res = napi_ok;
1255
1256 void *data;
1257 napi_value arraybuffer = nullptr;
1258 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1259 ASSERT_EQ(res, napi_ok);
1260
1261 napi_value result = nullptr;
1262 res = napi_create_sendable_typedarray(env, napi_int16_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1263 ASSERT_EQ(res, napi_ok);
1264
1265 bool isShared = false;
1266 res = napi_is_sendable(env, result, &isShared);
1267 ASSERT_EQ(res, napi_ok);
1268 ASSERT_EQ(isShared, true);
1269
1270 bool isTypedArray = false;
1271 res = napi_is_typedarray(env, result, &isTypedArray);
1272 ASSERT_EQ(res, napi_ok);
1273 ASSERT_EQ(isTypedArray, true);
1274
1275 napi_typedarray_type type = napi_uint8_array;
1276 size_t length = 0;
1277 void *getData = nullptr;
1278 napi_value getArrayBuffer = nullptr;
1279 size_t byteOffset = 0;
1280 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1281 ASSERT_EQ(res, napi_ok);
1282
1283 bool isEqual = false;
1284 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1285 ASSERT_EQ(res, napi_ok);
1286
1287 ASSERT_EQ(type, napi_int16_array);
1288 ASSERT_EQ(length, LENGTH);
1289 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1290 ASSERT_EQ(isEqual, true);
1291 ASSERT_EQ(byteOffset, OFFSET);
1292 }
1293
1294 /**
1295 * @tc.name: CreateSendableTypedArray005
1296 * @tc.desc: Test napi_create_sendable_arraybuffer.
1297 * @tc.type: FUNC
1298 */
1299 HWTEST_F(NapiSendableTest, CreateSendableTypedArray005, testing::ext::TestSize.Level1)
1300 {
1301 static size_t LENGTH = 1024;
1302 static size_t OFFSET = 0;
1303 ASSERT_NE(engine_, nullptr);
1304 napi_env env = reinterpret_cast<napi_env>(engine_);
1305 napi_status res = napi_ok;
1306
1307 void *data;
1308 napi_value arraybuffer = nullptr;
1309 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1310 ASSERT_EQ(res, napi_ok);
1311
1312 napi_value result = nullptr;
1313 res = napi_create_sendable_typedarray(env, napi_uint16_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1314 ASSERT_EQ(res, napi_ok);
1315
1316 bool isShared = false;
1317 res = napi_is_sendable(env, result, &isShared);
1318 ASSERT_EQ(res, napi_ok);
1319 ASSERT_EQ(isShared, true);
1320
1321 bool isTypedArray = false;
1322 res = napi_is_typedarray(env, result, &isTypedArray);
1323 ASSERT_EQ(res, napi_ok);
1324 ASSERT_EQ(isTypedArray, true);
1325
1326 napi_typedarray_type type = napi_uint8_array;
1327 size_t length = 0;
1328 void *getData = nullptr;
1329 napi_value getArrayBuffer = nullptr;
1330 size_t byteOffset = 0;
1331 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1332 ASSERT_EQ(res, napi_ok);
1333
1334 bool isEqual = false;
1335 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1336 ASSERT_EQ(res, napi_ok);
1337
1338 ASSERT_EQ(type, napi_uint16_array);
1339 ASSERT_EQ(length, LENGTH);
1340 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1341 ASSERT_EQ(isEqual, true);
1342 ASSERT_EQ(byteOffset, OFFSET);
1343 }
1344
1345 /**
1346 * @tc.name: CreateSendableTypedArray006
1347 * @tc.desc: Test napi_create_sendable_arraybuffer.
1348 * @tc.type: FUNC
1349 */
1350 HWTEST_F(NapiSendableTest, CreateSendableTypedArray006, testing::ext::TestSize.Level1)
1351 {
1352 static size_t LENGTH = 1024;
1353 static size_t OFFSET = 0;
1354 ASSERT_NE(engine_, nullptr);
1355 napi_env env = reinterpret_cast<napi_env>(engine_);
1356 napi_status res = napi_ok;
1357
1358 void *data;
1359 napi_value arraybuffer = nullptr;
1360 res = napi_create_sendable_arraybuffer(env, LENGTH * 2, &data, &arraybuffer);
1361 ASSERT_EQ(res, napi_ok);
1362
1363 napi_value result = nullptr;
1364 res = napi_create_sendable_typedarray(env, napi_uint32_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1365 ASSERT_EQ(res, napi_ok);
1366
1367 bool isShared = false;
1368 res = napi_is_sendable(env, result, &isShared);
1369 ASSERT_EQ(res, napi_ok);
1370 ASSERT_EQ(isShared, true);
1371
1372 bool isTypedArray = false;
1373 res = napi_is_typedarray(env, result, &isTypedArray);
1374 ASSERT_EQ(res, napi_ok);
1375 ASSERT_EQ(isTypedArray, true);
1376
1377 napi_typedarray_type type = napi_int8_array;
1378 size_t length = 0;
1379 void *getData = nullptr;
1380 napi_value getArrayBuffer = nullptr;
1381 size_t byteOffset = 0;
1382 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1383 ASSERT_EQ(res, napi_ok);
1384
1385 bool isEqual = false;
1386 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1387 ASSERT_EQ(res, napi_ok);
1388
1389 ASSERT_EQ(type, napi_uint32_array);
1390 ASSERT_EQ(length, LENGTH * 2);
1391 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1392 ASSERT_EQ(isEqual, true);
1393 ASSERT_EQ(byteOffset, OFFSET);
1394 }
1395
1396 /**
1397 * @tc.name: CreateSendableTypedArray007
1398 * @tc.desc: Test napi_create_sendable_arraybuffer.
1399 * @tc.type: FUNC
1400 */
1401 HWTEST_F(NapiSendableTest, CreateSendableTypedArray007, testing::ext::TestSize.Level1)
1402 {
1403 static size_t LENGTH = 1024;
1404 static size_t OFFSET = 0;
1405 ASSERT_NE(engine_, nullptr);
1406 napi_env env = reinterpret_cast<napi_env>(engine_);
1407 napi_status res = napi_ok;
1408
1409 void *data;
1410 napi_value arraybuffer = nullptr;
1411 res = napi_create_sendable_arraybuffer(env, LENGTH * 2, &data, &arraybuffer);
1412 ASSERT_EQ(res, napi_ok);
1413
1414 napi_value result = nullptr;
1415 res = napi_create_sendable_typedarray(env, napi_int32_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1416 ASSERT_EQ(res, napi_ok);
1417
1418 bool isShared = false;
1419 res = napi_is_sendable(env, result, &isShared);
1420 ASSERT_EQ(res, napi_ok);
1421 ASSERT_EQ(isShared, true);
1422
1423 bool isTypedArray = false;
1424 res = napi_is_typedarray(env, result, &isTypedArray);
1425 ASSERT_EQ(res, napi_ok);
1426 ASSERT_EQ(isTypedArray, true);
1427
1428 napi_typedarray_type type = napi_int8_array;
1429 size_t length = 0;
1430 void *getData = nullptr;
1431 napi_value getArrayBuffer = nullptr;
1432 size_t byteOffset = 0;
1433 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1434 ASSERT_EQ(res, napi_ok);
1435
1436 bool isEqual = false;
1437 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1438 ASSERT_EQ(res, napi_ok);
1439
1440 ASSERT_EQ(type, napi_int32_array);
1441 ASSERT_EQ(length, LENGTH * 2);
1442 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1443 ASSERT_EQ(isEqual, true);
1444 ASSERT_EQ(byteOffset, OFFSET);
1445 }
1446
1447 /**
1448 * @tc.name: CreateSendableTypedArray008
1449 * @tc.desc: Test napi_create_sendable_arraybuffer.
1450 * @tc.type: FUNC
1451 */
1452 HWTEST_F(NapiSendableTest, CreateSendableTypedArray008, testing::ext::TestSize.Level1)
1453 {
1454 static size_t LENGTH = 1024;
1455 static size_t OFFSET = 0;
1456 ASSERT_NE(engine_, nullptr);
1457 napi_env env = reinterpret_cast<napi_env>(engine_);
1458 napi_status res = napi_ok;
1459
1460 void *data;
1461 napi_value arraybuffer = nullptr;
1462 res = napi_create_sendable_arraybuffer(env, LENGTH * 2, &data, &arraybuffer);
1463 ASSERT_EQ(res, napi_ok);
1464
1465 napi_value result = nullptr;
1466 res = napi_create_sendable_typedarray(env, napi_float32_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1467 ASSERT_EQ(res, napi_ok);
1468
1469 bool isShared = false;
1470 res = napi_is_sendable(env, result, &isShared);
1471 ASSERT_EQ(res, napi_ok);
1472 ASSERT_EQ(isShared, true);
1473
1474 bool isTypedArray = false;
1475 res = napi_is_typedarray(env, result, &isTypedArray);
1476 ASSERT_EQ(res, napi_ok);
1477 ASSERT_EQ(isTypedArray, true);
1478
1479 napi_typedarray_type type = napi_int8_array;
1480 size_t length = 0;
1481 void *getData = nullptr;
1482 napi_value getArrayBuffer = nullptr;
1483 size_t byteOffset = 0;
1484 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1485 ASSERT_EQ(res, napi_ok);
1486
1487 bool isEqual = false;
1488 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1489 ASSERT_EQ(res, napi_ok);
1490
1491 ASSERT_EQ(type, napi_float32_array);
1492 ASSERT_EQ(length, LENGTH * 2);
1493 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1494 ASSERT_EQ(isEqual, true);
1495 ASSERT_EQ(byteOffset, OFFSET);
1496 }
1497
1498 /**
1499 * @tc.name: CreateSendableTypedArray009
1500 * @tc.desc: Test napi_create_sendable_arraybuffer.
1501 * @tc.type: FUNC
1502 */
1503 HWTEST_F(NapiSendableTest, CreateSendableTypedArray009, testing::ext::TestSize.Level1)
1504 {
1505 static size_t LENGTH = 1024;
1506 static size_t OFFSET = 128;
1507 ASSERT_NE(engine_, nullptr);
1508 napi_env env = reinterpret_cast<napi_env>(engine_);
1509 napi_status res = napi_ok;
1510
1511 void *data;
1512 napi_value arraybuffer = nullptr;
1513 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1514 ASSERT_EQ(res, napi_ok);
1515
1516 napi_value result = nullptr;
1517 res = napi_create_sendable_typedarray(env, napi_uint8_clamped_array, LENGTH / 2, arraybuffer, OFFSET, &result);
1518 ASSERT_EQ(res, napi_ok);
1519
1520 bool isShared = false;
1521 res = napi_is_sendable(env, result, &isShared);
1522 ASSERT_EQ(res, napi_ok);
1523 ASSERT_EQ(isShared, true);
1524
1525 bool isTypedArray = false;
1526 res = napi_is_typedarray(env, result, &isTypedArray);
1527 ASSERT_EQ(res, napi_ok);
1528 ASSERT_EQ(isTypedArray, true);
1529
1530 napi_typedarray_type type = napi_uint8_array;
1531 size_t length = 0;
1532 void *getData = nullptr;
1533 napi_value getArrayBuffer = nullptr;
1534 size_t byteOffset = 0;
1535 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1536 ASSERT_EQ(res, napi_ok);
1537
1538 bool isEqual = false;
1539 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1540 ASSERT_EQ(res, napi_ok);
1541
1542 ASSERT_EQ(type, napi_uint8_clamped_array);
1543 ASSERT_EQ(length, LENGTH / 2);
1544 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + OFFSET);
1545 ASSERT_EQ(isEqual, true);
1546 ASSERT_EQ(byteOffset, OFFSET);
1547 }
1548
1549 /**
1550 * @tc.name: CreateSendableTypedArray010
1551 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1552 * @tc.type: FUNC
1553 */
1554 HWTEST_F(NapiSendableTest, CreateSendableTypedArray010, testing::ext::TestSize.Level1)
1555 {
1556 static size_t LENGTH = 1024;
1557 ASSERT_NE(engine_, nullptr);
1558 napi_env env = reinterpret_cast<napi_env>(engine_);
1559 napi_status res = napi_ok;
1560
1561 void *data;
1562 napi_value arraybuffer = nullptr;
1563 napi_value result = nullptr;
1564 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1565 ASSERT_EQ(res, napi_ok);
1566
1567 bool isShared = false;
1568 res = napi_is_sendable(env, arraybuffer, &isShared);
1569 ASSERT_EQ(res, napi_ok);
1570 ASSERT_EQ(isShared, false);
1571
1572 res = napi_create_sendable_typedarray(env, napi_uint8_clamped_array, LENGTH / 2, arraybuffer, 1, &result);
1573 ASSERT_EQ(res, napi_arraybuffer_expected);
1574 }
1575
1576 /**
1577 * @tc.name: CreateSendableTypedArray011
1578 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1579 * @tc.type: FUNC
1580 */
1581 HWTEST_F(NapiSendableTest, CreateSendableTypedArray011, testing::ext::TestSize.Level1)
1582 {
1583 static size_t LENGTH = 1024;
1584 ASSERT_NE(engine_, nullptr);
1585 napi_env env = reinterpret_cast<napi_env>(engine_);
1586 napi_status res = napi_ok;
1587
1588 void *data;
1589 napi_value arraybuffer = nullptr;
1590 napi_value result = nullptr;
1591 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1592 ASSERT_EQ(res, napi_ok);
1593
1594 bool isShared = false;
1595 res = napi_is_sendable(env, arraybuffer, &isShared);
1596 ASSERT_EQ(res, napi_ok);
1597 ASSERT_EQ(isShared, false);
1598
1599 res = napi_create_sendable_typedarray(env, napi_uint8_array, LENGTH / 2, arraybuffer, 1, &result);
1600 ASSERT_EQ(res, napi_arraybuffer_expected);
1601 }
1602
1603 /**
1604 * @tc.name: CreateSendableTypedArray012
1605 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1606 * @tc.type: FUNC
1607 */
1608 HWTEST_F(NapiSendableTest, CreateSendableTypedArray012, testing::ext::TestSize.Level1)
1609 {
1610 static size_t LENGTH = 1024;
1611 ASSERT_NE(engine_, nullptr);
1612 napi_env env = reinterpret_cast<napi_env>(engine_);
1613 napi_status res = napi_ok;
1614
1615 void *data;
1616 napi_value arraybuffer = nullptr;
1617 napi_value result = nullptr;
1618 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1619 ASSERT_EQ(res, napi_ok);
1620
1621 bool isShared = false;
1622 res = napi_is_sendable(env, arraybuffer, &isShared);
1623 ASSERT_EQ(res, napi_ok);
1624 ASSERT_EQ(isShared, false);
1625
1626 res = napi_create_sendable_typedarray(env, napi_int8_array, LENGTH / 2, arraybuffer, 1, &result);
1627 ASSERT_EQ(res, napi_arraybuffer_expected);
1628 }
1629
1630 /**
1631 * @tc.name: CreateSendableTypedArray013
1632 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1633 * @tc.type: FUNC
1634 */
1635 HWTEST_F(NapiSendableTest, CreateSendableTypedArray013, testing::ext::TestSize.Level1)
1636 {
1637 static size_t LENGTH = 1024;
1638 ASSERT_NE(engine_, nullptr);
1639 napi_env env = reinterpret_cast<napi_env>(engine_);
1640 napi_status res = napi_ok;
1641
1642 void *data;
1643 napi_value arraybuffer = nullptr;
1644 napi_value result = nullptr;
1645 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1646 ASSERT_EQ(res, napi_ok);
1647
1648 bool isShared = false;
1649 res = napi_is_sendable(env, arraybuffer, &isShared);
1650 ASSERT_EQ(res, napi_ok);
1651 ASSERT_EQ(isShared, false);
1652
1653 res = napi_create_sendable_typedarray(env, napi_uint16_array, LENGTH / 2, arraybuffer, 1, &result);
1654 ASSERT_EQ(res, napi_arraybuffer_expected);
1655 }
1656
1657 /**
1658 * @tc.name: CreateSendableTypedArray014
1659 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1660 * @tc.type: FUNC
1661 */
1662 HWTEST_F(NapiSendableTest, CreateSendableTypedArray014, testing::ext::TestSize.Level1)
1663 {
1664 static size_t LENGTH = 1024;
1665 ASSERT_NE(engine_, nullptr);
1666 napi_env env = reinterpret_cast<napi_env>(engine_);
1667 napi_status res = napi_ok;
1668
1669 void *data;
1670 napi_value arraybuffer = nullptr;
1671 napi_value result = nullptr;
1672 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1673 ASSERT_EQ(res, napi_ok);
1674
1675 bool isShared = false;
1676 res = napi_is_sendable(env, arraybuffer, &isShared);
1677 ASSERT_EQ(res, napi_ok);
1678 ASSERT_EQ(isShared, false);
1679
1680 res = napi_create_sendable_typedarray(env, napi_int16_array, LENGTH / 2, arraybuffer, 1, &result);
1681 ASSERT_EQ(res, napi_arraybuffer_expected);
1682 }
1683
1684 /**
1685 * @tc.name: CreateSendableTypedArray015
1686 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1687 * @tc.type: FUNC
1688 */
1689 HWTEST_F(NapiSendableTest, CreateSendableTypedArray015, testing::ext::TestSize.Level1)
1690 {
1691 static size_t LENGTH = 1024;
1692 ASSERT_NE(engine_, nullptr);
1693 napi_env env = reinterpret_cast<napi_env>(engine_);
1694 napi_status res = napi_ok;
1695
1696 void *data;
1697 napi_value arraybuffer = nullptr;
1698 napi_value result = nullptr;
1699 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1700 ASSERT_EQ(res, napi_ok);
1701
1702 bool isShared = false;
1703 res = napi_is_sendable(env, arraybuffer, &isShared);
1704 ASSERT_EQ(res, napi_ok);
1705 ASSERT_EQ(isShared, false);
1706
1707 res = napi_create_sendable_typedarray(env, napi_uint32_array, LENGTH / 2, arraybuffer, 1, &result);
1708 ASSERT_EQ(res, napi_arraybuffer_expected);
1709 }
1710
1711 /**
1712 * @tc.name: CreateSendableTypedArray016
1713 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1714 * @tc.type: FUNC
1715 */
1716 HWTEST_F(NapiSendableTest, CreateSendableTypedArray016, testing::ext::TestSize.Level1)
1717 {
1718 static size_t LENGTH = 1024;
1719 ASSERT_NE(engine_, nullptr);
1720 napi_env env = reinterpret_cast<napi_env>(engine_);
1721 napi_status res = napi_ok;
1722
1723 void *data;
1724 napi_value arraybuffer = nullptr;
1725 napi_value result = nullptr;
1726 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1727 ASSERT_EQ(res, napi_ok);
1728
1729 bool isShared = false;
1730 res = napi_is_sendable(env, arraybuffer, &isShared);
1731 ASSERT_EQ(res, napi_ok);
1732 ASSERT_EQ(isShared, false);
1733
1734 res = napi_create_sendable_typedarray(env, napi_int32_array, LENGTH / 2, arraybuffer, 1, &result);
1735 ASSERT_EQ(res, napi_arraybuffer_expected);
1736 }
1737
1738 /**
1739 * @tc.name: CreateSendableTypedArray017
1740 * @tc.desc: Test napi_create_sendable_typedarray with non-sendable arraybuffer.
1741 * @tc.type: FUNC
1742 */
1743 HWTEST_F(NapiSendableTest, CreateSendableTypedArray017, testing::ext::TestSize.Level1)
1744 {
1745 static size_t LENGTH = 1024;
1746 ASSERT_NE(engine_, nullptr);
1747 napi_env env = reinterpret_cast<napi_env>(engine_);
1748 napi_status res = napi_ok;
1749
1750 void *data;
1751 napi_value arraybuffer = nullptr;
1752 napi_value result = nullptr;
1753 res = napi_create_arraybuffer(env, LENGTH, &data, &arraybuffer);
1754 ASSERT_EQ(res, napi_ok);
1755
1756 bool isShared = false;
1757 res = napi_is_sendable(env, arraybuffer, &isShared);
1758 ASSERT_EQ(res, napi_ok);
1759 ASSERT_EQ(isShared, false);
1760
1761 res = napi_create_sendable_typedarray(env, napi_float32_array, LENGTH / 2, arraybuffer, 1, &result);
1762 ASSERT_EQ(res, napi_arraybuffer_expected);
1763 }
1764
1765 /**
1766 * @tc.name: CreateSendableTypedArray018
1767 * @tc.desc: Test napi_create_sendable_arraybuffer.
1768 * @tc.type: FUNC
1769 */
1770 HWTEST_F(NapiSendableTest, CreateSendableTypedArray018, testing::ext::TestSize.Level1)
1771 {
1772 static size_t LENGTH = 1024;
1773 static size_t OFFSET = 0;
1774 ASSERT_NE(engine_, nullptr);
1775 napi_env env = reinterpret_cast<napi_env>(engine_);
1776
1777 void* data;
1778 napi_value arraybuffer = nullptr;
1779 ASSERT_CHECK_CALL(napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer));
1780
1781 for (int type = napi_int8_array; type <= napi_float32_array; ++type) {
1782 napi_value result = nullptr;
1783 ASSERT_CHECK_CALL(napi_create_sendable_typedarray(env, static_cast<napi_typedarray_type>(type), LENGTH / 4,
1784 arraybuffer, OFFSET, &result));
1785 bool isTypedArray = false;
1786 ASSERT_CHECK_CALL(napi_is_typedarray(env, result, &isTypedArray));
1787 ASSERT_EQ(isTypedArray, true);
1788 }
1789 }
1790
1791 /**
1792 * @tc.name: CreateSendableTypedArray019
1793 * @tc.desc: Test napi_create_sendable_arraybuffer.
1794 * @tc.type: FUNC
1795 */
1796 HWTEST_F(NapiSendableTest, CreateSendableTypedArray019, testing::ext::TestSize.Level1)
1797 {
1798 ASSERT_NE(engine_, nullptr);
1799 napi_env env = reinterpret_cast<napi_env>(engine_);
1800 napi_status res = napi_ok;
1801
1802 void *data;
1803 napi_value arraybuffer = nullptr;
1804 res = napi_create_sendable_arraybuffer(env, 57, &data, &arraybuffer);
1805 ASSERT_EQ(res, napi_ok);
1806
1807 napi_value result = nullptr;
1808 res = napi_create_sendable_typedarray(env, napi_float64_array, 6, arraybuffer, 8, &result);
1809 ASSERT_EQ(res, napi_ok);
1810
1811 bool isShared = false;
1812 res = napi_is_sendable(env, result, &isShared);
1813 ASSERT_EQ(res, napi_ok);
1814 ASSERT_EQ(isShared, true);
1815
1816 bool isTypedArray = false;
1817 res = napi_is_typedarray(env, result, &isTypedArray);
1818 ASSERT_EQ(res, napi_ok);
1819 ASSERT_EQ(isTypedArray, true);
1820
1821 napi_typedarray_type type = napi_uint8_array;
1822 size_t length = 0;
1823 void *getData = nullptr;
1824 napi_value getArrayBuffer = nullptr;
1825 size_t byteOffset = 0;
1826 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1827 ASSERT_EQ(res, napi_ok);
1828
1829 bool isEqual = false;
1830 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1831 ASSERT_EQ(res, napi_ok);
1832
1833 ASSERT_EQ(type, napi_float64_array);
1834 ASSERT_EQ(length, 48);
1835 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + 8);
1836 ASSERT_EQ(isEqual, true);
1837 ASSERT_EQ(byteOffset, 8);
1838 }
1839
1840 /**
1841 * @tc.name: CreateSendableTypedArray020
1842 * @tc.desc: Test napi_create_sendable_arraybuffer.
1843 * @tc.type: FUNC
1844 */
1845 HWTEST_F(NapiSendableTest, CreateSendableTypedArray020, testing::ext::TestSize.Level1)
1846 {
1847 ASSERT_NE(engine_, nullptr);
1848 napi_env env = reinterpret_cast<napi_env>(engine_);
1849 napi_status res = napi_ok;
1850
1851 void *data;
1852 napi_value arraybuffer = nullptr;
1853 res = napi_create_sendable_arraybuffer(env, 57, &data, &arraybuffer);
1854 ASSERT_EQ(res, napi_ok);
1855
1856 napi_value result = nullptr;
1857 res = napi_create_sendable_typedarray(env, napi_bigint64_array, 6, arraybuffer, 8, &result);
1858 ASSERT_EQ(res, napi_ok);
1859
1860 bool isShared = false;
1861 res = napi_is_sendable(env, result, &isShared);
1862 ASSERT_EQ(res, napi_ok);
1863 ASSERT_EQ(isShared, true);
1864
1865 bool isTypedArray = false;
1866 res = napi_is_typedarray(env, result, &isTypedArray);
1867 ASSERT_EQ(res, napi_ok);
1868 ASSERT_EQ(isTypedArray, true);
1869
1870 napi_typedarray_type type = napi_uint8_array;
1871 size_t length = 0;
1872 void *getData = nullptr;
1873 napi_value getArrayBuffer = nullptr;
1874 size_t byteOffset = 0;
1875 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1876 ASSERT_EQ(res, napi_ok);
1877
1878 bool isEqual = false;
1879 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1880 ASSERT_EQ(res, napi_ok);
1881
1882 ASSERT_EQ(type, napi_bigint64_array);
1883 ASSERT_EQ(length, 48);
1884 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + 8);
1885 ASSERT_EQ(isEqual, true);
1886 ASSERT_EQ(byteOffset, 8);
1887 }
1888
1889 /**
1890 * @tc.name: CreateSendableTypedArray021
1891 * @tc.desc: Test napi_create_sendable_arraybuffer.
1892 * @tc.type: FUNC
1893 */
1894 HWTEST_F(NapiSendableTest, CreateSendableTypedArray021, testing::ext::TestSize.Level1)
1895 {
1896 ASSERT_NE(engine_, nullptr);
1897 napi_env env = reinterpret_cast<napi_env>(engine_);
1898 napi_status res = napi_ok;
1899
1900 void *data;
1901 napi_value arraybuffer = nullptr;
1902 res = napi_create_sendable_arraybuffer(env, 57, &data, &arraybuffer);
1903 ASSERT_EQ(res, napi_ok);
1904
1905 napi_value result = nullptr;
1906 res = napi_create_sendable_typedarray(env, napi_biguint64_array, 6, arraybuffer, 8, &result);
1907 ASSERT_EQ(res, napi_ok);
1908
1909 bool isShared = false;
1910 res = napi_is_sendable(env, result, &isShared);
1911 ASSERT_EQ(res, napi_ok);
1912 ASSERT_EQ(isShared, true);
1913
1914 bool isTypedArray = false;
1915 res = napi_is_typedarray(env, result, &isTypedArray);
1916 ASSERT_EQ(res, napi_ok);
1917 ASSERT_EQ(isTypedArray, true);
1918
1919 napi_typedarray_type type = napi_uint8_array;
1920 size_t length = 0;
1921 void *getData = nullptr;
1922 napi_value getArrayBuffer = nullptr;
1923 size_t byteOffset = 0;
1924 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
1925 ASSERT_EQ(res, napi_ok);
1926
1927 bool isEqual = false;
1928 res = napi_strict_equals(env, arraybuffer, getArrayBuffer, &isEqual);
1929 ASSERT_EQ(res, napi_ok);
1930
1931 ASSERT_EQ(type, napi_biguint64_array);
1932 ASSERT_EQ(length, 48);
1933 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(data) + 8);
1934 ASSERT_EQ(isEqual, true);
1935 ASSERT_EQ(byteOffset, 8);
1936 }
1937
1938 /**
1939 * @tc.name: CreateSendableTypedArray022
1940 * @tc.desc: Test napi_create_sendable_arraybuffer.
1941 * @tc.type: FUNC
1942 */
1943 HWTEST_F(NapiSendableTest, CreateSendableTypedArray022, testing::ext::TestSize.Level1)
1944 {
1945 static size_t LENGTH = 1024;
1946 ASSERT_NE(engine_, nullptr);
1947 napi_env env = reinterpret_cast<napi_env>(engine_);
1948 napi_status res = napi_ok;
1949
1950 void *data;
1951 napi_value arraybuffer = nullptr;
1952 napi_value result = nullptr;
1953 res = napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1954 ASSERT_EQ(res, napi_ok);
1955
1956 bool isShared = false;
1957 res = napi_is_sendable(env, arraybuffer, &isShared);
1958 ASSERT_EQ(res, napi_ok);
1959 ASSERT_EQ(isShared, true);
1960
1961 res = napi_create_sendable_typedarray(env, napi_uint8_clamped_array, LENGTH / 2, arraybuffer, 1, &result);
1962 ASSERT_EQ(res, napi_ok);
1963
1964 res = napi_create_sendable_typedarray(env, napi_float64_array, LENGTH / 2, nullptr, 1, &result);
1965 ASSERT_EQ(res, napi_invalid_arg);
1966
1967 res = napi_create_sendable_typedarray(env, napi_float64_array, LENGTH / 2, nullptr, 1, &result);
1968 ASSERT_EQ(res, napi_invalid_arg);
1969
1970 res = napi_create_sendable_typedarray(env, napi_bigint64_array, LENGTH / 2, nullptr, 1, &result);
1971 ASSERT_EQ(res, napi_invalid_arg);
1972
1973 res = napi_create_sendable_typedarray(env, napi_bigint64_array, LENGTH / 2, nullptr, 1, &result);
1974 ASSERT_EQ(res, napi_invalid_arg);
1975
1976 res = napi_create_sendable_typedarray(env, napi_biguint64_array, LENGTH / 2, nullptr, 1, &result);
1977 ASSERT_EQ(res, napi_invalid_arg);
1978
1979 res = napi_create_sendable_typedarray(env, napi_biguint64_array, LENGTH / 2, nullptr, 1, &result);
1980 ASSERT_EQ(res, napi_invalid_arg);
1981 }
1982
1983 /**
1984 * @tc.name: IsDetachedSendableArrayBufferTest001
1985 * @tc.desc: Test is DetachedSendableArrayBuffer.
1986 * @tc.type: FUNC
1987 */
1988 HWTEST_F(NapiSendableTest, IsDetachedSendableArrayBufferTest001, testing::ext::TestSize.Level1)
1989 {
1990 static constexpr size_t arrayBufferSize = 1024;
1991 napi_env env = (napi_env)engine_;
1992 napi_value arrayBuffer = nullptr;
1993 void* arrayBufferPtr = nullptr;
1994 napi_create_sendable_arraybuffer(env, arrayBufferSize, &arrayBufferPtr, &arrayBuffer);
1995
1996 auto out = napi_detach_arraybuffer(env, arrayBuffer);
1997 if (out == napi_ok) {
1998 arrayBufferPtr = nullptr;
1999 }
2000 ASSERT_EQ(out, napi_ok);
2001 }
2002
SendableGetter(napi_env env,napi_callback_info info)2003 static napi_value SendableGetter(napi_env env, napi_callback_info info)
2004 {
2005 napi_value res;
2006 napi_get_boolean(env, false, &res);
2007 return res;
2008 }
2009
SendableSetter(napi_env env,napi_callback_info info)2010 static napi_value SendableSetter(napi_env env, napi_callback_info info)
2011 {
2012 napi_value res;
2013 napi_get_boolean(env, true, &res);
2014 return res;
2015 }
2016
2017 HWTEST_F(NapiSendableTest, CreateSendableObjectWithPropertiesTest001, testing::ext::TestSize.Level1)
2018 {
2019 napi_env env = (napi_env)engine_;
2020 napi_value excep;
2021 ASSERT_CHECK_CALL(napi_get_and_clear_last_exception(env, &excep));
2022 napi_value val_false;
2023 napi_value val_true;
2024 ASSERT_CHECK_CALL(napi_get_boolean(env, false, &val_false));
2025 ASSERT_CHECK_CALL(napi_get_boolean(env, true, &val_true));
2026 napi_property_descriptor desc1[] = {
2027 DECLARE_NAPI_DEFAULT_PROPERTY("x", val_true),
2028 };
2029 napi_value obj1;
2030 ASSERT_CHECK_CALL(napi_create_sendable_object_with_properties(env, 1, desc1, &obj1));
2031 napi_value obj2;
2032 napi_property_descriptor desc2[] = {
2033 DECLARE_NAPI_DEFAULT_PROPERTY("a", val_false),
2034 DECLARE_NAPI_GETTER_SETTER("b", SendableGetter, SendableSetter),
2035 DECLARE_NAPI_DEFAULT_PROPERTY("c", obj1),
2036 };
2037 ASSERT_CHECK_CALL(napi_create_sendable_object_with_properties(env, 3, desc2, &obj2));
2038 ASSERT_CHECK_VALUE_TYPE(env, obj1, napi_object);
2039 ASSERT_CHECK_VALUE_TYPE(env, obj2, napi_object);
__anon5805f5641002(napi_value obj, const char* keyStr, napi_value expect) 2040 auto checkPropertyEqualsTo = [env](napi_value obj, const char* keyStr, napi_value expect) -> bool {
2041 napi_value result;
2042 napi_get_named_property(env, obj, keyStr, &result);
2043 bool equal = false;
2044 napi_strict_equals(env, result, expect, &equal);
2045 return equal;
2046 };
2047 // get obj1.x == true
2048 ASSERT_TRUE(checkPropertyEqualsTo(obj1, "x", val_true));
2049 // set obj1.x = false
2050 ASSERT_CHECK_CALL(napi_set_named_property(env, obj1, "x", val_false));
2051 // get obj1.x == false
2052 ASSERT_TRUE(checkPropertyEqualsTo(obj1, "x", val_false));
2053 // get obj2.a == false
2054 ASSERT_TRUE(checkPropertyEqualsTo(obj2, "a", val_false));
2055 // get obj2.b == false
2056 ASSERT_TRUE(checkPropertyEqualsTo(obj2, "b", val_false));
2057 // set obj2.b = true (useless)
2058 ASSERT_CHECK_CALL(napi_set_named_property(env, obj2, "b", val_true));
2059 // get obj2.b == false
2060 ASSERT_TRUE(checkPropertyEqualsTo(obj2, "b", val_false));
2061 // get obj2.c == obj1
2062 ASSERT_TRUE(checkPropertyEqualsTo(obj2, "c", obj1));
2063 // get obj2.c.x == false
2064 napi_value val_res;
2065 ASSERT_CHECK_CALL(napi_get_named_property(env, obj2, "c", &val_res));
2066 ASSERT_TRUE(checkPropertyEqualsTo(val_res, "x", val_false));
2067 }
2068
2069 bool g_funcCalled = false;
Func(napi_env env,napi_callback_info info)2070 static napi_value Func(napi_env env, napi_callback_info info)
2071 {
2072 napi_value boolTrue = nullptr;
2073 napi_value boolFalse = nullptr;
2074 napi_get_boolean(env, true, &boolTrue);
2075 napi_get_boolean(env, false, &boolFalse);
2076
2077 if (g_funcCalled) {
2078 return boolFalse;
2079 }
2080
2081 char *data = nullptr;
2082 napi_value thisVar = nullptr;
2083 napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
2084 napi_unwrap_sendable(env, thisVar, reinterpret_cast<void**>(&data));
2085 if (*data == 'a') {
2086 g_funcCalled = true;
2087 delete [] data;
2088 }
2089
2090 return boolTrue;
2091 }
2092
2093 HWTEST_F(NapiSendableTest, CreateSendableObjectWithPropertiesTest002, testing::ext::TestSize.Level1)
2094 {
2095 napi_env env = (napi_env)engine_;
2096 napi_value excep;
2097 ASSERT_CHECK_CALL(napi_get_and_clear_last_exception(env, &excep));
2098
2099 napi_value obj2;
2100 napi_property_descriptor desc2[] = {
2101 DECLARE_NAPI_FUNCTION("func", Func),
2102 };
2103 ASSERT_CHECK_CALL(napi_create_sendable_object_with_properties(env, 1, desc2, &obj2));
2104 bool isShared = false;
2105 napi_is_sendable(env, obj2, &isShared);
2106 ASSERT_EQ(isShared, true);
2107
2108 auto data = new char[2];
2109 *data = 'a';
2110 *(data + 1) = 0;
2111 napi_wrap_sendable(env, obj2, data, nullptr, nullptr);
2112 ASSERT_CHECK_VALUE_TYPE(env, obj2, napi_object);
2113 napi_value func = nullptr;
2114 napi_value ret = nullptr;
2115 napi_get_named_property(env, obj2, "func", &func);
2116 ASSERT_EQ(g_funcCalled, false);
2117 napi_call_function(env, obj2, func, 0, nullptr, &ret);
2118 bool resultBool = false;
2119 napi_get_value_bool(env, ret, &resultBool);
2120 ASSERT_EQ(resultBool, true);
2121 ASSERT_EQ(g_funcCalled, true);
2122 }
2123
2124 /**
2125 * @tc.name: SerializeDeSerializeSendableDataTest001
2126 * @tc.desc: Test serialize & deserialize sendableArray.
2127 * @tc.type: FUNC
2128 */
2129 HWTEST_F(NapiSendableTest, SerializeDeSerializeSendableDataTest001, testing::ext::TestSize.Level1)
2130 {
2131 napi_env env = (napi_env)engine_;
2132 napi_status res = napi_ok;
2133 napi_value excep;
2134 ASSERT_CHECK_CALL(napi_get_and_clear_last_exception(env, &excep));
2135 napi_value num = nullptr;
2136 uint32_t value = 1000;
2137 res = napi_create_uint32(env, value, &num);
2138 ASSERT_EQ(res, napi_ok);
2139 napi_property_descriptor desc[] = {
2140 DECLARE_NAPI_DEFAULT_PROPERTY("a", num),
2141 };
2142 napi_value obj;
2143 ASSERT_CHECK_CALL(napi_create_sendable_object_with_properties(env, 1, desc, &obj));
2144 ASSERT_CHECK_VALUE_TYPE(env, obj, napi_object);
2145
2146 napi_value undefined = nullptr;
2147 napi_get_undefined(env, &undefined);
2148 void* data = nullptr;
2149 res = napi_serialize(env, obj, undefined, undefined, &data);
2150 ASSERT_NE(data, nullptr);
2151 ASSERT_EQ(res, napi_ok);
2152
2153 napi_value result1 = nullptr;
2154 res = napi_deserialize(env, data, &result1);
2155 ASSERT_CHECK_VALUE_TYPE(env, result1, napi_object);
2156
2157 napi_value number1 = nullptr;;
2158 napi_get_named_property(env, result1, "a", &number1);
2159 ASSERT_CHECK_VALUE_TYPE(env, number1, napi_number);
2160
2161 napi_delete_serialization_data(env, data);
2162 }
2163
2164 /**
2165 * @tc.name: SerializeDeSerializeSendableDataTest002
2166 * @tc.desc: Test serialize & deserialize sendableArray.
2167 * @tc.type: FUNC
2168 */
2169 HWTEST_F(NapiSendableTest, SerializeDeSerializeSendableDataTest002, testing::ext::TestSize.Level1)
2170 {
2171 napi_env env = (napi_env) engine_;
2172
2173 napi_status res = napi_ok;
2174 napi_value sendableArray = nullptr;
2175 napi_create_sendable_array(env, &sendableArray);
2176 ASSERT_NE(sendableArray, nullptr);
2177 bool isShared = false;
2178 res = napi_is_sendable(env, sendableArray, &isShared);
2179 ASSERT_EQ(res, napi_ok);
2180 ASSERT_EQ(isShared, true);
2181 bool isArray = false;
2182 napi_is_array(env, sendableArray, &isArray);
2183 ASSERT_TRUE(isArray);
2184 for (size_t i = 0; i < 10; i++) {
2185 napi_value num = nullptr;
2186 napi_create_uint32(env, i, &num);
2187 napi_set_element(env, sendableArray, i, num);
2188 }
2189
2190 uint32_t length = 0;
2191 res = napi_get_array_length(env, sendableArray, &length);
2192 ASSERT_EQ(res, napi_ok);
2193 ASSERT_EQ(length, 10u);
2194
2195 napi_value undefined = nullptr;
2196 napi_get_undefined(env, &undefined);
2197 void* data = nullptr;
2198 res = napi_serialize(env, sendableArray, undefined, undefined, &data);
2199 ASSERT_NE(data, nullptr);
2200 ASSERT_EQ(res, napi_ok);
2201
2202 napi_value result1 = nullptr;
2203 napi_deserialize(env, data, &result1);
2204 ASSERT_CHECK_VALUE_TYPE(env, result1, napi_object);
2205
2206 res = napi_get_array_length(env, result1, &length);
2207 ASSERT_EQ(res, napi_ok);
2208 ASSERT_EQ(length, 10u);
2209
2210 napi_delete_serialization_data(env, data);
2211 }
2212
2213 /**
2214 * @tc.name: SerializeDeSerializeSendableDataTest003
2215 * @tc.desc: Test serialize & deserialize sendableArrayWithLength.
2216 * @tc.type: FUNC
2217 */
2218 HWTEST_F(NapiSendableTest, SerializeDeSerializeSendableDataTest003, testing::ext::TestSize.Level1)
2219 {
2220 static uint32_t LENGTH = 1024;
2221 ASSERT_NE(engine_, nullptr);
2222 napi_env env = reinterpret_cast<napi_env>(engine_);
2223 napi_status res = napi_ok;
2224
2225 napi_value sendableArray = nullptr;
2226 res = napi_create_sendable_array_with_length(env, LENGTH, &sendableArray);
2227 ASSERT_EQ(res, napi_ok);
2228
2229 bool isShared = false;
2230 res = napi_is_sendable(env, sendableArray, &isShared);
2231 ASSERT_EQ(res, napi_ok);
2232 ASSERT_EQ(isShared, true);
2233 bool isArray = false;
2234 napi_is_array(env, sendableArray, &isArray);
2235 ASSERT_TRUE(isArray);
2236 for (size_t i = 0; i < 100; i++) {
2237 napi_value num = nullptr;
2238 napi_create_uint32(env, i, &num);
2239 napi_set_element(env, sendableArray, i, num);
2240 }
2241
2242 uint32_t length = 0;
2243 res = napi_get_array_length(env, sendableArray, &length);
2244 ASSERT_EQ(res, napi_ok);
2245 ASSERT_EQ(length, 1024);
2246
2247 napi_value undefined = nullptr;
2248 napi_get_undefined(env, &undefined);
2249 void* data = nullptr;
2250 res = napi_serialize(env, sendableArray, undefined, undefined, &data);
2251 ASSERT_NE(data, nullptr);
2252 ASSERT_EQ(res, napi_ok);
2253
2254 napi_value result1 = nullptr;
2255 napi_deserialize(env, data, &result1);
2256 ASSERT_CHECK_VALUE_TYPE(env, result1, napi_object);
2257
2258 res = napi_get_array_length(env, result1, &length);
2259 ASSERT_EQ(res, napi_ok);
2260 ASSERT_EQ(length, 1024);
2261
2262 napi_delete_serialization_data(env, data);
2263 }
2264
2265 /**
2266 * @tc.name: SerializeDeSerializeSendableDataTest004
2267 * @tc.desc: Test serialize & deserialize sendableTypedArray.
2268 * @tc.type: FUNC
2269 */
2270 HWTEST_F(NapiSendableTest, SerializeDeSerializeSendableDataTest004, testing::ext::TestSize.Level1)
2271 {
2272 static size_t LENGTH = 1024;
2273 static size_t OFFSET = 128;
2274 ASSERT_NE(engine_, nullptr);
2275 napi_env env = reinterpret_cast<napi_env>(engine_);
2276 napi_status res = napi_ok;
2277
2278 void *tmpData;
2279 napi_value sendableArraybuffer = nullptr;
2280 napi_value sendableTypedarray = nullptr;
2281 res = napi_create_sendable_arraybuffer(env, LENGTH, &tmpData, &sendableArraybuffer);
2282 ASSERT_EQ(res, napi_ok);
2283
2284 bool isShared = false;
2285 res = napi_is_sendable(env, sendableArraybuffer, &isShared);
2286 ASSERT_EQ(res, napi_ok);
2287 ASSERT_EQ(isShared, true);
2288
2289 res = napi_create_sendable_typedarray(env, napi_int8_array, LENGTH / 2,
2290 sendableArraybuffer, OFFSET, &sendableTypedarray);
2291 ASSERT_EQ(res, napi_ok);
2292
2293 isShared = false;
2294 res = napi_is_sendable(env, sendableArraybuffer, &isShared);
2295 ASSERT_EQ(res, napi_ok);
2296 ASSERT_EQ(isShared, true);
2297
2298 bool isTypedArray = false;
2299 res = napi_is_typedarray(env, sendableTypedarray, &isTypedArray);
2300 ASSERT_EQ(res, napi_ok);
2301 ASSERT_EQ(isTypedArray, true);
2302
2303 napi_value undefined = nullptr;
2304 napi_get_undefined(env, &undefined);
2305 void* data = nullptr;
2306 res = napi_serialize(env, sendableTypedarray, undefined, undefined, &data);
2307 ASSERT_NE(data, nullptr);
2308 ASSERT_EQ(res, napi_ok);
2309
2310 napi_value result = nullptr;
2311 res = napi_deserialize(env, data, &result);
2312 ASSERT_CHECK_VALUE_TYPE(env, result, napi_object);
2313
2314 napi_typedarray_type type = napi_uint8_array;
2315 size_t length = 0;
2316 void *getData = nullptr;
2317 napi_value getArrayBuffer = nullptr;
2318 size_t byteOffset = 0;
2319 res = napi_get_typedarray_info(env, result, &type, &length, &getData, &getArrayBuffer, &byteOffset);
2320 ASSERT_EQ(res, napi_ok);
2321
2322 ASSERT_EQ(type, napi_int8_array);
2323 ASSERT_EQ(length, LENGTH / 2);
2324 ASSERT_EQ(reinterpret_cast<size_t>(getData), reinterpret_cast<size_t>(tmpData) + OFFSET);
2325 ASSERT_EQ(byteOffset, OFFSET);
2326
2327 napi_delete_serialization_data(env, data);
2328 }
2329
2330 /**
2331 * @tc.name: SerializeDeSerializeSendableDataTest005
2332 * @tc.desc: Test serialize & deserialize sendableArrayBuffer.
2333 * @tc.type: FUNC
2334 */
2335 HWTEST_F(NapiSendableTest, SerializeDeSerializeSendableDataTest005, testing::ext::TestSize.Level1)
2336 {
2337 static size_t LENGTH = 1024;
2338 ASSERT_NE(engine_, nullptr);
2339 napi_env env = reinterpret_cast<napi_env>(engine_);
2340 napi_status res = napi_ok;
2341
2342 void *tmpData;
2343 napi_value sendableBuffer = nullptr;
2344 res = napi_create_sendable_arraybuffer(env, LENGTH, &tmpData, &sendableBuffer);
2345 ASSERT_EQ(res, napi_ok);
2346
2347 bool isShared = false;
2348 res = napi_is_sendable(env, sendableBuffer, &isShared);
2349 ASSERT_EQ(res, napi_ok);
2350 ASSERT_EQ(isShared, true);
2351
2352 bool isArrayBuffer = false;
2353 res = napi_is_arraybuffer(env, sendableBuffer, &isArrayBuffer);
2354 ASSERT_EQ(res, napi_ok);
2355 ASSERT_EQ(isArrayBuffer, true);
2356
2357 napi_value undefined = nullptr;
2358 napi_get_undefined(env, &undefined);
2359 void* data = nullptr;
2360 res = napi_serialize(env, sendableBuffer, undefined, undefined, &data);
2361 ASSERT_EQ(res, napi_ok);
2362 ASSERT_NE(data, nullptr);
2363
2364 napi_delete_serialization_data(env, data);
2365 }