1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_bluetooth_sapphire/internal/host/gap/android_vendor_capabilities.h"
16
17 #include "pw_bluetooth_sapphire/internal/host/hci-spec/constants.h"
18 #include "pw_bluetooth_sapphire/internal/host/hci-spec/vendor_protocol.h"
19 #include "pw_bluetooth_sapphire/internal/host/transport/emboss_control_packets.h"
20 #include "pw_unit_test/framework.h"
21
22 namespace bt::gap {
23 namespace {
24
25 class AndroidVendorCapabilitiesTest : public ::testing::Test {
26 public:
SetUp()27 void SetUp() override {
28 bt::StaticPacket<pw::bluetooth::vendor::android_hci::
29 LEGetVendorCapabilitiesCommandCompleteEventWriter>
30 params;
31 params.SetToZeros();
32 params.view().status().Write(pw::bluetooth::emboss::StatusCode::SUCCESS);
33
34 // select values other than the zero value to ensure the results of
35 // std::memset don't propagate
36 params.view().max_advt_instances().Write(1);
37 params.view().offloaded_resolution_of_private_address().Write(
38 pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
39 params.view().total_scan_results_storage().Write(2);
40 params.view().max_irk_list_sz().Write(3);
41 params.view().filtering_support().Write(
42 pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
43 params.view().max_filter().Write(4);
44 params.view().activity_energy_info_support().Write(
45 pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
46 params.view().version_supported().major_number().Write(5);
47 params.view().version_supported().minor_number().Write(6);
48 params.view().total_num_of_advt_tracked().Write(7);
49 params.view().extended_scan_support().Write(
50 pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
51 params.view().debug_logging_supported().Write(
52 pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
53 params.view().le_address_generation_offloading_support().Write(
54 pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
55 params.view()
56 .a2dp_source_offload_capability_mask()
57 .BackingStorage()
58 .WriteUInt(8);
59 params.view().bluetooth_quality_report_support().Write(
60 pw::bluetooth::vendor::android_hci::Capability::CAPABLE);
61 params.view().dynamic_audio_buffer_support().sbc().Write(true);
62 params.view().dynamic_audio_buffer_support().aptx_hd().Write(true);
63
64 vendor_capabilities_.Initialize(params.view());
65 }
66
67 protected:
vendor_capabilities()68 AndroidVendorCapabilities& vendor_capabilities() {
69 return vendor_capabilities_;
70 }
71
72 private:
73 AndroidVendorCapabilities vendor_capabilities_;
74 };
75
TEST_F(AndroidVendorCapabilitiesTest,CorrectExtraction)76 TEST_F(AndroidVendorCapabilitiesTest, CorrectExtraction) {
77 EXPECT_TRUE(vendor_capabilities().IsInitialized());
78
79 EXPECT_EQ(1u, vendor_capabilities().max_simultaneous_advertisements());
80 EXPECT_EQ(true, vendor_capabilities().supports_offloaded_rpa());
81 EXPECT_EQ(2u, vendor_capabilities().scan_results_storage_bytes());
82 EXPECT_EQ(3u, vendor_capabilities().irk_list_size());
83 EXPECT_EQ(true, vendor_capabilities().supports_filtering());
84 EXPECT_EQ(4u, vendor_capabilities().max_filters());
85 EXPECT_EQ(true, vendor_capabilities().supports_activity_energy_info());
86 EXPECT_EQ(5u, vendor_capabilities().version_major());
87 EXPECT_EQ(6u, vendor_capabilities().version_minor());
88 EXPECT_EQ(7u, vendor_capabilities().max_advertisers_tracked());
89 EXPECT_EQ(true, vendor_capabilities().supports_extended_scan());
90 EXPECT_EQ(true, vendor_capabilities().supports_debug_logging());
91 EXPECT_EQ(true,
92 vendor_capabilities().supports_offloading_le_address_generation());
93 EXPECT_EQ(8u, vendor_capabilities().a2dp_source_offload_capability_mask());
94 EXPECT_EQ(true, vendor_capabilities().supports_bluetooth_quality_report());
95 EXPECT_EQ(9u, vendor_capabilities().supports_dynamic_audio_buffer());
96 }
97
TEST_F(AndroidVendorCapabilitiesTest,InitializeFailure)98 TEST_F(AndroidVendorCapabilitiesTest, InitializeFailure) {
99 EXPECT_TRUE(vendor_capabilities().IsInitialized());
100
101 bt::StaticPacket<pw::bluetooth::vendor::android_hci::
102 LEGetVendorCapabilitiesCommandCompleteEventWriter>
103 params;
104 params.SetToZeros();
105 params.view().status().Write(
106 pw::bluetooth::emboss::StatusCode::UNKNOWN_COMMAND);
107 vendor_capabilities().Initialize(params.view());
108
109 EXPECT_FALSE(vendor_capabilities().IsInitialized());
110 }
111
112 } // namespace
113 } // namespace bt::gap
114