19762338dSopenharmony_ci/*
29762338dSopenharmony_ci * Copyright (C) 2024 HiHope Open Source Organization.
39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
49762338dSopenharmony_ci * you may not use this file except in compliance with the License.
59762338dSopenharmony_ci * You may obtain a copy of the License at
69762338dSopenharmony_ci *
79762338dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
89762338dSopenharmony_ci *
99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129762338dSopenharmony_ci * See the License for the specific language governing permissions and
139762338dSopenharmony_ci * limitations under the License.
149762338dSopenharmony_ci */
159762338dSopenharmony_ci
169762338dSopenharmony_ci#include <cerrno>
179762338dSopenharmony_ci#include <cstdio>
189762338dSopenharmony_ci#include <cstdlib>
199762338dSopenharmony_ci#include <string>
209762338dSopenharmony_ci#include <vector>
219762338dSopenharmony_ci#include <fcntl.h>
229762338dSopenharmony_ci#include <pthread.h>
239762338dSopenharmony_ci#include <unistd.h>
249762338dSopenharmony_ci#include <arpa/inet.h>
259762338dSopenharmony_ci#include <gtest/gtest.h>
269762338dSopenharmony_ci#include <netinet/in.h>
279762338dSopenharmony_ci#include <sys/stat.h>
289762338dSopenharmony_ci#include <sys/socket.h>
299762338dSopenharmony_ci#include <sys/types.h>
309762338dSopenharmony_ci#include "securec.h"
319762338dSopenharmony_ci
329762338dSopenharmony_ciusing namespace testing::ext;
339762338dSopenharmony_ci
349762338dSopenharmony_cistatic const int BAD_SOCKET_FD = -1;
359762338dSopenharmony_cistatic const int BUFFER_SIZE = 1024;
369762338dSopenharmony_cistatic const int TEST_UDP_PORT = 22356;
379762338dSopenharmony_cistatic const int TEST_TCP_PORT = 22355;
389762338dSopenharmony_cistatic const char *TEST_LOCAL_IP = "127.0.0.1";
399762338dSopenharmony_cistatic const char *TEST_BUFFER = "Hello, world!";
409762338dSopenharmony_cistatic const char *TEST_EXIT = "exit";
419762338dSopenharmony_cistatic int g_tcpFd = -1;
429762338dSopenharmony_cistatic int g_udpFd = -1;
439762338dSopenharmony_ci
449762338dSopenharmony_cienum ClientType {
459762338dSopenharmony_ci    NO_RECV_MSG = 0,
469762338dSopenharmony_ci    WAIT_MSG_NULL,
479762338dSopenharmony_ci    WAIT_MSG_EXIT,
489762338dSopenharmony_ci};
499762338dSopenharmony_ci
509762338dSopenharmony_ciclass HatsDataHandleTest : public testing::Test {
519762338dSopenharmony_cipublic:
529762338dSopenharmony_ci    static void SetUpTestCase();
539762338dSopenharmony_ci    static void TearDownTestCase();
549762338dSopenharmony_ci    void SetUp();
559762338dSopenharmony_ci    void TearDown();
569762338dSopenharmony_ciprivate:
579762338dSopenharmony_ci};
589762338dSopenharmony_civoid HatsDataHandleTest::SetUp()
599762338dSopenharmony_ci{
609762338dSopenharmony_ci    int ret;
619762338dSopenharmony_ci    int tcpFd = -1;
629762338dSopenharmony_ci    int udpFd = -1;
639762338dSopenharmony_ci    int32_t optVal = 1;
649762338dSopenharmony_ci    struct sockaddr_in serAddr = {
659762338dSopenharmony_ci        .sin_family = AF_INET,
669762338dSopenharmony_ci        .sin_port = htons(TEST_TCP_PORT),
679762338dSopenharmony_ci        .sin_addr = {
689762338dSopenharmony_ci            .s_addr = inet_addr(TEST_LOCAL_IP),
699762338dSopenharmony_ci        }
709762338dSopenharmony_ci    };
719762338dSopenharmony_ci
729762338dSopenharmony_ci    tcpFd = socket(AF_INET, SOCK_STREAM, 0);
739762338dSopenharmony_ci    EXPECT_TRUE(tcpFd > 0);
749762338dSopenharmony_ci
759762338dSopenharmony_ci    ret = setsockopt(tcpFd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal));
769762338dSopenharmony_ci    EXPECT_EQ(ret, 0);
779762338dSopenharmony_ci
789762338dSopenharmony_ci    ret = bind(tcpFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr));
799762338dSopenharmony_ci    EXPECT_EQ(ret, 0);
809762338dSopenharmony_ci
819762338dSopenharmony_ci    serAddr.sin_port = htons(TEST_UDP_PORT),
829762338dSopenharmony_ci    udpFd = socket(AF_INET, SOCK_DGRAM, 0);
839762338dSopenharmony_ci    EXPECT_TRUE(udpFd > 0);
849762338dSopenharmony_ci
859762338dSopenharmony_ci    ret = setsockopt(udpFd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal));
869762338dSopenharmony_ci    EXPECT_EQ(ret, 0);
879762338dSopenharmony_ci
889762338dSopenharmony_ci    ret = bind(udpFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr));
899762338dSopenharmony_ci    EXPECT_EQ(ret, 0);
909762338dSopenharmony_ci
919762338dSopenharmony_ci    g_tcpFd = tcpFd;
929762338dSopenharmony_ci    g_udpFd = udpFd;
939762338dSopenharmony_ci}
949762338dSopenharmony_civoid HatsDataHandleTest::TearDown()
959762338dSopenharmony_ci{
969762338dSopenharmony_ci    close(g_tcpFd);
979762338dSopenharmony_ci    g_tcpFd = -1;
989762338dSopenharmony_ci    close(g_udpFd);
999762338dSopenharmony_ci    g_udpFd = -1;
1009762338dSopenharmony_ci}
1019762338dSopenharmony_civoid HatsDataHandleTest::SetUpTestCase()
1029762338dSopenharmony_ci{
1039762338dSopenharmony_ci}
1049762338dSopenharmony_civoid HatsDataHandleTest::TearDownTestCase()
1059762338dSopenharmony_ci{
1069762338dSopenharmony_ci}
1079762338dSopenharmony_ci
1089762338dSopenharmony_cistatic void *TcpClient(void *args)
1099762338dSopenharmony_ci{
1109762338dSopenharmony_ci    int ret;
1119762338dSopenharmony_ci    ssize_t size;
1129762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
1139762338dSopenharmony_ci    int clientFd = -1;
1149762338dSopenharmony_ci    struct sockaddr_in serAddr = {
1159762338dSopenharmony_ci        .sin_family = AF_INET,
1169762338dSopenharmony_ci        .sin_port = htons(TEST_TCP_PORT),
1179762338dSopenharmony_ci        .sin_addr = {
1189762338dSopenharmony_ci            .s_addr = inet_addr(TEST_LOCAL_IP),
1199762338dSopenharmony_ci        }
1209762338dSopenharmony_ci    };
1219762338dSopenharmony_ci
1229762338dSopenharmony_ci    clientFd = socket(AF_INET, SOCK_STREAM, 0);
1239762338dSopenharmony_ci    EXPECT_TRUE(clientFd > 0);
1249762338dSopenharmony_ci
1259762338dSopenharmony_ci    ret = connect(clientFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(struct sockaddr_in));
1269762338dSopenharmony_ci    EXPECT_EQ(ret, 0);
1279762338dSopenharmony_ci
1289762338dSopenharmony_ci    size = send(clientFd, TEST_BUFFER, strlen(TEST_BUFFER), 0);
1299762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_BUFFER));
1309762338dSopenharmony_ci
1319762338dSopenharmony_ci    size = recv(clientFd, static_cast<void *>(buffer), BUFFER_SIZE, 0);
1329762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_EXIT));
1339762338dSopenharmony_ci    EXPECT_STREQ(buffer, TEST_EXIT);
1349762338dSopenharmony_ci
1359762338dSopenharmony_ci    close(clientFd);
1369762338dSopenharmony_ci    return nullptr;
1379762338dSopenharmony_ci}
1389762338dSopenharmony_ci
1399762338dSopenharmony_cistatic void *UdpClient(void *args)
1409762338dSopenharmony_ci{
1419762338dSopenharmony_ci    ssize_t size;
1429762338dSopenharmony_ci    int clientFd = -1;
1439762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
1449762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
1459762338dSopenharmony_ci    socklen_t addrLen = sizeof(struct sockaddr_in);
1469762338dSopenharmony_ci    struct sockaddr_in serAddr = {
1479762338dSopenharmony_ci        .sin_family = AF_INET,
1489762338dSopenharmony_ci        .sin_port = htons(TEST_UDP_PORT),
1499762338dSopenharmony_ci        .sin_addr = {
1509762338dSopenharmony_ci            .s_addr = inet_addr(TEST_LOCAL_IP),
1519762338dSopenharmony_ci        }
1529762338dSopenharmony_ci    };
1539762338dSopenharmony_ci    ClientType *type = reinterpret_cast<ClientType *>(args);
1549762338dSopenharmony_ci
1559762338dSopenharmony_ci    clientFd = socket(AF_INET, SOCK_DGRAM, 0);
1569762338dSopenharmony_ci    EXPECT_TRUE(clientFd > 0);
1579762338dSopenharmony_ci
1589762338dSopenharmony_ci    size = sendto(clientFd, TEST_BUFFER, strlen(TEST_BUFFER), 0,
1599762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(struct sockaddr_in));
1609762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_BUFFER));
1619762338dSopenharmony_ci
1629762338dSopenharmony_ci    if (*type == WAIT_MSG_EXIT) {
1639762338dSopenharmony_ci        size = recvfrom(clientFd, static_cast<void *>(buffer), BUFFER_SIZE, 0,
1649762338dSopenharmony_ci            reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
1659762338dSopenharmony_ci        EXPECT_EQ(size, strlen(TEST_EXIT));
1669762338dSopenharmony_ci        EXPECT_STREQ(buffer, TEST_EXIT);
1679762338dSopenharmony_ci    } else if (*type == WAIT_MSG_NULL) {
1689762338dSopenharmony_ci        size = recvfrom(clientFd, static_cast<void *>(buffer), BUFFER_SIZE, 0,
1699762338dSopenharmony_ci            reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
1709762338dSopenharmony_ci        EXPECT_EQ(size, 0);
1719762338dSopenharmony_ci    }
1729762338dSopenharmony_ci
1739762338dSopenharmony_ci    close(clientFd);
1749762338dSopenharmony_ci    return nullptr;
1759762338dSopenharmony_ci}
1769762338dSopenharmony_ci
1779762338dSopenharmony_ci/*
1789762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDTO_RECVFROM_0100
1799762338dSopenharmony_ci * @tc.name   : SendtoAndRecvFromDataSuccess_0001
1809762338dSopenharmony_ci * @tc.desc   : sendto and recvfrom by client and service success.
1819762338dSopenharmony_ci * @tc.size   : MediumTest
1829762338dSopenharmony_ci * @tc.type   : Function
1839762338dSopenharmony_ci * @tc.level  : Level 1
1849762338dSopenharmony_ci */
1859762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendtoAndRecvFromDataSuccess_0001, Function | MediumTest | Level1)
1869762338dSopenharmony_ci{
1879762338dSopenharmony_ci    ssize_t size;
1889762338dSopenharmony_ci    pthread_t thread;
1899762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
1909762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
1919762338dSopenharmony_ci    socklen_t addrLen = sizeof(struct sockaddr_in);
1929762338dSopenharmony_ci    ClientType type = WAIT_MSG_EXIT;
1939762338dSopenharmony_ci
1949762338dSopenharmony_ci    pthread_create(&thread, nullptr, UdpClient, static_cast<void *>(&type));
1959762338dSopenharmony_ci
1969762338dSopenharmony_ci    size = recvfrom(g_udpFd, static_cast<void *>(buffer), BUFFER_SIZE, 0,
1979762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
1989762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_BUFFER));
1999762338dSopenharmony_ci    EXPECT_STREQ(buffer, TEST_BUFFER);
2009762338dSopenharmony_ci
2019762338dSopenharmony_ci    size = sendto(g_udpFd, TEST_EXIT, strlen(TEST_EXIT), 0,
2029762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), addrLen);
2039762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_EXIT));
2049762338dSopenharmony_ci
2059762338dSopenharmony_ci    pthread_join(thread, nullptr);
2069762338dSopenharmony_ci}
2079762338dSopenharmony_ci
2089762338dSopenharmony_ci/*
2099762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDTO_RECVFROM_0200
2109762338dSopenharmony_ci * @tc.name   : SendtoAndRecvFromInvalidParamsFailed_0002
2119762338dSopenharmony_ci * @tc.desc   : sendto and recvfrom use invalid param failed.
2129762338dSopenharmony_ci * @tc.size   : MediumTest
2139762338dSopenharmony_ci * @tc.type   : Function
2149762338dSopenharmony_ci * @tc.level  : Level 2
2159762338dSopenharmony_ci */
2169762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendtoAndRecvFromInvalidParamsFailed_0002, Function | MediumTest | Level2)
2179762338dSopenharmony_ci{
2189762338dSopenharmony_ci    ssize_t size;
2199762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
2209762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
2219762338dSopenharmony_ci    socklen_t addrLen = sizeof(struct sockaddr_in);
2229762338dSopenharmony_ci    int socketFd = socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0);
2239762338dSopenharmony_ci    EXPECT_TRUE(socketFd > 0);
2249762338dSopenharmony_ci
2259762338dSopenharmony_ci    errno = 0;
2269762338dSopenharmony_ci    size = recvfrom(BAD_SOCKET_FD, static_cast<void *>(buffer), BUFFER_SIZE, 0,
2279762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
2289762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2299762338dSopenharmony_ci    EXPECT_EQ(errno, EBADF);
2309762338dSopenharmony_ci
2319762338dSopenharmony_ci    errno = 0;
2329762338dSopenharmony_ci    size = recvfrom(STDIN_FILENO, static_cast<void *>(buffer), BUFFER_SIZE, 0,
2339762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
2349762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2359762338dSopenharmony_ci    EXPECT_EQ(errno, ENOTSOCK);
2369762338dSopenharmony_ci
2379762338dSopenharmony_ci    errno = 0;
2389762338dSopenharmony_ci    size = recvfrom(socketFd, nullptr, BUFFER_SIZE, 0,
2399762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
2409762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2419762338dSopenharmony_ci    EXPECT_EQ(errno, EAGAIN);
2429762338dSopenharmony_ci
2439762338dSopenharmony_ci    errno = 0;
2449762338dSopenharmony_ci    size = recvfrom(socketFd, static_cast<void *>(buffer), 0, 0,
2459762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
2469762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2479762338dSopenharmony_ci    EXPECT_EQ(errno, EAGAIN);
2489762338dSopenharmony_ci
2499762338dSopenharmony_ci    errno = 0;
2509762338dSopenharmony_ci    size = sendto(BAD_SOCKET_FD, TEST_EXIT, strlen(TEST_EXIT), 0,
2519762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), addrLen);
2529762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2539762338dSopenharmony_ci    EXPECT_EQ(errno, EBADF);
2549762338dSopenharmony_ci
2559762338dSopenharmony_ci    errno = 0;
2569762338dSopenharmony_ci    size = sendto(STDIN_FILENO, TEST_EXIT, strlen(TEST_EXIT), 0,
2579762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), addrLen);
2589762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2599762338dSopenharmony_ci    EXPECT_EQ(errno, ENOTSOCK);
2609762338dSopenharmony_ci
2619762338dSopenharmony_ci    errno = 0;
2629762338dSopenharmony_ci    size = sendto(socketFd, nullptr, BUFFER_SIZE, 0,
2639762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), addrLen);
2649762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2659762338dSopenharmony_ci    EXPECT_EQ(errno, EINVAL);
2669762338dSopenharmony_ci
2679762338dSopenharmony_ci    errno = 0;
2689762338dSopenharmony_ci    size = sendto(socketFd, TEST_EXIT, 0, 0,
2699762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&dstAddr), addrLen);
2709762338dSopenharmony_ci    EXPECT_EQ(size, -1);
2719762338dSopenharmony_ci    EXPECT_EQ(errno, EINVAL);
2729762338dSopenharmony_ci}
2739762338dSopenharmony_ci
2749762338dSopenharmony_ci/*
2759762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDTO_RECVFROM_0300
2769762338dSopenharmony_ci * @tc.name   : SendtoFlagTest_0003
2779762338dSopenharmony_ci * @tc.desc   : sendto test MSG_DONTWAIT and MSG_CMSG_CLOEXEC flags success.
2789762338dSopenharmony_ci * @tc.size   : MediumTest
2799762338dSopenharmony_ci * @tc.type   : Function
2809762338dSopenharmony_ci * @tc.level  : Level 1
2819762338dSopenharmony_ci */
2829762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendtoFlagTest_0003, Function | MediumTest | Level1)
2839762338dSopenharmony_ci{
2849762338dSopenharmony_ci    ssize_t size;
2859762338dSopenharmony_ci    int clientFd = -1;
2869762338dSopenharmony_ci    struct sockaddr_in serAddr = {
2879762338dSopenharmony_ci        .sin_family = AF_INET,
2889762338dSopenharmony_ci        .sin_port = htons(TEST_UDP_PORT),
2899762338dSopenharmony_ci        .sin_addr = {
2909762338dSopenharmony_ci            .s_addr = inet_addr(TEST_LOCAL_IP),
2919762338dSopenharmony_ci        }
2929762338dSopenharmony_ci    };
2939762338dSopenharmony_ci
2949762338dSopenharmony_ci    clientFd = socket(AF_INET, SOCK_DGRAM, 0);
2959762338dSopenharmony_ci    EXPECT_TRUE(clientFd > 0);
2969762338dSopenharmony_ci
2979762338dSopenharmony_ci    size = sendto(clientFd, TEST_BUFFER, strlen(TEST_BUFFER), MSG_DONTWAIT,
2989762338dSopenharmony_ci        reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(struct sockaddr_in));
2999762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_BUFFER));
3009762338dSopenharmony_ci
3019762338dSopenharmony_ci    close(clientFd);
3029762338dSopenharmony_ci}
3039762338dSopenharmony_ci
3049762338dSopenharmony_ci/*
3059762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDMSG_RECVMSG_0400
3069762338dSopenharmony_ci * @tc.name   : RecvmsgSendmsgDataTest_0004
3079762338dSopenharmony_ci * @tc.desc   : sendmsg and recvmsg data success.
3089762338dSopenharmony_ci * @tc.size   : MediumTest
3099762338dSopenharmony_ci * @tc.type   : Function
3109762338dSopenharmony_ci * @tc.level  : Level 1
3119762338dSopenharmony_ci */
3129762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, RecvmsgSendmsgDataTest_0004, Function | MediumTest | Level1)
3139762338dSopenharmony_ci{
3149762338dSopenharmony_ci    ssize_t size;
3159762338dSopenharmony_ci    pthread_t thread;
3169762338dSopenharmony_ci    ClientType type = WAIT_MSG_EXIT;
3179762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
3189762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
3199762338dSopenharmony_ci    struct iovec io = {
3209762338dSopenharmony_ci        .iov_base = buffer,
3219762338dSopenharmony_ci        .iov_len = BUFFER_SIZE,
3229762338dSopenharmony_ci    };
3239762338dSopenharmony_ci    struct msghdr msgHdr = {
3249762338dSopenharmony_ci        .msg_name = &dstAddr,
3259762338dSopenharmony_ci        .msg_namelen = sizeof(struct sockaddr_in),
3269762338dSopenharmony_ci        .msg_iov = &io,
3279762338dSopenharmony_ci        .msg_iovlen = 1,
3289762338dSopenharmony_ci    };
3299762338dSopenharmony_ci
3309762338dSopenharmony_ci    pthread_create(&thread, nullptr, UdpClient, static_cast<void *>(&type));
3319762338dSopenharmony_ci
3329762338dSopenharmony_ci    size = recvmsg(g_udpFd, &msgHdr, 0);EXPECT_EQ(size, strlen(TEST_BUFFER));
3339762338dSopenharmony_ci    EXPECT_STREQ(static_cast<char *>(msgHdr.msg_iov->iov_base), TEST_BUFFER);
3349762338dSopenharmony_ci
3359762338dSopenharmony_ci    memcpy_s(msgHdr.msg_iov->iov_base, BUFFER_SIZE, TEST_EXIT, strlen(TEST_EXIT));
3369762338dSopenharmony_ci    msgHdr.msg_iov->iov_len = strlen(TEST_EXIT);
3379762338dSopenharmony_ci    size = sendmsg(g_udpFd, &msgHdr, 0);
3389762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_EXIT));
3399762338dSopenharmony_ci
3409762338dSopenharmony_ci    pthread_join(thread, nullptr);
3419762338dSopenharmony_ci}
3429762338dSopenharmony_ci
3439762338dSopenharmony_ci/*
3449762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDMSG_RECVMSG_0500
3459762338dSopenharmony_ci * @tc.name   : SendmsgRecvmsgInvalidFdFailed_0005
3469762338dSopenharmony_ci * @tc.desc   : sendmsg and recvmsg use invalid socket fd failed.
3479762338dSopenharmony_ci * @tc.size   : MediumTest
3489762338dSopenharmony_ci * @tc.type   : Function
3499762338dSopenharmony_ci * @tc.level  : Level 2
3509762338dSopenharmony_ci */
3519762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendmsgRecvmsgInvalidFdFailed_0005, Function | MediumTest | Level2)
3529762338dSopenharmony_ci{
3539762338dSopenharmony_ci    ssize_t size;
3549762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
3559762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
3569762338dSopenharmony_ci    struct iovec io = {
3579762338dSopenharmony_ci        .iov_base = buffer,
3589762338dSopenharmony_ci        .iov_len = BUFFER_SIZE,
3599762338dSopenharmony_ci    };
3609762338dSopenharmony_ci    struct msghdr msgHdr = {
3619762338dSopenharmony_ci        .msg_name = &dstAddr,
3629762338dSopenharmony_ci        .msg_namelen = sizeof(struct sockaddr_in),
3639762338dSopenharmony_ci        .msg_iov = &io,
3649762338dSopenharmony_ci        .msg_iovlen = 1,
3659762338dSopenharmony_ci    };
3669762338dSopenharmony_ci
3679762338dSopenharmony_ci    errno = 0;
3689762338dSopenharmony_ci    size = recvmsg(BAD_SOCKET_FD, &msgHdr, 0);
3699762338dSopenharmony_ci    EXPECT_EQ(size, -1);
3709762338dSopenharmony_ci    EXPECT_EQ(errno, EBADF);
3719762338dSopenharmony_ci    errno = 0;
3729762338dSopenharmony_ci    size = sendmsg(BAD_SOCKET_FD, &msgHdr, 0);
3739762338dSopenharmony_ci    EXPECT_EQ(size, -1);
3749762338dSopenharmony_ci    EXPECT_EQ(errno, EBADF);
3759762338dSopenharmony_ci
3769762338dSopenharmony_ci    errno = 0;
3779762338dSopenharmony_ci    size = recvmsg(STDIN_FILENO, &msgHdr, 0);
3789762338dSopenharmony_ci    EXPECT_EQ(size, -1);
3799762338dSopenharmony_ci    EXPECT_EQ(errno, ENOTSOCK);
3809762338dSopenharmony_ci    errno = 0;
3819762338dSopenharmony_ci    size = sendmsg(STDIN_FILENO, &msgHdr, 0);
3829762338dSopenharmony_ci    EXPECT_EQ(size, -1);
3839762338dSopenharmony_ci    EXPECT_EQ(errno, ENOTSOCK);
3849762338dSopenharmony_ci}
3859762338dSopenharmony_ci
3869762338dSopenharmony_ci
3879762338dSopenharmony_ci/*
3889762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDMSG_RECVMSG_0600
3899762338dSopenharmony_ci * @tc.name   : SendmsgRecvmsgMsgNameTest_0006
3909762338dSopenharmony_ci * @tc.desc   : send and recvmsg use msg_name nullptr test.
3919762338dSopenharmony_ci * @tc.size   : MediumTest
3929762338dSopenharmony_ci * @tc.type   : Function
3939762338dSopenharmony_ci * @tc.level  : Level 2
3949762338dSopenharmony_ci */
3959762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendmsgRecvmsgMsgNameTest_0006, Function | MediumTest | Level2)
3969762338dSopenharmony_ci{
3979762338dSopenharmony_ci    ssize_t size;
3989762338dSopenharmony_ci    pthread_t thread;
3999762338dSopenharmony_ci    ClientType type = NO_RECV_MSG;
4009762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
4019762338dSopenharmony_ci    struct iovec io = {
4029762338dSopenharmony_ci        .iov_base = buffer,
4039762338dSopenharmony_ci        .iov_len = BUFFER_SIZE,
4049762338dSopenharmony_ci    };
4059762338dSopenharmony_ci    struct msghdr msgHdr = {
4069762338dSopenharmony_ci        .msg_name = nullptr,
4079762338dSopenharmony_ci        .msg_namelen = sizeof(struct sockaddr_in),
4089762338dSopenharmony_ci        .msg_iov = &io,
4099762338dSopenharmony_ci        .msg_iovlen = 1,
4109762338dSopenharmony_ci    };
4119762338dSopenharmony_ci
4129762338dSopenharmony_ci    pthread_create(&thread, nullptr, UdpClient, static_cast<void *>(&type));
4139762338dSopenharmony_ci    size = recvmsg(g_udpFd, &msgHdr, 0);
4149762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_BUFFER));
4159762338dSopenharmony_ci    EXPECT_EQ(msgHdr.msg_name, nullptr);
4169762338dSopenharmony_ci    errno = 0;
4179762338dSopenharmony_ci    size = sendmsg(g_udpFd, &msgHdr, 0);
4189762338dSopenharmony_ci    EXPECT_EQ(size, -1);
4199762338dSopenharmony_ci    EXPECT_EQ(errno, EDESTADDRREQ);
4209762338dSopenharmony_ci    pthread_join(thread, nullptr);
4219762338dSopenharmony_ci}
4229762338dSopenharmony_ci
4239762338dSopenharmony_ci/*
4249762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDMSG_RECVMSG_0800
4259762338dSopenharmony_ci * @tc.name   : SendmsgRecvmsgErrorNameLenTest_0008
4269762338dSopenharmony_ci * @tc.desc   : send and recvmsg use error msg_name length test.
4279762338dSopenharmony_ci * @tc.size   : MediumTest
4289762338dSopenharmony_ci * @tc.type   : Function
4299762338dSopenharmony_ci * @tc.level  : Level 2
4309762338dSopenharmony_ci */
4319762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendmsgRecvmsgErrorNameLenTest_0008, Function | MediumTest | Level2)
4329762338dSopenharmony_ci{
4339762338dSopenharmony_ci    ssize_t size;
4349762338dSopenharmony_ci    pthread_t thread;
4359762338dSopenharmony_ci    ClientType type = NO_RECV_MSG;
4369762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
4379762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
4389762338dSopenharmony_ci    struct iovec io = {
4399762338dSopenharmony_ci        .iov_base = buffer,
4409762338dSopenharmony_ci        .iov_len = BUFFER_SIZE,
4419762338dSopenharmony_ci    };
4429762338dSopenharmony_ci    struct msghdr msgHdr = {
4439762338dSopenharmony_ci        .msg_name = &dstAddr,
4449762338dSopenharmony_ci        .msg_namelen = 0,
4459762338dSopenharmony_ci        .msg_iov = &io,
4469762338dSopenharmony_ci        .msg_iovlen = 1,
4479762338dSopenharmony_ci    };
4489762338dSopenharmony_ci
4499762338dSopenharmony_ci    pthread_create(&thread, nullptr, UdpClient, static_cast<void *>(&type));
4509762338dSopenharmony_ci    errno = 0;
4519762338dSopenharmony_ci    size = recvmsg(g_udpFd, &msgHdr, 0);
4529762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_BUFFER));
4539762338dSopenharmony_ci    EXPECT_EQ(msgHdr.msg_namelen, sizeof(struct sockaddr_in));
4549762338dSopenharmony_ci    msgHdr.msg_namelen = 0;
4559762338dSopenharmony_ci    errno = 0;
4569762338dSopenharmony_ci    size = sendmsg(g_udpFd, &msgHdr, 0);
4579762338dSopenharmony_ci    EXPECT_EQ(size, -1);
4589762338dSopenharmony_ci    EXPECT_EQ(errno, EDESTADDRREQ);
4599762338dSopenharmony_ci    pthread_join(thread, nullptr);
4609762338dSopenharmony_ci
4619762338dSopenharmony_ci    type = WAIT_MSG_NULL;
4629762338dSopenharmony_ci    pthread_create(&thread, nullptr, UdpClient, static_cast<void *>(&type));
4639762338dSopenharmony_ci    msgHdr.msg_name = &dstAddr;
4649762338dSopenharmony_ci    msgHdr.msg_namelen = sizeof(struct sockaddr_in);
4659762338dSopenharmony_ci    msgHdr.msg_iov = nullptr;
4669762338dSopenharmony_ci    msgHdr.msg_iovlen = 0;
4679762338dSopenharmony_ci    size = recvmsg(g_udpFd, &msgHdr, 0);
4689762338dSopenharmony_ci    EXPECT_EQ(size, 0);
4699762338dSopenharmony_ci    msgHdr.msg_iov = nullptr;
4709762338dSopenharmony_ci    msgHdr.msg_iovlen = 0;
4719762338dSopenharmony_ci    errno = 0;
4729762338dSopenharmony_ci    size = sendmsg(g_udpFd, &msgHdr, 0);
4739762338dSopenharmony_ci    EXPECT_EQ(size, 0);
4749762338dSopenharmony_ci    pthread_join(thread, nullptr);
4759762338dSopenharmony_ci}
4769762338dSopenharmony_ci
4779762338dSopenharmony_ci/*
4789762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SENDMSG_RECVMSG_0900
4799762338dSopenharmony_ci * @tc.name   : SendmsgRecvmsgMsgIovTest_0009
4809762338dSopenharmony_ci * @tc.desc   : send and recvmsg msg_iov nullptr test.
4819762338dSopenharmony_ci * @tc.size   : MediumTest
4829762338dSopenharmony_ci * @tc.type   : Function
4839762338dSopenharmony_ci * @tc.level  : Level 2
4849762338dSopenharmony_ci */
4859762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendmsgRecvmsgMsgIovTest_0009, Function | MediumTest | Level2)
4869762338dSopenharmony_ci{
4879762338dSopenharmony_ci    ssize_t size;
4889762338dSopenharmony_ci    pthread_t thread;
4899762338dSopenharmony_ci    ClientType type = WAIT_MSG_NULL;
4909762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
4919762338dSopenharmony_ci    struct msghdr msgHdr = {
4929762338dSopenharmony_ci        .msg_name = &dstAddr,
4939762338dSopenharmony_ci        .msg_namelen = sizeof(struct sockaddr_in),
4949762338dSopenharmony_ci        .msg_iov = nullptr,
4959762338dSopenharmony_ci        .msg_iovlen = 0,
4969762338dSopenharmony_ci    };
4979762338dSopenharmony_ci
4989762338dSopenharmony_ci    pthread_create(&thread, nullptr, UdpClient, static_cast<void *>(&type));
4999762338dSopenharmony_ci    size = recvmsg(g_udpFd, &msgHdr, 0);
5009762338dSopenharmony_ci    EXPECT_EQ(size, 0);
5019762338dSopenharmony_ci    msgHdr.msg_iov = nullptr;
5029762338dSopenharmony_ci    msgHdr.msg_iovlen = 0;
5039762338dSopenharmony_ci    errno = 0;
5049762338dSopenharmony_ci    size = sendmsg(g_udpFd, &msgHdr, 0);
5059762338dSopenharmony_ci    EXPECT_EQ(size, 0);
5069762338dSopenharmony_ci    pthread_join(thread, nullptr);
5079762338dSopenharmony_ci}
5089762338dSopenharmony_ci
5099762338dSopenharmony_ci/*
5109762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_SEND_RECV_1000
5119762338dSopenharmony_ci * @tc.name   : SendAndRecvDataSuccess_0010
5129762338dSopenharmony_ci * @tc.desc   : send/recv and getsockname by client and service success.
5139762338dSopenharmony_ci * @tc.size   : MediumTest
5149762338dSopenharmony_ci * @tc.type   : Function
5159762338dSopenharmony_ci * @tc.level  : Level 1
5169762338dSopenharmony_ci */
5179762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, SendAndRecvDataSuccess_0010, Function | MediumTest | Level1)
5189762338dSopenharmony_ci{
5199762338dSopenharmony_ci    int ret;
5209762338dSopenharmony_ci    ssize_t size;
5219762338dSopenharmony_ci    pthread_t thread;
5229762338dSopenharmony_ci    int acceptFd = -1;
5239762338dSopenharmony_ci    int32_t backLog = 5;
5249762338dSopenharmony_ci    char buffer[BUFFER_SIZE] = { 0 };
5259762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
5269762338dSopenharmony_ci    socklen_t addrLen = sizeof(struct sockaddr_in);
5279762338dSopenharmony_ci
5289762338dSopenharmony_ci    ret = listen(g_tcpFd, backLog);
5299762338dSopenharmony_ci    EXPECT_EQ(ret, 0);
5309762338dSopenharmony_ci
5319762338dSopenharmony_ci    pthread_create(&thread, nullptr, TcpClient, nullptr);
5329762338dSopenharmony_ci
5339762338dSopenharmony_ci    acceptFd = accept(g_tcpFd, reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
5349762338dSopenharmony_ci    EXPECT_TRUE(acceptFd > 0);
5359762338dSopenharmony_ci
5369762338dSopenharmony_ci    // test getsockname get client name success
5379762338dSopenharmony_ci    ret = getsockname(g_tcpFd, reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
5389762338dSopenharmony_ci    EXPECT_EQ(ret, 0);
5399762338dSopenharmony_ci    EXPECT_STREQ(inet_ntoa(dstAddr.sin_addr), TEST_LOCAL_IP);
5409762338dSopenharmony_ci
5419762338dSopenharmony_ci    // test recv success
5429762338dSopenharmony_ci    size = recv(acceptFd, static_cast<void *>(buffer), BUFFER_SIZE, 0);
5439762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_BUFFER));
5449762338dSopenharmony_ci    EXPECT_STREQ(buffer, TEST_BUFFER);
5459762338dSopenharmony_ci
5469762338dSopenharmony_ci    // test send success
5479762338dSopenharmony_ci    size = send(acceptFd, TEST_EXIT, strlen(TEST_EXIT), 0);
5489762338dSopenharmony_ci    EXPECT_EQ(size, strlen(TEST_EXIT));
5499762338dSopenharmony_ci
5509762338dSopenharmony_ci    close(acceptFd);
5519762338dSopenharmony_ci    pthread_join(thread, nullptr);
5529762338dSopenharmony_ci}
5539762338dSopenharmony_ci
5549762338dSopenharmony_ci/*
5559762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_GETSOCKNAME_1100
5569762338dSopenharmony_ci * @tc.name   : GetsocknameUseInvalidFdFailed_0011
5579762338dSopenharmony_ci * @tc.desc   : getsockname use invalid socket fd failed.
5589762338dSopenharmony_ci * @tc.size   : MediumTest
5599762338dSopenharmony_ci * @tc.type   : Function
5609762338dSopenharmony_ci * @tc.level  : Level 2
5619762338dSopenharmony_ci */
5629762338dSopenharmony_ciHWTEST_F(HatsDataHandleTest, GetsocknameUseInvalidFdFailed_0011, Function | MediumTest | Level2)
5639762338dSopenharmony_ci{
5649762338dSopenharmony_ci    int ret;
5659762338dSopenharmony_ci    struct sockaddr_in dstAddr = { 0 };
5669762338dSopenharmony_ci    socklen_t addrLen = sizeof(struct sockaddr_in);
5679762338dSopenharmony_ci
5689762338dSopenharmony_ci    // use invalid socket fd failed
5699762338dSopenharmony_ci    errno = 0;
5709762338dSopenharmony_ci    ret = getsockname(BAD_SOCKET_FD, reinterpret_cast<struct sockaddr *>(&dstAddr), &addrLen);
5719762338dSopenharmony_ci    EXPECT_EQ(ret, -1);
5729762338dSopenharmony_ci    EXPECT_EQ(errno, EBADF);
5739762338dSopenharmony_ci}
5749762338dSopenharmony_ci
575