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}