blob: fbbf1dbadac02fe73b081aa0ea79ce223d353011 [file] [log] [blame]
// Copyright 2023 The Pigweed Authors
//
// 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
//
// https://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 "pw_bluetooth_sapphire/internal/host/gap/android_vendor_capabilities.h"
#include "pw_bluetooth_sapphire/internal/host/hci-spec/constants.h"
#include "pw_bluetooth_sapphire/internal/host/hci-spec/vendor_protocol.h"
#include "pw_bluetooth_sapphire/internal/host/transport/emboss_control_packets.h"
#include "pw_unit_test/framework.h"
namespace bt::gap {
namespace {
class AndroidVendorCapabilitiesTest : public ::testing::Test {
public:
void SetUp() override {
bt::StaticPacket<pw::bluetooth::vendor::android_hci::
LEGetVendorCapabilitiesCommandCompleteEventWriter>
params;
params.SetToZeros();
params.view().status().Write(pw::bluetooth::emboss::StatusCode::SUCCESS);
// select values other than the zero value to ensure the results of
// std::memset don't propagate
params.view().max_advt_instances().Write(1);
params.view().offloaded_resolution_of_private_address().Write(
pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
params.view().total_scan_results_storage().Write(2);
params.view().max_irk_list_sz().Write(3);
params.view().filtering_support().Write(
pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
params.view().max_filter().Write(4);
params.view().activity_energy_info_support().Write(
pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
params.view().version_supported().major_number().Write(5);
params.view().version_supported().minor_number().Write(6);
params.view().total_num_of_advt_tracked().Write(7);
params.view().extended_scan_support().Write(
pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
params.view().debug_logging_supported().Write(
pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
params.view().le_address_generation_offloading_support().Write(
pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
params.view()
.a2dp_source_offload_capability_mask()
.BackingStorage()
.WriteUInt(8);
params.view().bluetooth_quality_report_support().Write(
pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
params.view().dynamic_audio_buffer_support().sbc().Write(true);
params.view().dynamic_audio_buffer_support().aptx_hd().Write(true);
vendor_capabilities_.Initialize(params.view());
}
protected:
AndroidVendorCapabilities& vendor_capabilities() {
return vendor_capabilities_;
}
private:
AndroidVendorCapabilities vendor_capabilities_;
};
TEST_F(AndroidVendorCapabilitiesTest, CorrectExtraction) {
EXPECT_TRUE(vendor_capabilities().IsInitialized());
EXPECT_EQ(1u, vendor_capabilities().max_simultaneous_advertisements());
EXPECT_EQ(true, vendor_capabilities().supports_offloaded_rpa());
EXPECT_EQ(2u, vendor_capabilities().scan_results_storage_bytes());
EXPECT_EQ(3u, vendor_capabilities().irk_list_size());
EXPECT_EQ(true, vendor_capabilities().supports_filtering());
EXPECT_EQ(4u, vendor_capabilities().max_filters());
EXPECT_EQ(true, vendor_capabilities().supports_activity_energy_info());
EXPECT_EQ(5u, vendor_capabilities().version_major());
EXPECT_EQ(6u, vendor_capabilities().version_minor());
EXPECT_EQ(7u, vendor_capabilities().max_advertisers_tracked());
EXPECT_EQ(true, vendor_capabilities().supports_extended_scan());
EXPECT_EQ(true, vendor_capabilities().supports_debug_logging());
EXPECT_EQ(true,
vendor_capabilities().supports_offloading_le_address_generation());
EXPECT_EQ(8u, vendor_capabilities().a2dp_source_offload_capability_mask());
EXPECT_EQ(true, vendor_capabilities().supports_bluetooth_quality_report());
EXPECT_EQ(9u, vendor_capabilities().supports_dynamic_audio_buffer());
}
TEST_F(AndroidVendorCapabilitiesTest, InitializeFailure) {
EXPECT_TRUE(vendor_capabilities().IsInitialized());
bt::StaticPacket<pw::bluetooth::vendor::android_hci::
LEGetVendorCapabilitiesCommandCompleteEventWriter>
params;
params.SetToZeros();
params.view().status().Write(
pw::bluetooth::emboss::StatusCode::UNKNOWN_COMMAND);
vendor_capabilities().Initialize(params.view());
EXPECT_FALSE(vendor_capabilities().IsInitialized());
}
} // namespace
} // namespace bt::gap