1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "js_napi_common.h"
16 #include "napi/native_api.h"
17 #include "napi/native_common.h"
18 #include "napi/native_node_api.h"
19 namespace ACE {
20 namespace NAPI {
21 namespace SYSTEM_TEST_NAPI {
22 static constexpr size_t bufferSizeAt16 = 128;
23 static constexpr size_t bufferSizeAt16Ext = 4;
24 
TestStringUtf16(napi_env env,napi_callback_info info)25 static napi_value TestStringUtf16(napi_env env, napi_callback_info info)
26 {
27     size_t argc = 1;
28     napi_value args[1];
29     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
30     NAPI_ASSERT(env, argc >= 1, "Wrong number of arguments");
31     napi_valuetype valuetype;
32     NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
33     NAPI_ASSERT(env, valuetype == napi_string, "Wrong type of argment. Expects a string.");
34     char16_t buffer[bufferSizeAt16] = { 0 };
35     size_t buffer_size = bufferSizeAt16;
36     size_t copied;
37 
38     NAPI_CALL(env, napi_get_value_string_utf16(env, args[0], buffer, buffer_size, &copied));
39     napi_value output = nullptr;
40     NAPI_CALL(env, napi_create_string_utf16(env, buffer, copied, &output));
41     return output;
42 }
43 
TestStringUtf16Insufficient(napi_env env,napi_callback_info info)44 static napi_value TestStringUtf16Insufficient(napi_env env, napi_callback_info info)
45 {
46     size_t argc = 1;
47     napi_value args[1] = { nullptr };
48     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
49     NAPI_ASSERT(env, argc >= 1, "Wrong number of arguments");
50 
51     napi_valuetype valuetype;
52     NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
53     NAPI_ASSERT(env, valuetype == napi_string, "Wrong type of argment. Expects a string.");
54 
55     char16_t buffer[bufferSizeAt16Ext] = { 0 };
56     size_t buffer_size = bufferSizeAt16Ext;
57     size_t copied;
58 
59     NAPI_CALL(env, napi_get_value_string_utf16(env, args[0], buffer, buffer_size, &copied));
60 
61     napi_value output = nullptr;
62     NAPI_CALL(env, napi_create_string_utf16(env, buffer, copied, &output));
63 
64     return output;
65 }
66 
TestStringUtf16Length(napi_env env,napi_callback_info info)67 static napi_value TestStringUtf16Length(napi_env env, napi_callback_info info)
68 {
69     size_t argc = 1;
70     napi_value args[1] = { nullptr };
71     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
72     NAPI_ASSERT(env, argc >= 1, "Wrong number of arguments");
73 
74     napi_valuetype valuetype;
75     NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
76     NAPI_ASSERT(env, valuetype == napi_string, "Wrong type of argment. Expects a string.");
77 
78     size_t length;
79     NAPI_CALL(env, napi_get_value_string_utf16(env, args[0], NULL, 0, &length));
80 
81     napi_value output;
82     NAPI_CALL(env, napi_create_uint32(env, (uint32_t)length, &output));
83 
84     return output;
85 }
86 
TestStringLargeUtf16(napi_env env,napi_callback_info info)87 static napi_value TestStringLargeUtf16(napi_env env, napi_callback_info info)
88 {
89     napi_value output = nullptr;
90     if (SIZE_MAX > INT_MAX) {
91         NAPI_CALL(env, napi_create_string_utf16(env, ((const char16_t*)""), ((size_t)INT_MAX) + 1, &output));
92     } else {
93         NAPI_CALL(env, napi_throw_error(env, NULL, "Invalid argument"));
94     }
95 
96     return output;
97 }
98 
JsStringInit(napi_env env,napi_value exports)99 napi_value JsStringInit(napi_env env, napi_value exports)
100 {
101     napi_property_descriptor descriptors[] = {
102         DECLARE_NAPI_FUNCTION("testStringUtf16", TestStringUtf16),
103         DECLARE_NAPI_FUNCTION("testStringUtf16Insufficient", TestStringUtf16Insufficient),
104         DECLARE_NAPI_FUNCTION("testStringUtf16Length", TestStringUtf16Length),
105         DECLARE_NAPI_FUNCTION("testStringLargeUtf16", TestStringLargeUtf16),
106     };
107 
108     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors));
109     return exports;
110 }
111 } // namespace SYSTEM_TEST_NAPI
112 } // namespace NAPI
113 } // namespace ACE
114