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 <cstdlib> 189762338dSopenharmony_ci#include <cstdio> 199762338dSopenharmony_ci#include <string> 209762338dSopenharmony_ci#include <fcntl.h> 219762338dSopenharmony_ci#include <unistd.h> 229762338dSopenharmony_ci#include <gtest/gtest.h> 239762338dSopenharmony_ci#include <sys/stat.h> 249762338dSopenharmony_ci#include <sys/types.h> 259762338dSopenharmony_ci 269762338dSopenharmony_ciusing namespace testing::ext; 279762338dSopenharmony_ciusing namespace std; 289762338dSopenharmony_ci 299762338dSopenharmony_ciclass OpenatApiTest : public testing::Test { 309762338dSopenharmony_cipublic: 319762338dSopenharmony_ci static void SetUpTestCase(); 329762338dSopenharmony_ci static void TearDownTestCase(); 339762338dSopenharmony_ci void SetUp(); 349762338dSopenharmony_ci void TearDown(); 359762338dSopenharmony_ci 369762338dSopenharmony_ciprivate: 379762338dSopenharmony_ci}; 389762338dSopenharmony_ci 399762338dSopenharmony_cistatic const char *TEST_DIR = "/data/local/tmp/tmp"; 409762338dSopenharmony_cistatic const char *TEST_FILE = "/data/local/tmp/tmp/test"; 419762338dSopenharmony_ci 429762338dSopenharmony_civoid OpenatApiTest::SetUpTestCase() 439762338dSopenharmony_ci{ 449762338dSopenharmony_ci} 459762338dSopenharmony_ci 469762338dSopenharmony_civoid OpenatApiTest::TearDownTestCase() 479762338dSopenharmony_ci{ 489762338dSopenharmony_ci} 499762338dSopenharmony_ci 509762338dSopenharmony_civoid OpenatApiTest::SetUp() 519762338dSopenharmony_ci{ 529762338dSopenharmony_ci mkdir(TEST_DIR, S_IRWXU | S_IRWXG | S_IRWXO); 539762338dSopenharmony_ci} 549762338dSopenharmony_ci 559762338dSopenharmony_civoid OpenatApiTest::TearDown() 569762338dSopenharmony_ci{ 579762338dSopenharmony_ci rmdir(TEST_DIR); 589762338dSopenharmony_ci} 599762338dSopenharmony_ci 609762338dSopenharmony_ci/* 619762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0100 629762338dSopenharmony_ci * @tc.name : OpenatReadOnlySuccess_0001 639762338dSopenharmony_ci * @tc.desc : openat with O_RDONLY should open a file for reading only. 649762338dSopenharmony_ci * @tc.size : MediumTest 659762338dSopenharmony_ci * @tc.type : Function 669762338dSopenharmony_ci * @tc.level : Level 1 679762338dSopenharmony_ci */ 689762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatReadOnlySuccess_0001, Function | MediumTest | Level1) 699762338dSopenharmony_ci{ 709762338dSopenharmony_ci int dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 719762338dSopenharmony_ci 729762338dSopenharmony_ci int fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT, 0644); 739762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 749762338dSopenharmony_ci close(fd); 759762338dSopenharmony_ci 769762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDONLY); 779762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 789762338dSopenharmony_ci 799762338dSopenharmony_ci errno = 0; 809762338dSopenharmony_ci ssize_t bytesWritten = write(fd, "A", 1); 819762338dSopenharmony_ci EXPECT_EQ(bytesWritten, -1); 829762338dSopenharmony_ci EXPECT_EQ(errno, EBADF); 839762338dSopenharmony_ci close(fd); 849762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 859762338dSopenharmony_ci close(dirFd); 869762338dSopenharmony_ci} 879762338dSopenharmony_ci 889762338dSopenharmony_ci/* 899762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0200 909762338dSopenharmony_ci * @tc.name : OpenatReadWriteSuccess_0002 919762338dSopenharmony_ci * @tc.desc : openat with O_RDWR should open a file for reading and writing. 929762338dSopenharmony_ci * @tc.size : MediumTest 939762338dSopenharmony_ci * @tc.type : Function 949762338dSopenharmony_ci * @tc.level : Level 1 959762338dSopenharmony_ci */ 969762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatReadWriteSuccess_0002, Function | MediumTest | Level1) 979762338dSopenharmony_ci{ 989762338dSopenharmony_ci const char *data = "Hello, World!"; 999762338dSopenharmony_ci char readBuf[128]; 1009762338dSopenharmony_ci int dirFd = -1; 1019762338dSopenharmony_ci int fd = -1; 1029762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 1039762338dSopenharmony_ci EXPECT_TRUE(dirFd >= 0); 1049762338dSopenharmony_ci 1059762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_CREAT, 0644); 1069762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 1079762338dSopenharmony_ci write(fd, data, strlen(data)); 1089762338dSopenharmony_ci lseek(fd, 0, SEEK_SET); 1099762338dSopenharmony_ci read(fd, readBuf, sizeof(readBuf)); 1109762338dSopenharmony_ci EXPECT_STREQ(readBuf, data); 1119762338dSopenharmony_ci close(fd); 1129762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 1139762338dSopenharmony_ci close(dirFd); 1149762338dSopenharmony_ci} 1159762338dSopenharmony_ci 1169762338dSopenharmony_ci/* 1179762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0300 1189762338dSopenharmony_ci * @tc.name : OpenatAppendSuccess_0003 1199762338dSopenharmony_ci * @tc.desc : openat with O_APPEND should append to the end of the file. 1209762338dSopenharmony_ci * @tc.size : MediumTest 1219762338dSopenharmony_ci * @tc.type : Function 1229762338dSopenharmony_ci * @tc.level : Level 1 1239762338dSopenharmony_ci */ 1249762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatAppendSuccess_0003, Function | MediumTest | Level1) 1259762338dSopenharmony_ci{ 1269762338dSopenharmony_ci char readBuf[256] = {0}; 1279762338dSopenharmony_ci const char *data = "Hello, World!"; 1289762338dSopenharmony_ci const char *appendData = " More data"; 1299762338dSopenharmony_ci int dirFd = -1; 1309762338dSopenharmony_ci int fd = -1; 1319762338dSopenharmony_ci 1329762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 1339762338dSopenharmony_ci 1349762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT, 0644); 1359762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 1369762338dSopenharmony_ci ssize_t bytesWritten = write(fd, data, strlen(data)); 1379762338dSopenharmony_ci EXPECT_EQ(bytesWritten, strlen(data)); 1389762338dSopenharmony_ci 1399762338dSopenharmony_ci close(fd); 1409762338dSopenharmony_ci 1419762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_APPEND); 1429762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 1439762338dSopenharmony_ci bytesWritten = write(fd, appendData, strlen(appendData)); 1449762338dSopenharmony_ci EXPECT_EQ(bytesWritten, strlen(appendData)); 1459762338dSopenharmony_ci 1469762338dSopenharmony_ci close(fd); 1479762338dSopenharmony_ci 1489762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDONLY); 1499762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 1509762338dSopenharmony_ci ssize_t bytesRead = read(fd, readBuf, sizeof(readBuf) - 1); 1519762338dSopenharmony_ci EXPECT_TRUE(bytesRead > 0); 1529762338dSopenharmony_ci 1539762338dSopenharmony_ci readBuf[bytesRead] = '\0'; 1549762338dSopenharmony_ci std::string expectedContent(data); 1559762338dSopenharmony_ci expectedContent += appendData; 1569762338dSopenharmony_ci EXPECT_STREQ(readBuf, expectedContent.c_str()); 1579762338dSopenharmony_ci 1589762338dSopenharmony_ci close(fd); 1599762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 1609762338dSopenharmony_ci close(dirFd); 1619762338dSopenharmony_ci} 1629762338dSopenharmony_ci 1639762338dSopenharmony_ci/* 1649762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0400 1659762338dSopenharmony_ci * @tc.name : OpenatNoFollowFailed_0004 1669762338dSopenharmony_ci * @tc.desc : openat with O_NOFOLLOW should fail if the path is a symbolic link. 1679762338dSopenharmony_ci * @tc.size : MediumTest 1689762338dSopenharmony_ci * @tc.type : Function 1699762338dSopenharmony_ci * @tc.level : Level 2 1709762338dSopenharmony_ci */ 1719762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatNoFollowFailed_0004, Function | MediumTest | Level2) 1729762338dSopenharmony_ci{ 1739762338dSopenharmony_ci int dirFd = -1; 1749762338dSopenharmony_ci int fd = -1; 1759762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 1769762338dSopenharmony_ci 1779762338dSopenharmony_ci errno = 0; 1789762338dSopenharmony_ci symlink("target", TEST_FILE); 1799762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT | O_NOFOLLOW); 1809762338dSopenharmony_ci EXPECT_EQ(fd, -1); 1819762338dSopenharmony_ci EXPECT_EQ(errno, ELOOP); 1829762338dSopenharmony_ci close(dirFd); 1839762338dSopenharmony_ci} 1849762338dSopenharmony_ci 1859762338dSopenharmony_ci/* 1869762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0500 1879762338dSopenharmony_ci * @tc.name : OpenatWriteOnlySuccess_0005 1889762338dSopenharmony_ci * @tc.desc : openat with O_WRONLY should open a file for writing only. 1899762338dSopenharmony_ci * @tc.size : MediumTest 1909762338dSopenharmony_ci * @tc.type : Function 1919762338dSopenharmony_ci * @tc.level : Level 1 1929762338dSopenharmony_ci */ 1939762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatWriteOnlySuccess_0005, Function | MediumTest | Level1) 1949762338dSopenharmony_ci{ 1959762338dSopenharmony_ci int dirFd; 1969762338dSopenharmony_ci int fd; 1979762338dSopenharmony_ci char buf; 1989762338dSopenharmony_ci ssize_t bytesRead; 1999762338dSopenharmony_ci ssize_t bytesWritten; 2009762338dSopenharmony_ci const char *data; 2019762338dSopenharmony_ci 2029762338dSopenharmony_ci 2039762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 2049762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT, 0644); 2059762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 2069762338dSopenharmony_ci 2079762338dSopenharmony_ci bytesRead = read(fd, &buf, 1); 2089762338dSopenharmony_ci EXPECT_EQ(bytesRead, -1); 2099762338dSopenharmony_ci EXPECT_EQ(errno, EBADF); 2109762338dSopenharmony_ci 2119762338dSopenharmony_ci data = "Test data"; 2129762338dSopenharmony_ci bytesWritten = write(fd, data, strlen(data)); 2139762338dSopenharmony_ci EXPECT_TRUE(bytesWritten == strlen(data)); 2149762338dSopenharmony_ci 2159762338dSopenharmony_ci close(fd); 2169762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 2179762338dSopenharmony_ci close(dirFd); 2189762338dSopenharmony_ci} 2199762338dSopenharmony_ci 2209762338dSopenharmony_ci/* 2219762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0600 2229762338dSopenharmony_ci * @tc.name : OpenatCreateTest_0006 2239762338dSopenharmony_ci * @tc.desc : openat with O_CREAT. 2249762338dSopenharmony_ci * @tc.size : MediumTest 2259762338dSopenharmony_ci * @tc.type : Function 2269762338dSopenharmony_ci * @tc.level : Level 2 2279762338dSopenharmony_ci */ 2289762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatCreateTest_0006, Function | MediumTest | Level2) 2299762338dSopenharmony_ci{ 2309762338dSopenharmony_ci int dirFd = -1; 2319762338dSopenharmony_ci int fd = -1; 2329762338dSopenharmony_ci struct stat buf; 2339762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 2349762338dSopenharmony_ci 2359762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY, 0644); 2369762338dSopenharmony_ci EXPECT_TRUE(fd == -1); 2379762338dSopenharmony_ci stat(TEST_FILE, &buf); 2389762338dSopenharmony_ci EXPECT_EQ(errno, ENOENT); 2399762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT, 0644); 2409762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 2419762338dSopenharmony_ci EXPECT_TRUE(stat(TEST_FILE, &buf) == 0); 2429762338dSopenharmony_ci 2439762338dSopenharmony_ci close(fd); 2449762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 2459762338dSopenharmony_ci close(dirFd); 2469762338dSopenharmony_ci} 2479762338dSopenharmony_ci 2489762338dSopenharmony_ci/* 2499762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0700 2509762338dSopenharmony_ci * @tc.name : OpenatDirectoryTest_0007 2519762338dSopenharmony_ci * @tc.desc : openat with O_DIRECTORY. 2529762338dSopenharmony_ci * @tc.size : MediumTest 2539762338dSopenharmony_ci * @tc.type : Function 2549762338dSopenharmony_ci * @tc.level : Level 2 2559762338dSopenharmony_ci */ 2569762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatDirectoryTest_0007, Function | MediumTest | Level2) 2579762338dSopenharmony_ci{ 2589762338dSopenharmony_ci int dirFd = -1; 2599762338dSopenharmony_ci int fd = -1; 2609762338dSopenharmony_ci struct stat buf; 2619762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 2629762338dSopenharmony_ci 2639762338dSopenharmony_ci fd = open(TEST_FILE, O_WRONLY | O_CREAT, 0644); 2649762338dSopenharmony_ci close(fd); 2659762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_DIRECTORY, 0644); 2669762338dSopenharmony_ci EXPECT_TRUE(fd == -1); 2679762338dSopenharmony_ci stat(TEST_FILE, &buf); 2689762338dSopenharmony_ci EXPECT_TRUE(S_ISREG(buf.st_mode)); 2699762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 2709762338dSopenharmony_ci 2719762338dSopenharmony_ci mkdir(TEST_FILE, 0644); 2729762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_DIRECTORY, 0644); 2739762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 2749762338dSopenharmony_ci stat(TEST_FILE, &buf); 2759762338dSopenharmony_ci EXPECT_TRUE(S_ISDIR(buf.st_mode)); 2769762338dSopenharmony_ci 2779762338dSopenharmony_ci close(fd); 2789762338dSopenharmony_ci rmdir(TEST_FILE); 2799762338dSopenharmony_ci close(dirFd); 2809762338dSopenharmony_ci} 2819762338dSopenharmony_ci 2829762338dSopenharmony_ci/* 2839762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0800 2849762338dSopenharmony_ci * @tc.name : OpenatExclTest_0008 2859762338dSopenharmony_ci * @tc.desc : openat with O_EXCL to prevent overwriting the content of existing files. 2869762338dSopenharmony_ci * @tc.size : MediumTest 2879762338dSopenharmony_ci * @tc.type : Function 2889762338dSopenharmony_ci * @tc.level : Level 2 2899762338dSopenharmony_ci */ 2909762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatExclTest_0008, Function | MediumTest | Level2) 2919762338dSopenharmony_ci{ 2929762338dSopenharmony_ci int dirFd = -1; 2939762338dSopenharmony_ci int fd = -1; 2949762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 2959762338dSopenharmony_ci 2969762338dSopenharmony_ci EXPECT_TRUE(access(TEST_FILE, F_OK) == -1); 2979762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT | O_EXCL, 0644); 2989762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 2999762338dSopenharmony_ci close(fd); 3009762338dSopenharmony_ci EXPECT_TRUE(access(TEST_FILE, F_OK) == 0); 3019762338dSopenharmony_ci 3029762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT | O_EXCL, 0644); 3039762338dSopenharmony_ci EXPECT_TRUE(fd == -1); 3049762338dSopenharmony_ci EXPECT_TRUE(access(TEST_FILE, F_OK) == 0); 3059762338dSopenharmony_ci 3069762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 3079762338dSopenharmony_ci close(dirFd); 3089762338dSopenharmony_ci} 3099762338dSopenharmony_ci 3109762338dSopenharmony_ci/* 3119762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_0900 3129762338dSopenharmony_ci * @tc.name : OpenatNoatimeSuccess_0009 3139762338dSopenharmony_ci * @tc.desc : openat with O_NOATIME to prevent changing atime but still changing mtime. 3149762338dSopenharmony_ci * @tc.size : MediumTest 3159762338dSopenharmony_ci * @tc.type : Function 3169762338dSopenharmony_ci * @tc.level : Level 1 3179762338dSopenharmony_ci */ 3189762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatNoatimeSuccess_0009, Function | MediumTest | Level1) 3199762338dSopenharmony_ci{ 3209762338dSopenharmony_ci int dirFd = -1; 3219762338dSopenharmony_ci int fd = -1; 3229762338dSopenharmony_ci struct stat bufFirst; 3239762338dSopenharmony_ci struct stat bufSecond; 3249762338dSopenharmony_ci dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 3259762338dSopenharmony_ci 3269762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_CREAT, 0644); 3279762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 3289762338dSopenharmony_ci close(fd); 3299762338dSopenharmony_ci stat(TEST_FILE, &bufFirst); 3309762338dSopenharmony_ci 3319762338dSopenharmony_ci usleep(100); 3329762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_WRONLY | O_NOATIME, 0644); 3339762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 3349762338dSopenharmony_ci close(fd); 3359762338dSopenharmony_ci stat(TEST_FILE, &bufSecond); 3369762338dSopenharmony_ci EXPECT_TRUE(bufFirst.st_atime == bufSecond.st_atime); 3379762338dSopenharmony_ci 3389762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 3399762338dSopenharmony_ci close(dirFd); 3409762338dSopenharmony_ci} 3419762338dSopenharmony_ci 3429762338dSopenharmony_ci/* 3439762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_1000 3449762338dSopenharmony_ci * @tc.name : OpenatFlagsTestSuccess_0010 3459762338dSopenharmony_ci * @tc.desc : openat with some flags. 3469762338dSopenharmony_ci * @tc.size : MediumTest 3479762338dSopenharmony_ci * @tc.type : Function 3489762338dSopenharmony_ci * @tc.level : Level 1 3499762338dSopenharmony_ci */ 3509762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatFlagsTestSuccess_0010, Function | MediumTest | Level1) 3519762338dSopenharmony_ci{ 3529762338dSopenharmony_ci int dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 3539762338dSopenharmony_ci 3549762338dSopenharmony_ci // O_TRUNC test 3559762338dSopenharmony_ci int fd = openat(dirFd, TEST_FILE, O_RDWR | O_CREAT, 0644); 3569762338dSopenharmony_ci const char *data = "Test data"; 3579762338dSopenharmony_ci write(fd, data, strlen(data)); 3589762338dSopenharmony_ci close(fd); 3599762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_TRUNC, 0644); 3609762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 3619762338dSopenharmony_ci close(fd); 3629762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 3639762338dSopenharmony_ci 3649762338dSopenharmony_ci // O_ASYNC test 3659762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_CREAT | O_ASYNC, 0644); 3669762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 3679762338dSopenharmony_ci close(fd); 3689762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 3699762338dSopenharmony_ci 3709762338dSopenharmony_ci // O_DIRECT test 3719762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_CREAT | O_DIRECT, 0644); 3729762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 3739762338dSopenharmony_ci close(fd); 3749762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 3759762338dSopenharmony_ci 3769762338dSopenharmony_ci // O_DSYNC test 3779762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_CREAT | O_DSYNC, 0644); 3789762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 3799762338dSopenharmony_ci close(fd); 3809762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 3819762338dSopenharmony_ci 3829762338dSopenharmony_ci // O_SYNC test 3839762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_CREAT | O_SYNC, 0644); 3849762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 3859762338dSopenharmony_ci close(fd); 3869762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 3879762338dSopenharmony_ci 3889762338dSopenharmony_ci close(dirFd); 3899762338dSopenharmony_ci} 3909762338dSopenharmony_ci 3919762338dSopenharmony_ci/* 3929762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_OPENAT_1100 3939762338dSopenharmony_ci * @tc.name : OpenatFlagsTestSuccess_0011 3949762338dSopenharmony_ci * @tc.desc : openat O_CLOEXEC/O_LARGEFILE/O_NOCTTY/O_NONBLOCK flags test success. 3959762338dSopenharmony_ci * @tc.size : MediumTest 3969762338dSopenharmony_ci * @tc.type : Function 3979762338dSopenharmony_ci * @tc.level : Level 1 3989762338dSopenharmony_ci */ 3999762338dSopenharmony_ciHWTEST_F(OpenatApiTest, OpenatO_CLOEXECFlagSuccess_0011, Function | MediumTest | Level1) 4009762338dSopenharmony_ci{ 4019762338dSopenharmony_ci int dirFd = open(TEST_DIR, O_RDONLY | O_DIRECTORY); 4029762338dSopenharmony_ci 4039762338dSopenharmony_ci int fd = openat(dirFd, TEST_FILE, O_RDWR | O_CLOEXEC | O_CREAT, 0755); 4049762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 4059762338dSopenharmony_ci close(fd); 4069762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 4079762338dSopenharmony_ci 4089762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_LARGEFILE | O_CREAT, 0755); 4099762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 4109762338dSopenharmony_ci close(fd); 4119762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 4129762338dSopenharmony_ci 4139762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_NOCTTY | O_CREAT, 0755); 4149762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 4159762338dSopenharmony_ci close(fd); 4169762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 4179762338dSopenharmony_ci 4189762338dSopenharmony_ci fd = openat(dirFd, TEST_FILE, O_RDWR | O_NONBLOCK | O_CREAT, 0755); 4199762338dSopenharmony_ci EXPECT_TRUE(fd >= 0); 4209762338dSopenharmony_ci close(fd); 4219762338dSopenharmony_ci unlinkat(dirFd, TEST_FILE, 0); 4229762338dSopenharmony_ci 4239762338dSopenharmony_ci close(dirFd); 4249762338dSopenharmony_ci}