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 <cstring>
16 #include <uv.h>
17 #include "js_napi_common.h"
18 #include "napi/native_api.h"
19 #include "napi/native_common.h"
20 #include "napi/native_node_api.h"
21 #include "utils/log.h"
22 #include "securec.h"
23 namespace ACE {
24 namespace NAPI {
25 namespace SYSTEM_TEST_NAPI {
26 static const char theText[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
27
28 static int deleterCallCount = 0;
DeleteTheTextFun(napi_env env,void * data,void * finalize_hint)29 static void DeleteTheTextFun(napi_env env, void* data, void* finalize_hint)
30 {
31 HILOG_INFO("%{public}s,called", __func__);
32 NAPI_ASSERT_RETURN_VOID(env, data != nullptr && strcmp(static_cast<char*>(data), theText) == 0, "invalid data");
33 (void)finalize_hint;
34 free(data);
35 deleterCallCount++;
36 }
37
NewBufferFun(napi_env env,napi_callback_info info)38 static napi_value NewBufferFun(napi_env env, napi_callback_info info)
39 {
40 HILOG_INFO("%{public}s,called", __func__);
41 napi_value theBuffer = nullptr;
42 char* theCopy = nullptr;
43
44 size_t argc = 1;
45 napi_value args[1];
46 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
47 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
48 napi_valuetype theType;
49 NAPI_CALL(env, napi_typeof(env, args[0], &theType));
50 NAPI_ASSERT(env, theType == napi_string, "NewBufferFun: instance is not an string object");
51
52 std::string paraStr;
53 UnwrapStringParam(paraStr, env, args[0]);
54 HILOG_INFO("%{public}s, ====step1===args[0] = %{public}s", __func__, paraStr.c_str());
55
56 NAPI_CALL(env, napi_create_buffer(env, paraStr.size()+1, (void**)(&theCopy), &theBuffer));
57 NAPI_ASSERT(env, theCopy, "Failed to copy static text for NewBufferFun");
58
59 if (memcpy_s(theCopy, paraStr.size(), paraStr.c_str(), paraStr.size()) != 0) {
60 return nullptr;
61 }
62
63 return theBuffer;
64 }
65 static constexpr int32_t TMP_BUJJER_SIZE = 4;
66 static char tmpBuffer[TMP_BUJJER_SIZE];
NewExternalBufferFun(napi_env env,napi_callback_info info)67 static napi_value NewExternalBufferFun(napi_env env, napi_callback_info info)
68 {
69 HILOG_INFO("%{public}s,called", __func__);
70 napi_value theBuffer = nullptr;
71
72 size_t argc = 1;
73 napi_value args[1];
74 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
75 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
76 napi_valuetype theType;
77 NAPI_CALL(env, napi_typeof(env, args[0], &theType));
78 NAPI_ASSERT(env, theType == napi_string, "NewExternalBufferFun: instance is not an string object");
79
80 std::string paraStr;
81 UnwrapStringParam(paraStr, env, args[0]);
82 if (memset_s(tmpBuffer, sizeof(tmpBuffer), 0, sizeof(tmpBuffer)) != 0) {
83 return nullptr;
84 }
85
86 if (memcpy_s(tmpBuffer, sizeof(tmpBuffer), paraStr.c_str(), sizeof(tmpBuffer)) != 0) {
87 return nullptr;
88 }
89 HILOG_INFO("%{public}s, ====step1===args[0] = %{public}s", __func__, paraStr.c_str());
90 NAPI_CALL(env, napi_create_external_buffer(env, TMP_BUJJER_SIZE, tmpBuffer,
91 DeleteTheTextFun, nullptr, &theBuffer));
92
93 return theBuffer;
94 }
95
CopyBufferFun(napi_env env,napi_callback_info info)96 static napi_value CopyBufferFun(napi_env env, napi_callback_info info)
97 {
98 HILOG_INFO("%{public}s,called", __func__);
99 napi_value theBuffer = nullptr, args[1] = { nullptr };
100 void* result_data = nullptr;
101
102 size_t argc = 1;
103 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
104 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
105 napi_valuetype theType;
106 NAPI_CALL(env, napi_typeof(env, args[0], &theType));
107 NAPI_ASSERT(env, theType == napi_string, "CopyBufferFun: instance is not an string object");
108
109 std::string paraStr;
110 UnwrapStringParam(paraStr, env, args[0]);
111 HILOG_INFO("%{public}s, ====step1===args[0] = %{public}s", __func__, paraStr.c_str());
112 NAPI_CALL(env, napi_create_buffer_copy(env, paraStr.size()+1,
113 const_cast<char*>(paraStr.c_str()), &result_data, &theBuffer));
114 HILOG_INFO("%{public}s,end", __func__);
115 HILOG_INFO("%{public}s,str", static_cast<char*>(result_data));
116 return theBuffer;
117 }
118
BufferHasInstanceFun(napi_env env,napi_callback_info info)119 static napi_value BufferHasInstanceFun(napi_env env, napi_callback_info info)
120 {
121 HILOG_INFO("%{public}s,called", __func__);
122 size_t argc = 1;
123 napi_value args[1] = { nullptr };
124 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
125 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
126 napi_value theBuffer = args[0];
127 bool hasInstance = false;
128 napi_valuetype theType;
129
130 NAPI_CALL(env, napi_typeof(env, theBuffer, &theType));
131 NAPI_ASSERT(env, theType == napi_object, "BufferHasInstanceFun: instance is not an object");
132 NAPI_CALL(env, napi_is_buffer(env, theBuffer, &hasInstance));
133 NAPI_ASSERT(env, hasInstance, "BufferHasInstanceFun: instance is not a buffer");
134 napi_value returnValue = nullptr;
135 NAPI_CALL(env, napi_get_boolean(env, hasInstance, &returnValue));
136 return returnValue;
137 }
138
BufferInfoFun(napi_env env,napi_callback_info info)139 static napi_value BufferInfoFun(napi_env env, napi_callback_info info)
140 {
141 HILOG_INFO("%{public}s,called", __func__);
142 size_t argc = 1;
143 napi_value args[1] = { nullptr };
144 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
145 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
146 napi_valuetype theType;
147 NAPI_CALL(env, napi_typeof(env, args[0], &theType));
148 NAPI_ASSERT(env, theType == napi_object, "BufferInfoFun: param is not a string object");
149
150 napi_value theBuffer = args[0];
151 char* bufferData = nullptr;
152 napi_value returnValue = nullptr;
153 size_t bufferLength;
154 NAPI_CALL(env, napi_get_buffer_info(env, theBuffer, (void**)(&bufferData), &bufferLength));
155 NAPI_CALL(env, napi_create_string_utf8(env, bufferData, std::strlen(bufferData), &returnValue));
156
157 return returnValue;
158 }
159
BufferInit(napi_env env,napi_value exports)160 napi_value BufferInit(napi_env env, napi_value exports)
161 {
162 HILOG_INFO("%{public}s,called", __func__);
163 napi_value theValue = nullptr;
164
165 NAPI_CALL(env, napi_create_string_utf8(env, theText, sizeof(theText), &theValue));
166 NAPI_CALL(env, napi_set_named_property(env, exports, "theText", theValue));
167
168 napi_property_descriptor methods[] = {
169 DECLARE_NAPI_FUNCTION("testNewBufferFun", NewBufferFun),
170 DECLARE_NAPI_FUNCTION("testNewExternalBufferFun", NewExternalBufferFun),
171 DECLARE_NAPI_FUNCTION("testCopyBufferFun", CopyBufferFun),
172 DECLARE_NAPI_FUNCTION("testBufferHasInstance", BufferHasInstanceFun),
173 DECLARE_NAPI_FUNCTION("testBufferInfoFun", BufferInfoFun)
174 };
175
176 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(methods) / sizeof(methods[0]), methods));
177 return exports;
178 }
179 } // namespace SYSTEM_TEST_NAPI
180 } // namespace NAPI
181 } // namespace ACE
182