Mmajiangfengsocket test
7997049c创建于 2025年2月14日历史提交
/*
 * Copyright (C) 2024 HiHope Open Source Organization.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <gtest/gtest.h>
#include <linux/netlink.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/types.h>
#include "securec.h"

using namespace testing::ext;

static const int MAX_SIZE = 128;
static const int ID_ONE = 88;
static const int ID_TWO = 98;

class HatsSocketTest : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    void SetUp();
    void TearDown();
private:
};
void HatsSocketTest::SetUp()
{
}
void HatsSocketTest::TearDown()
{
}
void HatsSocketTest::SetUpTestCase()
{
}
void HatsSocketTest::TearDownTestCase()
{
}

struct SetOptionSupportTest {
    int id;
    int domain;
    int type;
    int protocol;
} g_socketOpt[] = {
    {0,     AF_UNIX, SOCK_STREAM, NETLINK_ROUTE},
    {1,     AF_UNIX, SOCK_STREAM, IPPROTO_IP},
    {2,     AF_UNIX, SOCK_STREAM, IPPROTO_ICMP},
    {3,     AF_UNIX, SOCK_DGRAM, NETLINK_ROUTE},
    {4,     AF_UNIX, SOCK_DGRAM, IPPROTO_IP},
    {5,     AF_UNIX, SOCK_DGRAM, IPPROTO_ICMP},
    {6,     AF_UNIX, SOCK_SEQPACKET, NETLINK_ROUTE},
    {7,     AF_UNIX, SOCK_SEQPACKET, IPPROTO_IP},
    {8,     AF_UNIX, SOCK_SEQPACKET, IPPROTO_ICMP},
    {10,    AF_LOCAL, SOCK_STREAM, NETLINK_ROUTE},
    {11,    AF_LOCAL, SOCK_STREAM, IPPROTO_IP},
    {12,    AF_LOCAL, SOCK_STREAM, IPPROTO_ICMP},
    {13,    AF_LOCAL, SOCK_DGRAM, NETLINK_ROUTE},
    {14,    AF_LOCAL, SOCK_DGRAM, IPPROTO_IP},
    {15,    AF_LOCAL, SOCK_DGRAM, IPPROTO_ICMP},
    {16,    AF_LOCAL, SOCK_SEQPACKET, NETLINK_ROUTE},
    {17,    AF_LOCAL, SOCK_SEQPACKET, IPPROTO_IP},
    {20,    AF_LOCAL, SOCK_SEQPACKET, IPPROTO_ICMP},
    {24,    AF_INET, SOCK_STREAM, NETLINK_ROUTE},
    {25,    AF_INET, SOCK_STREAM, IPPROTO_IP},
    {26,    AF_INET, SOCK_STREAM, IPPROTO_TCP},
    {27,    AF_INET, SOCK_DGRAM, NETLINK_ROUTE},
    {28,    AF_INET, SOCK_DGRAM, IPPROTO_IP},
    {29,    AF_INET, SOCK_DGRAM, IPPROTO_ICMP},
    {30,    AF_INET, SOCK_DGRAM, IPPROTO_UDP},
    {31,    AF_INET, SOCK_RAW, NETLINK_FIREWALL},
    {32,    AF_INET, SOCK_RAW, NETLINK_SOCK_DIAG},
    {33,    AF_INET, SOCK_RAW, NETLINK_NFLOG},
    {34,    AF_INET, SOCK_RAW, NETLINK_AUDIT},
    {35,    AF_INET, SOCK_RAW, NETLINK_FIB_LOOKUP},
    {36,    AF_INET, SOCK_RAW, NETLINK_CONNECTOR},
    {37,    AF_INET, SOCK_RAW, NETLINK_NETFILTER},
    {38,    AF_INET, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
    {39,    AF_INET, SOCK_RAW, NETLINK_GENERIC},
    {40,    AF_INET, SOCK_RAW, IPPROTO_ICMPV6},
    {41,    AF_INET, SOCK_RAW, IPPROTO_ICMP},
    {42,    AF_INET, SOCK_RAW, IPPROTO_TCP},
    {43,    AF_INET, SOCK_RAW, IPPROTO_UDP},
    {44,    AF_INET, SOCK_PACKET, NETLINK_ROUTE},
    {45,    AF_INET, SOCK_PACKET, NETLINK_FIREWALL},
    {46,    AF_INET, SOCK_PACKET, NETLINK_SOCK_DIAG},
    {47,    AF_INET, SOCK_PACKET, NETLINK_NFLOG},
    {48,    AF_INET, SOCK_PACKET, NETLINK_AUDIT},
    {49,    AF_INET, SOCK_PACKET, NETLINK_FIB_LOOKUP},
    {50,    AF_INET, SOCK_PACKET, NETLINK_CONNECTOR},
    {51,    AF_INET, SOCK_PACKET, NETLINK_NETFILTER},
    {52,    AF_INET, SOCK_PACKET, NETLINK_KOBJECT_UEVENT},
    {53,    AF_INET, SOCK_PACKET, NETLINK_GENERIC},
    {54,    AF_INET, SOCK_PACKET, IPPROTO_ICMPV6},
    {55,    AF_INET, SOCK_PACKET, IPPROTO_IP},
    {56,    AF_INET, SOCK_PACKET, IPPROTO_ICMP},
    {57,    AF_INET, SOCK_PACKET, IPPROTO_TCP},
    {58,    AF_INET, SOCK_PACKET, IPPROTO_UDP},
    {59,    AF_INET6, SOCK_STREAM, NETLINK_ROUTE},
    {60,    AF_INET6, SOCK_STREAM, IPPROTO_IP},
    {61,    AF_INET6, SOCK_STREAM, IPPROTO_TCP},
    {62,    AF_INET6, SOCK_DGRAM, NETLINK_ROUTE},
    {63,    AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6},
    {64,    AF_INET6, SOCK_DGRAM, IPPROTO_IP},
    {65,    AF_INET6, SOCK_DGRAM, IPPROTO_UDP},
    {66,    AF_INET6, SOCK_RAW, NETLINK_FIREWALL},
    {67,    AF_INET6, SOCK_RAW, NETLINK_SOCK_DIAG},
    {68,    AF_INET6, SOCK_RAW, NETLINK_NFLOG},
    {69,    AF_INET6, SOCK_RAW, NETLINK_AUDIT},
    {70,    AF_INET6, SOCK_RAW, NETLINK_FIB_LOOKUP},
    {71,    AF_INET6, SOCK_RAW, NETLINK_CONNECTOR},
    {72,    AF_INET6, SOCK_RAW, NETLINK_NETFILTER},
    {73,    AF_INET6, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
    {74,    AF_INET6, SOCK_RAW, NETLINK_GENERIC},
    {75,    AF_INET6, SOCK_RAW, IPPROTO_ICMPV6},
    {76,    AF_INET6, SOCK_RAW, IPPROTO_ICMP},
    {77,    AF_INET6, SOCK_RAW, IPPROTO_TCP},
    {78,    AF_INET6, SOCK_RAW, IPPROTO_UDP},
    {79,    AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE},
    {80,    AF_NETLINK, SOCK_DGRAM, NETLINK_SOCK_DIAG},
    {81,    AF_NETLINK, SOCK_DGRAM, NETLINK_AUDIT},
    {82,    AF_NETLINK, SOCK_DGRAM, NETLINK_FIB_LOOKUP},
    {84,    AF_NETLINK, SOCK_DGRAM, NETLINK_NETFILTER},
    {85,    AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT},
    {86,    AF_NETLINK, SOCK_DGRAM, NETLINK_GENERIC},
    {87,    AF_NETLINK, SOCK_DGRAM, IPPROTO_IP},
    {88,    AF_NETLINK, SOCK_DGRAM, NETLINK_XFRM},
    {89,    AF_NETLINK, SOCK_RAW, NETLINK_ROUTE},
    {90,    AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG},
    {91,    AF_NETLINK, SOCK_RAW, NETLINK_AUDIT},
    {92,    AF_NETLINK, SOCK_RAW, NETLINK_FIB_LOOKUP},
    {94,    AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER},
    {95,    AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
    {96,    AF_NETLINK, SOCK_RAW, NETLINK_GENERIC},
    {97,    AF_NETLINK, SOCK_RAW, IPPROTO_IP},
    {98,    AF_NETLINK, SOCK_RAW, NETLINK_XFRM},
    {99,    AF_PACKET, SOCK_DGRAM, NETLINK_ROUTE},
    {110,   AF_PACKET, SOCK_DGRAM, NETLINK_FIREWALL},
    {111,   AF_PACKET, SOCK_DGRAM, NETLINK_SOCK_DIAG},
    {112,   AF_PACKET, SOCK_DGRAM, NETLINK_NFLOG},
    {113,   AF_PACKET, SOCK_DGRAM, NETLINK_AUDIT},
    {114,   AF_PACKET, SOCK_DGRAM, NETLINK_FIB_LOOKUP},
    {115,   AF_PACKET, SOCK_DGRAM, NETLINK_CONNECTOR},
    {116,   AF_PACKET, SOCK_DGRAM, NETLINK_NETFILTER},
    {117,   AF_PACKET, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT},
    {118,   AF_PACKET, SOCK_DGRAM, NETLINK_GENERIC},
    {119,   AF_PACKET, SOCK_DGRAM, IPPROTO_ICMPV6},
    {120,   AF_PACKET, SOCK_DGRAM, IPPROTO_IP},
    {121,   AF_PACKET, SOCK_DGRAM, IPPROTO_ICMP},
    {122,   AF_PACKET, SOCK_DGRAM, IPPROTO_TCP},
    {123,   AF_PACKET, SOCK_DGRAM, IPPROTO_UDP},
    {124,   AF_PACKET, SOCK_RAW, NETLINK_ROUTE},
    {125,   AF_PACKET, SOCK_RAW, NETLINK_FIREWALL},
    {126,   AF_PACKET, SOCK_RAW, NETLINK_SOCK_DIAG},
    {127,   AF_PACKET, SOCK_RAW, NETLINK_NFLOG},
    {128,   AF_PACKET, SOCK_RAW, NETLINK_AUDIT},
    {129,   AF_PACKET, SOCK_RAW, NETLINK_FIB_LOOKUP},
    {130,   AF_PACKET, SOCK_RAW, NETLINK_CONNECTOR},
    {131,   AF_PACKET, SOCK_RAW, NETLINK_NETFILTER},
    {132,   AF_PACKET, SOCK_RAW, NETLINK_KOBJECT_UEVENT},
    {133,   AF_PACKET, SOCK_RAW, NETLINK_GENERIC},
    {134,   AF_PACKET, SOCK_RAW, IPPROTO_ICMPV6},
    {135,   AF_PACKET, SOCK_RAW, IPPROTO_IP},
    {136,   AF_PACKET, SOCK_RAW, IPPROTO_ICMP},
    {137,   AF_PACKET, SOCK_RAW, IPPROTO_TCP},
    {138,   AF_PACKET, SOCK_RAW, IPPROTO_UDP},
    {139,   AF_PACKET, SOCK_PACKET, NETLINK_ROUTE},
    {140,   AF_PACKET, SOCK_PACKET, NETLINK_FIREWALL},
    {141,   AF_PACKET, SOCK_PACKET, NETLINK_SOCK_DIAG},
    {142,   AF_PACKET, SOCK_PACKET, NETLINK_NFLOG},
    {143,   AF_PACKET, SOCK_PACKET, NETLINK_AUDIT},
    {144,   AF_PACKET, SOCK_PACKET, NETLINK_FIB_LOOKUP},
    {145,   AF_PACKET, SOCK_PACKET, NETLINK_CONNECTOR},
    {146,   AF_PACKET, SOCK_PACKET, NETLINK_NETFILTER},
    {147,   AF_PACKET, SOCK_PACKET, NETLINK_KOBJECT_UEVENT},
    {148,   AF_PACKET, SOCK_PACKET, NETLINK_GENERIC},
    {149,   AF_PACKET, SOCK_PACKET, IPPROTO_ICMPV6},
    {150,   AF_PACKET, SOCK_PACKET, IPPROTO_IP},
    {151,   AF_PACKET, SOCK_PACKET, IPPROTO_ICMP},
    {152,   AF_PACKET, SOCK_PACKET, IPPROTO_TCP},
    {153,   AF_PACKET, SOCK_PACKET, IPPROTO_UDP},
    {154,   AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, NETLINK_ROUTE},
};

struct SocketPairOptionSupportTest {
    int id;
    int domain;
    int type;
} g_socketPairOpt[] = {
    {1,     AF_UNIX,    SOCK_STREAM},
    {2,     AF_UNIX,    SOCK_DGRAM},
    {3,     AF_UNIX,    SOCK_SEQPACKET},
    {4,     AF_UNIX,    SOCK_STREAM | SOCK_NONBLOCK},
    {5,     AF_UNIX,    SOCK_STREAM | SOCK_CLOEXEC},
    {6,     AF_LOCAL,   SOCK_STREAM},
    {7,     AF_LOCAL,   SOCK_DGRAM},
    {8,     AF_LOCAL,   SOCK_SEQPACKET},
    {9,     AF_LOCAL,   SOCK_STREAM | SOCK_NONBLOCK},
    {10,    AF_LOCAL,   SOCK_STREAM | SOCK_CLOEXEC},
};

/*
 * @tc.number : SUB_KERNEL_SYSCALL_SOCKET_0100
 * @tc.name   : SocketCreateFdSuccess_0001
 * @tc.desc   : socket create fd success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsSocketTest, SocketCreateFdSuccess_0001, Function | MediumTest | Level1)
{
    int i;
    int socketFd = -1;
    const string path = "/proc/sys/net/core/xfrm_acq_expires";
    for (i = 0; i < sizeof(g_socketOpt) / sizeof(g_socketOpt[0]); i++) {
        if ((g_socketOpt[i].id == ID_ONE || g_socketOpt[i].id == ID_TWO) && access(path.c_str(), F_OK) == -1) {
            continue;
        }
        socketFd = socket(g_socketOpt[i].domain, g_socketOpt[i].type, g_socketOpt[i].protocol);
        if (socketFd <= 0) {
            printf("id = %d\n", g_socketOpt[i].id);
            printf("err = %s\n", strerror(errno));
        }
        EXPECT_TRUE(socketFd > 0);
        close(socketFd);
    }
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_SOCKETPAIR_0200
 * @tc.name   : SocketpairCreateSuccess_0002
 * @tc.desc   : socketpair create success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsSocketTest, SocketpairCreateSuccess_0002, Function | MediumTest | Level1)
{
    int i;
    int ret;
    ssize_t size;
    char buf[MAX_SIZE] = {0};
    int socketPair[2];
    const char *content = "Hello, world!";

    for (i = 0; i < sizeof(g_socketPairOpt) / sizeof(g_socketPairOpt[0]); i++) {
        ret = socketpair(g_socketPairOpt[i].domain, g_socketPairOpt[i].type, 0, socketPair);
        if (ret < 0) {
            printf("id = %d, ret = %d\n", g_socketPairOpt[i].id, ret);
        }
        EXPECT_EQ(ret, 0);

        size = write(socketPair[0], content, strlen(content));
        EXPECT_EQ(size, strlen(content));

        read(socketPair[1], buf, MAX_SIZE);
        EXPECT_EQ(size, strlen(content));
        EXPECT_STREQ(buf, content);

        close(socketPair[0]);
        close(socketPair[1]);
    }
}