• 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, 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