1/* 2 * Copyright (C) 2024 HiHope Open Source Organization. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <cerrno> 17#include <cstdio> 18#include <cstdlib> 19#include <string> 20#include <vector> 21#include <fcntl.h> 22#include <unistd.h> 23#include <arpa/inet.h> 24#include <gtest/gtest.h> 25#include <linux/netlink.h> 26#include <netinet/in.h> 27#include <sys/stat.h> 28#include <sys/socket.h> 29#include <sys/types.h> 30#include "securec.h" 31 32using namespace testing::ext; 33 34static const int MAX_SIZE = 128; 35 36class HatsSocketTest : public testing::Test { 37public: 38 static void SetUpTestCase(); 39 static void TearDownTestCase(); 40 void SetUp(); 41 void TearDown(); 42private: 43}; 44void HatsSocketTest::SetUp() 45{ 46} 47void HatsSocketTest::TearDown() 48{ 49} 50void HatsSocketTest::SetUpTestCase() 51{ 52} 53void HatsSocketTest::TearDownTestCase() 54{ 55} 56 57struct SetOptionSupportTest { 58 int id; 59 int domain; 60 int type; 61 int protocol; 62} g_socketOpt[] = { 63 {0, AF_UNIX, SOCK_STREAM, NETLINK_ROUTE}, 64 {1, AF_UNIX, SOCK_STREAM, IPPROTO_IP}, 65 {2, AF_UNIX, SOCK_STREAM, IPPROTO_ICMP}, 66 {3, AF_UNIX, SOCK_DGRAM, NETLINK_ROUTE}, 67 {4, AF_UNIX, SOCK_DGRAM, IPPROTO_IP}, 68 {5, AF_UNIX, SOCK_DGRAM, IPPROTO_ICMP}, 69 {6, AF_UNIX, SOCK_SEQPACKET, NETLINK_ROUTE}, 70 {7, AF_UNIX, SOCK_SEQPACKET, IPPROTO_IP}, 71 {8, AF_UNIX, SOCK_SEQPACKET, IPPROTO_ICMP}, 72 {10, AF_LOCAL, SOCK_STREAM, NETLINK_ROUTE}, 73 {11, AF_LOCAL, SOCK_STREAM, IPPROTO_IP}, 74 {12, AF_LOCAL, SOCK_STREAM, IPPROTO_ICMP}, 75 {13, AF_LOCAL, SOCK_DGRAM, NETLINK_ROUTE}, 76 {14, AF_LOCAL, SOCK_DGRAM, IPPROTO_IP}, 77 {15, AF_LOCAL, SOCK_DGRAM, IPPROTO_ICMP}, 78 {16, AF_LOCAL, SOCK_SEQPACKET, NETLINK_ROUTE}, 79 {17, AF_LOCAL, SOCK_SEQPACKET, IPPROTO_IP}, 80 {20, AF_LOCAL, SOCK_SEQPACKET, IPPROTO_ICMP}, 81 {24, AF_INET, SOCK_STREAM, NETLINK_ROUTE}, 82 {25, AF_INET, SOCK_STREAM, IPPROTO_IP}, 83 {26, AF_INET, SOCK_STREAM, IPPROTO_TCP}, 84 {27, AF_INET, SOCK_DGRAM, NETLINK_ROUTE}, 85 {28, AF_INET, SOCK_DGRAM, IPPROTO_IP}, 86 {29, AF_INET, SOCK_DGRAM, IPPROTO_ICMP}, 87 {30, AF_INET, SOCK_DGRAM, IPPROTO_UDP}, 88 {31, AF_INET, SOCK_RAW, NETLINK_FIREWALL}, 89 {32, AF_INET, SOCK_RAW, NETLINK_SOCK_DIAG}, 90 {33, AF_INET, SOCK_RAW, NETLINK_NFLOG}, 91 {34, AF_INET, SOCK_RAW, NETLINK_AUDIT}, 92 {35, AF_INET, SOCK_RAW, NETLINK_FIB_LOOKUP}, 93 {36, AF_INET, SOCK_RAW, NETLINK_CONNECTOR}, 94 {37, AF_INET, SOCK_RAW, NETLINK_NETFILTER}, 95 {38, AF_INET, SOCK_RAW, NETLINK_KOBJECT_UEVENT}, 96 {39, AF_INET, SOCK_RAW, NETLINK_GENERIC}, 97 {40, AF_INET, SOCK_RAW, IPPROTO_ICMPV6}, 98 {41, AF_INET, SOCK_RAW, IPPROTO_ICMP}, 99 {42, AF_INET, SOCK_RAW, IPPROTO_TCP}, 100 {43, AF_INET, SOCK_RAW, IPPROTO_UDP}, 101 {44, AF_INET, SOCK_PACKET, NETLINK_ROUTE}, 102 {45, AF_INET, SOCK_PACKET, NETLINK_FIREWALL}, 103 {46, AF_INET, SOCK_PACKET, NETLINK_SOCK_DIAG}, 104 {47, AF_INET, SOCK_PACKET, NETLINK_NFLOG}, 105 {48, AF_INET, SOCK_PACKET, NETLINK_AUDIT}, 106 {49, AF_INET, SOCK_PACKET, NETLINK_FIB_LOOKUP}, 107 {50, AF_INET, SOCK_PACKET, NETLINK_CONNECTOR}, 108 {51, AF_INET, SOCK_PACKET, NETLINK_NETFILTER}, 109 {52, AF_INET, SOCK_PACKET, NETLINK_KOBJECT_UEVENT}, 110 {53, AF_INET, SOCK_PACKET, NETLINK_GENERIC}, 111 {54, AF_INET, SOCK_PACKET, IPPROTO_ICMPV6}, 112 {55, AF_INET, SOCK_PACKET, IPPROTO_IP}, 113 {56, AF_INET, SOCK_PACKET, IPPROTO_ICMP}, 114 {57, AF_INET, SOCK_PACKET, IPPROTO_TCP}, 115 {58, AF_INET, SOCK_PACKET, IPPROTO_UDP}, 116 {59, AF_INET6, SOCK_STREAM, NETLINK_ROUTE}, 117 {60, AF_INET6, SOCK_STREAM, IPPROTO_IP}, 118 {61, AF_INET6, SOCK_STREAM, IPPROTO_TCP}, 119 {62, AF_INET6, SOCK_DGRAM, NETLINK_ROUTE}, 120 {63, AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6}, 121 {64, AF_INET6, SOCK_DGRAM, IPPROTO_IP}, 122 {65, AF_INET6, SOCK_DGRAM, IPPROTO_UDP}, 123 {66, AF_INET6, SOCK_RAW, NETLINK_FIREWALL}, 124 {67, AF_INET6, SOCK_RAW, NETLINK_SOCK_DIAG}, 125 {68, AF_INET6, SOCK_RAW, NETLINK_NFLOG}, 126 {69, AF_INET6, SOCK_RAW, NETLINK_AUDIT}, 127 {70, AF_INET6, SOCK_RAW, NETLINK_FIB_LOOKUP}, 128 {71, AF_INET6, SOCK_RAW, NETLINK_CONNECTOR}, 129 {72, AF_INET6, SOCK_RAW, NETLINK_NETFILTER}, 130 {73, AF_INET6, SOCK_RAW, NETLINK_KOBJECT_UEVENT}, 131 {74, AF_INET6, SOCK_RAW, NETLINK_GENERIC}, 132 {75, AF_INET6, SOCK_RAW, IPPROTO_ICMPV6}, 133 {76, AF_INET6, SOCK_RAW, IPPROTO_ICMP}, 134 {77, AF_INET6, SOCK_RAW, IPPROTO_TCP}, 135 {78, AF_INET6, SOCK_RAW, IPPROTO_UDP}, 136 {79, AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE}, 137 {80, AF_NETLINK, SOCK_DGRAM, NETLINK_SOCK_DIAG}, 138 {81, AF_NETLINK, SOCK_DGRAM, NETLINK_AUDIT}, 139 {82, AF_NETLINK, SOCK_DGRAM, NETLINK_FIB_LOOKUP}, 140 {84, AF_NETLINK, SOCK_DGRAM, NETLINK_NETFILTER}, 141 {85, AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT}, 142 {86, AF_NETLINK, SOCK_DGRAM, NETLINK_GENERIC}, 143 {87, AF_NETLINK, SOCK_DGRAM, IPPROTO_IP}, 144 {88, AF_NETLINK, SOCK_DGRAM, IPPROTO_TCP}, 145 {89, AF_NETLINK, SOCK_RAW, NETLINK_ROUTE}, 146 {90, AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG}, 147 {91, AF_NETLINK, SOCK_RAW, NETLINK_AUDIT}, 148 {92, AF_NETLINK, SOCK_RAW, NETLINK_FIB_LOOKUP}, 149 {94, AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER}, 150 {95, AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT}, 151 {96, AF_NETLINK, SOCK_RAW, NETLINK_GENERIC}, 152 {97, AF_NETLINK, SOCK_RAW, IPPROTO_IP}, 153 {98, AF_NETLINK, SOCK_RAW, IPPROTO_TCP}, 154 {99, AF_PACKET, SOCK_DGRAM, NETLINK_ROUTE}, 155 {110, AF_PACKET, SOCK_DGRAM, NETLINK_FIREWALL}, 156 {111, AF_PACKET, SOCK_DGRAM, NETLINK_SOCK_DIAG}, 157 {112, AF_PACKET, SOCK_DGRAM, NETLINK_NFLOG}, 158 {113, AF_PACKET, SOCK_DGRAM, NETLINK_AUDIT}, 159 {114, AF_PACKET, SOCK_DGRAM, NETLINK_FIB_LOOKUP}, 160 {115, AF_PACKET, SOCK_DGRAM, NETLINK_CONNECTOR}, 161 {116, AF_PACKET, SOCK_DGRAM, NETLINK_NETFILTER}, 162 {117, AF_PACKET, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT}, 163 {118, AF_PACKET, SOCK_DGRAM, NETLINK_GENERIC}, 164 {119, AF_PACKET, SOCK_DGRAM, IPPROTO_ICMPV6}, 165 {120, AF_PACKET, SOCK_DGRAM, IPPROTO_IP}, 166 {121, AF_PACKET, SOCK_DGRAM, IPPROTO_ICMP}, 167 {122, AF_PACKET, SOCK_DGRAM, IPPROTO_TCP}, 168 {123, AF_PACKET, SOCK_DGRAM, IPPROTO_UDP}, 169 {124, AF_PACKET, SOCK_RAW, NETLINK_ROUTE}, 170 {125, AF_PACKET, SOCK_RAW, NETLINK_FIREWALL}, 171 {126, AF_PACKET, SOCK_RAW, NETLINK_SOCK_DIAG}, 172 {127, AF_PACKET, SOCK_RAW, NETLINK_NFLOG}, 173 {128, AF_PACKET, SOCK_RAW, NETLINK_AUDIT}, 174 {129, AF_PACKET, SOCK_RAW, NETLINK_FIB_LOOKUP}, 175 {130, AF_PACKET, SOCK_RAW, NETLINK_CONNECTOR}, 176 {131, AF_PACKET, SOCK_RAW, NETLINK_NETFILTER}, 177 {132, AF_PACKET, SOCK_RAW, NETLINK_KOBJECT_UEVENT}, 178 {133, AF_PACKET, SOCK_RAW, NETLINK_GENERIC}, 179 {134, AF_PACKET, SOCK_RAW, IPPROTO_ICMPV6}, 180 {135, AF_PACKET, SOCK_RAW, IPPROTO_IP}, 181 {136, AF_PACKET, SOCK_RAW, IPPROTO_ICMP}, 182 {137, AF_PACKET, SOCK_RAW, IPPROTO_TCP}, 183 {138, AF_PACKET, SOCK_RAW, IPPROTO_UDP}, 184 {139, AF_PACKET, SOCK_PACKET, NETLINK_ROUTE}, 185 {140, AF_PACKET, SOCK_PACKET, NETLINK_FIREWALL}, 186 {141, AF_PACKET, SOCK_PACKET, NETLINK_SOCK_DIAG}, 187 {142, AF_PACKET, SOCK_PACKET, NETLINK_NFLOG}, 188 {143, AF_PACKET, SOCK_PACKET, NETLINK_AUDIT}, 189 {144, AF_PACKET, SOCK_PACKET, NETLINK_FIB_LOOKUP}, 190 {145, AF_PACKET, SOCK_PACKET, NETLINK_CONNECTOR}, 191 {146, AF_PACKET, SOCK_PACKET, NETLINK_NETFILTER}, 192 {147, AF_PACKET, SOCK_PACKET, NETLINK_KOBJECT_UEVENT}, 193 {148, AF_PACKET, SOCK_PACKET, NETLINK_GENERIC}, 194 {149, AF_PACKET, SOCK_PACKET, IPPROTO_ICMPV6}, 195 {150, AF_PACKET, SOCK_PACKET, IPPROTO_IP}, 196 {151, AF_PACKET, SOCK_PACKET, IPPROTO_ICMP}, 197 {152, AF_PACKET, SOCK_PACKET, IPPROTO_TCP}, 198 {153, AF_PACKET, SOCK_PACKET, IPPROTO_UDP}, 199 {154, AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, NETLINK_ROUTE}, 200}; 201 202struct SocketPairOptionSupportTest { 203 int id; 204 int domain; 205 int type; 206} g_socketPairOpt[] = { 207 {1, AF_UNIX, SOCK_STREAM}, 208 {2, AF_UNIX, SOCK_DGRAM}, 209 {3, AF_UNIX, SOCK_SEQPACKET}, 210 {4, AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK}, 211 {5, AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC}, 212 {6, AF_LOCAL, SOCK_STREAM}, 213 {7, AF_LOCAL, SOCK_DGRAM}, 214 {8, AF_LOCAL, SOCK_SEQPACKET}, 215 {9, AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK}, 216 {10, AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC}, 217}; 218 219/* 220 * @tc.number : SUB_KERNEL_SYSCALL_SOCKET_0100 221 * @tc.name : SocketCreateFdSuccess_0001 222 * @tc.desc : socket create fd success. 223 * @tc.size : MediumTest 224 * @tc.type : Function 225 * @tc.level : Level 1 226 */ 227HWTEST_F(HatsSocketTest, SocketCreateFdSuccess_0001, Function | MediumTest | Level1) 228{ 229 int i; 230 int socketFd = -1; 231 for (i = 0; i < sizeof(g_socketOpt) / sizeof(g_socketOpt[0]); i++) { 232 socketFd = socket(g_socketOpt[i].domain, g_socketOpt[i].type, g_socketOpt[i].protocol); 233 if (socketFd <= 0) { 234 printf("id = %d\n", g_socketOpt[i].id); 235 } 236 EXPECT_TRUE(socketFd > 0); 237 close(socketFd); 238 } 239} 240 241/* 242 * @tc.number : SUB_KERNEL_SYSCALL_SOCKETPAIR_0200 243 * @tc.name : SocketpairCreateSuccess_0002 244 * @tc.desc : socketpair create success. 245 * @tc.size : MediumTest 246 * @tc.type : Function 247 * @tc.level : Level 1 248 */ 249HWTEST_F(HatsSocketTest, SocketpairCreateSuccess_0002, Function | MediumTest | Level1) 250{ 251 int i; 252 int ret; 253 ssize_t size; 254 char buf[MAX_SIZE] = {0}; 255 int socketPair[2]; 256 const char *content = "Hello, world!"; 257 258 for (i = 0; i < sizeof(g_socketPairOpt) / sizeof(g_socketPairOpt[0]); i++) { 259 ret = socketpair(g_socketPairOpt[i].domain, g_socketPairOpt[i].type, 0, socketPair); 260 if (ret < 0) { 261 printf("id = %d, ret = %d\n", g_socketPairOpt[i].id, ret); 262 } 263 EXPECT_EQ(ret, 0); 264 265 size = write(socketPair[0], content, strlen(content)); 266 EXPECT_EQ(size, strlen(content)); 267 268 read(socketPair[1], buf, MAX_SIZE); 269 EXPECT_EQ(size, strlen(content)); 270 EXPECT_STREQ(buf, content); 271 272 close(socketPair[0]); 273 close(socketPair[1]); 274 } 275}