| 26 | } |
| 27 | |
| 28 | void FirstInFirstOut(size_t queue_cap, |
| 29 | size_t elem_num, |
| 30 | size_t send_time_gap, |
| 31 | size_t receive_time_gap) { |
| 32 | BlockingQueue<size_t> q(queue_cap); |
| 33 | std::thread sender([&]() { |
| 34 | for (size_t i = 0; i < elem_num; ++i) { |
| 35 | std::this_thread::sleep_for(std::chrono::milliseconds(send_time_gap)); |
| 36 | EXPECT_TRUE(q.Send(i)); |
| 37 | } |
| 38 | q.Close(); |
| 39 | }); |
| 40 | size_t count = 0; |
| 41 | while (true) { |
| 42 | std::this_thread::sleep_for(std::chrono::milliseconds(receive_time_gap)); |
| 43 | size_t elem = 0; |
| 44 | if (!q.Receive(&elem)) { |
| 45 | break; |
| 46 | } |
| 47 | EXPECT_EQ(elem, count++); |
| 48 | } |
| 49 | sender.join(); |
| 50 | EXPECT_EQ(count, elem_num); |
| 51 | EXPECT_TRUE(q.IsClosed()); |
| 52 | } |
| 53 | |
| 54 | TEST(BlockingQueue, FirstInFirstOutTest) { |
| 55 | FirstInFirstOut(2, 5, 2, 50); |