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;
100 napi_value args[1] = { nullptr };
101 void* result_data = nullptr;
102
103 size_t argc = 1;
104 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
105 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
106 napi_valuetype theType;
107 NAPI_CALL(env, napi_typeof(env, args[0], &theType));
108 NAPI_ASSERT(env, theType == napi_string, "CopyBufferFun: instance is not an string object");
109
110 std::string paraStr;
111 UnwrapStringParam(paraStr, env, args[0]);
112 HILOG_INFO("%{public}s, ====step1===args[0] = %{public}s", __func__, paraStr.c_str());
113 NAPI_CALL(env, napi_create_buffer_copy(env, paraStr.size()+1,
114 const_cast<char*>(paraStr.c_str()), &result_data, &theBuffer));
115 HILOG_INFO("%{public}s,end", __func__);
116 HILOG_INFO("%{public}s,str", static_cast<char*>(result_data));
117 return theBuffer;
118 }
119
BufferHasInstanceFun(napi_env env,napi_callback_info info)120 static napi_value BufferHasInstanceFun(napi_env env, napi_callback_info info)
121 {
122 HILOG_INFO("%{public}s,called", __func__);
123 size_t argc = 1;
124 napi_value args[1] = { nullptr };
125 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
126 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
127 napi_value theBuffer = args[0];
128 bool hasInstance = false;
129 napi_valuetype theType;
130
131 NAPI_CALL(env, napi_typeof(env, theBuffer, &theType));
132 NAPI_ASSERT(env, theType == napi_object, "BufferHasInstanceFun: instance is not an object");
133 NAPI_CALL(env, napi_is_buffer(env, theBuffer, &hasInstance));
134 NAPI_ASSERT(env, hasInstance, "BufferHasInstanceFun: instance is not a buffer");
135 napi_value returnValue = nullptr;
136 NAPI_CALL(env, napi_get_boolean(env, hasInstance, &returnValue));
137 return returnValue;
138 }
139
BufferInfoFun(napi_env env,napi_callback_info info)140 static napi_value BufferInfoFun(napi_env env, napi_callback_info info)
141 {
142 HILOG_INFO("%{public}s,called", __func__);
143 size_t argc = 1;
144 napi_value args[1] = { nullptr };
145 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
146 NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
147 napi_valuetype theType;
148 NAPI_CALL(env, napi_typeof(env, args[0], &theType));
149 NAPI_ASSERT(env, theType == napi_object, "BufferInfoFun: param is not a string object");
150
151 napi_value theBuffer = args[0];
152 char* bufferData = nullptr;
153 napi_value returnValue = nullptr;
154 size_t bufferLength;
155 NAPI_CALL(env, napi_get_buffer_info(env, theBuffer, (void**)(&bufferData), &bufferLength));
156 NAPI_CALL(env, napi_create_string_utf8(env, bufferData, std::strlen(bufferData), &returnValue));
157
158 return returnValue;
159 }
160
BufferInit(napi_env env,napi_value exports)161 napi_value BufferInit(napi_env env, napi_value exports)
162 {
163 HILOG_INFO("%{public}s,called", __func__);
164 napi_value theValue = nullptr;
165
166 NAPI_CALL(env, napi_create_string_utf8(env, theText, sizeof(theText), &theValue));
167 NAPI_CALL(env, napi_set_named_property(env, exports, "theText", theValue));
168
169 napi_property_descriptor methods[] = {
170 DECLARE_NAPI_FUNCTION("testNewBufferFun", NewBufferFun),
171 DECLARE_NAPI_FUNCTION("testNewExternalBufferFun", NewExternalBufferFun),
172 DECLARE_NAPI_FUNCTION("testCopyBufferFun", CopyBufferFun),
173 DECLARE_NAPI_FUNCTION("testBufferHasInstance", BufferHasInstanceFun),
174 DECLARE_NAPI_FUNCTION("testBufferInfoFun", BufferInfoFun)
175 };
176
177 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(methods) / sizeof(methods[0]), methods));
178 return exports;
179 }
180 } // namespace SYSTEM_TEST_NAPI
181 } // namespace NAPI
182 } // namespace ACE
183