blob: 9e9d1e27a1a4ee37350fa336c4aaefb595c001cc [file] [log] [blame]
// Copyright 2017 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.
#include "device_wrapper.h"
#include <gtest/gtest.h>
namespace bt::hci {
namespace {
TEST(HCI_DdkDeviceWrapperTest, NullVendorProto) {
bt_hci_protocol_t hci_proto = {};
DdkDeviceWrapper wrapper(hci_proto, std::nullopt);
EXPECT_EQ(wrapper.GetVendorFeatures(), 0u);
bt_vendor_params_t params = {};
EXPECT_TRUE(wrapper.EncodeVendorCommand(0, params).is_error());
}
constexpr bt_vendor_features_t kVendorFeatures = 1;
bt_vendor_features_t get_vendor_features(void* ctx) { return kVendorFeatures; }
TEST(HCI_DdkDeviceWrapperTest, GetVendorFeatures) {
bt_hci_protocol_t hci_proto = {};
bt_vendor_protocol_ops_t vendor_ops{.get_features = get_vendor_features};
bt_vendor_protocol_t vendor_proto = {.ops = &vendor_ops};
DdkDeviceWrapper wrapper(hci_proto, vendor_proto);
EXPECT_EQ(wrapper.GetVendorFeatures(), kVendorFeatures);
}
zx_status_t encode_command_error(void* ctx, bt_vendor_command_t command,
const bt_vendor_params_t* params, uint8_t* out_encoded_buffer,
size_t encoded_size, size_t* out_encoded_actual) {
return ZX_ERR_BUFFER_TOO_SMALL;
}
TEST(HCI_DdkDeviceWrapperTest, EncodeCommandError) {
bt_hci_protocol_t hci_proto = {};
bt_vendor_protocol_ops_t vendor_ops{.encode_command = encode_command_error};
bt_vendor_protocol_t vendor_proto = {.ops = &vendor_ops};
DdkDeviceWrapper wrapper(hci_proto, vendor_proto);
bt_vendor_params_t params = {};
EXPECT_TRUE(wrapper.EncodeVendorCommand(0, params).is_error());
}
zx_status_t encode_command_actual_size_0(void* ctx, bt_vendor_command_t command,
const bt_vendor_params_t* params,
uint8_t* out_encoded_buffer, size_t encoded_size,
size_t* out_encoded_actual) {
*out_encoded_actual = 0;
return ZX_OK;
}
TEST(HCI_DdkDeviceWrapperTest, EncodeCommandActualSizeZero) {
bt_hci_protocol_t hci_proto = {};
bt_vendor_protocol_ops_t vendor_ops{.encode_command = encode_command_actual_size_0};
bt_vendor_protocol_t vendor_proto = {.ops = &vendor_ops};
DdkDeviceWrapper wrapper(hci_proto, vendor_proto);
bt_vendor_params_t params = {};
EXPECT_TRUE(wrapper.EncodeVendorCommand(0, params).is_error());
}
zx_status_t encode_command_actual_size_too_large(void* ctx, bt_vendor_command_t command,
const bt_vendor_params_t* params,
uint8_t* out_encoded_buffer, size_t encoded_size,
size_t* out_encoded_actual) {
*out_encoded_actual = BT_VENDOR_MAX_COMMAND_BUFFER_LEN + 1;
return ZX_OK;
}
TEST(HCI_DdkDeviceWrapperTest, EncodeCommandActualSizeTooLarge) {
bt_hci_protocol_t hci_proto = {};
bt_vendor_protocol_ops_t vendor_ops{.encode_command = encode_command_actual_size_too_large};
bt_vendor_protocol_t vendor_proto = {.ops = &vendor_ops};
DdkDeviceWrapper wrapper(hci_proto, vendor_proto);
bt_vendor_params_t params = {};
EXPECT_TRUE(wrapper.EncodeVendorCommand(0, params).is_error());
}
zx_status_t encode_command_success(void* ctx, bt_vendor_command_t command,
const bt_vendor_params_t* params, uint8_t* out_encoded_buffer,
size_t encoded_size, size_t* out_encoded_actual) {
*out_encoded_actual = 1;
static_cast<uint8_t*>(out_encoded_buffer)[0] = 1;
return ZX_OK;
}
TEST(HCI_DdkDeviceWrapperTest, EncodeCommandSuccess) {
bt_hci_protocol_t hci_proto = {};
bt_vendor_protocol_ops_t vendor_ops{.encode_command = encode_command_success};
bt_vendor_protocol_t vendor_proto = {.ops = &vendor_ops};
DdkDeviceWrapper wrapper(hci_proto, vendor_proto);
bt_vendor_params_t params = {};
auto result = wrapper.EncodeVendorCommand(0, params);
ASSERT_TRUE(result.is_ok());
ASSERT_EQ(result.value().size(), 1u);
EXPECT_EQ(result.value()[0], 0x01);
}
} // namespace
} // namespace bt::hci