mirror of
https://github.com/deepseek-ai/3FS
synced 2025-06-26 18:16:45 +00:00
Initial commit
This commit is contained in:
79
tests/common/utils/TestBoundedQueue.cc
Normal file
79
tests/common/utils/TestBoundedQueue.cc
Normal file
@@ -0,0 +1,79 @@
|
||||
#include <chrono>
|
||||
#include <folly/experimental/coro/BlockingWait.h>
|
||||
#include <folly/experimental/coro/GtestHelpers.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <thread>
|
||||
|
||||
#include "common/utils/BoundedQueue.h"
|
||||
#include "common/utils/Coroutine.h"
|
||||
|
||||
namespace hf3fs::test {
|
||||
namespace {
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
TEST(TestBoundedQueue, Normal) {
|
||||
BoundedQueue<int> queue(4);
|
||||
ASSERT_TRUE(queue.empty());
|
||||
|
||||
queue.enqueue(1);
|
||||
queue.enqueue(2);
|
||||
queue.enqueue(3);
|
||||
queue.enqueue(4);
|
||||
ASSERT_TRUE(queue.full());
|
||||
ASSERT_FALSE(queue.try_enqueue(5));
|
||||
|
||||
// 1. sync.
|
||||
{
|
||||
std::jthread dequeue([&] {
|
||||
std::this_thread::sleep_for(100ms);
|
||||
ASSERT_EQ(queue.dequeue(), 1);
|
||||
});
|
||||
|
||||
auto start = std::chrono::steady_clock::now();
|
||||
queue.enqueue(5);
|
||||
auto elapsed = std::chrono::steady_clock::now() - start;
|
||||
ASSERT_LE(50ms, elapsed);
|
||||
ASSERT_LE(elapsed, 150ms);
|
||||
}
|
||||
|
||||
// 2. async.
|
||||
{
|
||||
std::jthread dequeue([&] {
|
||||
std::this_thread::sleep_for(100ms);
|
||||
ASSERT_EQ(folly::coro::blockingWait(queue.co_dequeue()), 2);
|
||||
});
|
||||
|
||||
auto start = std::chrono::steady_clock::now();
|
||||
folly::coro::blockingWait(queue.co_enqueue(6));
|
||||
auto elapsed = std::chrono::steady_clock::now() - start;
|
||||
ASSERT_LE(50ms, elapsed);
|
||||
ASSERT_LE(elapsed, 150ms);
|
||||
}
|
||||
|
||||
// 3. try enqueue/dequeue.
|
||||
{
|
||||
ASSERT_FALSE(queue.try_enqueue(7));
|
||||
ASSERT_EQ(queue.try_dequeue(), std::optional<int>{3});
|
||||
ASSERT_TRUE(queue.try_enqueue(7));
|
||||
|
||||
int value;
|
||||
ASSERT_TRUE(queue.try_dequeue(value));
|
||||
ASSERT_EQ(value, 4);
|
||||
|
||||
ASSERT_EQ(queue.size(), 3);
|
||||
|
||||
queue.dequeue(value);
|
||||
ASSERT_EQ(value, 5);
|
||||
|
||||
folly::coro::blockingWait(queue.co_dequeue(value));
|
||||
ASSERT_EQ(value, 6);
|
||||
|
||||
ASSERT_EQ(queue.try_dequeue(), std::optional<int>{7});
|
||||
ASSERT_EQ(queue.try_dequeue(), std::optional<int>{});
|
||||
ASSERT_FALSE(queue.try_dequeue());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace hf3fs::test
|
||||
Reference in New Issue
Block a user