1 /* 2 * Copyright 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <unistd.h> 20 21 #include <functional> 22 #include <mutex> 23 #include <queue> 24 25 #include "common/bidi_queue.h" 26 #include "common/bind.h" 27 #include "common/callback.h" 28 #include "os/handler.h" 29 #include "os/queue.h" 30 31 namespace bluetooth { 32 namespace os { 33 34 template <typename T> 35 class MockIQueueEnqueue : public IQueueEnqueue<T> { 36 public: 37 using EnqueueCallback = common::Callback<std::unique_ptr<T>()>; 38 RegisterEnqueue(Handler * handler,EnqueueCallback callback)39 virtual void RegisterEnqueue(Handler* handler, EnqueueCallback callback) { 40 log::assert_that(registered_handler == nullptr, "assert failed: registered_handler == nullptr"); 41 registered_handler = handler; 42 registered_enqueue_callback = callback; 43 } 44 UnregisterEnqueue()45 virtual void UnregisterEnqueue() { 46 log::assert_that(registered_handler != nullptr, "assert failed: registered_handler != nullptr"); 47 registered_handler = nullptr; 48 registered_enqueue_callback = {}; 49 } 50 51 void run_enqueue(unsigned times = 1) { 52 while (registered_handler != nullptr && times > 0) { 53 times--; 54 enqueued.push(registered_enqueue_callback.Run()); 55 } 56 } 57 58 Handler* registered_handler = nullptr; 59 EnqueueCallback registered_enqueue_callback = {}; 60 std::queue<std::unique_ptr<T>> enqueued = {}; 61 }; 62 63 template <typename T> 64 class MockIQueueDequeue : public IQueueDequeue<T> { 65 public: 66 using DequeueCallback = common::Callback<void()>; 67 RegisterDequeue(Handler * handler,DequeueCallback callback)68 virtual void RegisterDequeue(Handler* handler, DequeueCallback callback) { 69 log::assert_that(registered_handler == nullptr, "assert failed: registered_handler == nullptr"); 70 registered_handler = handler; 71 registered_dequeue_callback = callback; 72 } 73 UnregisterDequeue()74 virtual void UnregisterDequeue() { 75 log::assert_that(registered_handler != nullptr, "assert failed: registered_handler != nullptr"); 76 registered_handler = nullptr; 77 registered_dequeue_callback = {}; 78 } 79 TryDequeue()80 virtual std::unique_ptr<T> TryDequeue() { 81 std::unique_ptr<T> front = std::move(enqueued.front()); 82 enqueued.pop(); 83 return front; 84 } 85 86 void run_dequeue(unsigned times = 1) { 87 while (registered_handler != nullptr && times > 0) { 88 times--; 89 registered_dequeue_callback.Run(); 90 } 91 } 92 93 Handler* registered_handler = nullptr; 94 DequeueCallback registered_dequeue_callback = {}; 95 std::queue<std::unique_ptr<T>> enqueued = {}; 96 }; 97 98 } // namespace os 99 } // namespace bluetooth 100