| 13 | using namespace std::chrono_literals; |
| 14 | |
| 15 | TEST(TestBoundedQueue, Normal) { |
| 16 | BoundedQueue<int> queue(4); |
| 17 | ASSERT_TRUE(queue.empty()); |
| 18 | |
| 19 | queue.enqueue(1); |
| 20 | queue.enqueue(2); |
| 21 | queue.enqueue(3); |
| 22 | queue.enqueue(4); |
| 23 | ASSERT_TRUE(queue.full()); |
| 24 | ASSERT_FALSE(queue.try_enqueue(5)); |
| 25 | |
| 26 | // 1. sync. |
| 27 | { |
| 28 | std::jthread dequeue([&] { |
| 29 | std::this_thread::sleep_for(100ms); |
| 30 | ASSERT_EQ(queue.dequeue(), 1); |
| 31 | }); |
| 32 | |
| 33 | auto start = std::chrono::steady_clock::now(); |
| 34 | queue.enqueue(5); |
| 35 | auto elapsed = std::chrono::steady_clock::now() - start; |
| 36 | ASSERT_LE(50ms, elapsed); |
| 37 | ASSERT_LE(elapsed, 150ms); |
| 38 | } |
| 39 | |
| 40 | // 2. async. |
| 41 | { |
| 42 | std::jthread dequeue([&] { |
| 43 | std::this_thread::sleep_for(100ms); |
| 44 | ASSERT_EQ(folly::coro::blockingWait(queue.co_dequeue()), 2); |
| 45 | }); |
| 46 | |
| 47 | auto start = std::chrono::steady_clock::now(); |
| 48 | folly::coro::blockingWait(queue.co_enqueue(6)); |
| 49 | auto elapsed = std::chrono::steady_clock::now() - start; |
| 50 | ASSERT_LE(50ms, elapsed); |
| 51 | ASSERT_LE(elapsed, 150ms); |
| 52 | } |
| 53 | |
| 54 | // 3. try enqueue/dequeue. |
| 55 | { |
| 56 | ASSERT_FALSE(queue.try_enqueue(7)); |
| 57 | ASSERT_EQ(queue.try_dequeue(), std::optional<int>{3}); |
| 58 | ASSERT_TRUE(queue.try_enqueue(7)); |
| 59 | |
| 60 | int value; |
| 61 | ASSERT_TRUE(queue.try_dequeue(value)); |
| 62 | ASSERT_EQ(value, 4); |
| 63 | |
| 64 | ASSERT_EQ(queue.size(), 3); |
| 65 | |
| 66 | queue.dequeue(value); |
| 67 | ASSERT_EQ(value, 5); |
| 68 | |
| 69 | folly::coro::blockingWait(queue.co_dequeue(value)); |
| 70 | ASSERT_EQ(value, 6); |
| 71 | |
| 72 | ASSERT_EQ(queue.try_dequeue(), std::optional<int>{7}); |
nothing calls this directly
no test coverage detected