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
16 #include "securec.h"
17 #include "gtest/gtest.h"
18 #include "log.h"
19 #include "utils.h"
20 #include <errno.h>
21 #include <sys/ioctl.h>
22 #include <sys/socket.h>
23 #include <bits/ioctl.h>
24 #include <arpa/inet.h>
25 #include <netinet/tcp.h>
26 #include <netinet/in.h>
27 #include <netinet/ether.h>
28 #include <net/if.h>
29 #include <netdb.h>
30 #include <resolv.h>
31 #include <arpa/nameser.h>
32 #include <poll.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <stdio.h>
36
37 using namespace std;
38 using namespace testing::ext;
39
40 #define PROTOCOL_COUNT 36
41 #define TEST_FD_COUNT 10
42 #define STACK_PORT 2288
43 #define PEER_PORT 2288
44 #define BUF_SIZE (100)
45 static const char* g_udpMsg = "Hi, this is UDP";
46 static const char* g_srvMsg = "Hi, this is TCP server";
47 static const char* g_cliMsg = "Hello, this is TCP client";
48 static const char* g_localHost = "127.0.0.1";
49 static char g_protocolList[PROTOCOL_COUNT][11] = {
50 "ip", "icmp", "igmp", "ggp", "ipencap", "st", "tcp",
51 "egp", "pup", "udp", "hmp", "xns-idp", "rdp", "iso-tp4", "xtp", "ddp", "idpr-cmtp", "ipv6",
52 "ipv6-route", "ipv6-frag", "idrp", "rsvp", "gre", "esp", "ah", "skip", "ipv6-icmp", "ipv6-nonxt",
53 "ipv6-opts", "rspf", "vmtp", "ospf", "ipip", "encap", "pim", "raw"
54 };
55 static int g_protocolNumber[PROTOCOL_COUNT] = {
56 0, 1, 2, 3, 4, 5, 6, 8, 12, 17, 20, 22, 27, 29, 36, 37,
57 38, 41, 43, 44, 45, 46, 47, 50, 51, 57, 58, 59, 60, 73, 81, 89, 94, 98, 103, 255
58 };
59
60 static pthread_barrier_t g_barrier;
61 #define WAIT() pthread_barrier_wait(&g_barrier)
62
63 class ActsNetTest : public testing::Test {
64 protected:
65 // SetUpTestCase: Testsuit setup, run before 1st testcase
SetUpTestCase(void)66 static void SetUpTestCase(void) {}
67 // TearDownTestCase: Testsuit teardown, run after last testcase
TearDownTestCase(void)68 static void TearDownTestCase(void) {}
69 // Testcase setup
SetUp()70 virtual void SetUp() {}
71 // Testcase teardown
TearDown()72 virtual void TearDown() {}
73 };
74
75 /* return fd */
CommInitTcpServer(int port)76 static int CommInitTcpServer(int port)
77 {
78 int srvFd = socket(AF_INET, SOCK_STREAM, 0);
79 if (srvFd == -1) {
80 printf("[###]CommInitTcpServer]socket fail!\n");
81 return -1;
82 }
83 int flag = 1;
84 int ret = setsockopt(srvFd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
85 if (ret != 0) {
86 printf("[###][CommInitTcpServer]setsockopt fail, ret[%d]!\n", ret);
87 }
88 struct sockaddr_in srvAddr = {0};
89 srvAddr.sin_family = AF_INET;
90 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
91 srvAddr.sin_port = htons(port);
92 ret = ::bind(srvFd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
93 if (ret != 0) {
94 printf("[###][CommInitTcpServer]::bind fail!\n");
95 close(srvFd);
96 return -1;
97 }
98 ret = listen(srvFd, 5);
99 if (ret != 0) {
100 printf("[###][CommInitTcpServer]listen fail!\n");
101 close(srvFd);
102 return -1;
103 }
104 printf("[###][CommInitTcpServer]success,Fd[%d]\n", srvFd);
105 return srvFd;
106 }
107
CommTcpClientTask(void * param)108 static void* CommTcpClientTask(void *param)
109 {
110 int* ret = (int *)malloc(sizeof(int));
111 if (ret == nullptr) {
112 printf("[---][comm client]malloc fail\n");
113 return nullptr;
114 }
115 *ret = 0;
116 int clnFd = socket(AF_INET, SOCK_STREAM, 0);
117 if (clnFd == -1) {
118 printf("[@@@][comm client]socket fail\n");
119 *ret = -1;
120 return ret;
121 }
122 struct sockaddr_in srvAddr = {0};
123 srvAddr.sin_family = AF_INET;
124 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
125 srvAddr.sin_port = htons(PEER_PORT + 1);
126 int rst = connect(clnFd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
127 if (rst != 0) {
128 printf("[@@@][comm client]connect fail\n");
129 close(clnFd);
130 *ret = -1;
131 return ret;
132 }
133 int sleepSecond = *((int *)param);
134 char dataBuf[50] = {0};
135 char sendMsgList[5][50] = {
136 "Hi, I'm client,FD:[%d]", "client:123456789abcdefg,FD:[%d]",
137 "client:!!@@##$$%%^^&&**(()),FD:[%d]", "client:(((112233445566778899))),FD:[%d]", "bye"
138 };
139 for (int i = 0; i < 4; i++) {
140 sleep(sleepSecond);
141 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
142 rst = sprintf_s(dataBuf, sizeof(dataBuf), sendMsgList[i], clnFd);
143 if (rst < 0) {
144 printf("[@@@][comm client]sprintf_s error!\n");
145 continue;
146 }
147 rst = send(clnFd, dataBuf, strlen(dataBuf), 0);
148 if (rst <= 0) {
149 *ret = -1;
150 printf("[@@@][comm client][%d]send fail\n", clnFd);
151 }
152 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
153 rst = recv(clnFd, dataBuf, sizeof(dataBuf), 0);
154 if (rst > 0) {
155 printf("[@@@][comm client][%d]recv msg[%s]\n", clnFd, dataBuf);
156 } else {
157 printf("[@@@][comm client][%d]recv no data\n", clnFd);
158 }
159 }
160 // send 'bye', finish
161 rst = send(clnFd, sendMsgList[4], strlen(sendMsgList[4]), 0);
162 if (rst <= 0) {
163 *ret = -1;
164 printf("[@@@][comm client][%d]send fail\n", clnFd);
165 }
166 rst = close(clnFd);
167 if (rst != 0) {
168 *ret = -1;
169 printf("[@@@][comm client][%d]close fd fail\n", clnFd);
170 }
171 return ret;
172 }
173
SampleTcpServerTask(void * p)174 static void* SampleTcpServerTask(void *p)
175 {
176 int srvFd = CommInitTcpServer(STACK_PORT);
177 EXPECT_NE(-1, srvFd);
178
179 WAIT();
180 struct sockaddr_in clnAddr = {0};
181 socklen_t clnAddrLen = sizeof(clnAddr);
182 int clnFd = accept(srvFd, (struct sockaddr*)&clnAddr, &clnAddrLen);
183 printf("[tcp server]accept <%s:%d>\n", inet_ntoa(clnAddr.sin_addr), ntohs(clnAddr.sin_port));
184 EXPECT_NE(-1, clnFd);
185 printf("[tcp server]lsfd[%d], sfd[%d]\n", srvFd, clnFd);
186
187 struct sockaddr addr = {0};
188 socklen_t addrLen = sizeof(addr);
189 int ret = getsockname(clnFd, &addr, &addrLen);
190 printf("[tcp server]getsockname %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
191 ntohs(((struct sockaddr_in*)&addr)->sin_port));
192 EXPECT_EQ(0, ret);
193 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
194
195 ret = getpeername(clnFd, &addr, &addrLen);
196 printf("[tcp server]getpeername %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
197 ntohs(((struct sockaddr_in*)&addr)->sin_port));
198 EXPECT_EQ(0, ret);
199 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
200
201 static char buf[BUF_SIZE + 1] = {0};
202 unsigned int srvMsgLen = strlen(g_srvMsg);
203 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
204 ret = strcpy_s(buf, BUF_SIZE, g_srvMsg);
205 EXPECT_EQ(0, ret);
206 ret = send(clnFd, buf, srvMsgLen, 0);
207 printf("[tcp server]send, ret=%d\n", ret);
208 EXPECT_EQ(srvMsgLen, (unsigned int)ret);
209
210 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
211 ret = recv(clnFd, buf, sizeof(buf), 0);
212 printf("[tcp server]recv, ret=%d, msg[%s]\n", ret, buf);
213 EXPECT_EQ(strlen(g_cliMsg), (unsigned int)ret);
214
215 WAIT();
216 int len = 2;
217 struct msghdr msg = {nullptr};
218 struct iovec iov[2] = {nullptr};
219 clnAddr.sin_family = AF_INET;
220 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
221 clnAddr.sin_port = htons(PEER_PORT);
222 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
223 ret = strcpy_s(buf, BUF_SIZE, g_srvMsg);
224 EXPECT_EQ(0, ret);
225 msg.msg_name = &clnAddr;
226 msg.msg_namelen = sizeof(clnAddr);
227 msg.msg_iov = iov;
228 msg.msg_iovlen = len;
229 iov[0].iov_base = buf;
230 iov[0].iov_len = srvMsgLen;
231 iov[1].iov_base = buf;
232 iov[1].iov_len = srvMsgLen;
233 ret = sendmsg(clnFd, &msg, 0);
234 printf("[tcp server]sendmsg, ret=%d\n", ret);
235 EXPECT_EQ(len * srvMsgLen, (unsigned int)ret);
236
237 WAIT();
238 static char bufrec[BUF_SIZE + 1] = {0};
239 memset_s(bufrec, sizeof(bufrec), 0, BUF_SIZE);
240 memset_s(&msg, sizeof(msg), 0, sizeof(msg));
241 msg.msg_name = &clnAddr;
242 msg.msg_namelen = sizeof(clnAddr);
243 msg.msg_iov = iov;
244 msg.msg_iovlen = 1;
245 iov[0].iov_base = bufrec;
246 iov[0].iov_len = sizeof(bufrec);
247 ret = recvmsg(clnFd, &msg, 0);
248 if (len * strlen(g_cliMsg) == (unsigned int)ret && ret >= 0) {
249 bufrec[ret] = 0;
250 printf("[tcp server]recvmsg on socket %d:%d, msg[%s]\n", clnFd, ret, buf);
251 } else {
252 EXPECT_TRUE(false);
253 printf("[tcp server] recvmsg on socket %d: %d\n", clnFd, ret);
254 }
255
256 ret = shutdown(clnFd, SHUT_RDWR);
257 printf("[tcp server]shutdown\n");
258 EXPECT_EQ(0, ret);
259 ret = close(clnFd);
260 EXPECT_NE(-1, ret);
261 ret = close(srvFd);
262 EXPECT_NE(-1, ret);
263 return nullptr;
264 }
265
SampleTcpClientTask(void * p)266 static void* SampleTcpClientTask(void *p)
267 {
268 int clnFd = socket(AF_INET, SOCK_STREAM, 0);
269 printf("[tcp client]create socket\n");
270 EXPECT_NE(-1, clnFd);
271
272 WAIT();
273 struct sockaddr_in srvAddr = {0};
274 srvAddr.sin_family = AF_INET;
275 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
276 srvAddr.sin_port = htons(PEER_PORT);
277 int ret = connect(clnFd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
278 printf("[tcp client]connect %s:%d, fd[%d]\n", inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), clnFd);
279 EXPECT_EQ(0, ret);
280
281 struct sockaddr addr = {0};
282 socklen_t addrLen = sizeof(addr);
283 ret = getpeername(clnFd, &addr, &addrLen);
284 printf("[tcp client]getpeername %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
285 ntohs(((struct sockaddr_in*)&addr)->sin_port));
286 EXPECT_EQ(0, ret);
287 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
288
289 ret = getsockname(clnFd, &addr, &addrLen);
290 printf("[tcp client]getsockname %s:%d\n", inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
291 ntohs(((struct sockaddr_in*)&addr)->sin_port));
292 EXPECT_EQ(0, ret);
293 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
294
295 static char buf[BUF_SIZE + 1] = {0};
296 unsigned int cliMsgLen = strlen(g_cliMsg);
297 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
298 ret = strcpy_s(buf, BUF_SIZE, g_cliMsg);
299 EXPECT_EQ(0, ret);
300 ret = send(clnFd, buf, cliMsgLen, 0);
301 printf("[tcp client]send, ret=%d\n", ret);
302 EXPECT_EQ(cliMsgLen, (unsigned int)ret);
303
304 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
305 ret = recv(clnFd, buf, sizeof(buf), 0);
306 printf("[tcp client]recv, ret=%d, msg[%s]\n", ret, buf);
307 EXPECT_EQ(strlen(g_srvMsg), (unsigned int)ret);
308
309 WAIT();
310 int len = 2;
311 struct msghdr msg = {nullptr};
312 struct iovec iov[2] = {nullptr};
313 struct sockaddr_in clnAddr = {0};
314 clnAddr.sin_family = AF_INET;
315 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
316 clnAddr.sin_port = htons(PEER_PORT);
317 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
318 ret = strcpy_s(buf, BUF_SIZE, g_cliMsg);
319 EXPECT_EQ(0, ret);
320 msg.msg_name = &clnAddr;
321 msg.msg_namelen = sizeof(clnAddr);
322 msg.msg_iov = iov;
323 msg.msg_iovlen = len;
324 iov[0].iov_base = buf;
325 iov[0].iov_len = cliMsgLen;
326 iov[1].iov_base = buf;
327 iov[1].iov_len = cliMsgLen;
328 ret = sendmsg(clnFd, &msg, 0);
329 printf("[tcp client]sendmsg, ret=%d\n", ret);
330 EXPECT_EQ(len * cliMsgLen, (unsigned int)ret);
331
332 WAIT();
333 static char bufrec[BUF_SIZE + 1] = {0};
334 memset_s(bufrec, sizeof(bufrec), 0, BUF_SIZE);
335 memset_s(&msg, sizeof(msg), 0, sizeof(msg));
336 msg.msg_name = &clnAddr;
337 msg.msg_namelen = sizeof(clnAddr);
338 msg.msg_iov = iov;
339 msg.msg_iovlen = 1;
340 iov[0].iov_base = bufrec;
341 iov[0].iov_len = sizeof(bufrec);
342 ret = recvmsg(clnFd, &msg, 0);
343 if (len * strlen(g_srvMsg) == (unsigned int)ret && ret >= 0) {
344 bufrec[ret] = 0;
345 printf("[tcp client]recvmsg, ret=%d, msg[%s]\n", ret, bufrec);
346 } else {
347 EXPECT_TRUE(false);
348 printf("[tcp clien]recvmsg, ret=%d\n", ret);
349 }
350
351 ret = shutdown(clnFd, SHUT_RDWR);
352 printf("[tcp client]shutdown\n");
353 EXPECT_EQ(0, ret);
354 ret = close(clnFd);
355 EXPECT_NE(-1, ret);
356 return nullptr;
357 }
358
TcpServerLoopTask(void * p)359 static void *TcpServerLoopTask(void *p)
360 {
361 int srvFd = CommInitTcpServer(STACK_PORT);
362 EXPECT_NE(-1, srvFd);
363 if (srvFd == -1)
364 {
365 LOG("CommInitTcpServer errno = %d\n", errno);
366 ADD_FAILURE();
367 }
368 int i = 0;
369 int clientFds[36];
370 struct sockaddr_in clnAddr = {0};
371 socklen_t clnAddrLen = sizeof(clnAddr);
372 while (i < 30)
373 {
374 clientFds[i] = accept(srvFd, (struct sockaddr *)&clnAddr, &clnAddrLen);
375 printf("[***---][tcp server loop]accept <%s:%d>, fd[%d]i[%d]\n", inet_ntoa(clnAddr.sin_addr),
376 ntohs(clnAddr.sin_port), clientFds[i], i);
377 EXPECT_NE(-1, clientFds[i]);
378 i++;
379 }
380
381 i--;
382 int ret;
383 while (i >= 0) {
384 ret = shutdown(clientFds[i], SHUT_RDWR);
385 EXPECT_EQ(0, ret);
386 ret = close(clientFds[i]);
387 EXPECT_NE(-1, ret) << "[***---][tcp server loop] close fd index[" << i << "]";
388 i--;
389 }
390 ret = close(srvFd);
391 EXPECT_NE(-1, ret);
392 return nullptr;
393 }
394
TcpClientOnlyConnectTask(void * p)395 static void* TcpClientOnlyConnectTask(void *p)
396 {
397 int tId = *((int *)p);
398 struct sockaddr addr = {0};
399 socklen_t addrLen = sizeof(addr);
400 struct sockaddr_in srvAddr = {0};
401 srvAddr.sin_family = AF_INET;
402 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
403 srvAddr.sin_port = htons(PEER_PORT);
404
405 int ret;
406 int index;
407 int clientFds[10];
408 for (index = 0; index < 10; index++) {
409 clientFds[index] = socket(AF_INET, SOCK_STREAM, 0);
410 printf("[------][tcp client[%d]]create socket fd[%d],index[%d]\n", tId, clientFds[index], index);
411 EXPECT_NE(-1, clientFds[index]);
412 ret = connect(clientFds[index], (struct sockaddr*)&srvAddr, sizeof(srvAddr));
413 EXPECT_EQ(0, ret);
414 if (ret != 0) {
415 break;
416 }
417
418 ret = getsockname(clientFds[index], &addr, &addrLen);
419 printf("[------][tcp client[%d]]getsockname %s:%d\n", tId, inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr),
420 ntohs(((struct sockaddr_in*)&addr)->sin_port));
421 EXPECT_EQ(0, ret);
422 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
423 ret = getpeername(clientFds[index], &addr, &addrLen);
424 EXPECT_EQ(0, ret);
425 EXPECT_EQ(inet_addr(g_localHost), ((struct sockaddr_in*)&addr)->sin_addr.s_addr);
426 sleep(1);
427 }
428
429 index--;
430 for (int i = index; i >= 0; i--) {
431 ret = shutdown(clientFds[i], SHUT_RDWR);
432 EXPECT_EQ(0, ret);
433 ret = close(clientFds[i]);
434 EXPECT_NE(-1, ret) << "[------][tcp client] close fd index[" << i << "]";
435 }
436 return nullptr;
437 }
438
TcpServerForFork()439 static int TcpServerForFork()
440 {
441 int timeout = 10;
442 char dataBuf[50] = {0};
443 int srvFd = CommInitTcpServer(STACK_PORT + 1);
444 if (srvFd == -1) {
445 return -1;
446 }
447 printf("[---][server process]wait client...\n");
448 int ret = -1;
449 struct sockaddr_in clnAddr = {0};
450 socklen_t clnAddrLen = sizeof(clnAddr);
451 int cliFd = accept(srvFd, (struct sockaddr*)&clnAddr, &clnAddrLen);
452 if (cliFd == -1) {
453 printf("[---][server process]accept fail!\n");
454 goto FINALLY;
455 }
456 while (timeout > 0) {
457 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
458 ret = recv(cliFd, dataBuf, sizeof(dataBuf), 0);
459 if (ret > 0) {
460 printf("[---][server process]recv msg[%s]\n", dataBuf);
461 if (strcmp(dataBuf, "bye") == 0) {
462 printf("[---][server process]break\n");
463 break;
464 }
465 } else {
466 printf("[---][server process]recv no data\n");
467 }
468 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
469 sprintf_s(dataBuf, sizeof(dataBuf), "server timeout:%d", timeout);
470 ret = send(cliFd, dataBuf, strlen(dataBuf), 0);
471 if (ret > 0) {
472 printf("[---][server process]send success, msg[%s]\n", dataBuf);
473 } else {
474 printf("[---][server process]send fail!\n");
475 }
476 timeout--;
477 }
478 close(cliFd);
479 printf("[---][server process]over\n");
480
481 FINALLY:
482 close(srvFd);
483 return ret;
484 }
485
SelectServerForFork(unsigned int timeoutSec)486 static int SelectServerForFork(unsigned int timeoutSec)
487 {
488 int srvFd = CommInitTcpServer(STACK_PORT + 1);
489 if (srvFd == -1) {
490 return -1;
491 }
492 int ret;
493 int cliCount = 0;
494 int maxFd = srvFd;
495 fd_set readSet;
496 char dataBuf[50] = {0};
497 int fds[TEST_FD_COUNT] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
498 fds[0] = srvFd;
499 struct timeval timev = {.tv_sec = timeoutSec, .tv_usec = 0};
500 struct sockaddr_in clnAddr = {0};
501 socklen_t clnAddrLen = sizeof(clnAddr);
502 while (1) {
503 FD_ZERO(&readSet);
504 for (int i = 0; i < TEST_FD_COUNT; i++) {
505 if (fds[i] != -1) {
506 FD_SET(fds[i], &readSet);
507 if (maxFd < fds[i]) {
508 maxFd = fds[i];
509 }
510 printf("[&&&][select process]fd info[%d:%d]\n", i, fds[i]);
511 }
512 }
513 ret = select(maxFd + 1, &readSet, nullptr, nullptr, &timev);
514 if (ret == 0) {
515 printf("[---][select process]select timeout!\n");
516 ret = -2;
517 break;
518 }
519 if (ret == -1) {
520 fprintf(stderr, "[---][select process]select fail[%s]\n", strerror(errno));
521 break;
522 }
523 if (FD_ISSET(srvFd, &readSet)) {
524 int cliFd = accept(srvFd, (struct sockaddr*)&clnAddr, &clnAddrLen);
525 if (cliFd == -1) {
526 printf("[---][select process]accept fail!\n");
527 ret = -1;
528 break;
529 } else {
530 for (int i = 0; i < TEST_FD_COUNT; i++) {
531 if (fds[i] == -1) {
532 fds[i] = cliFd;
533 break;
534 }
535 }
536 cliCount++;
537 printf("[***][select process]accept success, cliCount[%d]\n", cliCount);
538 }
539 continue;
540 }
541 for (int i = 0; i < TEST_FD_COUNT; i++) {
542 if (fds[i] == -1) {
543 continue;
544 }
545 if (FD_ISSET(fds[i], &readSet)) {
546 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
547 int len = recv(fds[i], dataBuf, sizeof(dataBuf), 0);
548 if (len > 0) {
549 printf("[***][select process][%d]recv msg[%s]\n", fds[i], dataBuf);
550 if (strcmp(dataBuf, "bye") == 0) {
551 printf("[###][select process][%d]client bye,cliCount[%d]\n", fds[i], cliCount);
552 FD_CLR(fds[i], &readSet);
553 close(fds[i]);
554 fds[i] = -1;
555 cliCount--;
556 continue;
557 }
558 len = send(fds[i], dataBuf, strlen(dataBuf), 0);
559 if (len > 0) {
560 printf("[***][select process][%d]send success\n", fds[i]);
561 } else {
562 printf("[---][select process][%d]send fail\n", fds[i]);
563 }
564 }
565 }
566 }
567 if (cliCount == 0) {
568 ret = 0;
569 printf("[###][select process]cliCount=0, over!\n");
570 break;
571 }
572 }
573 close(srvFd);
574 return ret;
575 }
576
PollServerForFork(int timeoutSec)577 static int PollServerForFork(int timeoutSec)
578 {
579 int srvFd = CommInitTcpServer(STACK_PORT + 1);
580 if (srvFd == -1) {
581 return -1;
582 }
583 int ret;
584 int cliCount = 0;
585 int fdCount = 1;
586 char dataBuf[50] = {0};
587 struct pollfd fds[TEST_FD_COUNT];
588 fds[0].events = POLLIN | POLLPRI;
589 fds[0].fd = srvFd;
590 for (int i = 1; i < TEST_FD_COUNT; i++) {
591 fds[i].fd = -1;
592 }
593 struct sockaddr_in clnAddr = {0};
594 socklen_t clnAddrLen = sizeof(clnAddr);
595 while (1) {
596 ret = poll(fds, fdCount, timeoutSec);
597 if (ret == 0) {
598 printf("[---][poll process]poll timeout!\n");
599 ret = -2;
600 break;
601 }
602 if (ret == -1) {
603 fprintf(stderr, "[---][poll process]poll fail[%s]\n", strerror(errno));
604 break;
605 }
606 if (fds[0].revents & POLLIN) {
607 int cliFd = accept(srvFd, (struct sockaddr*)&clnAddr, &clnAddrLen);
608 if (cliFd == -1) {
609 printf("[---][poll process]accept fail!\n");
610 ret = -1;
611 break;
612 } else {
613 for (int i = 1; i < TEST_FD_COUNT; i++) {
614 if (fds[i].fd == -1) {
615 fds[i].fd = cliFd;
616 fds[i].events = POLLIN | POLLPRI;
617 break;
618 }
619 }
620 cliCount++;
621 fdCount++;
622 printf("[***][poll process]accept success, cliCount[%d]\n", cliCount);
623 }
624 continue;
625 }
626 for (int i = 0; i < TEST_FD_COUNT; i++) {
627 if (fds[i].fd == -1) {
628 continue;
629 }
630 if (fds[i].revents & POLLIN) {
631 memset_s(dataBuf, sizeof(dataBuf), 0, sizeof(dataBuf));
632 int len = recv(fds[i].fd, dataBuf, sizeof(dataBuf), 0);
633 if (len > 0) {
634 printf("[***][poll process][%d]recv msg[%s]\n", fds[i].fd, dataBuf);
635 if (strcmp(dataBuf, "bye") == 0) {
636 printf("[###][select process][%d]client bye,cliCount[%d]\n", fds[i].fd, cliCount);
637 cliCount--;
638 continue;
639 }
640 len = send(fds[i].fd, dataBuf, strlen(dataBuf), 0);
641 if (len > 0) {
642 printf("[***][poll process][%d]send success\n", fds[i].fd);
643 } else {
644 printf("[---][poll process][%d]send fail\n", fds[i].fd);
645 }
646 }
647 }
648 }
649 if (cliCount == 0) {
650 ret = 0;
651 printf("[###][poll process]cliCount=0, over!\n");
652 break;
653 }
654 }
655 for (int i = 0; i < TEST_FD_COUNT; i++) {
656 if (fds[i].fd != -1) {
657 close(fds[i].fd);
658 }
659 }
660 close(srvFd);
661 return ret;
662 }
663
664 /**
665 * @tc.number : SUB_KERNEL_NET_0100
666 * @tc.name : sample test tcp
667 * @tc.desc : [C- SOFTWARE -0200]
668 */
669 HWTEST_F(ActsNetTest, testTcpSample, Function | MediumTest | Level2)
670 {
671 pthread_t srv;
672 pthread_t cli;
673
674 int ret = pthread_barrier_init(&g_barrier, 0, 2);
675 EXPECT_EQ(0, ret);
676
677 ret = pthread_create(&srv, nullptr, SampleTcpServerTask, nullptr);
678 EXPECT_EQ(0, ret);
679 ret = pthread_create(&cli, nullptr, SampleTcpClientTask, nullptr);
680 EXPECT_EQ(0, ret);
681
682 ret = pthread_join(cli, nullptr);
683 EXPECT_EQ(0, ret);
684 ret = pthread_join(srv, nullptr);
685 EXPECT_EQ(0, ret);
686
687 ret = pthread_barrier_destroy(&g_barrier);
688 EXPECT_EQ(0, ret);
689 }
690
691 /**
692 * @tc.number : SUB_KERNEL_NET_0200
693 * @tc.name : test tcp concurrent connect
694 * @tc.desc : [C- SOFTWARE -0200]
695 */
696 HWTEST_F(ActsNetTest, testTcpConcurrentConnect, Function | MediumTest | Level2)
697 {
698 pthread_t srv;
699 int ret = pthread_create(&srv, nullptr, TcpServerLoopTask, nullptr);
700 EXPECT_EQ(0, ret);
701
702 sleep(2);
703 pthread_t cliOne;
704 int tIdOne = 1;
705 ret = pthread_create(&cliOne, nullptr, TcpClientOnlyConnectTask, &tIdOne);
706 EXPECT_EQ(0, ret);
707 pthread_t cliTwo;
708 int tIdTwo = 2;
709 ret = pthread_create(&cliTwo, nullptr, TcpClientOnlyConnectTask, &tIdTwo);
710 EXPECT_EQ(0, ret);
711 pthread_t cliThree;
712 int tIdThree = 3;
713 ret = pthread_create(&cliThree, nullptr, TcpClientOnlyConnectTask, &tIdThree);
714 EXPECT_EQ(0, ret);
715
716 ret = pthread_join(srv, nullptr);
717 EXPECT_EQ(0, ret);
718 ret = pthread_join(cliOne, nullptr);
719 EXPECT_EQ(0, ret);
720 printf("[******]testTcpConnect thread[1] finish!\n");
721 ret = pthread_join(cliTwo, nullptr);
722 EXPECT_EQ(0, ret);
723 printf("[******]testTcpConnect thread[2] finish!\n");
724 ret = pthread_join(cliThree, nullptr);
725 EXPECT_EQ(0, ret);
726 printf("[******]testTcpConnect thread[3] finish!\n");
727 }
728
729 /**
730 * @tc.number : SUB_KERNEL_NET_0300
731 * @tc.name : sample test upd
732 * @tc.desc : [C- SOFTWARE -0200]
733 */
734 HWTEST_F(ActsNetTest, testUdpSample, Function | MediumTest | Level2)
735 {
736 int len = 2;
737 char buf[BUF_SIZE + 1];
738 struct msghdr msg = {nullptr};
739 struct iovec iov[2] = {nullptr};
740 struct sockaddr_in srvAddr = {0};
741 struct sockaddr_in clnAddr = {0};
742 socklen_t clnAddrLen = sizeof(clnAddr);
743
744 int sfd = socket(AF_INET, SOCK_DGRAM, 0);
745 ASSERT_NE(-1, sfd);
746 srvAddr.sin_family = AF_INET;
747 srvAddr.sin_addr.s_addr = inet_addr(g_localHost);
748 srvAddr.sin_port = htons(STACK_PORT);
749 int ret = ::bind(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
750 ASSERT_EQ(0, ret);
751
752 clnAddr.sin_family = AF_INET;
753 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
754 clnAddr.sin_port = htons(PEER_PORT);
755 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
756 ret = strcpy_s(buf, BUF_SIZE, g_udpMsg);
757 EXPECT_EQ(0, ret);
758 ret = sendto(sfd, buf, strlen(g_udpMsg), 0, (struct sockaddr*)&clnAddr, (socklen_t)sizeof(clnAddr));
759 EXPECT_NE(-1, ret);
760
761 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
762 ret = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&clnAddr, &clnAddrLen);
763 EXPECT_EQ(strlen(g_udpMsg), (unsigned int)ret);
764
765 clnAddr.sin_family = AF_INET;
766 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
767 clnAddr.sin_port = htons(PEER_PORT);
768 memset_s(buf, BUF_SIZE, 0, BUF_SIZE);
769 ret = strcpy_s(buf, BUF_SIZE, g_udpMsg);
770 EXPECT_EQ(0, ret);
771 msg.msg_name = &clnAddr;
772 msg.msg_namelen = sizeof(clnAddr);
773 msg.msg_iov = iov;
774 msg.msg_iovlen = len;
775 iov[0].iov_base = buf;
776 iov[0].iov_len = strlen(g_udpMsg);
777 iov[1].iov_base = buf;
778 iov[1].iov_len = strlen(g_udpMsg);
779 ret = sendmsg(sfd, &msg, 0);
780 EXPECT_EQ(len*strlen(g_udpMsg), (unsigned int)ret);
781
782 ret = close(sfd);
783 EXPECT_NE(-1, ret);
784 }
785
786 /**
787 * @tc.number : SUB_KERNEL_NET_0400
788 * @tc.name : test inter-process network communication
789 * @tc.desc : [C- SOFTWARE -0200]
790 */
791 HWTEST_F(ActsNetTest, testInterProcessComm, Function | MediumTest | Level2)
792 {
793 pid_t pid = fork();
794 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
795 if (pid == 0) {
796 // child:tcp server
797 int exitCode = 0;
798 int ret = TcpServerForFork();
799 if (ret == -1) {
800 printf("[tcp server]run fail\n");
801 exitCode = 1;
802 }
803 exit(exitCode);
804 } else {
805 // parent:tcp client
806 sleep(2);
807 int second = 1;
808 void *ret = CommTcpClientTask(&second);
809 if (ret == nullptr) {
810 printf("[test select]CommClientTask ret is null\n");
811 EXPECT_TRUE(0);
812 } else {
813 printf("[test select]CommClientTask ret...\n");
814 int rst = *((int *)ret);
815 printf("[test select]CommClientTask ret [%d]\n", rst);
816 EXPECT_EQ(0, rst);
817 free(ret);
818 }
819 WaitProcExitedOK(pid);
820 }
821 }
822
823 /**
824 * @tc.number : SUB_KERNEL_NET_0500
825 * @tc.name : test select timeout
826 * @tc.desc : [C- SOFTWARE -0200]
827 */
828 HWTEST_F(ActsNetTest, testSelectTimeout, Function | MediumTest | Level2)
829 {
830 pid_t pid = fork();
831 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
832 if (pid == 0) {
833 // child: server
834 int ret = SelectServerForFork(2);
835 if (ret == -2) {
836 exit(0);
837 } else {
838 printf("[select server]fail, ret is[%d]\n", ret);
839 exit(1);
840 }
841 } else {
842 WaitProcExitedOK(pid);
843 }
844 }
845
846 /**
847 * @tc.number : SUB_KERNEL_NET_0510
848 * @tc.name : test select with one client
849 * @tc.desc : [C- SOFTWARE -0200]
850 */
851 HWTEST_F(ActsNetTest, testSelectOneClient, Function | MediumTest | Level2)
852 {
853 pid_t pid = fork();
854 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
855 if (pid == 0) {
856 // child: server
857 int exitCode = 0;
858 int ret = SelectServerForFork(5);
859 if (ret != 0) {
860 printf("[###][select server]run fail\n");
861 exitCode = 1;
862 }
863 printf("[###][select server]ret[%d]\n", ret);
864 exit(exitCode);
865 } else {
866 // parent: client
867 sleep(2);
868 int second = 1;
869 void* ret = CommTcpClientTask(&second);
870 if (ret == nullptr) {
871 printf("[###][test select]CommClientTask ret is null\n");
872 EXPECT_TRUE(0);
873 } else {
874 int rst = *((int *)ret);
875 printf("[###][test select]CommClientTask ret [%d]\n", rst);
876 EXPECT_EQ(0, rst);
877 free(ret);
878 }
879 WaitProcExitedOK(pid);
880 }
881 }
882
883 /**
884 * @tc.number : SUB_KERNEL_NET_0520
885 * @tc.name : test select with multi clients
886 * @tc.desc : [C- SOFTWARE -0200]
887 */
888 HWTEST_F(ActsNetTest, testSelectMultiClients, Function | MediumTest | Level2)
889 {
890 pid_t pid = fork();
891 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
892 if (pid == 0) {
893 // child: server
894 int exitCode = 0;
895 int ret = SelectServerForFork(5);
896 if (ret != 0) {
897 printf("[###][select server]run fail\n");
898 exitCode = 1;
899 }
900 printf("[###][select server]ret[%d]\n", ret);
901 exit(exitCode);
902 } else {
903 // parent: client
904 sleep(2);
905 int ret;
906 pthread_t pCli[4];
907 int pEroId[4] = {0};
908 int interval[4] = {2, 1, 3, 1};
909 for (int i = 0; i < 4; i++) {
910 ret = pthread_create(&pCli[i], nullptr, CommTcpClientTask, &interval[i]);
911 if (ret == -1) {
912 pEroId[i] = -1;
913 } else {
914 EXPECT_EQ(0, ret) << "Errinfo:pthread_create index is [" << i << "]";
915 }
916 }
917
918 void* rst = nullptr;
919 for (int i = 0; i < 4; i++)
920 {
921 if (pEroId[i] == 0)
922 {
923 ret = pthread_join(pCli[i], &rst);
924 EXPECT_EQ(0, ret) << "Errinfo:pthread_join index is [" << i << "]";
925 if (rst != nullptr)
926 {
927 printf("[###][test select]client thread[%d] return[%d]\n", i, *((int *)rst));
928 EXPECT_EQ(0, *((int *)rst));
929 free(rst);
930 }
931 }
932 }
933 WaitProcExitedOK(pid);
934 }
935 }
936
937 /**
938 * @tc.number : SUB_KERNEL_NET_0600
939 * @tc.name : test poll timeout
940 * @tc.desc : [C- SOFTWARE -0200]
941 */
942 HWTEST_F(ActsNetTest, testPollTimeout, Function | MediumTest | Level2)
943 {
944 pid_t pid = fork();
945 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
946 if (pid == 0) {
947 // child: server
948 int ret = PollServerForFork(2000);
949 if (ret == -2) {
950 exit(0);
951 } else {
952 printf("[###][poll server]fail, ret is[%d]\n", ret);
953 exit(1);
954 }
955 } else {
956 WaitProcExitedOK(pid);
957 }
958 }
959
960 /**
961 * @tc.number : SUB_KERNEL_NET_0610
962 * @tc.name : test poll with one client
963 * @tc.desc : [C- SOFTWARE -0200]
964 */
965 HWTEST_F(ActsNetTest, testPollOneClient, Function | MediumTest | Level2)
966 {
967 pid_t pid = fork();
968 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
969 if (pid == 0) {
970 // child: server
971 int exitCode = 0;
972 int ret = PollServerForFork(5000);
973 if (ret != 0) {
974 printf("[###][poll server]run fail\n");
975 exitCode = 1;
976 }
977 printf("[###][poll server]ret[%d]\n", ret);
978 exit(exitCode);
979 } else {
980 // parent: client
981 sleep(2);
982 int second = 1;
983 void* ret = CommTcpClientTask(&second);
984 if (ret == nullptr) {
985 printf("[###][test poll]CommClientTask ret is null\n");
986 EXPECT_TRUE(0);
987 } else {
988 int rst = *((int *)ret);
989 printf("[###][test poll]CommClientTask ret [%d]\n", rst);
990 EXPECT_EQ(0, rst);
991 free(ret);
992 }
993 WaitProcExitedOK(pid);
994 }
995 }
996
997 /**
998 * @tc.number : SUB_KERNEL_NET_0620
999 * @tc.name : test poll with multi clients
1000 * @tc.desc : [C- SOFTWARE -0200]
1001 */
1002 HWTEST_F(ActsNetTest, testPollMultiClients, Function | MediumTest | Level2)
1003 {
1004 pid_t pid = fork();
1005 ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
1006 if (pid == 0) {
1007 // child: server
1008 int exitCode = 0;
1009 int ret = PollServerForFork(5000);
1010 if (ret != 0) {
1011 printf("[###][poll server]run fail\n");
1012 exitCode = 1;
1013 }
1014 printf("[###][poll server]ret[%d]\n", ret);
1015 exit(exitCode);
1016 } else {
1017 // parent: client
1018 sleep(2);
1019 int ret;
1020 pthread_t pCli[6];
1021 int pEroId[6] = {0};
1022 int interval[6] = {2, 1, 3, 1, 2, 1};
1023 for (int i = 0; i < 6; i++)
1024 {
1025 ret = pthread_create(&pCli[i], nullptr, CommTcpClientTask, &interval[i]);
1026 if (ret == -1)
1027 {
1028 pEroId[i] = -1;
1029 }
1030 else
1031 {
1032 EXPECT_EQ(0, ret) << "Errinfo:pthread_create index is [" << i << "]";
1033 }
1034 }
1035
1036 void* rst = nullptr;
1037 for (int i = 0; i < 6; i++)
1038 {
1039 if (pEroId[i] == 0)
1040 {
1041 ret = pthread_join(pCli[i], &rst);
1042 EXPECT_EQ(0, ret) << "Errinfo:pthread_join index is [" << i << "]";
1043 if (rst != nullptr)
1044 {
1045 printf("[###][test poll]client thread[%d] return[%d]\n", i, *((int *)rst));
1046 EXPECT_EQ(0, *((int *)rst));
1047 free(rst);
1048 }
1049 }
1050 }
1051 WaitProcExitedOK(pid);
1052 }
1053 }
1054
1055 /**
1056 * @tc.number : SUB_KERNEL_NET_0700
1057 * @tc.name : test ioctl SIOCGIFCONF
1058 * @tc.desc : [C- SOFTWARE -0200]
1059 */
1060 HWTEST_F(ActsNetTest, testIoctlIfconf, Function | MediumTest | Level2)
1061 {
1062 int udpFd = socket(AF_INET, SOCK_DGRAM, 0);
1063 ASSERT_NE(-1, udpFd);
1064
1065 struct ifreq ifr[5];
1066 struct ifconf ifc = {0};
1067 memset_s(&ifc, sizeof(struct ifconf), 0, sizeof(struct ifconf));
1068 ifc.ifc_len = 5 * sizeof(struct ifreq);
1069 ifc.ifc_buf = (char *)ifr;
1070 int ret = ioctl(udpFd, SIOCGIFCONF, (char *)&ifc);
1071 ASSERT_EQ(0, ret) << "ioctl fail[SIOCGIFCONF], errinfo[" << strerror(errno) << "]";
1072 int ifrCount = ifc.ifc_len / sizeof(struct ifreq);
1073 EXPECT_TRUE(ifrCount >= 2);
1074 for (int i = 0; i < ifrCount; i++) {
1075 printf("[###]interface name is %s\n", ifr[i].ifr_name);
1076 }
1077 ret = close(udpFd);
1078 EXPECT_EQ(0, ret);
1079 }
1080
1081 /**
1082 * @tc.number : SUB_KERNEL_NET_0710
1083 * @tc.name : test ioctl get set delete IFADDR,FIONREAD, localhost
1084 * @tc.desc : [C- SOFTWARE -0200]
1085 */
1086 HWTEST_F(ActsNetTest, testIoctlIfnetAddrLocal, Function | MediumTest | Level2)
1087 {
1088 int udpFd = socket(AF_INET, SOCK_DGRAM, 0);
1089 ASSERT_NE(-1, udpFd);
1090
1091 // get ifnet address
1092 struct ifreq ifr = {0};
1093 const char *deviceLo = "lo";
1094 int ret = strcpy_s(ifr.ifr_name, sizeof(ifr.ifr_name), deviceLo);
1095 EXPECT_EQ(0, ret) << "strcpy_s fail!";
1096 ret = ioctl(udpFd, SIOCGIFADDR, &ifr);
1097 ASSERT_EQ(0, ret) << "ioctl fail[SIOCGIFADDR], errinfo[" << strerror(errno) << "]";
1098 struct sockaddr_in *srvAddr = (struct sockaddr_in *)&ifr.ifr_addr;
1099 EXPECT_STREQ(g_localHost, inet_ntoa(srvAddr->sin_addr));
1100 srvAddr->sin_family = AF_INET;
1101 srvAddr->sin_port = htons(STACK_PORT);
1102
1103 // get read buffer bytes
1104 ret = ::bind(udpFd, (struct sockaddr*)srvAddr, sizeof(sockaddr_in));
1105 struct sockaddr_in clnAddr = {0};
1106 clnAddr.sin_family = AF_INET;
1107 clnAddr.sin_port = htons(PEER_PORT);
1108 clnAddr.sin_addr.s_addr = inet_addr(g_localHost);
1109 const char *msg = "Hi, test ioctl...";
1110 unsigned int msgLen = strlen(msg);
1111 ret = sendto(udpFd, msg, msgLen, 0, (struct sockaddr*)&clnAddr, (socklen_t)sizeof(clnAddr));
1112 EXPECT_NE(-1, ret);
1113 EXPECT_EQ(msgLen, (unsigned int)ret);
1114 int bytes;
1115 ret = ioctl(udpFd, FIONREAD, &bytes);
1116 EXPECT_EQ(0, ret) << "ioctl fail[FIONREAD], errinfo[" << strerror(errno) << "]";
1117 EXPECT_EQ(msgLen, (unsigned int)bytes);
1118
1119 // delete lo address, will fail
1120 ret = ioctl(udpFd, SIOCDIFADDR, &ifr);
1121 EXPECT_EQ(-1, ret);
1122 EXPECT_STREQ("Operation not permitted", strerror(errno));
1123 // set lo address, will fail
1124 srvAddr->sin_addr.s_addr = inet_addr(g_localHost);
1125 ret = ioctl(udpFd, SIOCSIFADDR, &ifr);
1126 EXPECT_STREQ("Operation not permitted", strerror(errno));
1127
1128 ret = close(udpFd);
1129 EXPECT_EQ(0, ret);
1130 }
1131
1132 /**
1133 * @tc.number : SUB_KERNEL_NET_0720
1134 * @tc.name : test ioctl get and set IFADDR others
1135 * @tc.desc : [C- SOFTWARE -0200]
1136 */
1137 HWTEST_F(ActsNetTest, testIoctlIfnetAddrOthers, Function | MediumTest | Level2)
1138 {
1139 int udpFd = socket(AF_INET, SOCK_DGRAM, 0);
1140 ASSERT_NE(-1, udpFd);
1141
1142 struct ifreq ifr[5];
1143 struct ifconf ifc = {0};
1144 memset_s(&ifc, sizeof(struct ifconf), 0, sizeof(struct ifconf));
1145 ifc.ifc_len = 5 * sizeof(struct ifreq);
1146 ifc.ifc_buf = (char *)ifr;
1147 int ret = ioctl(udpFd, SIOCGIFCONF, (char *)&ifc);
1148 ASSERT_EQ(0, ret) << "ioctl fail[SIOCGIFCONF], errinfo[" << strerror(errno) << "]";
1149
1150 struct ifreq ifrTmp = {0};
1151 struct sockaddr_in *addr1 = nullptr;
1152 struct sockaddr_in *addr2 = nullptr;
1153 int ifrCount = ifc.ifc_len / sizeof(struct ifreq);
1154 EXPECT_TRUE(ifrCount >= 2);
1155 for (int i = 0; i < ifrCount; i++) {
1156 addr1 = (struct sockaddr_in *)&ifr[i].ifr_addr;
1157 if (strcmp("lo", ifr[i].ifr_name) != 0) {
1158 // get inet addr
1159 memset_s(&ifrTmp, sizeof(struct ifreq), 0, sizeof(struct ifreq));
1160 ret = strcpy_s(ifrTmp.ifr_name, sizeof(ifrTmp.ifr_name), ifr[i].ifr_name);
1161 ret = ioctl(udpFd, SIOCGIFADDR, &ifrTmp);
1162 ASSERT_EQ(0, ret) << "ioctl fail[SIOCGIFADDR], errinfo[" << strerror(errno) << "]";
1163 addr2 = (struct sockaddr_in *)&ifrTmp.ifr_addr;
1164 EXPECT_EQ(addr1->sin_addr.s_addr, addr2->sin_addr.s_addr);
1165 printf("[###]get %s\n", ifr[i].ifr_name);
1166
1167 // set inet addr
1168 addr2->sin_addr.s_addr = addr1->sin_addr.s_addr;
1169 ret = ioctl(udpFd, SIOCSIFADDR, &ifrTmp);
1170 if (strcmp("0.0.0.0", inet_ntoa(addr1->sin_addr)) == 0) {
1171 // can't set 0.0.0.0
1172 EXPECT_NE(0, ret) << "ioctl[0.0.0.0] fail[SIOCSIFADDR], errinfo[" << strerror(errno) << "]";
1173 } else {
1174 EXPECT_EQ(0, ret) << "ioctl fail[SIOCSIFADDR], errinfo[" << strerror(errno) << "]";
1175 }
1176 // get again
1177 ret = ioctl(udpFd, SIOCGIFADDR, &ifrTmp);
1178 EXPECT_EQ(0, ret) << "ioctl fail[SIOCGIFADDR], errinfo[" << strerror(errno) << "]";
1179 EXPECT_EQ(addr1->sin_addr.s_addr, addr2->sin_addr.s_addr);
1180 }
1181 }
1182 ret = close(udpFd);
1183 EXPECT_EQ(0, ret);
1184 }
1185
1186 /**
1187 * @tc.number : SUB_KERNEL_NET_0730
1188 * @tc.name : test ioctl get and set IFHWADDR
1189 * @tc.desc : [C- SOFTWARE -0200]
1190 */
1191 HWTEST_F(ActsNetTest, testIoctlIfhwAddr, Function | MediumTest | Level2)
1192 {
1193 int udpFd = socket(AF_INET, SOCK_DGRAM, 0);
1194 ASSERT_NE(-1, udpFd);
1195
1196 struct ifreq ifr[5];
1197 struct ifconf ifc = {0};
1198 memset_s(&ifc, sizeof(struct ifconf), 0, sizeof(struct ifconf));
1199 ifc.ifc_len = 5 * sizeof(struct ifreq);
1200 ifc.ifc_buf = (char *)ifr;
1201 int ret = ioctl(udpFd, SIOCGIFCONF, (char *)&ifc);
1202 ASSERT_EQ(0, ret) << "ioctl fail[SIOCGIFCONF], errinfo[" << strerror(errno) << "]";
1203
1204 char rst1[18];
1205 char rst2[18];
1206 char* macPtr = nullptr;
1207 struct ifreq ifrTmp = {0};
1208 struct sockaddr_in *addr = nullptr;
1209 int ifrCount = ifc.ifc_len / sizeof(struct ifreq);
1210 EXPECT_TRUE(ifrCount >= 2);
1211 for (int i = 0; i < ifrCount; i++) {
1212 addr = (struct sockaddr_in *)&ifr[i].ifr_addr;
1213 if (strcmp("lo", ifr[i].ifr_name) != 0) {
1214 // get ifhwaddr
1215 memset_s(&ifrTmp, sizeof(struct ifreq), 0, sizeof(struct ifreq));
1216 ret = strcpy_s(ifrTmp.ifr_name, sizeof(ifrTmp.ifr_name), ifr[i].ifr_name);
1217 EXPECT_EQ(0, ret) << "strcpy_s error";
1218 ret = ioctl(udpFd, SIOCGIFHWADDR, &ifrTmp);
1219 ASSERT_EQ(0, ret) << "ioctl fail[SIOCGIFHWADDR], errinfo[" << strerror(errno) << "]";
1220 macPtr = ifrTmp.ifr_hwaddr.sa_data;
1221 ret = sprintf_s(rst1, sizeof(rst1), "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", *macPtr, *(macPtr+1),
1222 *(macPtr+2), *(macPtr+3), *(macPtr+4), *(macPtr+5));
1223 EXPECT_EQ(strlen(rst1), (unsigned int)ret) << "sprintf_s error";
1224 printf("[###]get %s \n", ifrTmp.ifr_name);
1225 }
1226 }
1227 ret = close(udpFd);
1228 EXPECT_EQ(0, ret);
1229 }
1230
1231 /**
1232 * @tc.number : SUB_KERNEL_NET_1000
1233 * @tc.name : test socket operation
1234 * @tc.desc : [C- SOFTWARE -0200]
1235 */
1236 HWTEST_F(ActsNetTest, testSocketOpt, Function | MediumTest | Level2)
1237 {
1238 socklen_t len;
1239 struct timeval timeout = {0};
1240 int fd = socket(AF_INET, SOCK_STREAM, 0);
1241 EXPECT_NE(-1, fd);
1242
1243 int error = -1;
1244 len = sizeof(error);
1245 int ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
1246 EXPECT_EQ(0, ret);
1247 EXPECT_EQ(0, error);
1248
1249 len = sizeof(timeout);
1250 ret = getsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, &len);
1251 EXPECT_EQ(0, ret);
1252
1253 timeout.tv_sec = 1000;
1254 len = sizeof(timeout);
1255 ret = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, len);
1256 EXPECT_EQ(0, ret);
1257
1258 memset_s(&timeout, len, 0, len);
1259 ret = getsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, &len);
1260 EXPECT_EQ(0, ret);
1261 EXPECT_EQ(1000, timeout.tv_sec);
1262
1263 int flag = 1;
1264 ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
1265 EXPECT_EQ(0, ret);
1266
1267 flag = 0;
1268 len = sizeof(flag);
1269 ret = getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, &len);
1270 EXPECT_EQ(0, ret);
1271 EXPECT_EQ(1, flag);
1272
1273 error = -1;
1274 len = sizeof(error);
1275 ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
1276 EXPECT_EQ(0, ret);
1277 EXPECT_EQ(0, error);
1278
1279 ret = close(fd);
1280 EXPECT_EQ(0, ret);
1281 }
1282
1283 /**
1284 * @tc.number : SUB_KERNEL_NET_1100
1285 * @tc.name : test getsockname and getpeername invalid input
1286 * @tc.desc : [C- SOFTWARE -0200]
1287 */
1288 HWTEST_F(ActsNetTest, testGetSocketNameInvalidInput, Function | MediumTest | Level3)
1289 {
1290 struct sockaddr addr = {0};
1291 socklen_t addrLen = sizeof(addr);
1292 int ret = getsockname(-1, &addr, &addrLen);
1293 EXPECT_EQ(-1, ret);
1294 ret = getpeername(-1, &addr, &addrLen);
1295 EXPECT_EQ(-1, ret);
1296 ret = getsockname(0, &addr, &addrLen);
1297 EXPECT_EQ(-1, ret);
1298 ret = getpeername(0, &addr, &addrLen);
1299 EXPECT_EQ(-1, ret);
1300 ret = getsockname(1, &addr, &addrLen);
1301 EXPECT_EQ(-1, ret);
1302 ret = getpeername(1, &addr, &addrLen);
1303 EXPECT_EQ(-1, ret);
1304 ret = getsockname(130, &addr, &addrLen);
1305 EXPECT_EQ(-1, ret);
1306 ret = getpeername(130, &addr, &addrLen);
1307 EXPECT_EQ(-1, ret);
1308 ret = getsockname(10, nullptr, &addrLen);
1309 EXPECT_EQ(-1, ret);
1310 ret = getpeername(10, nullptr, &addrLen);
1311 EXPECT_EQ(-1, ret);
1312 ret = getsockname(10, &addr, nullptr);
1313 EXPECT_EQ(-1, ret);
1314 ret = getpeername(10, &addr, nullptr);
1315 EXPECT_EQ(-1, ret);
1316 }
1317
1318 /**
1319 * @tc.number : SUB_KERNEL_NET_1200
1320 * @tc.name : test domain name compress and expand normally
1321 * @tc.desc : [C- SOFTWARE -0200]
1322 */
1323 HWTEST_F(ActsNetTest, testDnCompExpandNormal, Function | MediumTest | Level2)
1324 {
1325 const char* domain1 = "www.testohos.com";
1326 unsigned char buf[MAXDNAME] = {0};
1327 unsigned char* bufPtr = buf;
1328 int ret = dn_comp(domain1, bufPtr, MAXDNAME, nullptr, nullptr);
1329 EXPECT_NE(-1, ret) << "dn_comp fail, buf is '" << buf << "'";
1330 int len = ret + 4;
1331
1332 char expandDn[MAXDNAME];
1333 unsigned char* eomorig = buf + MAXDNAME;
1334 ret = dn_expand(buf, eomorig, buf, expandDn, MAXDNAME);
1335 EXPECT_NE(-1, ret);
1336 EXPECT_STREQ(domain1, expandDn);
1337 printf("dn_expand ret=%d, expandDn is '%s'\n", ret, expandDn);
1338
1339 const char* domain2 = "www.baidu.com";
1340 unsigned char* dnptrs[5] = {bufPtr, nullptr};
1341 unsigned char** lastdnptr = dnptrs + 5;
1342 ret = dn_comp(domain2, bufPtr + len, MAXDNAME - len, dnptrs, lastdnptr);
1343 EXPECT_NE(-1, ret) << "dn_comp(with dnptrs) fail, buf+len is '" << bufPtr + len << "'";
1344
1345 char expandDnWithDnptrs[MAXDNAME];
1346 unsigned char* eomorigWithDnptrs = buf + MAXDNAME;
1347 ret = dn_expand(dnptrs[1], eomorigWithDnptrs, dnptrs[1], expandDnWithDnptrs, MAXDNAME);
1348 EXPECT_NE(-1, ret);
1349 EXPECT_STREQ(domain2, expandDnWithDnptrs);
1350 }
1351
1352 /**
1353 * @tc.number : SUB_KERNEL_NET_1300
1354 * @tc.name : test domain name compress and expand abnormally
1355 * @tc.desc : [C- SOFTWARE -0200]
1356 */
1357 HWTEST_F(ActsNetTest, testDnCompExpandAbnormal, Function | MediumTest | Level3)
1358 {
1359 const char* src = "!#%^.)(-+{}\r\n";
1360 unsigned char destComp[MAXDNAME];
1361 int ret = dn_comp(src, destComp, 10, nullptr, nullptr);
1362 EXPECT_EQ(-1, ret);
1363 printf("dn_comp ret=%d, compDn is '%s'\n", ret, destComp);
1364
1365 ret = dn_comp("www.baidu.com", destComp, MAXDNAME, nullptr, nullptr);
1366 EXPECT_NE(-1, ret);
1367
1368 // dest array too small
1369 char destExpand[5];
1370 unsigned char *eomorig = destComp + 10;
1371 ret = dn_expand(destComp, eomorig, destComp, destExpand, MAXDNAME);
1372 EXPECT_EQ(-1, ret);
1373 printf("dn_expand ret=%d, expandDn is '%s'\n", ret, destExpand);
1374
1375 // compress info is 0
1376 unsigned char destCompError[20] = {0};
1377 eomorig = destCompError + 20;
1378 ret = dn_expand(destCompError, eomorig, destCompError, destExpand, MAXDNAME);
1379 EXPECT_EQ(1, ret);
1380 printf("dn_expand ret=%d, expandDn is '%s'\n", ret, destExpand);
1381 }
1382
1383 /**
1384 * @tc.number : SUB_KERNEL_NET_1400
1385 * @tc.name : test convert 48 bit Ethernet host address normally
1386 * @tc.desc : [C- SOFTWARE -0200]
1387 */
1388 HWTEST_F(ActsNetTest, testEtherConvertNormal, Function | MediumTest | Level2)
1389 {
1390 char atonByteRst[24];
1391 char* ntoaRst = nullptr;
1392 struct ether_addr *atonRst = nullptr;
1393 char addrHex[3][18] = {"FF:FF:FF:FF:FF:FF", "00:00:00:00:00:00", "0A:1B:2C:3D:4E:5F"};
1394 char addrByte[3][24] = {"255.255.255.255.255.255", "0.0.0.0.0.0", "10.27.44.61.78.95"};
1395 for (int i = 0; i < 3; i++) {
1396 atonRst = nullptr;
1397 atonRst = ether_aton(addrHex[i]);
1398 ASSERT_TRUE(atonRst != nullptr);
1399 int ret = sprintf_s(atonByteRst, sizeof(atonByteRst), "%u.%u.%u.%u.%u.%u",
1400 atonRst->ether_addr_octet[0], atonRst->ether_addr_octet[1],
1401 atonRst->ether_addr_octet[2], atonRst->ether_addr_octet[3],
1402 atonRst->ether_addr_octet[4], atonRst->ether_addr_octet[5]);
1403 EXPECT_STREQ(addrByte[i], atonByteRst) << "ErrInfo:result '" << atonByteRst << "',ret=" << ret;
1404
1405 ntoaRst = nullptr;
1406 ntoaRst = ether_ntoa(atonRst);
1407 EXPECT_TRUE(ntoaRst != nullptr);
1408 EXPECT_STREQ(addrHex[i], ntoaRst) << "ErrInfo:result '" << ntoaRst << "'";
1409 }
1410 }
1411
1412 /**
1413 * @tc.number : SUB_KERNEL_NET_1500
1414 * @tc.name : test convert 48 bit Ethernet host address abnormally
1415 * @tc.desc : [C- SOFTWARE -0200]
1416 */
1417 HWTEST_F(ActsNetTest, testEtherConvertAbnormal, Function | MediumTest | Level3)
1418 {
1419 char* addrError = (char *)":::F:Z:";
1420 struct ether_addr *atonRst = nullptr;
1421 atonRst = ether_aton(addrError);
1422 EXPECT_TRUE(atonRst == nullptr);
1423 }
1424
1425 /**
1426 * @tc.number : SUB_KERNEL_NET_1600
1427 * @tc.name : test thread safe convert 48 bit Ethernet host address normally
1428 * @tc.desc : [C- SOFTWARE -0200]
1429 */
1430 HWTEST_F(ActsNetTest, testEtherConvertNormalWithThreadSafe, Function | MediumTest | Level2)
1431 {
1432 int ret;
1433 char ntoaDataRst[18];
1434 char* ntoaPointRst = nullptr;
1435 struct ether_addr *atonPointRst = nullptr;
1436 struct ether_addr *atonDataRst = (ether_addr *)malloc(sizeof(ether_addr));
1437 ASSERT_TRUE(atonDataRst != nullptr);
1438 char addrHex[3][18] = {"FF:FF:FF:FF:FF:FF", "00:00:00:00:00:00", "5F:4E:2C:3D:1B:0A"};
1439 char addrByte[3][24] = {"255.255.255.255.255.255", "0.0.0.0.0.0", "95.78.44.61.27.10"};
1440 for (int i = 0; i < 3; i++) {
1441 atonPointRst = nullptr;
1442 atonPointRst = ether_aton_r(addrHex[i], atonDataRst);
1443 ASSERT_TRUE(atonPointRst != nullptr);
1444 char byteRst[24];
1445 ret = sprintf_s(byteRst, sizeof(byteRst), "%u.%u.%u.%u.%u.%u",
1446 atonDataRst->ether_addr_octet[0], atonDataRst->ether_addr_octet[1],
1447 atonDataRst->ether_addr_octet[2], atonDataRst->ether_addr_octet[3],
1448 atonDataRst->ether_addr_octet[4], atonDataRst->ether_addr_octet[5]);
1449 EXPECT_STREQ(addrByte[i], byteRst) << "ErrInfo:ether_aton_r rst[" << byteRst << "], ret[" << ret << "]";
1450 ret = sprintf_s(byteRst, sizeof(byteRst), "%u.%u.%u.%u.%u.%u",
1451 atonPointRst->ether_addr_octet[0], atonPointRst->ether_addr_octet[1],
1452 atonPointRst->ether_addr_octet[2], atonPointRst->ether_addr_octet[3],
1453 atonPointRst->ether_addr_octet[4], atonPointRst->ether_addr_octet[5]);
1454 EXPECT_STREQ(addrByte[i], byteRst) << "ErrInfo:ether_aton_r rst[" << byteRst << "], ret[" << ret << "]";
1455
1456 ntoaPointRst = nullptr;
1457 ntoaPointRst = ether_ntoa_r(atonDataRst, ntoaDataRst);
1458 EXPECT_STREQ(addrHex[i], ntoaDataRst);
1459 EXPECT_STREQ(addrHex[i], ntoaPointRst);
1460 printf("ether_ntoa_r result '%s', '%s'\n", ntoaDataRst, ntoaPointRst);
1461 }
1462
1463 free(atonDataRst);
1464 }
1465
1466 /**
1467 * @tc.number : SUB_KERNEL_NET_1700
1468 * @tc.name : test get protocals by normal name and number
1469 * @tc.desc : [C- SOFTWARE -0200]
1470 */
1471 HWTEST_F(ActsNetTest, testGetProtoByNormal, Function | MediumTest | Level2)
1472 {
1473 int number;
1474 struct protoent *protoPtr = nullptr;
1475 for (int i = 0; i < PROTOCOL_COUNT; i++) {
1476 protoPtr = getprotobyname(g_protocolList[i]);
1477 if (protoPtr == nullptr) {
1478 printf("getprotobyname is NULL! [%s]\n", g_protocolList[i]);
1479 continue;
1480 }
1481 EXPECT_STREQ(g_protocolList[i], protoPtr->p_name);
1482 number = protoPtr->p_proto;
1483
1484 protoPtr = nullptr;
1485 protoPtr = getprotobynumber(number);
1486 if (protoPtr == nullptr) {
1487 EXPECT_TRUE(protoPtr != NULL) << "ErrInfo:getprotobynumber NULL '" << g_protocolList[i] << "'";
1488 continue;
1489 }
1490 EXPECT_STREQ(g_protocolList[i], protoPtr->p_name);
1491 protoPtr = nullptr;
1492 }
1493 }
1494
1495 /**
1496 * @tc.number : SUB_KERNEL_NET_1800
1497 * @tc.name : test get protocals by invalid name and number
1498 * @tc.desc : [C- SOFTWARE -0200]
1499 */
1500 HWTEST_F(ActsNetTest, testGetProtoByAbNormal, Function | MediumTest | Level2)
1501 {
1502 struct protoent* protoPtr = nullptr;
1503 protoPtr = getprotobyname("ipv4");
1504 EXPECT_TRUE(protoPtr == NULL);
1505 protoPtr = getprotobyname("idpr-cmtp-s");
1506 EXPECT_TRUE(protoPtr == NULL);
1507 protoPtr = getprotobyname("12&^%$\n\0?><");
1508 EXPECT_TRUE(protoPtr == NULL);
1509
1510 protoPtr = getprotobynumber(-1);
1511 EXPECT_TRUE(protoPtr == NULL);
1512 protoPtr = getprotobynumber(256);
1513 EXPECT_TRUE(protoPtr == NULL);
1514 }
1515
1516 /**
1517 * @tc.number : SUB_KERNEL_NET_1900
1518 * @tc.name : test getprotoent
1519 * @tc.desc : [C- SOFTWARE -0200]
1520 */
1521 HWTEST_F(ActsNetTest, testGetProtoent, Function | MediumTest | Level2)
1522 {
1523 int index = 0;
1524 struct protoent* protoPtr = nullptr;
1525 setprotoent(0);
1526 while (index < PROTOCOL_COUNT) {
1527 protoPtr = getprotoent();
1528 if (protoPtr == NULL) {
1529 EXPECT_TRUE(protoPtr != NULL) << "ErrInfo:getprotoent NULL, index[" << index << "]";
1530 } else {
1531 EXPECT_STREQ(g_protocolList[index], protoPtr->p_name);
1532 EXPECT_EQ(g_protocolNumber[index], protoPtr->p_proto);
1533 }
1534 protoPtr = nullptr;
1535 index ++;
1536 }
1537
1538 protoPtr = getprotoent();
1539 EXPECT_TRUE(protoPtr == NULL);
1540 }
1541
1542 /**
1543 * @tc.number : SUB_KERNEL_NET_2000
1544 * @tc.name : test setprotoent
1545 * @tc.desc : [C- SOFTWARE -0200]
1546 */
1547 HWTEST_F(ActsNetTest, testSetProtoent, Function | MediumTest | Level2)
1548 {
1549 int index = 0;
1550 struct protoent* protoPtr = nullptr;
1551 setprotoent(0);
1552 while (index < PROTOCOL_COUNT) {
1553 protoPtr = getprotoent();
1554 if (protoPtr == nullptr) {
1555 EXPECT_TRUE(protoPtr != NULL) << "ErrInfo:getprotoent NULL, index[" << index << "]";
1556 } else {
1557 EXPECT_STREQ(g_protocolList[index], protoPtr->p_name);
1558 EXPECT_EQ(g_protocolNumber[index], protoPtr->p_proto);
1559 }
1560 protoPtr = nullptr;
1561 index ++;
1562 }
1563 protoPtr = getprotoent();
1564 EXPECT_TRUE(protoPtr == NULL);
1565
1566 setprotoent(0);
1567 protoPtr = nullptr;
1568 protoPtr = getprotoent();
1569 ASSERT_TRUE(protoPtr != NULL);
1570 EXPECT_STREQ(g_protocolList[0], protoPtr->p_name);
1571 EXPECT_EQ(g_protocolNumber[0], protoPtr->p_proto);
1572
1573 index = 0;
1574 protoPtr = nullptr;
1575 setprotoent(0);
1576 while (index < PROTOCOL_COUNT) {
1577 protoPtr = getprotoent();
1578 if (protoPtr == nullptr) {
1579 EXPECT_TRUE(protoPtr != NULL) << "ErrInfo:getprotoent NULL, index[" << index << "]";
1580 } else {
1581 EXPECT_STREQ(g_protocolList[index], protoPtr->p_name);
1582 EXPECT_EQ(g_protocolNumber[index], protoPtr->p_proto);
1583 }
1584 protoPtr = nullptr;
1585 index ++;
1586 }
1587 }
1588
1589 /**
1590 * @tc.number : SUB_KERNEL_NET_2100
1591 * @tc.name : test herror,no output and return value, so no check point
1592 * @tc.desc : [C- SOFTWARE -0200]
1593 */
1594 HWTEST_F(ActsNetTest, testHerror, Function | MediumTest | Level2)
1595 {
1596 const char* fileName = "/storage/test_herror";
1597 FILE* fp = freopen(fileName, "w", stderr);
1598 ASSERT_NE(nullptr, fp);
1599
1600 const char *msg = "herror msg";
1601 herror(msg);
1602 const int errorCode[5] = {HOST_NOT_FOUND, TRY_AGAIN, NO_RECOVERY, NO_DATA, NO_ADDRESS};
1603 for (int i = 0; i < 5; i++) {
1604 h_errno = errorCode[i];
1605 herror(msg);
1606 }
1607 h_errno = -1;
1608 herror(msg);
1609 h_errno = 0;
1610 herror(msg);
1611 herror(msg);
1612 fclose(stderr);
1613
1614 char buffer[256];
1615 const char* expectStr = "herror msg: Unknown errorherror msg: Host not foundherror msg: \
1616 Try againherror msg: Non-recoverable errorherror msg: Address not availableherror msg: \
1617 Address not availableherror msg: Unknown errorherror msg: Unknown errorherror msg: Unknown error";
1618 FILE* fpRead = fopen(fileName, "rb");
1619 size_t bytes = fread(buffer, 1, sizeof(buffer), fpRead);
1620 buffer[bytes] = 0;
1621 EXPECT_STREQ(expectStr, buffer);
1622
1623 int ret = fclose(fpRead);
1624 EXPECT_EQ(0, ret);
1625 ret = remove(fileName);
1626 EXPECT_EQ(0, ret);
1627 }
1628
1629 /**
1630 * @tc.number : SUB_KERNEL_NET_2200
1631 * @tc.name : test hstrerror normal
1632 * @tc.desc : [C- SOFTWARE -0200]
1633 */
1634 HWTEST_F(ActsNetTest, testHstrerrorNormal, Function | MediumTest | Level2)
1635 {
1636 const char errorMsgs[5][22] = {"Host not found", "Try again", "Non-recoverable error", "Address not available",
1637 "Address not available"};
1638 const int errorCode[5] = {HOST_NOT_FOUND, TRY_AGAIN, NO_RECOVERY, NO_DATA, NO_ADDRESS};
1639 for (int i = 0; i < 5; i++) {
1640 EXPECT_STREQ(errorMsgs[i], hstrerror(errorCode[i]));
1641 }
1642 }
1643
1644 /**
1645 * @tc.number : SUB_KERNEL_NET_2300
1646 * @tc.name : test hstrerror abnormal
1647 * @tc.desc : [C- SOFTWARE -0200]
1648 */
1649 HWTEST_F(ActsNetTest, testHstrerrorAbnormal, Function | MediumTest | Level2)
1650 {
1651 const char* expectStr = "Unknown error";
1652 EXPECT_STREQ(expectStr, hstrerror(0));
1653 EXPECT_STREQ(expectStr, hstrerror(-1));
1654 EXPECT_STREQ(expectStr, hstrerror(16));
1655 }
1656
1657 /**
1658 * @tc.number : SUB_KERNEL_NET_2400
1659 * @tc.name : test convert value from host to network byte order
1660 * @tc.desc : [C- SOFTWARE -0200]
1661 */
1662 HWTEST_F(ActsNetTest, testHostToNetwork, Function | MediumTest | Level2)
1663 {
1664 uint32_t intInput1 = 0;
1665 uint32_t intRst1 = htonl(intInput1);
1666 uint32_t intInput2 = 65536;
1667 uint32_t intRst2 = htonl(intInput2);
1668
1669 uint16_t shortInput1 = 0;
1670 uint16_t shortRst1 = htons(shortInput1);
1671 uint16_t shortInput2 = 255;
1672 uint16_t shortRst2 = htons(shortInput2);
1673
1674 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1675 uint32_t expectZero = 0;
1676 uint32_t expectForIinput2 = 256;
1677 uint32_t expectForSinput2 = 65280;
1678 EXPECT_EQ(expectZero, intRst1);
1679 EXPECT_EQ(expectForIinput2, intRst2);
1680 EXPECT_EQ(expectZero, shortRst1);
1681 EXPECT_EQ(expectForSinput2, shortRst2);
1682 #else
1683 EXPECT_EQ(intInput1, intRst1);
1684 EXPECT_EQ(intInput2, intRst2);
1685 EXPECT_EQ(shortInput1, shortRst1);
1686 EXPECT_EQ(shortInput2, shortRst2);
1687 #endif
1688 }
1689
1690 /**
1691 * @tc.number : SUB_KERNEL_NET_2500
1692 * @tc.name : test convert value from network to host byte order
1693 * @tc.desc : [C- SOFTWARE -0200]
1694 */
1695 HWTEST_F(ActsNetTest, testNetworkToHost, Function | MediumTest | Level2)
1696 {
1697 uint32_t intInput1 = 0;
1698 uint32_t intRst1 = ntohl(intInput1);
1699 uint32_t intInput2 = 65536;
1700 uint32_t intRst2 = ntohl(intInput2);
1701 uint16_t shortInput1 = 0;
1702 uint16_t shortRst1 = ntohs(shortInput1);
1703 uint16_t shortInput2 = 255;
1704 uint16_t shortRst2 = ntohs(shortInput2);
1705
1706 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1707 uint32_t expectZero = 0;
1708 uint32_t expectForIinput2 = 256;
1709 uint32_t expectForSinput2 = 65280;
1710 EXPECT_EQ(expectZero, intRst1);
1711 EXPECT_EQ(expectForIinput2, intRst2);
1712 EXPECT_EQ(expectZero, shortRst1);
1713 EXPECT_EQ(expectForSinput2, shortRst2);
1714 #else
1715 EXPECT_EQ(intInput1, intRst1);
1716 EXPECT_EQ(intInput2, intRst2);
1717 EXPECT_EQ(shortInput1, shortRst1);
1718 EXPECT_EQ(shortInput2, shortRst2);
1719 #endif
1720 }
1721
1722 /**
1723 * @tc.number : SUB_KERNEL_NET_2600
1724 * @tc.name : test inet_pton IPv4 normal
1725 * @tc.desc : [C- SOFTWARE -0200]
1726 */
1727 HWTEST_F(ActsNetTest, testInetPtonIpv4Normal, Function | MediumTest | Level2)
1728 {
1729 int ret;
1730 struct in_addr rst = {0};
1731 char cpAddrs[4][16] = {"10.58.212.100", "0.0.0.0", "255.0.0.0", "255.255.255.255"};
1732 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1733 unsigned int expectLittle[4] = {1691630090, 0, 255, 4294967295};
1734 #else
1735 unsigned int expectBig[4] = {171627620, 0, 4278190080, 4294967295};
1736 #endif
1737
1738 for (int i = 0; i < 4; i++) {
1739 ret = inet_pton(AF_INET, cpAddrs[i], &rst);
1740 EXPECT_EQ(1, ret);
1741 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1742 EXPECT_EQ(expectLittle[i], rst.s_addr);
1743 #else
1744 EXPECT_EQ(expectBig[i], rst.s_addr);
1745 #endif
1746 printf("[###]inet_pton : un[%u],s[%d],hex[%x]\n", rst.s_addr, rst.s_addr, rst.s_addr);
1747 }
1748 }
1749
1750 /**
1751 * @tc.number : SUB_KERNEL_NET_2700
1752 * @tc.name : test inet_pton IPv4 abnormal
1753 * @tc.desc : [C- SOFTWARE -0200]
1754 */
1755 HWTEST_F(ActsNetTest, testInetPtonIpv4Abnormal, Function | MediumTest | Level2)
1756 {
1757 int ret;
1758 struct in_addr rst = {0};
1759 char cpAddrs[10][16] = {"255", "256", "255.0", "255.0.0", "256.0.0.1", "a.a.a.a", "....", "#",
1760 "127.0.0.f", "0:0:0:0:0:0:0:1"};
1761 for (int i = 0; i < 10; i++) {
1762 ret = inet_pton(AF_INET, cpAddrs[i], &rst);
1763 EXPECT_EQ(0, ret) << "ErrInfo:inet_pton abnormal [" << cpAddrs[i] << "]";
1764 }
1765 }
1766
1767 /**
1768 * @tc.number : SUB_KERNEL_NET_2800
1769 * @tc.name : test inet_pton IPv6 normal
1770 * @tc.desc : [C- SOFTWARE -0200]
1771 */
1772 HWTEST_F(ActsNetTest, testInetPtonIpv6Normal, Function | MediumTest | Level2)
1773 {
1774 int ret;
1775 struct in6_addr rst = {0};
1776 char cpAddrs[6][40] = {"0101:0101:0101:0101:1010:1010:1010:1010", "0:0:0:0:0:0:0:0",
1777 "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "::", "1::", "0011:0011:0011:0011:11:11:11:11"};
1778 for (int i = 0; i < 6; i++) {
1779 ret = inet_pton(AF_INET6, cpAddrs[i], &rst);
1780 EXPECT_EQ(1, ret) << "ErrInfo:inet_pton [" << cpAddrs[i] << "]";
1781 }
1782 }
1783
1784 /**
1785 * @tc.number : SUB_KERNEL_NET_2900
1786 * @tc.name : test inet_pton IPv6 abnormal
1787 * @tc.desc : [C- SOFTWARE -0200]
1788 */
1789 HWTEST_F(ActsNetTest, testInetPtonIpv6Abnormal, Function | MediumTest | Level2)
1790 {
1791 int ret;
1792 struct in6_addr rst = {0};
1793 char cpAddrs[7][40] = {"127.0.0.1", "f", ":", "0:0", "1:::", ":::::::",
1794 "1111:1111:1111:1111:1111:1111:1111:111G"};
1795 for (int i = 0; i < 7; i++) {
1796 ret = inet_pton(AF_INET6, cpAddrs[i], &rst);
1797 EXPECT_EQ(0, ret) << "ErrInfo:inet_pton abnormal [" << cpAddrs[i] << "]";
1798 }
1799 }
1800
1801 /**
1802 * @tc.number : SUB_KERNEL_NET_3000
1803 * @tc.name : test inet_pton with invalid family
1804 * @tc.desc : [C- SOFTWARE -0200]
1805 */
1806 HWTEST_F(ActsNetTest, testInetPtonInvalidFamily, Function | MediumTest | Level2)
1807 {
1808 struct in_addr rst = {0};
1809 int ret = inet_pton(AF_IPX, "127.0.0.1", &rst);
1810 EXPECT_EQ(-1, ret);
1811 ret = inet_pton(-1, "127.0.0.1", &rst);
1812 EXPECT_EQ(-1, ret);
1813 }
1814
1815 /**
1816 * @tc.number : SUB_KERNEL_NET_3100
1817 * @tc.name : test inet_ntop IPv4 normal
1818 * @tc.desc : [C- SOFTWARE -0200]
1819 */
1820 HWTEST_F(ActsNetTest, testInetNtopIpv4Normal, Function | MediumTest | Level2)
1821 {
1822 const char* ret = nullptr;
1823 struct in_addr inputAddr = {0};
1824 char rstBuff[INET_ADDRSTRLEN];
1825 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1826 unsigned int inputLittle[4] = {0x64d43a0a, 0, 255, 4294967295};
1827 #else
1828 unsigned int inputBig[4] = {171627620, 0, 4278190080, 4294967295};
1829 #endif
1830
1831 char expectAddrs[4][16] = {"10.58.212.100", "0.0.0.0", "255.0.0.0", "255.255.255.255"};
1832 for (int i = 0; i < 4; i++) {
1833 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1834 inputAddr.s_addr = inputLittle[i];
1835 #else
1836 inputAddr.s_addr = inputBig[i];
1837 #endif
1838 ret = inet_ntop(AF_INET, &inputAddr, rstBuff, sizeof(rstBuff));
1839 if (ret == nullptr) {
1840 EXPECT_TRUE(ret != NULL) << "ErrInfo:inet_ntop NULL [" << expectAddrs[i] << "]";
1841 } else {
1842 printf("[###]inet_ntop expect [%s]: ret[%s], buf[%s]\n", expectAddrs[i], ret, rstBuff);
1843 EXPECT_STREQ(expectAddrs[i], ret);
1844 EXPECT_STREQ(expectAddrs[i], rstBuff);
1845 }
1846 }
1847 }
1848
1849 /**
1850 * @tc.number : SUB_KERNEL_NET_3200
1851 * @tc.name : test inet_ntop IPv4 boundary input
1852 * @tc.desc : [C- SOFTWARE -0200]
1853 */
1854 HWTEST_F(ActsNetTest, testInetNtopIpv4Abnormal, Function | MediumTest | Level2)
1855 {
1856 const char* ret = nullptr;
1857 struct in_addr inputAddr = {0};
1858 char rstBuff[INET_ADDRSTRLEN];
1859 char expectStr[2][16] = {"255.255.255.255", "0.0.0.0"};
1860 for (int i = 0; i < 2; i++) {
1861 inputAddr.s_addr = (i == 0 ? -1 : 4294967296);
1862 ret = inet_ntop(AF_INET, &inputAddr, rstBuff, sizeof(rstBuff));
1863 ASSERT_TRUE(ret != NULL);
1864 EXPECT_STREQ(expectStr[i], ret);
1865 EXPECT_STREQ(expectStr[i], rstBuff);
1866 }
1867 }
1868
1869 /**
1870 * @tc.number : SUB_KERNEL_NET_3300
1871 * @tc.name : test inet_ntop IPv6 normal
1872 * @tc.desc : [C- SOFTWARE -0200]
1873 */
1874 HWTEST_F(ActsNetTest, testInetNtopIpv6Normal, Function | MediumTest | Level2)
1875 {
1876 int iret;
1877 const char* ret = nullptr;
1878 struct in6_addr inputAddr = {0};
1879 char rstBuff[INET6_ADDRSTRLEN];
1880 char inputAddrs[6][40] = {"0101:0101:0101:0101:1010:1010:1010:1010", "0:0:0:0:0:0:0:0",
1881 "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "::", "1::", "0011:0011:0011:0011:11:11:11:11"};
1882 char expectAddrs[6][40] = {"101:101:101:101:1010:1010:1010:1010", "::",
1883 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "::", "1::", "11:11:11:11:11:11:11:11"};
1884 for (int i = 0; i < 6; i++) {
1885 iret = inet_pton(AF_INET6, inputAddrs[i], &inputAddr);
1886 ASSERT_EQ(1, iret);
1887 ret = inet_ntop(AF_INET6, &inputAddr, rstBuff, sizeof(rstBuff));
1888 if (ret == nullptr) {
1889 EXPECT_TRUE(ret != NULL) << "ErrInfo:inet_ntop NULL [" << expectAddrs[i] << "]";
1890 } else {
1891 printf("[###]inet_ntop expect [%s]: ret[%s], buf[%s]\n", expectAddrs[i], ret, rstBuff);
1892 EXPECT_STREQ(expectAddrs[i], ret);
1893 EXPECT_STREQ(expectAddrs[i], rstBuff);
1894 }
1895 }
1896 }
1897
1898 /**
1899 * @tc.number : SUB_KERNEL_NET_3400
1900 * @tc.name : test inet_ntop IPv6 boundary input
1901 * @tc.desc : [C- SOFTWARE -0200]
1902 */
1903 HWTEST_F(ActsNetTest, testInetNtopIpv6Abnormal, Function | MediumTest | Level2)
1904 {
1905 const char* ret = nullptr;
1906 struct in6_addr inputAddr = {0};
1907 char rstBuff[INET6_ADDRSTRLEN];
1908 char expectStr[2][40] = {"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "::"};
1909 for (int i = 0; i < 2; i++) {
1910 for (int j = 0; j < 16; j++) {
1911 inputAddr.s6_addr[j] = (i == 0 ? -1 : 256);
1912 }
1913 ret = inet_ntop(AF_INET6, &inputAddr, rstBuff, sizeof(rstBuff));
1914 ASSERT_TRUE(ret != NULL);
1915 EXPECT_STREQ(expectStr[i], ret);
1916 EXPECT_STREQ(expectStr[i], rstBuff);
1917 }
1918 }
1919
1920 /**
1921 * @tc.number : SUB_KERNEL_NET_3500
1922 * @tc.name : test inet_ntop with invalid family
1923 * @tc.desc : [C- SOFTWARE -0200]
1924 */
1925 HWTEST_F(ActsNetTest, testInetNtopInvalidFamily, Function | MediumTest | Level2)
1926 {
1927 int iret;
1928 const char* ret = nullptr;
1929 struct in6_addr inputAddr = {0};
1930 char rstBuff[INET6_ADDRSTRLEN];
1931
1932 iret = inet_pton(AF_INET6, "1::", &inputAddr);
1933 ASSERT_EQ(1, iret);
1934 ret = inet_ntop(AF_IPX, &inputAddr, rstBuff, sizeof(rstBuff));
1935 EXPECT_TRUE(ret == NULL);
1936 ret = inet_ntop(-1, &inputAddr, rstBuff, sizeof(rstBuff));
1937 EXPECT_TRUE(ret == NULL);
1938 }
1939
1940 /**
1941 * @tc.number : SUB_KERNEL_NET_3600
1942 * @tc.name : test inet_addr normal
1943 * @tc.desc : [C- SOFTWARE -0200]
1944 */
1945 HWTEST_F(ActsNetTest, testInetAddrNormal, Function | MediumTest | Level2)
1946 {
1947 in_addr_t rst;
1948 char cpAddrs[7][16] = {"10.58.212.100", "0.0.0.0", "255", "0.255.0", "255.0.0.0",
1949 "255.255.255.255", "257"};
1950 unsigned int expectList[7] = {1691630090, 0, 4278190080, 65280, 255, 4294967295, 16842752};
1951 for (int i = 0; i < 7; i++) {
1952 rst = inet_addr(cpAddrs[i]);
1953 EXPECT_EQ(expectList[i], rst);
1954 printf("[###]inet_addr %s: uns[%u],s[%d],hex[%x]\n", cpAddrs[i], rst, rst, rst);
1955 }
1956 }
1957
1958 /**
1959 * @tc.number : SUB_KERNEL_NET_3700
1960 * @tc.name : test inet_addr abnormal
1961 * @tc.desc : [C- SOFTWARE -0200]
1962 */
1963 HWTEST_F(ActsNetTest, testInetAddrAbnormal, Function | MediumTest | Level2)
1964 {
1965 in_addr_t rst;
1966 unsigned int expect = 4294967295;
1967 char invalidAddrs[4][10] = {"-1", "a", "%^", "257.1.1.1"};
1968 for (int i = 0; i < 4; i++) {
1969 rst = inet_addr(invalidAddrs[i]);
1970 EXPECT_EQ(expect, rst) << "ErrInfo:inet_addr [" << invalidAddrs[i] << "]";
1971 }
1972 }
1973
1974 /**
1975 * @tc.number : SUB_KERNEL_NET_3800
1976 * @tc.name : test inet_aton normal
1977 * @tc.desc : [C- SOFTWARE -0200]
1978 */
1979 HWTEST_F(ActsNetTest, testInetAtonNormal, Function | MediumTest | Level2)
1980 {
1981 int ret;
1982 struct in_addr addr = {0};
1983 char cpAddrs[7][16] = {"10.58.212.100", "0.0.0.0", "255", "0.255.0", "255.0.0.0",
1984 "255.255.255.255", "257"};
1985 unsigned int expectList[7] = {1691630090, 0, 4278190080, 65280, 255, 4294967295, 16842752};
1986 for (int i = 0; i < 7; i++) {
1987 ret = inet_aton(cpAddrs[i], &addr);
1988 EXPECT_EQ(1, ret);
1989 EXPECT_EQ(expectList[i], addr.s_addr);
1990 printf("##inet_aton %s: uns[%u],s[%d],hex[%x]\n", cpAddrs[i], addr.s_addr, addr.s_addr, addr.s_addr);
1991 }
1992 }
1993
1994 /**
1995 * @tc.number : SUB_KERNEL_NET_3900
1996 * @tc.name : test inet_aton abnormal
1997 * @tc.desc : [C- SOFTWARE -0200]
1998 */
1999 HWTEST_F(ActsNetTest, testInetAtonAbnormal, Function | MediumTest | Level2)
2000 {
2001 int ret;
2002 struct in_addr addr = {0};
2003 char invalidAddrs[4][10] = {"-1", "a", "%^", "257.1.1.1"};
2004 for (int i = 0; i < 4; i++) {
2005 ret = inet_aton(invalidAddrs[i], &addr);
2006 EXPECT_EQ(0, ret) << "ErrInfo:inet_addr [" << invalidAddrs[i] << "]";
2007 }
2008 }
2009
2010 /**
2011 * @tc.number : SUB_KERNEL_NET_4000
2012 * @tc.name : test inet_ntoa normal
2013 * @tc.desc : [C- SOFTWARE -0200]
2014 */
2015 HWTEST_F(ActsNetTest, testInetNtoaNormal, Function | MediumTest | Level2)
2016 {
2017 char *rst = nullptr;
2018 struct in_addr addr = {0};
2019 char expectAddrs[6][16] = {"10.58.212.100", "0.0.0.0", "255.255.255.255", "0.0.0.255", "0.255.0.0", "0.0.1.1"};
2020 unsigned int inputList[6] = {1691630090, 0, 4294967295, 4278190080, 65280, 16842752};
2021 for (int i = 0; i < 6; i++) {
2022 addr.s_addr = inputList[i];
2023 rst = inet_ntoa(addr);
2024 if (rst == nullptr) {
2025 EXPECT_TRUE(rst != NULL);
2026 } else {
2027 EXPECT_STREQ(expectAddrs[i], rst);
2028 }
2029 printf("##inet_ntoa %u: rst is [%s]\n", inputList[i], expectAddrs[i]);
2030 }
2031 }
2032
2033 /**
2034 * @tc.number : SUB_KERNEL_NET_4100
2035 * @tc.name : test inet_ntoa boundary input
2036 * @tc.desc : [C- SOFTWARE -0200]
2037 */
2038 HWTEST_F(ActsNetTest, testInetNtoaAbnormal, Function | MediumTest | Level2)
2039 {
2040 const char* ret = nullptr;
2041 struct in_addr addrInput = {0};
2042 char expectStr[2][16] = {"255.255.255.255", "0.0.0.0"};
2043 for (int i = 0; i < 2; i++) {
2044 addrInput.s_addr = (i == 0 ? -1 : 4294967296);
2045 ret = inet_ntoa(addrInput);
2046 ASSERT_TRUE(ret != NULL);
2047 EXPECT_STREQ(expectStr[i], ret);
2048 }
2049 }
2050
2051 /**
2052 * @tc.number : SUB_KERNEL_NET_4200
2053 * @tc.name : test inet_network normal
2054 * @tc.desc : [C- SOFTWARE -0200]
2055 */
2056 HWTEST_F(ActsNetTest, testInetNetworkNormal, Function | MediumTest | Level2)
2057 {
2058 in_addr_t rst;
2059 char cpAddrs[7][16] = {"10.58.212.100", "0.0.0.0", "255", "0.255.0", "255.0.0.0",
2060 "255.255.255.255", "257"};
2061 unsigned int expectList[7] = {171627620, 0, 255, 16711680, 4278190080, 4294967295, 257};
2062 for (int i = 0; i < 7; i++) {
2063 rst = inet_network(cpAddrs[i]);
2064 EXPECT_EQ(expectList[i], rst);
2065 printf("##inet_network %s: uns[%u],s[%d],hex[%x]\n", cpAddrs, rst, rst, rst);
2066 }
2067 }
2068
2069 /**
2070 * @tc.number : SUB_KERNEL_NET_4300
2071 * @tc.name : test inet_network abnormal
2072 * @tc.desc : [C- SOFTWARE -0200]
2073 */
2074 HWTEST_F(ActsNetTest, testInetNetworkAbnormal, Function | MediumTest | Level2)
2075 {
2076 in_addr_t rst;
2077 unsigned int expect = 4294967295;
2078 char invalidAddrs[4][10] = {"-1", "a", "%^", "257.1.1.1"};
2079 for (int i = 0; i < 4; i++) {
2080 rst = inet_network(invalidAddrs[i]);
2081 EXPECT_EQ(expect, rst) << "ErrInfo:inet_network [" << invalidAddrs[i] << "]";
2082 }
2083 }
2084
2085 /**
2086 * @tc.number : SUB_KERNEL_NET_4400
2087 * @tc.name : test inet_lnaof normal
2088 * @tc.desc : [C- SOFTWARE -0200]
2089 */
2090 HWTEST_F(ActsNetTest, testInetLnaofNormal, Function | MediumTest | Level2)
2091 {
2092 in_addr_t rst;
2093 struct in_addr addr = {0};
2094 char cpAddrs[7][16] = {"10.58.212.100", "0.0.0.0", "255", "0.255.0", "255.0.0.0",
2095 "255.255.255.255", "257"};
2096 unsigned int expectList[7] = {13908490, 0, 0, 65280, 255, 255, 65536};
2097 for (int i = 0; i < 7; i++) {
2098 addr.s_addr = inet_network(cpAddrs[i]);
2099 rst = inet_lnaof(addr);
2100 EXPECT_EQ(expectList[i], rst);
2101 printf("[###]inet_lnaof %s: uns[%u],s[%d],hex[%x]\n", cpAddrs[i], rst, rst, rst);
2102 }
2103 }
2104
2105 /**
2106 * @tc.number : SUB_KERNEL_NET_4500
2107 * @tc.name : test inet_netof normal
2108 * @tc.desc : [C- SOFTWARE -0200]
2109 */
2110 HWTEST_F(ActsNetTest, testInetNetofNormal, Function | MediumTest | Level2)
2111 {
2112 in_addr_t rst;
2113 struct in_addr addr = {0};
2114 char cpAddrs[7][16] = {"10.58.212.100", "0.0.0.0", "255", "0.255.0", "255.0.0.0",
2115 "255.255.255.255", "257"};
2116 unsigned int expectList[7] = {100, 0, 16711680, 0, 0, 16777215, 1};
2117 for (int i = 0; i < 7; i++) {
2118 addr.s_addr = inet_network(cpAddrs[i]);
2119 rst = inet_netof(addr);
2120 EXPECT_EQ(expectList[i], rst);
2121 printf("[###]inet_netof %s: uns[%u],s[%d],hex[%x]\n", cpAddrs[i], rst, rst, rst);
2122 }
2123 }
2124
2125 /**
2126 * @tc.number : SUB_KERNEL_NET_4600
2127 * @tc.name : test inet_makeaddr normal
2128 * @tc.desc : [C- SOFTWARE -0200]
2129 */
2130 HWTEST_F(ActsNetTest, testInetMakeaddrNormal, Function | MediumTest | Level2)
2131 {
2132 struct in_addr addrRst = {0};
2133 int hostList[7] = {13908490, 0, 0, 65280, 255, 255, 65536};
2134 int netList[7] = {100, 0, 16711680, 0, 0, 16777215, 1};
2135 unsigned int expectList[7] = {171627620, 0, 255, 16711680, 4278190080, 4294967295, 257};
2136 for (int i = 0; i < 7; i++) {
2137 addrRst = inet_makeaddr(netList[i], hostList[i]);
2138 EXPECT_EQ(expectList[i], addrRst.s_addr);
2139 printf("[###]inet_makeaddr: uns[%u],s[%d],hex[%x]\n", addrRst.s_addr, addrRst.s_addr, addrRst.s_addr);
2140 }
2141 }
2142
2143 /**
2144 * @tc.number : SUB_KERNEL_NET_4700
2145 * @tc.name : test invalid parameter
2146 * @tc.desc : [C- SOFTWARE -0200]
2147 */
2148 HWTEST_F(ActsNetTest, testInvalidParameter, Function | MediumTest | Level3)
2149 {
2150 int ret;
2151 int fdFail = -1;
2152 int fdSuccess = -1;
2153
2154 fdFail = socket(0, 0, 0);
2155 EXPECT_EQ(fdFail, -1);
2156 fdSuccess = socket(AF_INET, SOCK_STREAM, 0);
2157 EXPECT_NE(fdSuccess, -1);
2158
2159 ret = ::bind(fdFail, nullptr, sizeof(struct sockaddr_in));
2160 EXPECT_EQ(-1, ret);
2161 ret = ::bind(fdSuccess, nullptr, sizeof(struct sockaddr_in));
2162 EXPECT_EQ(-1, ret);
2163
2164 ret = connect(fdFail, nullptr, sizeof(struct sockaddr));
2165 EXPECT_EQ(-1, ret);
2166 ret = connect(fdSuccess, nullptr, sizeof(struct sockaddr));
2167 EXPECT_EQ(-1, ret);
2168
2169 ret = accept(fdFail, nullptr, nullptr);
2170 EXPECT_EQ(-1, ret);
2171 ret = accept(fdSuccess, nullptr, nullptr);
2172 EXPECT_EQ(-1, ret);
2173
2174 ret = getsockname(fdFail, nullptr, nullptr);
2175 EXPECT_EQ(-1, ret);
2176 ret = getsockname(fdSuccess, nullptr, nullptr);
2177 EXPECT_EQ(-1, ret);
2178
2179 ret = getpeername(fdFail, nullptr, nullptr);
2180 EXPECT_EQ(-1, ret);
2181 ret = getpeername(fdSuccess, nullptr, nullptr);
2182 EXPECT_EQ(-1, ret);
2183
2184 ret = send(fdFail, nullptr, strlen(g_srvMsg), 0);
2185 EXPECT_EQ(-1, ret);
2186 ret = send(fdSuccess, nullptr, strlen(g_srvMsg), 0);
2187 EXPECT_EQ(-1, ret);
2188
2189 ret = sendto(fdFail, nullptr, strlen(g_srvMsg), 0, nullptr, (socklen_t)sizeof(struct sockaddr_in));
2190 EXPECT_EQ(-1, ret);
2191 ret = sendto(fdSuccess, nullptr, strlen(g_srvMsg), 0, nullptr, (socklen_t)sizeof(struct sockaddr_in));
2192 EXPECT_EQ(-1, ret);
2193
2194 ret = recv(fdFail, nullptr, sizeof(g_srvMsg), 0);
2195 EXPECT_EQ(-1, ret);
2196 ret = recv(fdSuccess, nullptr, sizeof(g_srvMsg), 0);
2197 EXPECT_EQ(-1, ret);
2198
2199 struct msghdr msg = {nullptr};
2200 ret = recvmsg(fdFail, &msg, 0);
2201 EXPECT_EQ(-1, ret);
2202 ret = recvmsg(fdSuccess, &msg, 0);
2203 EXPECT_EQ(-1, ret);
2204
2205 ret = recvfrom(fdFail, nullptr, sizeof(g_srvMsg), 0, nullptr, nullptr);
2206 EXPECT_EQ(-1, ret);
2207 ret = recvfrom(fdSuccess, nullptr, sizeof(g_srvMsg), 0, nullptr, nullptr);
2208 EXPECT_EQ(-1, ret);
2209
2210 ret = setsockopt(fdFail, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t)sizeof(struct timeval));
2211 EXPECT_EQ(-1, ret);
2212 ret = setsockopt(fdSuccess, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t)sizeof(struct timeval));
2213 EXPECT_EQ(-1, ret);
2214 ret = getsockopt(fdFail, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t*)sizeof(struct timeval));
2215 EXPECT_EQ(-1, ret);
2216 ret = getsockopt(fdSuccess, SOL_SOCKET, SO_RCVTIMEO, nullptr, (socklen_t*)sizeof(struct timeval));
2217 EXPECT_EQ(-1, ret);
2218
2219 ret = sendmsg(fdFail, nullptr, 0);
2220 EXPECT_EQ(-1, ret);
2221 ret = sendmsg(fdSuccess, nullptr, 0);
2222 EXPECT_EQ(-1, ret);
2223
2224 ret = listen(fdFail, 0);
2225 EXPECT_EQ(-1, ret);
2226 ret = select(fdFail, nullptr, nullptr, nullptr, nullptr);
2227 EXPECT_EQ(-1, ret);
2228
2229 ret = shutdown(fdFail, SHUT_RD);
2230 EXPECT_EQ(-1, ret);
2231 ret = shutdown(fdSuccess, -1);
2232 EXPECT_EQ(-1, ret);
2233
2234 ret = close(fdSuccess);
2235 EXPECT_EQ(0, ret);
2236 }
2237