• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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