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