Mmutouyuguoinit commit
d0bea0d8创建于 2025年4月29日历史提交
#include "test_file_lock.h"

#include <future>

FileLock FileLockUT::flk;
uint64_t FileLockUT::id = 0;

TEST_P(FileLockUT, TryLock)
{
    flk.TryGetFileLock(id, std::get<0>(GetParam()));
    bool succ = flk.TryGetFileLock(id, std::get<1>(GetParam()));
    EXPECT_EQ(succ, std::get<2>(GetParam()));
    flk.ReleaseFileLock(id, std::get<0>(GetParam()));
    if (succ) {
        flk.ReleaseFileLock(id, std::get<1>(GetParam()));
    }
}

TEST_P(FileLockUT, WaitLock)
{
    flk.WaitGetFileLock(id, std::get<0>(GetParam()));
    auto fut1 = std::async(std::launch::async, [&]() { flk.WaitGetFileLock(id, std::get<1>(GetParam())); });
    auto status = fut1.wait_for(std::chrono::milliseconds(100));

    EXPECT_EQ(status == std::future_status::ready, std::get<2>(GetParam()));
    flk.ReleaseFileLock(id, std::get<0>(GetParam()));
    fut1.wait();
    flk.ReleaseFileLock(id, std::get<1>(GetParam()));
}

TEST_F(FileLockUT, TestLocked)
{
    bool succ = flk.TestLocked(id, LockMode::S);
    EXPECT_EQ(succ, false);
    succ = flk.TestLocked(id, LockMode::X);
    EXPECT_EQ(succ, false);

    flk.TryGetFileLock(id, LockMode::S);
    succ = flk.TestLocked(id, LockMode::S);
    EXPECT_EQ(succ, false);
    succ = flk.TestLocked(id, LockMode::X);
    EXPECT_EQ(succ, true);
    flk.ReleaseFileLock(id, LockMode::S);

    flk.TryGetFileLock(id, LockMode::X);
    succ = flk.TestLocked(id, LockMode::S);
    EXPECT_EQ(succ, true);
    succ = flk.TestLocked(id, LockMode::X);
    EXPECT_EQ(succ, true);
    flk.ReleaseFileLock(id, LockMode::X);
}

INSTANTIATE_TEST_SUITE_P(FileLockSuite,
                         FileLockUT,
                         ::testing::Values(std::make_tuple(LockMode::S, LockMode::S, true),
                                           std::make_tuple(LockMode::S, LockMode::X, false),
                                           std::make_tuple(LockMode::X, LockMode::S, false),
                                           std::make_tuple(LockMode::X, LockMode::X, false)));

int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}