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 <fcntl.h> 219762338dSopenharmony_ci#include <unistd.h> 229762338dSopenharmony_ci#include <vector> 239762338dSopenharmony_ci#include <arpa/inet.h> 249762338dSopenharmony_ci#include <gtest/gtest.h> 259762338dSopenharmony_ci#include <netinet/in.h> 269762338dSopenharmony_ci#include <sys/stat.h> 279762338dSopenharmony_ci#include <sys/socket.h> 289762338dSopenharmony_ci#include <sys/types.h> 299762338dSopenharmony_ci#include "securec.h" 309762338dSopenharmony_ci 319762338dSopenharmony_ciusing namespace testing::ext; 329762338dSopenharmony_ci 339762338dSopenharmony_ciclass HatsBindTest : public testing::Test { 349762338dSopenharmony_cipublic: 359762338dSopenharmony_ci static void SetUpTestCase(); 369762338dSopenharmony_ci static void TearDownTestCase(); 379762338dSopenharmony_ci void SetUp(); 389762338dSopenharmony_ci void TearDown(); 399762338dSopenharmony_ciprivate: 409762338dSopenharmony_ci}; 419762338dSopenharmony_civoid HatsBindTest::SetUp() 429762338dSopenharmony_ci{ 439762338dSopenharmony_ci} 449762338dSopenharmony_civoid HatsBindTest::TearDown() 459762338dSopenharmony_ci{ 469762338dSopenharmony_ci} 479762338dSopenharmony_civoid HatsBindTest::SetUpTestCase() 489762338dSopenharmony_ci{ 499762338dSopenharmony_ci} 509762338dSopenharmony_civoid HatsBindTest::TearDownTestCase() 519762338dSopenharmony_ci{ 529762338dSopenharmony_ci} 539762338dSopenharmony_ci 549762338dSopenharmony_cistatic const int BAD_SOCKET_FD = -1; 559762338dSopenharmony_cistatic const int TEST_PORT = 21356; 569762338dSopenharmony_cistatic const char *TEST_LOCAL_IP = "127.0.0.1"; 579762338dSopenharmony_cistatic const char *TEST_BAD_IP = "192.168.10.3"; 589762338dSopenharmony_ci 599762338dSopenharmony_ci/* 609762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_BIND_0100 619762338dSopenharmony_ci * @tc.name : BindSockfdTwice_0001 629762338dSopenharmony_ci * @tc.desc : bind the same socket fd twice failed, errno EINVAL. 639762338dSopenharmony_ci * @tc.size : MediumTest 649762338dSopenharmony_ci * @tc.type : Function 659762338dSopenharmony_ci * @tc.level : Level 2 669762338dSopenharmony_ci */ 679762338dSopenharmony_ciHWTEST_F(HatsBindTest, BindSockfdTwice_0001, Function | MediumTest | Level2) 689762338dSopenharmony_ci{ 699762338dSopenharmony_ci int ret; 709762338dSopenharmony_ci int socketFd = -1; 719762338dSopenharmony_ci int32_t optVal = 1; 729762338dSopenharmony_ci struct sockaddr_in serAddr = { 739762338dSopenharmony_ci .sin_family = AF_INET, 749762338dSopenharmony_ci .sin_port = htons(TEST_PORT), 759762338dSopenharmony_ci .sin_addr = { 769762338dSopenharmony_ci .s_addr = inet_addr(TEST_LOCAL_IP), 779762338dSopenharmony_ci } 789762338dSopenharmony_ci }; 799762338dSopenharmony_ci 809762338dSopenharmony_ci socketFd = socket(AF_INET, SOCK_STREAM, 0); 819762338dSopenharmony_ci EXPECT_TRUE(socketFd > 0); 829762338dSopenharmony_ci 839762338dSopenharmony_ci ret = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal)); 849762338dSopenharmony_ci EXPECT_EQ(ret, 0); 859762338dSopenharmony_ci 869762338dSopenharmony_ci ret = bind(socketFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr)); 879762338dSopenharmony_ci EXPECT_EQ(ret, 0); 889762338dSopenharmony_ci 899762338dSopenharmony_ci errno = 0; 909762338dSopenharmony_ci ret = bind(socketFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr)); 919762338dSopenharmony_ci EXPECT_EQ(ret, -1); 929762338dSopenharmony_ci EXPECT_EQ(errno, EINVAL); 939762338dSopenharmony_ci 949762338dSopenharmony_ci close(socketFd); 959762338dSopenharmony_ci} 969762338dSopenharmony_ci 979762338dSopenharmony_ci/* 989762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_BIND_0200 999762338dSopenharmony_ci * @tc.name : BindInvalidSockfdFailed_0002 1009762338dSopenharmony_ci * @tc.desc : bind the invalid socket fd failed. 1019762338dSopenharmony_ci * @tc.size : MediumTest 1029762338dSopenharmony_ci * @tc.type : Function 1039762338dSopenharmony_ci * @tc.level : Level 2 1049762338dSopenharmony_ci */ 1059762338dSopenharmony_ciHWTEST_F(HatsBindTest, BindInvalidSockfdFailed_0002, Function | MediumTest | Level2) 1069762338dSopenharmony_ci{ 1079762338dSopenharmony_ci int ret; 1089762338dSopenharmony_ci struct sockaddr_in serAddr = { 1099762338dSopenharmony_ci .sin_family = AF_INET, 1109762338dSopenharmony_ci .sin_port = htons(TEST_PORT), 1119762338dSopenharmony_ci .sin_addr = { 1129762338dSopenharmony_ci .s_addr = inet_addr(TEST_LOCAL_IP), 1139762338dSopenharmony_ci } 1149762338dSopenharmony_ci }; 1159762338dSopenharmony_ci 1169762338dSopenharmony_ci errno = 0; 1179762338dSopenharmony_ci ret = bind(BAD_SOCKET_FD, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr)); 1189762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1199762338dSopenharmony_ci EXPECT_EQ(errno, EBADF); 1209762338dSopenharmony_ci 1219762338dSopenharmony_ci errno = 0; 1229762338dSopenharmony_ci ret = bind(STDIN_FILENO, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr)); 1239762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1249762338dSopenharmony_ci EXPECT_EQ(errno, ENOTSOCK); 1259762338dSopenharmony_ci} 1269762338dSopenharmony_ci 1279762338dSopenharmony_ci/* 1289762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_BIND_0300 1299762338dSopenharmony_ci * @tc.name : BindInvalidIPFailed_0003 1309762338dSopenharmony_ci * @tc.desc : bind the invalid ip addr failed. 1319762338dSopenharmony_ci * @tc.size : MediumTest 1329762338dSopenharmony_ci * @tc.type : Function 1339762338dSopenharmony_ci * @tc.level : Level 2 1349762338dSopenharmony_ci */ 1359762338dSopenharmony_ciHWTEST_F(HatsBindTest, BindInvalidIPFailed_0003, Function | MediumTest | Level2) 1369762338dSopenharmony_ci{ 1379762338dSopenharmony_ci int ret; 1389762338dSopenharmony_ci int32_t optVal = 1; 1399762338dSopenharmony_ci int socketFd = -1; 1409762338dSopenharmony_ci struct sockaddr_in serAddr = { 1419762338dSopenharmony_ci .sin_family = AF_INET, 1429762338dSopenharmony_ci .sin_port = htons(TEST_PORT), 1439762338dSopenharmony_ci .sin_addr = { 1449762338dSopenharmony_ci .s_addr = inet_addr(TEST_BAD_IP), 1459762338dSopenharmony_ci } 1469762338dSopenharmony_ci }; 1479762338dSopenharmony_ci 1489762338dSopenharmony_ci socketFd = socket(AF_INET, SOCK_STREAM, 0); 1499762338dSopenharmony_ci EXPECT_TRUE(socketFd > 0); 1509762338dSopenharmony_ci 1519762338dSopenharmony_ci ret = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal)); 1529762338dSopenharmony_ci EXPECT_EQ(ret, 0); 1539762338dSopenharmony_ci 1549762338dSopenharmony_ci errno = 0; 1559762338dSopenharmony_ci ret = bind(socketFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr)); 1569762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1579762338dSopenharmony_ci EXPECT_EQ(errno, EADDRNOTAVAIL); 1589762338dSopenharmony_ci 1599762338dSopenharmony_ci errno = 0; 1609762338dSopenharmony_ci ret = bind(socketFd, nullptr, sizeof(serAddr)); 1619762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1629762338dSopenharmony_ci EXPECT_EQ(errno, EFAULT); 1639762338dSopenharmony_ci 1649762338dSopenharmony_ci close(socketFd); 1659762338dSopenharmony_ci} 1669762338dSopenharmony_ci 1679762338dSopenharmony_ci/* 1689762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_BIND_0400 1699762338dSopenharmony_ci * @tc.name : BindErrorIPAddrLen_0004 1709762338dSopenharmony_ci * @tc.desc : bind addr len >= sizeof(serAddr) success, otherwise errno EINVAL. 1719762338dSopenharmony_ci * @tc.size : MediumTest 1729762338dSopenharmony_ci * @tc.type : Function 1739762338dSopenharmony_ci * @tc.level : Level 2 1749762338dSopenharmony_ci */ 1759762338dSopenharmony_ciHWTEST_F(HatsBindTest, BindErrorIPAddrLen_0004, Function | MediumTest | Level2) 1769762338dSopenharmony_ci{ 1779762338dSopenharmony_ci int ret; 1789762338dSopenharmony_ci int32_t optVal = 1; 1799762338dSopenharmony_ci int socketFd = -1; 1809762338dSopenharmony_ci struct sockaddr_in serAddr = { 1819762338dSopenharmony_ci .sin_family = AF_INET, 1829762338dSopenharmony_ci .sin_port = htons(TEST_PORT), 1839762338dSopenharmony_ci .sin_addr = { 1849762338dSopenharmony_ci .s_addr = inet_addr(TEST_LOCAL_IP), 1859762338dSopenharmony_ci } 1869762338dSopenharmony_ci }; 1879762338dSopenharmony_ci 1889762338dSopenharmony_ci socketFd = socket(AF_INET, SOCK_STREAM, 0); 1899762338dSopenharmony_ci EXPECT_TRUE(socketFd > 0); 1909762338dSopenharmony_ci 1919762338dSopenharmony_ci ret = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal)); 1929762338dSopenharmony_ci EXPECT_EQ(ret, 0); 1939762338dSopenharmony_ci 1949762338dSopenharmony_ci errno = 0; 1959762338dSopenharmony_ci ret = bind(socketFd, reinterpret_cast<struct sockaddr *>(&serAddr), -1); 1969762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1979762338dSopenharmony_ci EXPECT_EQ(errno, EINVAL); 1989762338dSopenharmony_ci 1999762338dSopenharmony_ci errno = 0; 2009762338dSopenharmony_ci ret = bind(socketFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr) - 1); 2019762338dSopenharmony_ci EXPECT_EQ(ret, -1); 2029762338dSopenharmony_ci EXPECT_EQ(errno, EINVAL); 2039762338dSopenharmony_ci 2049762338dSopenharmony_ci errno = 0; 2059762338dSopenharmony_ci ret = bind(socketFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr) + 1); 2069762338dSopenharmony_ci EXPECT_EQ(ret, 0); 2079762338dSopenharmony_ci 2089762338dSopenharmony_ci close(socketFd); 2099762338dSopenharmony_ci} 2109762338dSopenharmony_ci 2119762338dSopenharmony_ci/* 2129762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_BIND_0500 2139762338dSopenharmony_ci * @tc.name : BindUsedPortFailed_0005 2149762338dSopenharmony_ci * @tc.desc : bind the used port, errno EINVAL. 2159762338dSopenharmony_ci * @tc.size : MediumTest 2169762338dSopenharmony_ci * @tc.type : Function 2179762338dSopenharmony_ci * @tc.level : Level 2 2189762338dSopenharmony_ci */ 2199762338dSopenharmony_ciHWTEST_F(HatsBindTest, BindUsedPortFailed_0005, Function | MediumTest | Level2) 2209762338dSopenharmony_ci{ 2219762338dSopenharmony_ci int ret; 2229762338dSopenharmony_ci int socketFd = -1; 2239762338dSopenharmony_ci int socketFd2 = -1; 2249762338dSopenharmony_ci int32_t optVal = 1; 2259762338dSopenharmony_ci struct sockaddr_in serAddr = { 2269762338dSopenharmony_ci .sin_family = AF_INET, 2279762338dSopenharmony_ci .sin_port = htons(TEST_PORT), 2289762338dSopenharmony_ci .sin_addr = { 2299762338dSopenharmony_ci .s_addr = inet_addr(TEST_LOCAL_IP), 2309762338dSopenharmony_ci } 2319762338dSopenharmony_ci }; 2329762338dSopenharmony_ci 2339762338dSopenharmony_ci socketFd = socket(AF_INET, SOCK_STREAM, 0); 2349762338dSopenharmony_ci EXPECT_TRUE(socketFd > 0); 2359762338dSopenharmony_ci 2369762338dSopenharmony_ci ret = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal)); 2379762338dSopenharmony_ci EXPECT_EQ(ret, 0); 2389762338dSopenharmony_ci 2399762338dSopenharmony_ci errno = 0; 2409762338dSopenharmony_ci ret = bind(socketFd, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr)); 2419762338dSopenharmony_ci EXPECT_EQ(ret, 0); 2429762338dSopenharmony_ci EXPECT_EQ(errno, 0); 2439762338dSopenharmony_ci 2449762338dSopenharmony_ci socketFd2 = socket(AF_INET, SOCK_STREAM, 0); 2459762338dSopenharmony_ci EXPECT_TRUE(socketFd > 0); 2469762338dSopenharmony_ci 2479762338dSopenharmony_ci errno = 0; 2489762338dSopenharmony_ci ret = bind(socketFd2, reinterpret_cast<struct sockaddr *>(&serAddr), sizeof(serAddr)); 2499762338dSopenharmony_ci EXPECT_EQ(ret, -1); 2509762338dSopenharmony_ci EXPECT_EQ(errno, EADDRINUSE); 2519762338dSopenharmony_ci 2529762338dSopenharmony_ci close(socketFd); 2539762338dSopenharmony_ci close(socketFd2); 2549762338dSopenharmony_ci} 255