blob: 438b9290f8808eb7fc6510863460d2a17066cef2 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_TRANSPORT_MOCK_ACL_DATA_CHANNEL_H_
#define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_TRANSPORT_MOCK_ACL_DATA_CHANNEL_H_
#include "lib/inspect/cpp/vmo/types.h"
#include "src/connectivity/bluetooth/core/bt-host/transport/acl_data_channel.h"
namespace bt::hci::testing {
class MockAclDataChannel final : public AclDataChannel {
public:
MockAclDataChannel() = default;
~MockAclDataChannel() override = default;
void set_bredr_buffer_info(DataBufferInfo info) { bredr_buffer_info_ = info; }
void set_le_buffer_info(DataBufferInfo info) { le_buffer_info_ = info; }
using SendPacketsCallback = fit::function<bool(
LinkedList<ACLDataPacket> packets, UniqueChannelId channel_id, PacketPriority priority)>;
void set_send_packets_cb(SendPacketsCallback cb) { send_packets_cb_ = std::move(cb); }
using DropQueuedPacketsCallback = fit::function<void(AclPacketPredicate predicate)>;
void set_drop_queued_packets_cb(DropQueuedPacketsCallback cb) {
drop_queued_packets_cb_ = std::move(cb);
}
using RequestAclPriorityCallback =
fit::function<void(hci::AclPriority priority, hci_spec::ConnectionHandle handle,
fit::callback<void(fitx::result<fitx::failed>)> callback)>;
void set_request_acl_priority_cb(RequestAclPriorityCallback cb) {
request_acl_priority_cb_ = std::move(cb);
}
using SetBrEdrAutomaticFlushTimeoutCallback =
fit::function<void(zx::duration, hci_spec::ConnectionHandle, ResultCallback<>)>;
void set_set_bredr_automatic_flush_timeout_cb(SetBrEdrAutomaticFlushTimeoutCallback callback) {
flush_timeout_cb_ = std::move(callback);
}
void ReceivePacket(std::unique_ptr<ACLDataPacket> packet) {
ZX_ASSERT(data_rx_handler_);
data_rx_handler_(std::move(packet));
}
// AclDataChannel overrides:
void AttachInspect(inspect::Node& /*unused*/, const std::string& /*unused*/) override {}
void SetDataRxHandler(ACLPacketHandler rx_callback) override {
ZX_ASSERT(rx_callback);
data_rx_handler_ = std::move(rx_callback);
}
bool SendPacket(ACLDataPacketPtr data_packet, UniqueChannelId channel_id,
PacketPriority priority) override {
return false;
}
bool SendPackets(LinkedList<ACLDataPacket> packets, UniqueChannelId channel_id,
PacketPriority priority) override {
if (send_packets_cb_) {
return send_packets_cb_(std::move(packets), channel_id, priority);
}
return true;
}
void RegisterLink(hci_spec::ConnectionHandle handle, bt::LinkType ll_type) override {}
void UnregisterLink(hci_spec::ConnectionHandle handle) override {}
void DropQueuedPackets(AclPacketPredicate predicate) override {
if (drop_queued_packets_cb_) {
drop_queued_packets_cb_(std::move(predicate));
}
}
void ClearControllerPacketCount(hci_spec::ConnectionHandle handle) override {}
const DataBufferInfo& GetBufferInfo() const override { return bredr_buffer_info_; }
const DataBufferInfo& GetLeBufferInfo() const override { return le_buffer_info_; }
void RequestAclPriority(hci::AclPriority priority, hci_spec::ConnectionHandle handle,
fit::callback<void(fitx::result<fitx::failed>)> callback) override {
if (request_acl_priority_cb_) {
request_acl_priority_cb_(priority, handle, std::move(callback));
}
}
void SetBrEdrAutomaticFlushTimeout(zx::duration flush_timeout, hci_spec::ConnectionHandle handle,
ResultCallback<> callback) override {
if (flush_timeout_cb_) {
flush_timeout_cb_(flush_timeout, handle, std::move(callback));
}
}
private:
DataBufferInfo bredr_buffer_info_;
DataBufferInfo le_buffer_info_;
ACLPacketHandler data_rx_handler_;
SendPacketsCallback send_packets_cb_;
DropQueuedPacketsCallback drop_queued_packets_cb_;
RequestAclPriorityCallback request_acl_priority_cb_;
SetBrEdrAutomaticFlushTimeoutCallback flush_timeout_cb_;
};
} // namespace bt::hci::testing
#endif // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_TRANSPORT_MOCK_ACL_DATA_CHANNEL_H_