diff options
author | Hansong Zhang <hsz@google.com> | 2019-06-19 14:53:16 -0700 |
---|---|---|
committer | Hansong Zhang <hsz@google.com> | 2019-06-19 15:19:24 -0700 |
commit | 37b320cd5b9ced03254c987c60eb24caa2890a84 (patch) | |
tree | 36eab13d4ea411813a08695d26fe7da2a05d58eb /system/gd/os/linux_generic/queue_unittest.cc | |
parent | 1b0398a61c4908455f4a9d115f56fe2388d0044b (diff) |
OS Queue: Add Enqueue Buffer
Enqueue Buffer is a common interface to handle RegisterEnqueue() and
UnregisterEnqueue() according to current buffer size
Test: bluetooth_test_gd
Change-Id: I5b3ef749cd09f866a6c676af403ab6fa39d34701
Diffstat (limited to 'system/gd/os/linux_generic/queue_unittest.cc')
-rw-r--r-- | system/gd/os/linux_generic/queue_unittest.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/system/gd/os/linux_generic/queue_unittest.cc b/system/gd/os/linux_generic/queue_unittest.cc index 664b7703f7..542d16dd13 100644 --- a/system/gd/os/linux_generic/queue_unittest.cc +++ b/system/gd/os/linux_generic/queue_unittest.cc @@ -750,6 +750,85 @@ TEST_F(QueueDeathTest, die_if_enqueue_not_unregistered) { TEST_F(QueueDeathTest, die_if_dequeue_not_unregistered) { EXPECT_DEATH(RegisterDequeueAndDelete(), "equeue"); } + +class MockIQueueEnqueue : public IQueueEnqueue<int> { + public: + void RegisterEnqueue(Handler* handler, EnqueueCallback callback) override { + EXPECT_FALSE(registered_); + registered_ = true; + handler->Post(common::BindOnce(&MockIQueueEnqueue::handle_register_enqueue, common::Unretained(this), callback)); + } + + void handle_register_enqueue(EnqueueCallback callback) { + if (dont_handle_register_enqueue_) { + return; + } + while (registered_) { + std::unique_ptr<int> front = callback.Run(); + queue_.push(*front); + } + } + + void UnregisterEnqueue() override { + EXPECT_TRUE(registered_); + registered_ = false; + } + + bool dont_handle_register_enqueue_ = false; + bool registered_ = false; + std::queue<int> queue_; +}; + +class EnqueueBufferTest : public ::testing::Test { + protected: + void SetUp() override { + thread_ = new Thread("test_thread", Thread::Priority::NORMAL); + handler_ = new Handler(thread_); + } + + void TearDown() override { + handler_->Clear(); + delete handler_; + delete thread_; + } + + void SynchronizeHandler() { + std::promise<void> promise; + auto future = promise.get_future(); + handler_->Post(common::BindOnce([](std::promise<void> promise) { promise.set_value(); }, std::move(promise))); + future.wait(); + } + + MockIQueueEnqueue enqueue_; + EnqueueBuffer<int> enqueue_buffer_{&enqueue_}; + Thread* thread_; + Handler* handler_; +}; + +TEST_F(EnqueueBufferTest, enqueue) { + int num_items = 10; + for (int i = 0; i < num_items; i++) { + enqueue_buffer_.Enqueue(i, handler_); + } + SynchronizeHandler(); + for (int i = 0; i < num_items; i++) { + ASSERT_EQ(enqueue_.queue_.front(), i); + enqueue_.queue_.pop(); + } + ASSERT_FALSE(enqueue_.registered_); +} + +TEST_F(EnqueueBufferTest, clear) { + enqueue_.dont_handle_register_enqueue_ = true; + int num_items = 10; + for (int i = 0; i < num_items; i++) { + enqueue_buffer_.Enqueue(i, handler_); + } + ASSERT_TRUE(enqueue_.registered_); + enqueue_buffer_.Clear(); + ASSERT_FALSE(enqueue_.registered_); +} + } // namespace } // namespace os } // namespace bluetooth |