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