/*
 * Copyright (C) 2024 HiHope Open Source Organization.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <cerrno>
#include <climits>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <gtest/gtest.h>
#include <sys/eventfd.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <poll.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/wait.h>
#include "securec.h"

using namespace testing::ext;

static constexpr int EVENTFD_DATA_SIZE = 8;
static constexpr int PAGE_SIZE_VAL = 4096;
static constexpr int DELAYED_WRITE_US = 10000;
static constexpr int BUF_MODULO = 256;
static constexpr int PATH_BUF_SIZE = 64;
static constexpr int FDINFO_BUF_SIZE = 256;
static constexpr int BAD_FD_VALUE = 9999;
static constexpr int IDEMPOTENT_LOOP_COUNT = 100;
static constexpr int THREAD_RW_COUNT = 1000;
static constexpr int BUF_IDEMPOTENT_COUNT = 50;
static constexpr int SEMAPHORE_INITVAL = 100;
static constexpr int BUF_RACE_COUNT = 10000;
static constexpr int ACCUM_LOOP_COUNT = 10;
static constexpr int TIMING_WRITE_LOOP_COUNT = 1000;
static constexpr int POLL_TIMEOUT_MS = 2000;
static constexpr int READS_PER_THREAD = 50;
static constexpr int WRITES_PER_THREAD = 250;
static constexpr int MASSIVE_RW_PER_THREAD = 100;

struct ThreadArg {
    int fd;
    uint64_t val;
    int count;
    ssize_t lastRet;
    uint64_t totalRead;
};

static void *ThreadWriteFunc(void *arg)
{
    ThreadArg *a = static_cast<ThreadArg *>(arg);
    for (int i = 0; i < a->count; i++) {
        a->lastRet = write(a->fd, &a->val, sizeof(a->val));
    }
    return nullptr;
}

static void *ThreadReadFunc(void *arg)
{
    ThreadArg *a = static_cast<ThreadArg *>(arg);
    uint64_t val = 0;
    a->totalRead = 0;
    for (int i = 0; i < a->count; i++) {
        errno = 0;
        ssize_t r = read(a->fd, &val, sizeof(val));
        a->lastRet = r;
        if (r == static_cast<ssize_t>(sizeof(val))) {
            a->totalRead += val;
        }
    }
    return nullptr;
}

static void *ThreadDelayWriteFunc(void *arg)
{
    ThreadArg *a = static_cast<ThreadArg *>(arg);
    usleep(DELAYED_WRITE_US);
    a->lastRet = write(a->fd, &a->val, sizeof(a->val));
    return nullptr;
}

struct ThreadBufArg {
    uint64_t *buf;
    int count;
};

static void *ThreadBufModifyFunc(void *arg)
{
    ThreadBufArg *a = static_cast<ThreadBufArg *>(arg);
    for (int i = 0; i < a->count; i++) {
        *(a->buf) = static_cast<uint64_t>(i % BUF_MODULO);
    }
    return nullptr;
}

class HatsEventfd2Test : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    void SetUp();
    void TearDown();
private:
};
void HatsEventfd2Test::SetUp()
{
}

void HatsEventfd2Test::TearDown()
{
}

void HatsEventfd2Test::SetUpTestCase()
{
}

void HatsEventfd2Test::TearDownTestCase()
{
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0100
 * @tc.name   : Eventfd2CreateFdSuccess_0001
 * @tc.desc   : eventfd2 create fd use EFD_NONBLOCK/EFD_SEMAPHORE success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2CreateFdSuccess_0001, Function | MediumTest | Level1)
{
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);
    close(fd);

    fd = syscall(__NR_eventfd2, 1, EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);

    close(fd);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0200
 * @tc.name   : Eventfd2InvalidParamFailed_0002
 * @tc.desc   : eventfd2 create fd use invalid param failed.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2InvalidParamFailed_0002, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, -1);
    EXPECT_TRUE(fd < 0);
    EXPECT_EQ(errno, EINVAL);
}

/*
 * TestReportAnalysis 问题[P0-ENODEV]: eventfd2 - 缺少 ENODEV 错误码测试 (P0)
 * 建议: 在可能触发ENODEV的环境中调用eventfd2()或通过mock/故障注入方式模拟设备不可用
 * 注意: ENODEV在常规环境下难以触发,此用例仅尝试调用并记录结果,不做强制断言
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0300
 * @tc.name   : Eventfd2EnodevError_0003
 * @tc.desc   : eventfd2 ENODEV error code test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2EnodevError_0003, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, 0);
    if (fd < 0) {
        EXPECT_EQ(errno, ENODEV);
    } else {
        close(fd);
    }
}

/*
 * TestReportAnalysis 问题[#PB-01]: eventfd2 - initval=0 未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, 0, 0) 验证fd > 0
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0400
 * @tc.name   : Eventfd2InitvalZero_0004
 * @tc.desc   : eventfd2 with initval=0.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2InitvalZero_0004, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, 0);
    EXPECT_TRUE(fd > 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-02]: eventfd2 - initval=UINT_MAX 未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, UINT_MAX, 0) 验证fd > 0,read验证计数器值为UINT_MAX
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0500
 * @tc.name   : Eventfd2InitvalUintMax_0005
 * @tc.desc   : eventfd2 with initval=UINT_MAX.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2InitvalUintMax_0005, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, UINT_MAX, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t val = 0;
    errno = 0;
    ssize_t ret = read(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(sizeof(val)));
    EXPECT_EQ(val, static_cast<uint64_t>(UINT_MAX));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-03]: eventfd2 - flags=0 未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, 0, 0) 验证fd > 0
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0600
 * @tc.name   : Eventfd2FlagsZero_0006
 * @tc.desc   : eventfd2 with flags=0.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2FlagsZero_0006, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, 0);
    EXPECT_TRUE(fd > 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-04]: eventfd2 - EFD_CLOEXEC 标志未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, 0, EFD_CLOEXEC) 验证fd > 0
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0700
 * @tc.name   : Eventfd2Cloexec_0007
 * @tc.desc   : eventfd2 with EFD_CLOEXEC flag.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2Cloexec_0007, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_CLOEXEC);
    EXPECT_TRUE(fd > 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-05]: eventfd2 - EFD_CLOEXEC|EFD_NONBLOCK 组合未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, 0, EFD_CLOEXEC | EFD_NONBLOCK) 验证fd > 0
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0800
 * @tc.name   : Eventfd2CloexecNonblock_0008
 * @tc.desc   : eventfd2 with EFD_CLOEXEC|EFD_NONBLOCK flags.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2CloexecNonblock_0008, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_CLOEXEC | EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-06]: eventfd2 - EFD_CLOEXEC|EFD_SEMAPHORE 组合未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, 0, EFD_CLOEXEC | EFD_SEMAPHORE) 验证fd > 0
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_0900
 * @tc.name   : Eventfd2CloexecSemaphore_0009
 * @tc.desc   : eventfd2 with EFD_CLOEXEC|EFD_SEMAPHORE flags.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2CloexecSemaphore_0009, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_CLOEXEC | EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-07]: eventfd2 - EFD_NONBLOCK|EFD_SEMAPHORE 组合未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, 1, EFD_NONBLOCK | EFD_SEMAPHORE),write后read验证信号量语义
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1000
 * @tc.name   : Eventfd2NonblockSemaphore_0010
 * @tc.desc   : eventfd2 with EFD_NONBLOCK|EFD_SEMAPHORE flags.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2NonblockSemaphore_0010, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK | EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 3;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(1));

    errno = 0;
    rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(1));

    errno = 0;
    rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(1));

    errno = 0;
    rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-08]: eventfd2 - EFD_CLOEXEC|EFD_NONBLOCK|EFD_SEMAPHORE 全组合未测试 (P1)
 * 建议: 调用 syscall(__NR_eventfd2, 1, EFD_CLOEXEC | EFD_NONBLOCK | EFD_SEMAPHORE) 验证fd > 0
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1100
 * @tc.name   : Eventfd2AllFlagsCombo_0011
 * @tc.desc   : eventfd2 with all flags combined.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(HatsEventfd2Test, Eventfd2AllFlagsCombo_0011, Function | MediumTest | Level1)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_CLOEXEC | EFD_NONBLOCK | EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 2;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(1));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-09]: read操作 - buf=NULL 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,write写入值,调用 read(fd, NULL, 8),期望返回-1,errno=EFAULT
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1200
 * @tc.name   : Eventfd2ReadBufNull_0012
 * @tc.desc   : eventfd2 read with null buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufNull_0012, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = read(fd, nullptr, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-10]: read操作 - buf=未映射地址 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,write写入值,mmap后munmap,调用read(fd, buf, EVENTFD_DATA_SIZE)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1300
 * @tc.name   : Eventfd2ReadBufUnmapped_0013
 * @tc.desc   : eventfd2 read with unmapped buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufUnmapped_0013, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    void *buf = mmap(nullptr, PAGE_SIZE_VAL, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    EXPECT_NE(buf, MAP_FAILED);
    munmap(buf, 4096);

    errno = 0;
    ssize_t ret = read(fd, buf, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-11]: read操作 - buf=内核态地址 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,write写入值,调用read(fd, (void*)0xFFFF800000000000, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1400
 * @tc.name   : Eventfd2ReadBufKernel_0014
 * @tc.desc   : eventfd2 read with kernel address buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufKernel_0014, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = read(fd, reinterpret_cast<void *>(0xFFFF800000000000ULL), 8);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-12]: read操作 - buf=只读区 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,write写入值,调用read(fd, (void*)"readonly", 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1500
 * @tc.name   : Eventfd2ReadBufReadonly_0015
 * @tc.desc   : eventfd2 read with read-only buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufReadonly_0015, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = read(fd, const_cast<void *>(static_cast<const void *>("readonly")), 8);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-13]: write操作 - buf=NULL 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,调用write(fd, NULL, 8),期望返回-1,errno=EFAULT
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1600
 * @tc.name   : Eventfd2WriteBufNull_0016
 * @tc.desc   : eventfd2 write with null buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufNull_0016, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = write(fd, nullptr, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-14]: write操作 - buf=未映射地址 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,mmap后munmap,调用write(fd, buf, EVENTFD_DATA_SIZE)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1700
 * @tc.name   : Eventfd2WriteBufUnmapped_0017
 * @tc.desc   : eventfd2 write with unmapped buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufUnmapped_0017, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    void *buf = mmap(nullptr, PAGE_SIZE_VAL, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    EXPECT_NE(buf, MAP_FAILED);
    munmap(buf, 4096);

    errno = 0;
    ssize_t ret = write(fd, buf, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-15]: write操作 - buf=内核态地址 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,调用write(fd, (void*)0xFFFF800000000000, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1800
 * @tc.name   : Eventfd2WriteBufKernel_0018
 * @tc.desc   : eventfd2 write with kernel address buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufKernel_0018, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = write(fd, reinterpret_cast<void *>(0xFFFF800000000000ULL), 8);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#PB-16]: write操作 - buf=只读区 非法指针未测试 (P1)
 * 建议: 创建eventfd2 fd,调用write(fd, (char*)"readonly", 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_1900
 * @tc.name   : Eventfd2WriteBufReadonly_0019
 * @tc.desc   : eventfd2 write with read-only buffer returns EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufReadonly_0019, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = write(fd, const_cast<void *>(static_cast<const void *>("readonly")), 8);
    EXPECT_TRUE(ret > 0);
    EXPECT_EQ(errno, 0);
}
/*
 * TestReportAnalysis 问题[#FP-01]: eventfd2 - 计数器初始化值未验证 (P2)
 * 建议: 创建eventfd2(initval=5, 0),立即read验证返回5
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2000
 * @tc.name   : Eventfd2CounterInitVal_0020
 * @tc.desc   : eventfd2 counter initial value verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2CounterInitVal_0020, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 5, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t val = 0;
    errno = 0;
    ssize_t ret = read(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(sizeof(val)));
    EXPECT_EQ(val, static_cast<uint64_t>(5));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-02]: eventfd2 - flags=0 创建成功未测试 (P2)
 * 建议: syscall(__NR_eventfd2, 0, 0) 验证fd > 0
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2100
 * @tc.name   : Eventfd2FlagsZeroFunc_0021
 * @tc.desc   : eventfd2 flags=0 functional behavior.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2FlagsZeroFunc_0021, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, 0);
    EXPECT_TRUE(fd > 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-03]: eventfd2 - EFD_CLOEXEC 标志行为未测试 (P2)
 * 建议: 创建EFD_CLOEXEC的fd,fork+execve后验证fd不可用
 * 注意: 完整execve测试需要外部测试程序,此处通过fcntl验证FD_CLOEXEC标志已设置
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2200
 * @tc.name   : Eventfd2CloexecBehavior_0022
 * @tc.desc   : eventfd2 EFD_CLOEXEC behavior across exec.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2CloexecBehavior_0022, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_CLOEXEC);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    int flags = fcntl(fd, F_GETFD);
    EXPECT_NE(flags, -1);
    EXPECT_NE(flags & FD_CLOEXEC, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-04]: eventfd2 - read 基本操作未测试 (P2)
 * 建议: write(42)后read,验证返回42和8字节大小
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2300
 * @tc.name   : Eventfd2ReadBasic_0023
 * @tc.desc   : eventfd2 basic read operation.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBasic_0023, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 42;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(42));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-05]: eventfd2 - 非信号量read语义未测试 (P2)
 * 建议: write多次累加后read,验证返回累加总值,再次read返回EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2400
 * @tc.name   : Eventfd2ReadNonSem_0024
 * @tc.desc   : eventfd2 read in non-semaphore mode.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadNonSem_0024, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval1 = 10;
    errno = 0;
    ssize_t wret = write(fd, &wval1, sizeof(wval1));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval1)));

    uint64_t wval2 = 20;
    errno = 0;
    wret = write(fd, &wval2, sizeof(wval2));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval2)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(30));

    errno = 0;
    rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-06]: eventfd2 - 信号量read语义未测试 (P2)
 * 建议: 创建EFD_SEMAPHORE的fd,write(3)后连续read 3次,每次返回1
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2500
 * @tc.name   : Eventfd2ReadSem_0025
 * @tc.desc   : eventfd2 read in semaphore mode.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadSem_0025, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK | EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 3;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    for (int i = 0; i < 3; i++) {
        uint64_t rval = 0;
        errno = 0;
        ssize_t rret = read(fd, &rval, sizeof(rval));
        EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
        EXPECT_EQ(rval, static_cast<uint64_t>(1));
    }

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-07]: eventfd2 - 非阻塞空计数器read未测试 (P2)
 * 建议: 创建EFD_NONBLOCK的fd,不write直接read,验证errno=EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2600
 * @tc.name   : Eventfd2ReadEagain_0026
 * @tc.desc   : eventfd2 read returns EAGAIN when counter is zero.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadEagain_0026, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t val = 0;
    errno = 0;
    ssize_t ret = read(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-08]: eventfd2 - write 基本操作未测试 (P2)
 * 建议: 创建fd,write(10)后read验证返回10
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2700
 * @tc.name   : Eventfd2WriteBasic_0027
 * @tc.desc   : eventfd2 basic write operation.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBasic_0027, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 10;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(10));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-09]: eventfd2 - write 累加计数器值未测试 (P2)
 * 建议: write(5), write(3)后read,验证返回8
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2800
 * @tc.name   : Eventfd2WriteAccum_0028
 * @tc.desc   : eventfd2 write accumulates counter value.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteAccum_0028, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval1 = 5;
    errno = 0;
    ssize_t wret = write(fd, &wval1, sizeof(wval1));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval1)));

    uint64_t wval2 = 3;
    errno = 0;
    wret = write(fd, &wval2, sizeof(wval2));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval2)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(8));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-10]: eventfd2 - write 最大值约束未测试 (P2)
 * 建议: write接近最大值后继续write,验证EFD_NONBLOCK下返回EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_2900
 * @tc.name   : Eventfd2WriteMax_0029
 * @tc.desc   : eventfd2 write with UINT64_MAX.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteMax_0029, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t maxVal = 0xfffffffffffffffeULL;
    errno = 0;
    ssize_t wret = write(fd, &maxVal, sizeof(maxVal));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(maxVal)));

    uint64_t one = 1;
    errno = 0;
    wret = write(fd, &one, sizeof(one));
    EXPECT_EQ(wret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-11]: eventfd2 - write 非法值 0xffffffffffffffff 未测试 (P2)
 * 建议: uint64_t val = 0xffffffffffffffff; write(fd, &val, 8); 验证errno=EINVAL
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3000
 * @tc.name   : Eventfd2WriteIllegal_0030
 * @tc.desc   : eventfd2 write with illegal value returns EINVAL.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteIllegal_0030, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t illegal = 0xffffffffffffffffULL;
    errno = 0;
    ssize_t ret = write(fd, &illegal, sizeof(illegal));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EINVAL);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-12]: eventfd2 - 非阻塞write溢出未测试 (P2)
 * 建议: 创建EFD_NONBLOCK的fd,write大值使计数器接近最大,再write验证EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3100
 * @tc.name   : Eventfd2WriteOverflow_0031
 * @tc.desc   : eventfd2 write overflow returns EINVAL.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteOverflow_0031, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t nearMax = 0xfffffffffffffffdULL;
    errno = 0;
    ssize_t wret = write(fd, &nearMax, sizeof(nearMax));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(nearMax)));

    uint64_t addVal = 2;
    errno = 0;
    wret = write(fd, &addVal, sizeof(addVal));
    EXPECT_EQ(wret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-13]: eventfd2 - poll/select 支持未测试 (P2)
 * 建议: 创建fd,使用poll验证空计数器时POLLOUT、write后POLLIN|POLLOUT
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3200
 * @tc.name   : Eventfd2PollSupport_0032
 * @tc.desc   : eventfd2 poll support verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2PollSupport_0032, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    struct pollfd pfd = {fd, POLLIN | POLLOUT, 0};
    errno = 0;
    int pret = poll(&pfd, 1, 0);
    EXPECT_EQ(pret, 1);
    EXPECT_NE(pfd.revents & POLLOUT, 0);

    uint64_t wval = 1;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    pfd.revents = 0;
    errno = 0;
    pret = poll(&pfd, 1, 0);
    EXPECT_EQ(pret, 1);
    EXPECT_NE(pfd.revents & POLLIN, 0);
    EXPECT_NE(pfd.revents & POLLOUT, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-14]: eventfd2 - fork 继承fd未测试 (P2)
 * 建议: 创建fd,fork后子进程write,父进程read验证值正确
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3300
 * @tc.name   : Eventfd2ForkInherit_0033
 * @tc.desc   : eventfd2 fd inherited across fork.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ForkInherit_0033, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, 0);
    EXPECT_TRUE(fd > 0);

    int pipeFd[2] = {-1, -1};
    errno = 0;
    int pret = pipe(pipeFd);
    EXPECT_EQ(pret, 0);

    pid_t pid = fork();
    EXPECT_GE(pid, 0);
    if (pid == 0) {
        close(pipeFd[0]);
        uint64_t val = 42;
        write(fd, &val, sizeof(val));
        char c = 'A';
        write(pipeFd[1], &c, 1);
        close(pipeFd[1]);
        close(fd);
        _exit(0);
    }
    close(pipeFd[1]);
    char c = 0;
    read(pipeFd[0], &c, 1);
    close(pipeFd[0]);

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(42));

    int status = 0;
    waitpid(pid, &status, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-15]: eventfd2 - execve 保留fd(除非CLOEXEC)未测试 (P2)
 * 建议: 创建无CLOEXEC的fd,fork+execve后验证fd仍有效
 * 注意: 完整execve测试需要外部测试程序,此处通过fcntl验证FD_CLOEXEC未设置
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3400
 * @tc.name   : Eventfd2ExecveKeepFd_0034
 * @tc.desc   : eventfd2 fd kept across execve with EFD_CLOEXEC.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ExecveKeepFd_0034, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    int flags = fcntl(fd, F_GETFD);
    EXPECT_NE(flags, -1);
    EXPECT_EQ(flags & FD_CLOEXEC, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#FP-16]: eventfd2 - /proc/pid/fdinfo 查看计数器未测试 (P2)
 * 建议: 创建fd,write后读取/proc/self/fdinfo/<fd>验证eventfd-count值
 * 注意: /proc/pid/fdinfo在部分OpenHarmony环境中可能不可用
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3500
 * @tc.name   : Eventfd2ProcFdinfo_0035
 * @tc.desc   : eventfd2 /proc/fd info verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ProcFdinfo_0035, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 12345;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    char path[PATH_BUF_SIZE] = {0};
    sprintf_s(path, PATH_BUF_SIZE, "/proc/self/fdinfo/%d", fd);
    errno = 0;
    int infoFd = open(path, O_RDONLY);
    if (infoFd >= 0) {
        char buf[FDINFO_BUF_SIZE] = {0};
        errno = 0;
        ssize_t rret = read(infoFd, buf, sizeof(buf) - 1);
        EXPECT_GT(rret, 0);
        close(infoFd);
    } else {
    }
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-01]: read操作 - fd已关闭后read (P1)
 * 建议: 创建eventfd2 fd,close(fd),read(fd, &val, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3600
 * @tc.name   : Eventfd2ReadClosedFd_0036
 * @tc.desc   : eventfd2 read on closed fd returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadClosedFd_0036, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);
    close(fd);

    uint64_t val = 0;
    errno = 0;
    ssize_t ret = read(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);
}

/*
 * TestReportAnalysis 问题[#CS-02]: read操作 - fd无效值read (P1)
 * 建议: read(BAD_FD_VALUE, &val, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3700
 * @tc.name   : Eventfd2ReadBadFd_0037
 * @tc.desc   : eventfd2 read on bad fd returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBadFd_0037, Function | MediumTest | Level2)
{
    uint64_t val = 0;
    errno = 0;
    ssize_t ret = read(BAD_FD_VALUE, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);
}

/*
 * TestReportAnalysis 问题[#CS-03]: read操作 - fd=-1 read (P1)
 * 建议: read(-1, &val, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3800
 * @tc.name   : Eventfd2ReadFdNegOne_0038
 * @tc.desc   : eventfd2 read on fd=-1 returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadFdNegOne_0038, Function | MediumTest | Level2)
{
    uint64_t val = 0;
    errno = 0;
    ssize_t ret = read(-1, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);
}

/*
 * TestReportAnalysis 问题[#CS-04]: read操作 - buf=NULL (P1)
 * 建议: 创建fd,write写入值,read(fd, NULL, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_3900
 * @tc.name   : Eventfd2ReadBufNullCombo_0039
 * @tc.desc   : eventfd2 read null buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufNullCombo_0039, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = read(fd, nullptr, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-05]: read操作 - buf=未映射地址 (P1)
 * 建议: 创建fd,write写入值,mmap后munmap,调用read(fd, buf, EVENTFD_DATA_SIZE)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4000
 * @tc.name   : Eventfd2ReadBufUnmappedCombo_0040
 * @tc.desc   : eventfd2 read unmapped buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufUnmappedCombo_0040, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    void *buf = mmap(nullptr, PAGE_SIZE_VAL, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    EXPECT_NE(buf, MAP_FAILED);
    munmap(buf, 4096);

    errno = 0;
    ssize_t ret = read(fd, buf, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-06]: read操作 - buf=内核态地址 (P1)
 * 建议: 创建fd,write写入值,read(fd, (void*)0xFFFF800000000000, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4100
 * @tc.name   : Eventfd2ReadBufKernelCombo_0041
 * @tc.desc   : eventfd2 read kernel buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufKernelCombo_0041, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = read(fd, reinterpret_cast<void *>(0xFFFF800000000000ULL), 8);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-07]: read操作 - buf=只读区 (P1)
 * 建议: 创建fd,write写入值,read(fd, (void*)"readonly", 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4200
 * @tc.name   : Eventfd2ReadBufReadonlyCombo_0042
 * @tc.desc   : eventfd2 read read-only buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufReadonlyCombo_0042, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = read(fd, const_cast<void *>(static_cast<const void *>("readonly")), 8);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-08]: write操作 - fd已关闭后write (P1)
 * 建议: 创建eventfd2 fd,close(fd),write(fd, &val, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4300
 * @tc.name   : Eventfd2WriteClosedFd_0043
 * @tc.desc   : eventfd2 write on closed fd returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteClosedFd_0043, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);
    close(fd);

    uint64_t val = 1;
    errno = 0;
    ssize_t ret = write(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);
}

/*
 * TestReportAnalysis 问题[#CS-09]: write操作 - fd无效值write (P1)
 * 建议: uint64_t val = 1; write(BAD_FD_VALUE, &val, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4400
 * @tc.name   : Eventfd2WriteBadFd_0044
 * @tc.desc   : eventfd2 write on bad fd returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBadFd_0044, Function | MediumTest | Level2)
{
    uint64_t val = 1;
    errno = 0;
    ssize_t ret = write(BAD_FD_VALUE, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);
}

/*
 * TestReportAnalysis 问题[#CS-10]: write操作 - fd=-1 write (P1)
 * 建议: uint64_t val = 1; write(-1, &val, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4500
 * @tc.name   : Eventfd2WriteFdNegOne_0045
 * @tc.desc   : eventfd2 write on fd=-1 returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteFdNegOne_0045, Function | MediumTest | Level2)
{
    uint64_t val = 1;
    errno = 0;
    ssize_t ret = write(-1, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);
}

/*
 * TestReportAnalysis 问题[#CS-11]: write操作 - buf=NULL (P1)
 * 建议: 创建fd,write(fd, NULL, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4600
 * @tc.name   : Eventfd2WriteBufNullCombo_0046
 * @tc.desc   : eventfd2 write null buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufNullCombo_0046, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = write(fd, nullptr, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-12]: write操作 - buf=未映射地址 (P1)
 * 建议: 创建fd,mmap后munmap,调用write(fd, buf, EVENTFD_DATA_SIZE)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4700
 * @tc.name   : Eventfd2WriteBufUnmappedCombo_0047
 * @tc.desc   : eventfd2 write unmapped buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufUnmappedCombo_0047, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    void *buf = mmap(nullptr, PAGE_SIZE_VAL, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    EXPECT_NE(buf, MAP_FAILED);
    munmap(buf, 4096);

    errno = 0;
    ssize_t ret = write(fd, buf, EVENTFD_DATA_SIZE);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-13]: write操作 - buf=内核态地址 (P1)
 * 建议: 创建fd,write(fd, (void*)0xFFFF800000000000, 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4800
 * @tc.name   : Eventfd2WriteBufKernelCombo_0048
 * @tc.desc   : eventfd2 write kernel buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufKernelCombo_0048, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = write(fd, reinterpret_cast<void *>(0xFFFF800000000000ULL), 8);
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EFAULT);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-14]: write操作 - buf=只读区 (P1)
 * 建议: 创建fd,write(fd, (char*)"readonly", 8)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_4900
 * @tc.name   : Eventfd2WriteBufReadonlyCombo_0049
 * @tc.desc   : eventfd2 write read-only buffer combination scenario.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufReadonlyCombo_0049, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    ssize_t ret = write(fd, const_cast<void *>(static_cast<const void *>("readonly")), 8);
    EXPECT_TRUE(ret > 0);
    EXPECT_EQ(errno, 0);
}

/*
 * TestReportAnalysis 问题[#CS-15]: poll操作 - fd已关闭后poll (P1)
 * 建议: 创建eventfd2 fd,close(fd),struct pollfd pfd={fd, POLLIN, 0}; poll(&pfd, 1, 0)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5000
 * @tc.name   : Eventfd2PollClosedFd_0050
 * @tc.desc   : eventfd2 poll on closed fd returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2PollClosedFd_0050, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);
    close(fd);

    struct pollfd pfd = {fd, POLLIN, 0};
    errno = 0;
    int pret = poll(&pfd, 1, 0);
    EXPECT_EQ(pret, 1);
    EXPECT_NE(pfd.revents & POLLNVAL, 0);
}

/*
 * TestReportAnalysis 问题[#CS-16]: poll操作 - fd无效值poll (P1)
 * 建议: struct pollfd pfd={BAD_FD_VALUE, POLLIN, 0}; poll(&pfd, 1, 0)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5100
 * @tc.name   : Eventfd2PollBadFd_0051
 * @tc.desc   : eventfd2 poll on bad fd returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2PollBadFd_0051, Function | MediumTest | Level2)
{
    struct pollfd pfd = {BAD_FD_VALUE, POLLIN, 0};
    errno = 0;
    int pret = poll(&pfd, 1, 0);
    EXPECT_EQ(pret, 1);
    EXPECT_NE(pfd.revents & POLLNVAL, 0);
}

/*
 * TestReportAnalysis 问题[#CS-17]: poll操作 - fd=-1 poll (P1)
 * 建议: struct pollfd pfd={-1, POLLIN, 0}; poll(&pfd, 1, 0)
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5200
 * @tc.name   : Eventfd2PollFdNegOne_0052
 * @tc.desc   : eventfd2 poll on fd=-1 returns EBADF.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2PollFdNegOne_0052, Function | MediumTest | Level2)
{
    struct pollfd pfd = {-1, POLLIN, 0};
    errno = 0;
    int pret = poll(&pfd, 1, 0);
    EXPECT_EQ(pret, 0);
}

/*
 * TestReportAnalysis 问题[#CS-18]: read操作.fd - 幂等性场景 (P1)
 * 建议: 创建fd,循环100次:write(42) → read验证返回42
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5300
 * @tc.name   : Eventfd2ReadIdempotent_0053
 * @tc.desc   : eventfd2 read idempotent verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadIdempotent_0053, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    for (int i = 0; i < IDEMPOTENT_LOOP_COUNT; i++) {
        uint64_t wval = 42;
        errno = 0;
        ssize_t wret = write(fd, &wval, sizeof(wval));
        if (wret != static_cast<ssize_t>(sizeof(wval))) {
            break;
        }

        uint64_t rval = 0;
        errno = 0;
        ssize_t rret = read(fd, &rval, sizeof(rval));
        if (rret != static_cast<ssize_t>(sizeof(rval)) || rval != 42) {
            EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
            EXPECT_EQ(rval, static_cast<uint64_t>(42));
            break;
        }
    }
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-19]: read操作.fd - 文件状态变化场景 (P1)
 * 建议: 创建fd,write(10), write(20) → read验证返回30,write(5) → read验证返回5
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5400
 * @tc.name   : Eventfd2ReadStateChange_0054
 * @tc.desc   : eventfd2 read state transition test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadStateChange_0054, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval1 = 10;
    errno = 0;
    ssize_t wret = write(fd, &wval1, sizeof(wval1));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval1)));

    uint64_t wval2 = 20;
    errno = 0;
    wret = write(fd, &wval2, sizeof(wval2));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval2)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(30));

    uint64_t wval3 = 5;
    errno = 0;
    wret = write(fd, &wval3, sizeof(wval3));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval3)));

    errno = 0;
    rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(5));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-20]: read操作.fd - 时序干扰场景 (P1)
 * 建议: 创建EFD_NONBLOCK的fd,线程A循环read,线程B循环write,验证无崩溃
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5500
 * @tc.name   : Eventfd2ReadTiming_0055
 * @tc.desc   : eventfd2 read timing verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadTiming_0055, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    ThreadArg warg = {fd, 1, THREAD_RW_COUNT, 0, 0};
    ThreadArg rarg = {fd, 0, THREAD_RW_COUNT, 0, 0};
    pthread_t wt = 0;
    pthread_t rt = 0;
    int pret = pthread_create(&wt, nullptr, ThreadWriteFunc, &warg);
    ASSERT_EQ(pret, 0);

    pret = pthread_create(&rt, nullptr, ThreadReadFunc, &rarg);
    ASSERT_EQ(pret, 0);

    pthread_join(wt, nullptr);
    pthread_join(rt, nullptr);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-21]: read操作.buf - 幂等性场景 (P1)
 * 建议: 创建fd,循环:write(i) → read(fd, buf, EVENTFD_DATA_SIZE) → 验证buf内容
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5600
 * @tc.name   : Eventfd2ReadBufIdempotent_0056
 * @tc.desc   : eventfd2 read buffer idempotent verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufIdempotent_0056, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t buf = 0;
    for (int i = 1; i <= BUF_IDEMPOTENT_COUNT; i++) {
        uint64_t wval = static_cast<uint64_t>(i);
        errno = 0;
        ssize_t wret = write(fd, &wval, sizeof(wval));
        if (wret != static_cast<ssize_t>(sizeof(wval))) {
            break;
        }

        errno = 0;
        ssize_t rret = read(fd, &buf, sizeof(buf));
        if (rret != static_cast<ssize_t>(sizeof(buf)) || buf != wval) {
            EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(buf)));
            EXPECT_EQ(buf, wval);
            break;
        }
    }
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-22]: read操作.buf - 时序干扰场景 (P1)
 * 建议: 创建fd,write写入值,read使用共享buf,同时另一线程修改buf
 * 注意: 此场景为竞态条件测试,主要验证无崩溃,不保证确定性结果
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5700
 * @tc.name   : Eventfd2ReadBufTiming_0057
 * @tc.desc   : eventfd2 read buffer timing verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ReadBufTiming_0057, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, SEMAPHORE_INITVAL, EFD_NONBLOCK | EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);

    uint64_t sharedBuf = 0;
    ThreadBufArg barg = {&sharedBuf, BUF_RACE_COUNT};
    pthread_t t1 = 0;
    int pret = pthread_create(&t1, nullptr, ThreadBufModifyFunc, &barg);
    ASSERT_EQ(pret, 0);

    for (int i = 0; i < IDEMPOTENT_LOOP_COUNT; i++) {
        errno = 0;
        ssize_t r = read(fd, &sharedBuf, sizeof(sharedBuf));
        if (r == static_cast<ssize_t>(-1) && errno == EAGAIN) {
            break;
        }
    }
    pthread_join(t1, nullptr);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-23]: write操作.fd - 幂等性场景 (P1)
 * 建议: 创建fd,initval=0,循环10次write(1),read验证返回10
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5800
 * @tc.name   : Eventfd2WriteIdempotent_0058
 * @tc.desc   : eventfd2 write idempotent verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteIdempotent_0058, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    for (int i = 0; i < ACCUM_LOOP_COUNT; i++) {
        uint64_t val = 1;
        errno = 0;
        ssize_t wret = write(fd, &val, sizeof(val));
        EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(val)));
    }

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(10));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-24]: write操作.fd - 文件状态变化场景 (P1)
 * 建议: 创建fd,write(100) → read清空,write(50) → read验证返回50
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_5900
 * @tc.name   : Eventfd2WriteStateChange_0059
 * @tc.desc   : eventfd2 write state transition test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteStateChange_0059, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval1 = 100;
    errno = 0;
    ssize_t wret = write(fd, &wval1, sizeof(wval1));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval1)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));

    uint64_t wval2 = 50;
    errno = 0;
    wret = write(fd, &wval2, sizeof(wval2));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval2)));

    errno = 0;
    rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(50));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-25]: write操作.fd - 时序干扰场景 (P1)
 * 建议: 创建fd,initval=0,2个线程各write(1)执行1000次,read验证总值为2000
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6000
 * @tc.name   : Eventfd2WriteTiming_0060
 * @tc.desc   : eventfd2 write timing verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteTiming_0060, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    ThreadArg arg1 = {fd, 1, THREAD_RW_COUNT, 0, 0};
    ThreadArg arg2 = {fd, 1, THREAD_RW_COUNT, 0, 0};
    pthread_t t1 = 0;
    pthread_t t2 = 0;
    int pret = pthread_create(&t1, nullptr, ThreadWriteFunc, &arg1);
    ASSERT_EQ(pret, 0);

    pret = pthread_create(&t2, nullptr, ThreadWriteFunc, &arg2);
    ASSERT_EQ(pret, 0);

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(2000));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-26]: write操作.buf - 幂等性场景 (P1)
 * 建议: 创建fd,同一buf写入不同值,循环write
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6100
 * @tc.name   : Eventfd2WriteBufIdempotent_0061
 * @tc.desc   : eventfd2 write buffer idempotent verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufIdempotent_0061, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t buf = 1;
    uint64_t expectedTotal = 0;
    for (int i = 0; i < ACCUM_LOOP_COUNT; i++) {
        buf = static_cast<uint64_t>(i + 1);
        expectedTotal += buf;
        errno = 0;
        ssize_t wret = write(fd, &buf, sizeof(buf));
        EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(buf)));
    }

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, expectedTotal);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-27]: write操作.buf - 时序干扰场景 (P1)
 * 建议: 创建fd,write使用buf时,另一线程修改buf内容
 * 注意: 此场景为竞态条件测试,主要验证无崩溃,不保证确定性结果
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6200
 * @tc.name   : Eventfd2WriteBufTiming_0062
 * @tc.desc   : eventfd2 write buffer timing verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2WriteBufTiming_0062, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t sharedBuf = 1;
    ThreadBufArg barg = {&sharedBuf, BUF_RACE_COUNT};
    pthread_t t1 = 0;
    int pret = pthread_create(&t1, nullptr, ThreadBufModifyFunc, &barg);
    ASSERT_EQ(pret, 0);

    for (int i = 0; i < TIMING_WRITE_LOOP_COUNT; i++) {
        sharedBuf = 1;
        errno = 0;
        ssize_t wret = write(fd, &sharedBuf, sizeof(sharedBuf));
        if (wret == static_cast<ssize_t>(-1)) {
            break;
        }
    }
    pthread_join(t1, nullptr);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-28]: poll操作.fd - 幂等性场景 (P1)
 * 建议: 创建fd,write(1),连续poll 10次验证每次返回POLLIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6300
 * @tc.name   : Eventfd2PollIdempotent_0063
 * @tc.desc   : eventfd2 poll idempotent verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2PollIdempotent_0063, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 1;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    for (int i = 0; i < ACCUM_LOOP_COUNT; i++) {
        struct pollfd pfd = {fd, POLLIN, 0};
        errno = 0;
        int pret = poll(&pfd, 1, 0);
        EXPECT_EQ(pret, 1);
        EXPECT_NE(pfd.revents & POLLIN, 0);
    }
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-29]: poll操作.fd - 文件状态变化场景 (P1)
 * 建议: 创建fd,poll验证仅POLLOUT,write(1)后poll验证POLLIN|POLLOUT,read清空后poll仅POLLOUT
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6400
 * @tc.name   : Eventfd2PollStateChange_0064
 * @tc.desc   : eventfd2 poll state transition test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2PollStateChange_0064, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    struct pollfd pfd1 = {fd, POLLIN | POLLOUT, 0};
    errno = 0;
    int pret = poll(&pfd1, 1, 0);
    EXPECT_EQ(pret, 1);
    EXPECT_EQ(pfd1.revents & POLLIN, 0);
    EXPECT_NE(pfd1.revents & POLLOUT, 0);

    uint64_t wval = 1;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    struct pollfd pfd2 = {fd, POLLIN | POLLOUT, 0};
    errno = 0;
    pret = poll(&pfd2, 1, 0);
    EXPECT_EQ(pret, 1);
    EXPECT_NE(pfd2.revents & POLLIN, 0);
    EXPECT_NE(pfd2.revents & POLLOUT, 0);

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));

    struct pollfd pfd3 = {fd, POLLIN | POLLOUT, 0};
    errno = 0;
    pret = poll(&pfd3, 1, 0);
    EXPECT_EQ(pret, 1);
    EXPECT_EQ(pfd3.revents & POLLIN, 0);
    EXPECT_NE(pfd3.revents & POLLOUT, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CS-30]: poll操作.fd - 时序干扰场景 (P1)
 * 建议: 创建fd(无EFD_NONBLOCK),poll等待POLLIN,另一线程write(1)触发poll返回
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6500
 * @tc.name   : Eventfd2PollTiming_0065
 * @tc.desc   : eventfd2 poll timing verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2PollTiming_0065, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, 0);
    EXPECT_TRUE(fd > 0);

    ThreadArg warg = {fd, 1, 1, 0, 0};
    pthread_t t1 = 0;
    int pret = pthread_create(&t1, nullptr, ThreadDelayWriteFunc, &warg);
    ASSERT_EQ(pret, 0);

    struct pollfd pfd = {fd, POLLIN, 0};
    errno = 0;
    int pollRet = poll(&pfd, 1, POLL_TIMEOUT_MS);
    EXPECT_EQ(pollRet, 1);
    EXPECT_NE(pfd.revents & POLLIN, 0);

    pthread_join(t1, nullptr);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-01]: eventfd2 - 缺少 已创建→counter>0 转换(write写入计数器) (P1)
 * 建议: 创建eventfd2(0, EFD_NONBLOCK),write(42),read验证返回42
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6600
 * @tc.name   : Eventfd2StateWriteCounter_0066
 * @tc.desc   : eventfd2 state write counter verification.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateWriteCounter_0066, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 42;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(42));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-02]: eventfd2 - 缺少 counter>0→counter=0 转换(非信号量read重置) (P1)
 * 建议: 创建eventfd2(0, EFD_NONBLOCK),write(100) → read → 验证返回100,再次read → EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6700
 * @tc.name   : Eventfd2StateReadReset_0067
 * @tc.desc   : eventfd2 state read resets counter.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateReadReset_0067, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 100;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(100));

    errno = 0;
    rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-03]: eventfd2 - 缺少 counter>0→counter-1 转换(信号量read递减) (P1)
 * 建议: 创建eventfd2(0, EFD_NONBLOCK|EFD_SEMAPHORE),write(3),3次read返回1,第4次EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6800
 * @tc.name   : Eventfd2StateSemDecrement_0068
 * @tc.desc   : eventfd2 semaphore mode decrements counter.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateSemDecrement_0068, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK | EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 3;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    for (int i = 0; i < 3; i++) {
        uint64_t rval = 0;
        errno = 0;
        ssize_t rret = read(fd, &rval, sizeof(rval));
        EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
        EXPECT_EQ(rval, static_cast<uint64_t>(1));
    }

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-04]: eventfd2 - 缺少 counter=0→EAGAIN 转换(非阻塞read空计数器) (P1)
 * 建议: 创建eventfd2(0, EFD_NONBLOCK),read → 验证errno=EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_6900
 * @tc.name   : Eventfd2StateEagainRead_0069
 * @tc.desc   : eventfd2 state EAGAIN on zero counter read.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateEagainRead_0069, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t val = 0;
    errno = 0;
    ssize_t ret = read(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-05]: eventfd2 - 缺少 counter=0→阻塞 转换(阻塞模式read等待) (P1)
 * 建议: 创建eventfd2(0, 0)(阻塞模式),使用子线程write触发read返回
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7000
 * @tc.name   : Eventfd2StateBlockingRead_0070
 * @tc.desc   : eventfd2 state blocking read behavior.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateBlockingRead_0070, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, 0);
    EXPECT_TRUE(fd > 0);

    ThreadArg warg = {fd, 99, 1, 0, 0};
    pthread_t t1 = 0;
    int pret = pthread_create(&t1, nullptr, ThreadDelayWriteFunc, &warg);
    ASSERT_EQ(pret, 0);

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(99));

    pthread_join(t1, nullptr);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-06]: eventfd2 - 缺少 counter接近max→EAGAIN 转换(非阻塞write溢出) (P1)
 * 建议: 创建eventfd2(0, EFD_NONBLOCK),write(0xfffffffffffffffe) → write(1) → 验证EAGAIN
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7100
 * @tc.name   : Eventfd2StateWriteEagain_0071
 * @tc.desc   : eventfd2 state write EAGAIN on overflow.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateWriteEagain_0071, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t maxVal = 0xfffffffffffffffeULL;
    errno = 0;
    ssize_t wret = write(fd, &maxVal, sizeof(maxVal));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(maxVal)));

    uint64_t one = 1;
    errno = 0;
    wret = write(fd, &one, sizeof(one));
    EXPECT_EQ(wret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EAGAIN);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-07]: eventfd2 - 缺少 已关闭→EBADF 转换(已关闭fd操作) (P1)
 * 建议: 创建fd → close(fd),read(fd, &val, 8) → EBADF,write(fd, &val, 8) → EBADF
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7200
 * @tc.name   : Eventfd2StateEbadfAfterClose_0072
 * @tc.desc   : eventfd2 state EBADF after fd closed.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateEbadfAfterClose_0072, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);
    close(fd);

    uint64_t val = 1;
    errno = 0;
    ssize_t ret = read(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);

    errno = 0;
    ret = write(fd, &val, sizeof(val));
    EXPECT_EQ(ret, static_cast<ssize_t>(-1));
    EXPECT_EQ(errno, EBADF);
}

/*
 * TestReportAnalysis 问题[#ST-08]: eventfd2 - 缺少 已创建→fork继承 转换 (P1)
 * 建议: 创建eventfd2(0, 0),fork() → 子进程write(42) → 父进程read验证42
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7300
 * @tc.name   : Eventfd2StateForkInherit_0073
 * @tc.desc   : eventfd2 state fork inherits fd.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateForkInherit_0073, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, 0);
    EXPECT_TRUE(fd > 0);

    int pipeFd[2] = {-1, -1};
    errno = 0;
    int pret = pipe(pipeFd);
    EXPECT_EQ(pret, 0);

    pid_t pid = fork();
    EXPECT_GE(pid, 0);
    if (pid == 0) {
        close(pipeFd[0]);
        uint64_t val = 42;
        write(fd, &val, sizeof(val));
        char c = 'D';
        write(pipeFd[1], &c, 1);
        close(pipeFd[1]);
        close(fd);
        _exit(0);
    }
    close(pipeFd[1]);
    char c = 0;
    read(pipeFd[0], &c, 1);
    close(pipeFd[0]);

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(42));

    int status = 0;
    waitpid(pid, &status, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-09]: eventfd2 - 缺少 已创建(无CLOEXEC)→exec保留 转换 (P1)
 * 建议: 创建eventfd2(0, 0),fork() → 子进程execve测试程序 → 验证fd仍可操作
 * 注意: 完整execve测试需要外部测试程序,此处通过fcntl验证FD_CLOEXEC未设置
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7400
 * @tc.name   : Eventfd2StateExecKeepFd_0074
 * @tc.desc   : eventfd2 state exec keeps fd with CLOEXEC.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateExecKeepFd_0074, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    int flags = fcntl(fd, F_GETFD);
    EXPECT_NE(flags, -1);
    EXPECT_EQ(flags & FD_CLOEXEC, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#ST-10]: eventfd2 - 缺少 已创建(CLOEXEC)→exec关闭 转换 (P1)
 * 建议: 创建eventfd2(0, EFD_CLOEXEC),fork() → 子进程execve测试程序 → 验证fd不可用
 * 注意: 完整execve测试需要外部测试程序,此处通过fcntl验证FD_CLOEXEC已设置
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7500
 * @tc.name   : Eventfd2StateExecCloseFd_0075
 * @tc.desc   : eventfd2 state exec closes fd without CLOEXEC.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2StateExecCloseFd_0075, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_CLOEXEC);
    EXPECT_TRUE(fd > 0);

    errno = 0;
    int flags = fcntl(fd, F_GETFD);
    EXPECT_NE(flags, -1);
    EXPECT_NE(flags & FD_CLOEXEC, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CC-01]: eventfd2 - 多线程并发read同一eventfd fd (P1)
 * 建议: pthread_create,多线程同时read
 * 期望: read结果总和等于计数器值,无数据丢失
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7600
 * @tc.name   : Eventfd2ConcurrentRead_0076
 * @tc.desc   : eventfd2 concurrent read test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ConcurrentRead_0076, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK | EFD_SEMAPHORE);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 100;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    const int threadCount = 4;
    ThreadArg args[threadCount] = {};
    pthread_t threads[threadCount] = {};
    for (int i = 0; i < threadCount; i++) {
        args[i].fd = fd;
        args[i].count = READS_PER_THREAD;
        args[i].val = 0;
        args[i].totalRead = 0;
        int pret = pthread_create(&threads[i], nullptr, ThreadReadFunc, &args[i]);
        ASSERT_EQ(pret, 0);
    }

    uint64_t totalRead = 0;
    for (int i = 0; i < threadCount; i++) {
        pthread_join(threads[i], nullptr);
        totalRead += args[i].totalRead;
    }
    EXPECT_EQ(totalRead, static_cast<uint64_t>(100));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CC-02]: eventfd2 - 多线程并发write同一eventfd fd (P1)
 * 建议: pthread_create,多线程同时write
 * 期望: 所有write值正确累加到计数器
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7700
 * @tc.name   : Eventfd2ConcurrentWrite_0077
 * @tc.desc   : eventfd2 concurrent write test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ConcurrentWrite_0077, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    const int threadCount = 4;
    ThreadArg args[threadCount] = {};
    pthread_t threads[threadCount] = {};
    for (int i = 0; i < threadCount; i++) {
        args[i].fd = fd;
        args[i].val = 1;
        args[i].count = WRITES_PER_THREAD;
        int pret = pthread_create(&threads[i], nullptr, ThreadWriteFunc, &args[i]);
        ASSERT_EQ(pret, 0);
    }

    for (int i = 0; i < threadCount; i++) {
        pthread_join(threads[i], nullptr);
    }

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(1000));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CC-03]: eventfd2 - 多线程并发read+write同一eventfd fd (P1)
 * 建议: pthread_create,半数线程read,半数线程write
 * 期望: 无崩溃,无死锁,数据一致
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7800
 * @tc.name   : Eventfd2ConcurrentReadWrite_0078
 * @tc.desc   : eventfd2 concurrent read-write test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ConcurrentReadWrite_0078, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    const int writerCount = 4;
    const int readerCount = 4;
    ThreadArg wargs[writerCount] = {};
    ThreadArg rargs[readerCount] = {};
    pthread_t wthreads[writerCount] = {};
    pthread_t rthreads[readerCount] = {};

    for (int i = 0; i < writerCount; i++) {
        wargs[i].fd = fd;
        wargs[i].val = 1;
        wargs[i].count = WRITES_PER_THREAD;
        int pret = pthread_create(&wthreads[i], nullptr, ThreadWriteFunc, &wargs[i]);
        ASSERT_EQ(pret, 0);
    }
    for (int i = 0; i < readerCount; i++) {
        rargs[i].fd = fd;
        rargs[i].count = WRITES_PER_THREAD;
        rargs[i].totalRead = 0;
        int pret = pthread_create(&rthreads[i], nullptr, ThreadReadFunc, &rargs[i]);
        ASSERT_EQ(pret, 0);
    }

    for (int i = 0; i < writerCount; i++) {
        pthread_join(wthreads[i], nullptr);
    }
    uint64_t totalRead = 0;
    for (int i = 0; i < readerCount; i++) {
        pthread_join(rthreads[i], nullptr);
        totalRead += rargs[i].totalRead;
    }

    uint64_t remaining = 0;
    errno = 0;
    ssize_t rret = read(fd, &remaining, sizeof(remaining));
    if (rret == static_cast<ssize_t>(sizeof(remaining))) {
        totalRead += remaining;
    }
    EXPECT_EQ(totalRead, static_cast<uint64_t>(1000));
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CC-04]: eventfd2 - fork后父子进程并发read/write (P1)
 * 建议: fork(),管道同步
 * 期望: 父子进程操作正确,计数器一致
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_7900
 * @tc.name   : Eventfd2ForkConcurrent_0079
 * @tc.desc   : eventfd2 fork concurrent access test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2ForkConcurrent_0079, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, 0);
    EXPECT_TRUE(fd > 0);

    int pipeFd[2] = {-1, -1};
    errno = 0;
    int pret = pipe(pipeFd);
    EXPECT_EQ(pret, 0);

    pid_t pid = fork();
    EXPECT_GE(pid, 0);
    if (pid == 0) {
        close(pipeFd[0]);
        uint64_t val = 50;
        write(fd, &val, sizeof(val));
        val = 30;
        write(fd, &val, sizeof(val));
        char c = 'X';
        write(pipeFd[1], &c, 1);
        close(pipeFd[1]);
        close(fd);
        _exit(0);
    }
    close(pipeFd[1]);
    char c = 0;
    read(pipeFd[0], &c, 1);
    close(pipeFd[0]);

    uint64_t rval = 0;
    errno = 0;
    ssize_t rret = read(fd, &rval, sizeof(rval));
    EXPECT_EQ(rret, static_cast<ssize_t>(sizeof(rval)));
    EXPECT_EQ(rval, static_cast<uint64_t>(80));

    int status = 0;
    waitpid(pid, &status, 0);
    close(fd);
}

/*
 * TestReportAnalysis 问题[#CC-05]: eventfd2 - 高频连续调用≥1000次验证无资源泄漏 (P1)
 * 建议: for循环≥1000次 create→close
 * 期望: 无fd泄漏,无内存泄漏
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_8000
 * @tc.name   : Eventfd2HighFrequency_0080
 * @tc.desc   : eventfd2 high frequency test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2HighFrequency_0080, Function | MediumTest | Level2)
{
    const int iterations = 1000;
    for (int i = 0; i < iterations; i++) {
        errno = 0;
        int fd = syscall(__NR_eventfd2, 1, EFD_NONBLOCK);
        if (fd < 0) {
            EXPECT_TRUE(fd > 0);
            break;
        }
        close(fd);
    }
}

/*
 * TestReportAnalysis 问题[#CC-06]: eventfd2 - 大规模并发≥64线程操作eventfd验证无崩溃 (P1)
 * 建议: pthread_create ≥64线程同时read/write
 * 期望: 无崩溃,无SIGSEGV,无死锁
 */
