blob: 6855feab04edb125c413dbd58032ce765f457e72 [file] [log] [blame]
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <base/logging.h>
#include <gtest/gtest.h>
#include <stdint.h>
#include "common/message_loop_thread.h"
#include "hci/src/hci_layer.cc"
#include "hci_internals.h"
#include "osi/include/allocator.h"
#include "osi/include/osi.h"
#include "osi/test/AllocationTestHarness.h"
#include "osi/test/test_stubs.h"
#include "stack/include/bt_types.h"
#include "stack/include/hcidefs.h"
extern void allocation_tracker_uninit(void);
allocator_t buffer_allocator_ = {
.alloc = osi_malloc,
.free = osi_free,
};
void monitor_socket(int ctrl_fd, int fd) {
LOG(INFO) << __func__ << " UNIMPLEMENTED";
}
void hci_initialize() { LOG(INFO) << __func__ << " UNIMPLEMENTED"; }
void hci_close() { LOG(INFO) << __func__ << " UNIMPLEMENTED"; }
void hci_transmit(BT_HDR* packet) { LOG(INFO) << __func__ << " UNIMPLEMENTED"; }
int hci_open_firmware_log_file() { return INVALID_FD; }
void hci_close_firmware_log_file(int fd) {}
void hci_log_firmware_debug_packet(int fd, BT_HDR* packet) {}
const allocator_t* buffer_allocator_get_interface() {
return &buffer_allocator_;
}
/**
* Test class to test selected functionality in hci/src/hci_layer.cc
*/
class HciLayerTest : public AllocationTestHarness {
protected:
void SetUp() override {
AllocationTestHarness::SetUp();
// Disable our allocation tracker to allow ASAN full range
allocation_tracker_uninit();
commands_pending_response = list_new(NULL);
buffer_allocator = &buffer_allocator_;
}
void TearDown() override {
list_free(commands_pending_response);
AllocationTestHarness::TearDown();
}
BT_HDR* AllocateHciEventPacket(size_t packet_length) const {
return AllocatePacket(packet_length, MSG_HC_TO_STACK_HCI_EVT);
}
uint8_t* GetPayloadPointer(BT_HDR* packet) const {
return static_cast<uint8_t*>(packet->data);
}
private:
BT_HDR* AllocatePacket(size_t packet_length, uint16_t event) const {
BT_HDR* packet =
static_cast<BT_HDR*>(osi_calloc(sizeof(BT_HDR) + packet_length));
packet->offset = 0;
packet->len = packet_length;
packet->layer_specific = 0;
packet->event = MSG_HC_TO_STACK_HCI_EVT;
return packet;
}
};
TEST_F(HciLayerTest, FilterIncomingEvent) {
{
BT_HDR* packet = AllocateHciEventPacket(3);
auto p = GetPayloadPointer(packet);
*p++ = HCI_COMMAND_STATUS_EVT;
*p++ = 0x0; // length
CHECK(filter_incoming_event(packet));
}
{
BT_HDR* packet = AllocateHciEventPacket(3);
auto p = GetPayloadPointer(packet);
*p++ = HCI_COMMAND_STATUS_EVT;
*p++ = 0x1; // length
*p++ = 0xff;
CHECK(filter_incoming_event(packet));
}
{
BT_HDR* packet = AllocateHciEventPacket(6);
auto p = GetPayloadPointer(packet);
*p++ = HCI_COMMAND_STATUS_EVT;
*p++ = 0x04; // length
*p++ = 0x00; // status
*p++ = 0x01; // credits
*p++ = 0x34; // opcode0
*p++ = 0x12; // opcode1
CHECK(filter_incoming_event(packet));
}
}