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 <unistd.h> 239762338dSopenharmony_ci#include <gtest/gtest.h> 249762338dSopenharmony_ci#include <sys/file.h> 259762338dSopenharmony_ci#include <sys/stat.h> 269762338dSopenharmony_ci#include <sys/types.h> 279762338dSopenharmony_ci#include <sys/xattr.h> 289762338dSopenharmony_ci#include "securec.h" 299762338dSopenharmony_ci 309762338dSopenharmony_ciusing namespace testing::ext; 319762338dSopenharmony_ciusing namespace std; 329762338dSopenharmony_ci 339762338dSopenharmony_cistatic const char *TEST_FILE = "/data/local/tmp/fcntl.txt"; 349762338dSopenharmony_cimode_t MODE_0644 = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; 359762338dSopenharmony_ci 369762338dSopenharmony_ciclass FcntlApiTest : public testing::Test { 379762338dSopenharmony_cipublic: 389762338dSopenharmony_ci static void SetUpTestCase(); 399762338dSopenharmony_ci static void TearDownTestCase(); 409762338dSopenharmony_ci void SetUp(); 419762338dSopenharmony_ci void TearDown(); 429762338dSopenharmony_ciprivate: 439762338dSopenharmony_ci}; 449762338dSopenharmony_civoid FcntlApiTest::SetUp() 459762338dSopenharmony_ci{ 469762338dSopenharmony_ci} 479762338dSopenharmony_civoid FcntlApiTest::TearDown() 489762338dSopenharmony_ci{ 499762338dSopenharmony_ci} 509762338dSopenharmony_civoid FcntlApiTest::SetUpTestCase() 519762338dSopenharmony_ci{ 529762338dSopenharmony_ci} 539762338dSopenharmony_civoid FcntlApiTest::TearDownTestCase() 549762338dSopenharmony_ci{ 559762338dSopenharmony_ci} 569762338dSopenharmony_ci 579762338dSopenharmony_ci/* 589762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0100 599762338dSopenharmony_ci * @tc.name : FcntlManipulateFdFlagSuccess_0001 609762338dSopenharmony_ci * @tc.desc : fcntl get fd flag and set fd flag success. 619762338dSopenharmony_ci * @tc.size : MediumTest 629762338dSopenharmony_ci * @tc.type : Function 639762338dSopenharmony_ci * @tc.level : Level 1 649762338dSopenharmony_ci */ 659762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlFdFlagSuccess_0001, Function | MediumTest | Level1) 669762338dSopenharmony_ci{ 679762338dSopenharmony_ci int ret; 689762338dSopenharmony_ci int flags = 0; 699762338dSopenharmony_ci int fd = open(TEST_FILE, O_RDWR | O_CREAT | O_TRUNC, MODE_0644); 709762338dSopenharmony_ci EXPECT_TRUE(fd > 0); 719762338dSopenharmony_ci 729762338dSopenharmony_ci ret = fcntl(fd, F_SETFD, FD_CLOEXEC); 739762338dSopenharmony_ci EXPECT_EQ(ret, 0); 749762338dSopenharmony_ci 759762338dSopenharmony_ci flags = fcntl(fd, F_GETFD); 769762338dSopenharmony_ci EXPECT_EQ(flags, FD_CLOEXEC); 779762338dSopenharmony_ci 789762338dSopenharmony_ci ret = fcntl(fd, F_SETFL, O_NONBLOCK); 799762338dSopenharmony_ci EXPECT_EQ(ret, 0); 809762338dSopenharmony_ci 819762338dSopenharmony_ci flags = fcntl(fd, F_GETFL); 829762338dSopenharmony_ci EXPECT_EQ(flags & O_NONBLOCK, O_NONBLOCK); 839762338dSopenharmony_ci 849762338dSopenharmony_ci close(fd); 859762338dSopenharmony_ci remove(TEST_FILE); 869762338dSopenharmony_ci} 879762338dSopenharmony_ci 889762338dSopenharmony_ci/* 899762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0200 909762338dSopenharmony_ci * @tc.name : FcntlManipulateFileLockSuccess_0002 919762338dSopenharmony_ci * @tc.desc : fcntl set file lock success and return unlock by get lock check. 929762338dSopenharmony_ci * @tc.size : MediumTest 939762338dSopenharmony_ci * @tc.type : Function 949762338dSopenharmony_ci * @tc.level : Level 1 959762338dSopenharmony_ci */ 969762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlManipulateFileLockSuccess_0002, Function | MediumTest | Level1) 979762338dSopenharmony_ci{ 989762338dSopenharmony_ci int ret; 999762338dSopenharmony_ci int fd = open(TEST_FILE, O_RDWR | O_CREAT, MODE_0644); 1009762338dSopenharmony_ci EXPECT_TRUE(fd > 0); 1019762338dSopenharmony_ci 1029762338dSopenharmony_ci struct flock lockCheck = { 0 }; 1039762338dSopenharmony_ci struct flock lock = { 1049762338dSopenharmony_ci .l_type = F_RDLCK, 1059762338dSopenharmony_ci .l_whence = SEEK_SET, 1069762338dSopenharmony_ci .l_start = 0, 1079762338dSopenharmony_ci .l_len = 0, 1089762338dSopenharmony_ci }; 1099762338dSopenharmony_ci 1109762338dSopenharmony_ci ret = fcntl(fd, F_SETLK, &lock); 1119762338dSopenharmony_ci EXPECT_EQ(ret, 0); 1129762338dSopenharmony_ci 1139762338dSopenharmony_ci ret = fcntl(fd, F_GETLK, &lockCheck); 1149762338dSopenharmony_ci EXPECT_EQ(ret, 0); 1159762338dSopenharmony_ci EXPECT_EQ(lockCheck.l_type, F_UNLCK); 1169762338dSopenharmony_ci EXPECT_EQ(lockCheck.l_whence, lock.l_whence); 1179762338dSopenharmony_ci EXPECT_EQ(lockCheck.l_start, lock.l_start); 1189762338dSopenharmony_ci EXPECT_EQ(lockCheck.l_len, lock.l_len); 1199762338dSopenharmony_ci 1209762338dSopenharmony_ci close(fd); 1219762338dSopenharmony_ci remove(TEST_FILE); 1229762338dSopenharmony_ci} 1239762338dSopenharmony_ci 1249762338dSopenharmony_ci/* 1259762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0300 1269762338dSopenharmony_ci * @tc.name : FcntlManipulateInvalidFdFail_0003 1279762338dSopenharmony_ci * @tc.desc : fcntl manipulate invalid fd fail, errno EBADF. 1289762338dSopenharmony_ci * @tc.size : MediumTest 1299762338dSopenharmony_ci * @tc.type : Function 1309762338dSopenharmony_ci * @tc.level : Level 2 1319762338dSopenharmony_ci */ 1329762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlManipulateInvalidFdFail_0003, Function | MediumTest | Level2) 1339762338dSopenharmony_ci{ 1349762338dSopenharmony_ci int ret; 1359762338dSopenharmony_ci int invalidFd = -1; 1369762338dSopenharmony_ci errno = 0; 1379762338dSopenharmony_ci ret = fcntl(invalidFd, F_GETFL); 1389762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1399762338dSopenharmony_ci EXPECT_EQ(errno, EBADF); 1409762338dSopenharmony_ci} 1419762338dSopenharmony_ci 1429762338dSopenharmony_ci/* 1439762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0400 1449762338dSopenharmony_ci * @tc.name : FcntlSetInvalidLockFail_0004 1459762338dSopenharmony_ci * @tc.desc : fcntl set invalid nullptr lock fail, errno EFAULT. 1469762338dSopenharmony_ci * @tc.size : MediumTest 1479762338dSopenharmony_ci * @tc.type : Function 1489762338dSopenharmony_ci * @tc.level : Level 2 1499762338dSopenharmony_ci */ 1509762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlSetInvalidLockFail_0004, Function | MediumTest | Level2) 1519762338dSopenharmony_ci{ 1529762338dSopenharmony_ci int ret; 1539762338dSopenharmony_ci int fd = open(TEST_FILE, O_RDWR | O_CREAT, MODE_0644); 1549762338dSopenharmony_ci EXPECT_TRUE(fd > 0); 1559762338dSopenharmony_ci 1569762338dSopenharmony_ci errno = 0; 1579762338dSopenharmony_ci ret = fcntl(fd, F_SETLKW, nullptr); 1589762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1599762338dSopenharmony_ci EXPECT_EQ(errno, EFAULT); 1609762338dSopenharmony_ci 1619762338dSopenharmony_ci close(fd); 1629762338dSopenharmony_ci remove(TEST_FILE); 1639762338dSopenharmony_ci} 1649762338dSopenharmony_ci 1659762338dSopenharmony_ci/* 1669762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0500 1679762338dSopenharmony_ci * @tc.name : FcntlDupFdSuccess_0005 1689762338dSopenharmony_ci * @tc.desc : fcntl duplicate fd success. 1699762338dSopenharmony_ci * @tc.size : MediumTest 1709762338dSopenharmony_ci * @tc.type : Function 1719762338dSopenharmony_ci * @tc.level : Level 1 1729762338dSopenharmony_ci */ 1739762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlDupFdSuccess_0005, Function | MediumTest | Level1) 1749762338dSopenharmony_ci{ 1759762338dSopenharmony_ci int ret; 1769762338dSopenharmony_ci int fd = open(TEST_FILE, O_RDWR | O_CREAT, MODE_0644); 1779762338dSopenharmony_ci EXPECT_TRUE(fd > 0); 1789762338dSopenharmony_ci 1799762338dSopenharmony_ci ret = fcntl(fd, F_DUPFD, 0); 1809762338dSopenharmony_ci EXPECT_TRUE(ret > 0); 1819762338dSopenharmony_ci 1829762338dSopenharmony_ci ret = fcntl(fd, F_DUPFD_CLOEXEC, 0); 1839762338dSopenharmony_ci EXPECT_TRUE(ret > 0); 1849762338dSopenharmony_ci 1859762338dSopenharmony_ci close(fd); 1869762338dSopenharmony_ci close(ret); 1879762338dSopenharmony_ci remove(TEST_FILE); 1889762338dSopenharmony_ci} 1899762338dSopenharmony_ci 1909762338dSopenharmony_ci/* 1919762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0600 1929762338dSopenharmony_ci * @tc.name : FcntlSetLockSuccess_0006 1939762338dSopenharmony_ci * @tc.desc : fcntl set lock success. 1949762338dSopenharmony_ci * @tc.size : MediumTest 1959762338dSopenharmony_ci * @tc.type : Function 1969762338dSopenharmony_ci * @tc.level : Level 1 1979762338dSopenharmony_ci */ 1989762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlSetLockSuccess_0006, Function | MediumTest | Level1) 1999762338dSopenharmony_ci{ 2009762338dSopenharmony_ci int ret; 2019762338dSopenharmony_ci int fd = open(TEST_FILE, O_RDWR | O_CREAT, MODE_0644); 2029762338dSopenharmony_ci EXPECT_TRUE(fd > 0); 2039762338dSopenharmony_ci 2049762338dSopenharmony_ci struct flock lock = { 2059762338dSopenharmony_ci .l_type = F_WRLCK, 2069762338dSopenharmony_ci .l_whence = SEEK_SET, 2079762338dSopenharmony_ci .l_start = 0, 2089762338dSopenharmony_ci .l_len = 0, 2099762338dSopenharmony_ci }; 2109762338dSopenharmony_ci 2119762338dSopenharmony_ci ret = fcntl(fd, F_SETLK, &lock); 2129762338dSopenharmony_ci EXPECT_EQ(ret, 0); 2139762338dSopenharmony_ci 2149762338dSopenharmony_ci close(fd); 2159762338dSopenharmony_ci remove(TEST_FILE); 2169762338dSopenharmony_ci} 2179762338dSopenharmony_ci 2189762338dSopenharmony_ci/* 2199762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0700 2209762338dSopenharmony_ci * @tc.name : FcntlOfdSetLockSuccess_0007 2219762338dSopenharmony_ci * @tc.desc : fcntl ofd set lock success. 2229762338dSopenharmony_ci * @tc.size : MediumTest 2239762338dSopenharmony_ci * @tc.type : Function 2249762338dSopenharmony_ci * @tc.level : Level 1 2259762338dSopenharmony_ci */ 2269762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlOfdSetLockSuccess_0007, Function | MediumTest | Level1) 2279762338dSopenharmony_ci{ 2289762338dSopenharmony_ci int ret; 2299762338dSopenharmony_ci int fd = open(TEST_FILE, O_RDWR | O_CREAT, MODE_0644); 2309762338dSopenharmony_ci EXPECT_TRUE(fd > 0); 2319762338dSopenharmony_ci 2329762338dSopenharmony_ci struct flock lock = { 2339762338dSopenharmony_ci .l_type = F_WRLCK, 2349762338dSopenharmony_ci .l_whence = SEEK_SET, 2359762338dSopenharmony_ci .l_start = 0, 2369762338dSopenharmony_ci .l_len = 0, 2379762338dSopenharmony_ci }; 2389762338dSopenharmony_ci 2399762338dSopenharmony_ci ret = fcntl(fd, F_OFD_SETLK, &lock); 2409762338dSopenharmony_ci EXPECT_EQ(ret, 0); 2419762338dSopenharmony_ci 2429762338dSopenharmony_ci close(fd); 2439762338dSopenharmony_ci remove(TEST_FILE); 2449762338dSopenharmony_ci} 2459762338dSopenharmony_ci 2469762338dSopenharmony_ci/* 2479762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0800 2489762338dSopenharmony_ci * @tc.name : FcntlSetPipeSzSuccess_0008 2499762338dSopenharmony_ci * @tc.desc : fcntl set pipe get pipe success. 2509762338dSopenharmony_ci * @tc.size : MediumTest 2519762338dSopenharmony_ci * @tc.type : Function 2529762338dSopenharmony_ci * @tc.level : Level 1 2539762338dSopenharmony_ci */ 2549762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlSetPipeSzSuccess_0008, Function | MediumTest | Level1) 2559762338dSopenharmony_ci{ 2569762338dSopenharmony_ci int fds[2]; 2579762338dSopenharmony_ci int ret = pipe(fds); 2589762338dSopenharmony_ci EXPECT_TRUE(ret == 0); 2599762338dSopenharmony_ci 2609762338dSopenharmony_ci ret = fcntl(fds[1], F_SETPIPE_SZ, 1024); 2619762338dSopenharmony_ci EXPECT_GE(ret, 0); 2629762338dSopenharmony_ci ret = fcntl(fds[1], F_GETPIPE_SZ); 2639762338dSopenharmony_ci EXPECT_GE(ret, 0); 2649762338dSopenharmony_ci 2659762338dSopenharmony_ci close(fds[0]); 2669762338dSopenharmony_ci close(fds[1]); 2679762338dSopenharmony_ci} 2689762338dSopenharmony_ci 2699762338dSopenharmony_ci/* 2709762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_FCNTL_0900 2719762338dSopenharmony_ci * @tc.name : FcntlAddAndGetSealsFlagSuccess_0009 2729762338dSopenharmony_ci * @tc.desc : fcntl add F_SEAL_SEAL/F_SEAL_SHRINK/F_SEAL_WRITE/F_SEAL_GROW flags and get seals success. 2739762338dSopenharmony_ci * @tc.size : MediumTest 2749762338dSopenharmony_ci * @tc.type : Function 2759762338dSopenharmony_ci * @tc.level : Level 1 2769762338dSopenharmony_ci */ 2779762338dSopenharmony_ciHWTEST_F(FcntlApiTest, FcntlAddAndGetSealsFlagSuccess_0009, Function | MediumTest | Level1) 2789762338dSopenharmony_ci{ 2799762338dSopenharmony_ci int flags = 0; 2809762338dSopenharmony_ci int fd = open(TEST_FILE, O_RDWR | O_CREAT | O_TRUNC, MODE_0644); 2819762338dSopenharmony_ci EXPECT_TRUE(fd > 0); 2829762338dSopenharmony_ci 2839762338dSopenharmony_ci // F_ADD_SEALS F_SEAL_GROW test success 2849762338dSopenharmony_ci flags = fcntl(fd, F_ADD_SEALS, F_SEAL_GROW); 2859762338dSopenharmony_ci EXPECT_EQ(flags & F_SEAL_GROW, F_SEAL_GROW); 2869762338dSopenharmony_ci 2879762338dSopenharmony_ci // F_ADD_SEALS F_SEAL_SEAL test success 2889762338dSopenharmony_ci flags = fcntl(fd, F_ADD_SEALS, F_SEAL_SEAL); 2899762338dSopenharmony_ci EXPECT_EQ(flags & F_SEAL_SEAL, F_SEAL_SEAL); 2909762338dSopenharmony_ci 2919762338dSopenharmony_ci // F_ADD_SEALS F_SEAL_WRITE test success 2929762338dSopenharmony_ci flags = fcntl(fd, F_ADD_SEALS, F_SEAL_WRITE); 2939762338dSopenharmony_ci EXPECT_EQ(flags & F_SEAL_WRITE, F_SEAL_WRITE); 2949762338dSopenharmony_ci 2959762338dSopenharmony_ci // F_ADD_SEALS F_SEAL_SHRINK test success 2969762338dSopenharmony_ci flags = fcntl(fd, F_ADD_SEALS, F_SEAL_SHRINK); 2979762338dSopenharmony_ci EXPECT_EQ(flags & F_SEAL_SHRINK, F_SEAL_SHRINK); 2989762338dSopenharmony_ci 2999762338dSopenharmony_ci // F_GET_SEALS test success 3009762338dSopenharmony_ci int testFlags = F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_SEAL | F_SEAL_WRITE; 3019762338dSopenharmony_ci flags = fcntl(fd, F_GET_SEALS); 3029762338dSopenharmony_ci EXPECT_EQ(flags & testFlags, testFlags); 3039762338dSopenharmony_ci 3049762338dSopenharmony_ci close(fd); 3059762338dSopenharmony_ci remove(TEST_FILE); 3069762338dSopenharmony_ci}