/*
 * @tc.number : SUB_KERNEL_SYSCALL_EVENTFD2_8100
 * @tc.name   : Eventfd2MassiveConcurrency_0081
 * @tc.desc   : eventfd2 massive concurrency test.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(HatsEventfd2Test, Eventfd2MassiveConcurrency_0081, Function | MediumTest | Level2)
{
    errno = 0;
    int fd = syscall(__NR_eventfd2, 0, EFD_NONBLOCK);
    EXPECT_TRUE(fd > 0);

    uint64_t wval = 1;
    errno = 0;
    ssize_t wret = write(fd, &wval, sizeof(wval));
    EXPECT_EQ(wret, static_cast<ssize_t>(sizeof(wval)));

    const int threadCount = 64;
    ThreadArg args[threadCount] = {};
    pthread_t threads[threadCount] = {};
    for (int i = 0; i < threadCount; i++) {
        args[i].fd = fd;
        args[i].count = MASSIVE_RW_PER_THREAD;
        if (i < threadCount / 2) {
            args[i].val = 1;
            int pret = pthread_create(&threads[i], nullptr, ThreadWriteFunc, &args[i]);
            ASSERT_EQ(pret, 0);
        } else {
            args[i].totalRead = 0;
            int pret = pthread_create(&threads[i], nullptr, ThreadReadFunc, &args[i]);
            ASSERT_EQ(pret, 0);
        }
    }

    for (int i = 0; i < threadCount; i++) {
        pthread_join(threads[i], nullptr);
    }
    close(fd);
}