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