1 /*
2 * Copyright (C) 2021-2022 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
16 #include "test_common.h"
17
18 #include "context_key.h"
19 #include "event_list.h"
20 #include "net_address.h"
21 #include "securec.h"
22 #include "socket_module.h"
23
24 #define TCP_COMMON_DEFINES \
25 auto env = (napi_env)engine_; \
26 \
27 napi_value exports = NapiUtils::CreateObject(env); \
28 \
29 SocketModuleExports::InitSocketModule(env, exports); \
30 \
31 napi_value newTcp = \
32 NapiUtils::GetNamedProperty(env, exports, SocketModuleExports::FUNCTION_CONSTRUCTOR_TCP_SOCKET_INSTANCE); \
33 ASSERT_CHECK_VALUE_TYPE(env, newTcp, napi_function); \
34 \
35 napi_value tcpThis = NapiUtils::CallFunction(env, exports, newTcp, 0, nullptr); \
36 ASSERT_CHECK_VALUE_TYPE(env, tcpThis, napi_object); \
37 \
38 napi_value tcpBind = NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_BIND); \
39 ASSERT_CHECK_VALUE_TYPE(env, tcpBind, napi_function); \
40 \
41 napi_value tcpConnect = \
42 NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_CONNECT); \
43 ASSERT_CHECK_VALUE_TYPE(env, tcpConnect, napi_function); \
44 \
45 napi_value tcpSend = NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_SEND); \
46 ASSERT_CHECK_VALUE_TYPE(env, tcpSend, napi_function); \
47 \
48 napi_value tcpClose = NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_CLOSE); \
49 ASSERT_CHECK_VALUE_TYPE(env, tcpClose, napi_function); \
50 \
51 napi_value tcpGetRemoteAddress = \
52 NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_GET_REMOTE_ADDRESS); \
53 ASSERT_CHECK_VALUE_TYPE(env, tcpGetRemoteAddress, napi_function); \
54 \
55 napi_value tcpGetState = \
56 NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_GET_STATE); \
57 ASSERT_CHECK_VALUE_TYPE(env, tcpGetState, napi_function); \
58 \
59 napi_value tcpSetExtraOptions = \
60 NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_SET_EXTRA_OPTIONS); \
61 ASSERT_CHECK_VALUE_TYPE(env, tcpSetExtraOptions, napi_function); \
62 \
63 napi_value tcpOn = NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_ON); \
64 ASSERT_CHECK_VALUE_TYPE(env, tcpOn, napi_function); \
65 \
66 napi_value tcpOff = NapiUtils::GetNamedProperty(env, tcpThis, SocketModuleExports::TCPSocket::FUNCTION_OFF); \
67 ASSERT_CHECK_VALUE_TYPE(env, tcpOff, napi_function);
68
69 #define UDP_COMMON_DEFINES \
70 auto env = (napi_env)engine_; \
71 \
72 napi_value exports = NapiUtils::CreateObject(env); \
73 \
74 SocketModuleExports::InitSocketModule(env, exports); \
75 \
76 napi_value newUdp = \
77 NapiUtils::GetNamedProperty(env, exports, SocketModuleExports::FUNCTION_CONSTRUCTOR_UDP_SOCKET_INSTANCE); \
78 ASSERT_CHECK_VALUE_TYPE(env, newUdp, napi_function); \
79 \
80 napi_value udpThis = NapiUtils::CallFunction(env, exports, newUdp, 0, nullptr); \
81 ASSERT_CHECK_VALUE_TYPE(env, udpThis, napi_object); \
82 \
83 napi_value udpBind = NapiUtils::GetNamedProperty(env, udpThis, SocketModuleExports::UDPSocket::FUNCTION_BIND); \
84 ASSERT_CHECK_VALUE_TYPE(env, udpBind, napi_function); \
85 \
86 napi_value udpSend = NapiUtils::GetNamedProperty(env, udpThis, SocketModuleExports::UDPSocket::FUNCTION_SEND); \
87 ASSERT_CHECK_VALUE_TYPE(env, udpSend, napi_function); \
88 \
89 napi_value udpClose = NapiUtils::GetNamedProperty(env, udpThis, SocketModuleExports::UDPSocket::FUNCTION_CLOSE); \
90 ASSERT_CHECK_VALUE_TYPE(env, udpClose, napi_function); \
91 \
92 napi_value udpGetState = \
93 NapiUtils::GetNamedProperty(env, udpThis, SocketModuleExports::UDPSocket::FUNCTION_GET_STATE); \
94 ASSERT_CHECK_VALUE_TYPE(env, udpGetState, napi_function); \
95 \
96 napi_value udpSetExtraOptions = \
97 NapiUtils::GetNamedProperty(env, udpThis, SocketModuleExports::UDPSocket::FUNCTION_SET_EXTRA_OPTIONS); \
98 ASSERT_CHECK_VALUE_TYPE(env, udpSetExtraOptions, napi_function); \
99 \
100 napi_value udpOn = NapiUtils::GetNamedProperty(env, udpThis, SocketModuleExports::UDPSocket::FUNCTION_ON); \
101 ASSERT_CHECK_VALUE_TYPE(env, udpOn, napi_function); \
102 \
103 napi_value udpOff = NapiUtils::GetNamedProperty(env, udpThis, SocketModuleExports::UDPSocket::FUNCTION_OFF); \
104 ASSERT_CHECK_VALUE_TYPE(env, udpOff, napi_function);
105
106 #define MAKE_ON_MESSAGE(FUNC_NAME) \
107 [](napi_env env, napi_callback_info info) -> napi_value { \
108 NETSTACK_LOGI("%s", FUNC_NAME); \
109 \
110 napi_value thisVal = nullptr; \
111 size_t paramsCount = 1; \
112 napi_value params[1] = {nullptr}; \
113 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); \
114 \
115 napi_value remoteInfo = NapiUtils::GetNamedProperty(env, params[0], KEY_REMOTE_INFO); \
116 NETSTACK_LOGI("On recv message"); \
117 NETSTACK_LOGI("address: %s", NapiUtils::GetStringPropertyUtf8(env, remoteInfo, KEY_ADDRESS).c_str()); \
118 NETSTACK_LOGI("port: %u", NapiUtils::GetUint32Property(env, remoteInfo, KEY_PORT)); \
119 NETSTACK_LOGI("size: %u", NapiUtils::GetUint32Property(env, remoteInfo, KEY_SIZE)); \
120 \
121 napi_value msgBuffer = NapiUtils::GetNamedProperty(env, params[0], KEY_MESSAGE); \
122 size_t len = 0; \
123 void *data = NapiUtils::GetInfoFromArrayBufferValue(env, msgBuffer, &len); \
124 std::string s; \
125 s.append((char *)data, len); \
126 NETSTACK_LOGI("data:\n%s", s.c_str()); \
127 \
128 NETSTACK_LOGI("\n\n\n"); \
129 return NapiUtils::GetUndefined(env); \
130 }
131
132 #define TEST_TCP(TEST_NAME, LOCAL_IP, REMOTE_IP, FAMILY, MAKER, PNG) \
133 [[maybe_unused]] HWTEST_F(NativeEngineTest, TEST_NAME, testing::ext::TestSize.Level0) /* NOLINT */ \
134 { \
135 TCP_COMMON_DEFINES \
136 \
137 napi_value tcpBindAddress = NapiUtils::CreateObject(env); \
138 NapiUtils::SetStringPropertyUtf8(env, (napi_value)tcpBindAddress, KEY_ADDRESS, LOCAL_IP); \
139 NapiUtils::SetUint32Property(env, tcpBindAddress, KEY_FAMILY, (uint32_t)NetAddress::Family::FAMILY); \
140 NapiUtils::SetUint32Property(env, tcpBindAddress, KEY_PORT, 5126); \
141 \
142 napi_value tcpConnectAddress = NapiUtils::CreateObject(env); \
143 NapiUtils::SetStringPropertyUtf8(env, (napi_value)tcpConnectAddress, KEY_ADDRESS, REMOTE_IP); \
144 NapiUtils::SetUint32Property(env, tcpConnectAddress, KEY_FAMILY, (uint32_t)NetAddress::Family::FAMILY); \
145 NapiUtils::SetUint32Property(env, tcpConnectAddress, KEY_PORT, 1314); \
146 \
147 napi_value tcpConnectOptions = NapiUtils::CreateObject(env); \
148 NapiUtils::SetNamedProperty(env, (napi_value)tcpConnectOptions, KEY_ADDRESS, tcpConnectAddress); \
149 \
150 const char *sendStr = nullptr; \
151 size_t len = 0; \
152 if (!(PNG)) { \
153 sendStr = "Hello This is Tcp Test" #TEST_NAME; \
154 len = strlen(sendStr); \
155 } else { \
156 FILE *fp = fopen("for-post.png", "rb"); \
157 fseek(fp, 0L, SEEK_END); \
158 long size = ftell(fp); \
159 void *buffer = malloc(size); \
160 fseek(fp, 0, SEEK_SET); \
161 size_t readSize = fread((void *)buffer, 1, size, fp); \
162 NETSTACK_LOGI("file size = %ld read size = %zu", size, readSize); \
163 \
164 sendStr = (const char *)buffer; \
165 len = readSize; \
166 } \
167 \
168 void *data = nullptr; \
169 napi_value msgBuffer = NapiUtils::CreateArrayBuffer(env, len, &data); \
170 memcpy_s(data, (size_t)len, sendStr, (size_t)len); \
171 napi_value tcpSendOptions = NapiUtils::CreateObject(env); \
172 NapiUtils::SetNamedProperty(env, (napi_value)tcpSendOptions, KEY_DATA, msgBuffer); \
173 \
174 napi_value event = NapiUtils::CreateStringUtf8(env, EVENT_MESSAGE); \
175 napi_value eventCallback = NapiUtils::CreateFunction(env, #TEST_NAME, MAKER(#TEST_NAME), nullptr); \
176 napi_value arg[2] = {event, eventCallback}; \
177 NapiUtils::CallFunction(env, tcpThis, tcpOn, 2, arg); \
178 \
179 NapiUtils::CallFunction(env, tcpThis, tcpBind, 1, &tcpBindAddress); \
180 \
181 NapiUtils::CallFunction(env, tcpThis, tcpConnect, 1, &tcpConnectOptions); \
182 \
183 NapiUtils::CallFunction(env, tcpThis, tcpSend, 1, &tcpSendOptions); \
184 \
185 NapiUtils::CallFunction(env, tcpThis, tcpClose, 0, nullptr); \
186 }
187
188 #define TEST_UDP(TEST_NAME, LOCAL_IP, REMOTE_IP, FAMILY, MAKER, PNG) \
189 [[maybe_unused]] HWTEST_F(NativeEngineTest, TEST_NAME, testing::ext::TestSize.Level0) /* NOLINT */ \
190 { \
191 UDP_COMMON_DEFINES \
192 \
193 napi_value udpBindAddress = NapiUtils::CreateObject(env); \
194 NapiUtils::SetStringPropertyUtf8(env, (napi_value)udpBindAddress, KEY_ADDRESS, LOCAL_IP); \
195 NapiUtils::SetUint32Property(env, udpBindAddress, KEY_FAMILY, (uint32_t)NetAddress::Family::FAMILY); \
196 NapiUtils::SetUint32Property(env, udpBindAddress, KEY_PORT, 5126); \
197 \
198 napi_value udpSendAddress = NapiUtils::CreateObject(env); \
199 NapiUtils::SetStringPropertyUtf8(env, (napi_value)udpSendAddress, KEY_ADDRESS, REMOTE_IP); \
200 NapiUtils::SetUint32Property(env, udpSendAddress, KEY_FAMILY, (uint32_t)NetAddress::Family::FAMILY); \
201 NapiUtils::SetUint32Property(env, udpSendAddress, KEY_PORT, 4556); \
202 \
203 const char *sendStr = nullptr; \
204 size_t len = 0; \
205 if (!(PNG)) { \
206 sendStr = "Hello UDP UDP Test" #TEST_NAME; \
207 len = strlen(sendStr); \
208 } else { \
209 FILE *fp = fopen("for-post.png", "rb"); \
210 fseek(fp, 0L, SEEK_END); \
211 long size = ftell(fp); \
212 void *buffer = malloc(size); \
213 fseek(fp, 0, SEEK_SET); \
214 size_t readSize = fread((void *)buffer, 1, size, fp); \
215 NETSTACK_LOGI("file size = %ld read size = %zu", size, readSize); \
216 \
217 sendStr = (const char *)buffer; \
218 len = readSize; \
219 } \
220 \
221 void *data = nullptr; \
222 napi_value msgBuffer = NapiUtils::CreateArrayBuffer(env, len, &data); \
223 memcpy_s(data, len, sendStr, len); \
224 \
225 napi_value udpSendOptions = NapiUtils::CreateObject(env); \
226 NapiUtils::SetNamedProperty(env, (napi_value)udpSendOptions, KEY_ADDRESS, udpSendAddress); \
227 NapiUtils::SetNamedProperty(env, (napi_value)udpSendOptions, KEY_DATA, msgBuffer); \
228 \
229 napi_value event = NapiUtils::CreateStringUtf8(env, EVENT_MESSAGE); \
230 napi_value eventCallback = NapiUtils::CreateFunction(env, #TEST_NAME, MAKER(#TEST_NAME), nullptr); \
231 napi_value arg[2] = {event, eventCallback}; \
232 NapiUtils::CallFunction(env, udpThis, udpOn, 2, arg); \
233 \
234 NapiUtils::CallFunction(env, udpThis, udpBind, 1, &udpBindAddress); \
235 \
236 napi_value extraOptions = NapiUtils::CreateObject(env); \
237 NapiUtils::SetUint32Property(env, extraOptions, KEY_RECEIVE_BUFFER_SIZE, 1024); \
238 NapiUtils::SetUint32Property(env, extraOptions, KEY_SEND_BUFFER_SIZE, 1024); \
239 NapiUtils::CallFunction(env, udpThis, udpSetExtraOptions, 1, &extraOptions); \
240 \
241 NapiUtils::CallFunction(env, udpThis, udpSend, 1, &udpSendOptions); \
242 \
243 NapiUtils::CallFunction(env, udpThis, udpClose, 0, nullptr); \
244 }
245
246 #define MAKE_PNG_ON_MESSAGE(FUNC_NAME) \
247 [](napi_env env, napi_callback_info info) -> napi_value { \
248 NETSTACK_LOGI("%s", FUNC_NAME); \
249 \
250 napi_value thisVal = nullptr; \
251 size_t paramsCount = 1; \
252 napi_value params[1] = {nullptr}; \
253 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); \
254 \
255 napi_value remoteInfo = NapiUtils::GetNamedProperty(env, params[0], KEY_REMOTE_INFO); \
256 NETSTACK_LOGI("On recv message"); \
257 NETSTACK_LOGI("address: %s", NapiUtils::GetStringPropertyUtf8(env, remoteInfo, KEY_ADDRESS).c_str()); \
258 NETSTACK_LOGI("port: %u", NapiUtils::GetUint32Property(env, remoteInfo, KEY_PORT)); \
259 NETSTACK_LOGI("size: %u", NapiUtils::GetUint32Property(env, remoteInfo, KEY_SIZE)); \
260 \
261 napi_value msgBuffer = NapiUtils::GetNamedProperty(env, params[0], KEY_MESSAGE); \
262 size_t len = 0; \
263 void *data = NapiUtils::GetInfoFromArrayBufferValue(env, msgBuffer, &len); \
264 std::string s; \
265 \
266 FILE *fp = fopen(FUNC_NAME ".png", "ab"); \
267 if (fp != nullptr) { \
268 \
269 fwrite(data, 1, len, fp); \
270 fclose(fp); \
271 } \
272 \
273 NETSTACK_LOGI("\n\n\n"); \
274 return NapiUtils::GetUndefined(env); \
275 }
276
277 namespace OHOS::NetStack {
278 TEST_TCP(TEST_TCP1, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
279 TEST_TCP(TEST_TCP2, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
280 TEST_TCP(TEST_TCP3, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
281 TEST_TCP(TEST_TCP4, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
282 TEST_UDP(TEST_UDP1, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
283 TEST_UDP(TEST_UDP2, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
284 TEST_UDP(TEST_UDP3, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
285 TEST_UDP(TEST_UDP4, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_ON_MESSAGE, false)
286
287 TEST_TCP(TEST_TCP1_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
288 TEST_TCP(TEST_TCP2_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
289 TEST_TCP(TEST_TCP3_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
290 TEST_TCP(TEST_TCP4_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
291 TEST_UDP(TEST_UDP1_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
292 TEST_UDP(TEST_UDP2_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
293 TEST_UDP(TEST_UDP3_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
294 TEST_UDP(TEST_UDP4_IPv6, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_ON_MESSAGE, false)
295
296 TEST_TCP(TEST_TCP1_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
297 TEST_TCP(TEST_TCP2_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
298 TEST_TCP(TEST_TCP3_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
299 TEST_TCP(TEST_TCP4_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
300 TEST_UDP(TEST_UDP1_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
301 TEST_UDP(TEST_UDP2_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
302 TEST_UDP(TEST_UDP3_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
303 TEST_UDP(TEST_UDP4_PNG, LOCAL_IPV4_IP, REMOTE_IPV4_IP, IPv4, MAKE_PNG_ON_MESSAGE, true)
304
305 TEST_TCP(TEST_TCP1_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
306 TEST_TCP(TEST_TCP2_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
307 TEST_TCP(TEST_TCP3_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
308 TEST_TCP(TEST_TCP4_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
309 TEST_UDP(TEST_UDP1_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
310 TEST_UDP(TEST_UDP2_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
311 TEST_UDP(TEST_UDP3_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
312 TEST_UDP(TEST_UDP4_IPv6_PNG, LOCAL_IPV6_IP, REMOTE_IPV6_IP, IPv6, MAKE_PNG_ON_MESSAGE, true)
313 } // namespace OHOS::NetStack
314
main(int argc,char ** argv)315 int main(int argc, char **argv)
316 {
317 testing::GTEST_FLAG(output) = "xml:./";
318 testing::InitGoogleTest(&argc, argv);
319
320 JSRuntime *rt = JS_NewRuntime();
321
322 if (rt == nullptr) {
323 return 0;
324 }
325
326 JSContext *ctx = JS_NewContext(rt);
327 if (ctx == nullptr) {
328 return 0;
329 }
330
331 js_std_add_helpers(ctx, 0, nullptr);
332
333 g_nativeEngine = new QuickJSNativeEngine(rt, ctx, nullptr); // default instance id 0
334
335 int ret = RUN_ALL_TESTS();
336 (void)ret;
337
338 g_nativeEngine->Loop(LOOP_DEFAULT);
339
340 return 0;
341 }