• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }