• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include <gmock/gmock.h>
17 #include <gtest/gtest.h>
18 #include <stdlib.h>
19 
20 #include <cstddef>
21 
22 #include "btif/include/btif_storage.h"
23 #include "btif/include/stack_manager_t.h"
24 #include "device/include/interop.h"
25 #include "device/include/interop_config.h"
26 #include "mock_btif_config.h"
27 #include "osi/include/allocator.h"
28 #include "profile/avrcp/avrcp_config.h"
29 #include "stack/include/avrc_api.h"
30 #include "stack/include/avrc_defs.h"
31 #include "stack/include/bt_types.h"
32 #include "stack/include/bt_uuid16.h"
33 #include "stack/sdp/sdpint.h"
34 #include "test/fake/fake_osi.h"
35 #include "test/mock/mock_btif_config.h"
36 #include "test/mock/mock_osi_allocator.h"
37 #include "test/mock/mock_osi_properties.h"
38 #include "test/mock/mock_stack_l2cap_interface.h"
39 
40 #ifndef BT_DEFAULT_BUFFER_SIZE
41 #define BT_DEFAULT_BUFFER_SIZE (4096 + 16)
42 #endif
43 
44 #define INVALID_LENGTH 5
45 #define INVALID_UUID 0X1F
46 #define UUID_HF_LSB 0X1E
47 
48 #define PROFILE_VERSION_POSITION 7
49 #define SDP_PROFILE_DESC_LENGTH 8
50 #define HFP_PROFILE_MINOR_VERSION_6 0x06
51 #define HFP_PROFILE_MINOR_VERSION_7 0x07
52 
53 static int L2CA_ConnectReqWithSecurity_cid = 0x42;
54 static RawAddress addr = RawAddress({0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6});
55 static tSDP_DISCOVERY_DB* sdp_db = nullptr;
56 
57 using ::testing::_;
58 using ::testing::DoAll;
59 using ::testing::Invoke;
60 using ::testing::Return;
61 using ::testing::ReturnArg;
62 using ::testing::SaveArg;
63 using ::testing::SetArrayArgument;
64 
65 namespace {
66 // convenience mock
67 class IopMock {
68 public:
69   MOCK_METHOD(bool, InteropMatchAddr, (const interop_feature_t, const RawAddress*));
70   MOCK_METHOD(bool, InteropMatchName, (const interop_feature_t, const char*));
71   MOCK_METHOD(void, InteropDatabaseAdd, (uint16_t, const RawAddress*, size_t));
72   MOCK_METHOD(void, InteropDatabaseClear, ());
73   MOCK_METHOD(bool, InteropMatchAddrOrName,
74               (const interop_feature_t, const RawAddress*,
75                bt_status_t (*)(const RawAddress*, bt_property_t*)));
76   MOCK_METHOD(bool, InteropMatchManufacturer, (const interop_feature_t, uint16_t));
77   MOCK_METHOD(bool, InteropMatchVendorProductIds, (const interop_feature_t, uint16_t, uint16_t));
78   MOCK_METHOD(bool, InteropDatabaseMatchVersion, (const interop_feature_t, uint16_t));
79   MOCK_METHOD(bool, InteropMatchAddrGetMaxLat,
80               (const interop_feature_t, const RawAddress*, uint16_t*));
81   MOCK_METHOD(bool, InteropGetAllowlistedMediaPlayersList, (list_t*));
82   MOCK_METHOD(int, InteropFeatureNameToFeatureId, (const char*));
83   MOCK_METHOD(void, InteropDatabaseAddAddr, (uint16_t, const RawAddress*, size_t));
84 };
85 
86 class AvrcpVersionMock {
87 public:
88   MOCK_METHOD0(AvrcpProfileVersionMock, uint16_t(void));
89 };
90 
91 std::unique_ptr<IopMock> localIopMock;
92 std::unique_ptr<AvrcpVersionMock> localAvrcpVersionMock;
93 }  // namespace
94 
interop_match_addr(const interop_feature_t feature,const RawAddress * addr)95 bool interop_match_addr(const interop_feature_t feature, const RawAddress* addr) {
96   return localIopMock->InteropMatchAddr(feature, addr);
97 }
interop_match_name(const interop_feature_t feature,const char * name)98 bool interop_match_name(const interop_feature_t feature, const char* name) {
99   return localIopMock->InteropMatchName(feature, name);
100 }
interop_database_add(uint16_t feature,const RawAddress * addr,size_t length)101 void interop_database_add(uint16_t feature, const RawAddress* addr, size_t length) {
102   return localIopMock->InteropDatabaseAdd(feature, addr, length);
103 }
interop_database_clear()104 void interop_database_clear() { localIopMock->InteropDatabaseClear(); }
105 
interop_match_addr_or_name(const interop_feature_t feature,const RawAddress * addr,bt_status_t (* get_remote_device_property)(const RawAddress *,bt_property_t *))106 bool interop_match_addr_or_name(const interop_feature_t feature, const RawAddress* addr,
107                                 bt_status_t (*get_remote_device_property)(const RawAddress*,
108                                                                           bt_property_t*)) {
109   return localIopMock->InteropMatchAddrOrName(feature, addr, get_remote_device_property);
110 }
111 
interop_match_manufacturer(const interop_feature_t feature,uint16_t manufacturer)112 bool interop_match_manufacturer(const interop_feature_t feature, uint16_t manufacturer) {
113   return localIopMock->InteropMatchManufacturer(feature, manufacturer);
114 }
115 
interop_match_vendor_product_ids(const interop_feature_t feature,uint16_t vendor_id,uint16_t product_id)116 bool interop_match_vendor_product_ids(const interop_feature_t feature, uint16_t vendor_id,
117                                       uint16_t product_id) {
118   return localIopMock->InteropMatchVendorProductIds(feature, vendor_id, product_id);
119 }
120 
interop_database_match_version(const interop_feature_t feature,uint16_t version)121 bool interop_database_match_version(const interop_feature_t feature, uint16_t version) {
122   return localIopMock->InteropDatabaseMatchVersion(feature, version);
123 }
interop_match_addr_get_max_lat(const interop_feature_t feature,const RawAddress * addr,uint16_t * max_lat)124 bool interop_match_addr_get_max_lat(const interop_feature_t feature, const RawAddress* addr,
125                                     uint16_t* max_lat) {
126   return localIopMock->InteropMatchAddrGetMaxLat(feature, addr, max_lat);
127 }
128 
interop_feature_name_to_feature_id(const char * feature_name)129 int interop_feature_name_to_feature_id(const char* feature_name) {
130   return localIopMock->InteropFeatureNameToFeatureId(feature_name);
131 }
132 
interop_database_add_addr(uint16_t feature,const RawAddress * addr,size_t length)133 void interop_database_add_addr(uint16_t feature, const RawAddress* addr, size_t length) {
134   return localIopMock->InteropDatabaseAddAddr(feature, addr, length);
135 }
136 
AVRC_GetProfileVersion()137 uint16_t AVRC_GetProfileVersion() { return localAvrcpVersionMock->AvrcpProfileVersionMock(); }
138 
139 uint8_t avrc_value[8] = {
140         ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE),  // data_element
141         6,                                                    // data_len
142         ((UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES),             // uuid_element
143         0,                                                    // uuid
144         0,                                                    // uuid
145         ((UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES),             // version_element
146         0,                                                    // version
147         0                                                     // version
148 };
149 tSDP_ATTRIBUTE avrcp_attr = {
150         .len = 0,
151         .value_ptr = (uint8_t*)(&avrc_value),
152         .id = 0,
153         .type = 0,
154 };
155 
156 uint8_t avrc_feat_value[2] = {
157         0,  // feature
158         0   // feature
159 };
160 tSDP_ATTRIBUTE avrcp_feat_attr = {
161         .len = 0,
162         .value_ptr = (uint8_t*)(&avrc_feat_value),
163         .id = 0,
164         .type = 0,
165 };
166 
167 uint8_t hfp_value[8] = {0, 0, 0, 0x11, 0x1E, 0, 0, 0};
168 
169 tSDP_ATTRIBUTE hfp_attr = {
170         .len = 0,
171         .value_ptr = (uint8_t*)(hfp_value),
172         .id = 0,
173         .type = 0,
174 };
175 
set_hfp_attr(uint32_t len,uint16_t id,uint16_t uuid)176 static void set_hfp_attr(uint32_t len, uint16_t id, uint16_t uuid) {
177   hfp_attr.value_ptr[4] = uuid;
178   hfp_attr.len = len;
179   hfp_attr.id = id;
180 }
181 
set_avrcp_feat_attr(uint32_t len,uint16_t id,uint16_t feature)182 static void set_avrcp_feat_attr(uint32_t len, uint16_t id, uint16_t feature) {
183   UINT16_TO_BE_FIELD(avrc_feat_value, feature);
184   avrcp_feat_attr.len = len;
185   avrcp_feat_attr.id = id;
186 }
187 
set_avrcp_attr(uint32_t len,uint16_t id,uint16_t uuid,uint16_t version)188 static void set_avrcp_attr(uint32_t len, uint16_t id, uint16_t uuid, uint16_t version) {
189   UINT16_TO_BE_FIELD(avrc_value + 3, uuid);
190   UINT16_TO_BE_FIELD(avrc_value + 6, version);
191   avrcp_attr.len = len;
192   avrcp_attr.id = id;
193 }
194 
get_avrc_target_version(tSDP_ATTRIBUTE * p_attr)195 static uint16_t get_avrc_target_version(tSDP_ATTRIBUTE* p_attr) {
196   uint8_t* p_version = p_attr->value_ptr + 6;
197   uint16_t version = (((uint16_t)(*(p_version))) << 8) + ((uint16_t)(*((p_version) + 1)));
198   return version;
199 }
200 
get_avrc_target_feature(tSDP_ATTRIBUTE * p_attr)201 static uint16_t get_avrc_target_feature(tSDP_ATTRIBUTE* p_attr) {
202   uint8_t* p_feature = p_attr->value_ptr;
203   uint16_t feature = (((uint16_t)(*(p_feature))) << 8) + ((uint16_t)(*((p_feature) + 1)));
204   return feature;
205 }
206 
207 class StackSdpMockAndFakeTest : public ::testing::Test {
208 protected:
SetUp()209   void SetUp() override {
210     fake_osi_ = std::make_unique<test::fake::FakeOsi>();
211     bluetooth::testing::stack::l2cap::set_interface(&mock_stack_l2cap_interface_);
212     EXPECT_CALL(mock_stack_l2cap_interface_, L2CA_RegisterWithSecurity(_, _, _, _, _, _, _))
213             .WillOnce(DoAll(SaveArg<1>(&l2cap_callbacks_), ::testing::ReturnArg<0>()));
214     EXPECT_CALL(mock_stack_l2cap_interface_, L2CA_Deregister(_));
215   }
216 
TearDown()217   void TearDown() override {
218     bluetooth::testing::stack::l2cap::reset_interface();
219     fake_osi_.reset();
220   }
221 
222   tL2CAP_APPL_INFO l2cap_callbacks_{};
223   bluetooth::testing::stack::l2cap::Mock mock_stack_l2cap_interface_;
224   std::unique_ptr<test::fake::FakeOsi> fake_osi_;
225 };
226 
227 class StackSdpInitTest : public StackSdpMockAndFakeTest {
228 protected:
SetUp()229   void SetUp() override {
230     StackSdpMockAndFakeTest::SetUp();
231     sdp_init();
232     sdp_db = (tSDP_DISCOVERY_DB*)osi_malloc(BT_DEFAULT_BUFFER_SIZE);
233   }
234 
TearDown()235   void TearDown() override {
236     osi_free(sdp_db);
237     sdp_free();
238     StackSdpMockAndFakeTest::TearDown();
239   }
240 };
241 
242 class StackSdpUtilsTest : public StackSdpInitTest {
243 protected:
SetUp()244   void SetUp() override {
245     StackSdpInitTest::SetUp();
246     GetInterfaceToProfiles()->profileSpecific_HACK->AVRC_GetProfileVersion = AVRC_GetProfileVersion;
247     test::mock::btif_config::btif_config_get_bin.body = [this](const std::string& section,
248                                                                const std::string& key,
249                                                                uint8_t* value, size_t* length) {
250       return btif_config_interface_.GetBin(section, key, value, length);
251     };
252     test::mock::btif_config::btif_config_get_bin_length.body = [this](const std::string& section,
253                                                                       const std::string& key) {
254       return btif_config_interface_.GetBinLength(section, key);
255     };
256     test::mock::osi_properties::osi_property_get_bool.body =
257             [](const char* /* key */, bool /* default_value */) { return true; };
258 
259     localIopMock = std::make_unique<IopMock>();
260     localAvrcpVersionMock = std::make_unique<AvrcpVersionMock>();
261     set_avrcp_attr(8, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_5);
262     set_avrcp_feat_attr(2, ATTR_ID_SUPPORTED_FEATURES, AVRCP_SUPF_TG_1_5);
263     set_hfp_attr(SDP_PROFILE_DESC_LENGTH, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_HF_LSB);
264   }
265 
TearDown()266   void TearDown() override {
267     GetInterfaceToProfiles()->profileSpecific_HACK->AVRC_GetProfileVersion = nullptr;
268     test::mock::btif_config::btif_config_get_bin_length = {};
269     test::mock::btif_config::btif_config_get_bin = {};
270     test::mock::osi_properties::osi_property_get_bool = {};
271 
272     localIopMock.reset();
273     localAvrcpVersionMock.reset();
274     StackSdpInitTest::TearDown();
275   }
276   bluetooth::manager::MockBtifConfigInterface btif_config_interface_;
277 };
278 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_device_in_iop_table_version_1_4)279 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_device_in_iop_table_version_1_4) {
280   RawAddress bdaddr;
281   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
282   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
283           .WillOnce(Return(true));
284   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
285   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_4);
286 }
287 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_device_in_iop_table_version_1_3)288 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_device_in_iop_table_version_1_3) {
289   RawAddress bdaddr;
290   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
291   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
292           .WillOnce(Return(false));
293   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
294           .WillOnce(Return(true));
295   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
296   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_3);
297 }
298 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_wrong_len)299 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_wrong_len) {
300   RawAddress bdaddr;
301   set_avrcp_attr(5, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_5);
302   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
303   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
304 }
305 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_wrong_attribute_id)306 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_wrong_attribute_id) {
307   RawAddress bdaddr;
308   set_avrcp_attr(8, ATTR_ID_SERVICE_CLASS_ID_LIST, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_5);
309   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
310   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
311 }
312 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_wrong_uuid)313 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_wrong_uuid) {
314   RawAddress bdaddr;
315   set_avrcp_attr(8, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_SERVCLASS_AUDIO_SOURCE, AVRC_REV_1_5);
316   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
317   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
318 }
319 
320 // device's controller version older than our target version
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_device_older_version)321 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_device_older_version) {
322   RawAddress bdaddr;
323   uint8_t config_0104[2] = {0x04, 0x01};
324   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
325   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
326           .WillOnce(Return(false));
327   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
328           .WillOnce(Return(false));
329   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
330   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
331           .WillOnce(DoAll(SetArrayArgument<2>(config_0104, config_0104 + 2), Return(true)));
332   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
333   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_4);
334 }
335 
336 // device's controller version same as our target version
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_device_same_version)337 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_device_same_version) {
338   RawAddress bdaddr;
339   uint8_t config_0105[2] = {0x05, 0x01};
340   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
341   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
342           .WillOnce(Return(false));
343   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
344           .WillOnce(Return(false));
345   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
346   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
347           .WillOnce(DoAll(SetArrayArgument<2>(config_0105, config_0105 + 2), Return(true)));
348   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
349   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
350 }
351 
352 // device's controller version higher than our target version
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_device_newer_version)353 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_device_newer_version) {
354   RawAddress bdaddr;
355   uint8_t config_0106[2] = {0x06, 0x01};
356   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
357   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
358           .WillOnce(Return(false));
359   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
360           .WillOnce(Return(false));
361   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
362   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
363           .WillOnce(DoAll(SetArrayArgument<2>(config_0106, config_0106 + 2), Return(true)));
364   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
365   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
366 }
367 
368 // cannot read device's controller version from bt_config
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_no_config_value)369 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_no_config_value) {
370   RawAddress bdaddr;
371   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
372   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
373           .WillOnce(Return(false));
374   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
375           .WillOnce(Return(false));
376   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(0));
377   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
378   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
379 }
380 
381 // read device's controller version from bt_config return only 1 byte
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_config_value_1_byte)382 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_config_value_1_byte) {
383   RawAddress bdaddr;
384   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
385   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
386           .WillOnce(Return(false));
387   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
388           .WillOnce(Return(false));
389   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(1));
390   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
391   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
392 }
393 
394 // read device's controller version from bt_config return 3 bytes
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_config_value_3_bytes)395 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_config_value_3_bytes) {
396   RawAddress bdaddr;
397   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
398   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
399           .WillOnce(Return(false));
400   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
401           .WillOnce(Return(false));
402   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(3));
403   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
404   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
405 }
406 
407 // cached controller version is not valid
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_version_config_value_not_valid)408 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_version_config_value_not_valid) {
409   RawAddress bdaddr;
410   uint8_t config_not_valid[2] = {0x12, 0x34};
411   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
412   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
413           .WillOnce(Return(false));
414   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
415           .WillOnce(Return(false));
416   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
417   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
418           .WillOnce(
419                   DoAll(SetArrayArgument<2>(config_not_valid, config_not_valid + 2), Return(true)));
420   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
421   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
422 }
423 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_feature_wrong_len)424 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_feature_wrong_len) {
425   RawAddress bdaddr;
426   set_avrcp_attr(8, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_5);
427   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
428   set_avrcp_feat_attr(6, ATTR_ID_SUPPORTED_FEATURES, AVRCP_SUPF_TG_1_5);
429   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
430   sdpu_set_avrc_target_features(&avrcp_feat_attr, &bdaddr, get_avrc_target_version(&avrcp_attr));
431   ASSERT_EQ(get_avrc_target_feature(&avrcp_feat_attr), AVRCP_SUPF_TG_1_5);
432 }
433 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_feature_wrong_attribute_id)434 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_feature_wrong_attribute_id) {
435   RawAddress bdaddr;
436   set_avrcp_attr(8, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_5);
437   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
438   set_avrcp_feat_attr(2, ATTR_ID_BT_PROFILE_DESC_LIST, AVRCP_SUPF_TG_1_5);
439   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
440   sdpu_set_avrc_target_features(&avrcp_feat_attr, &bdaddr, get_avrc_target_version(&avrcp_attr));
441   ASSERT_EQ(get_avrc_target_feature(&avrcp_feat_attr), AVRCP_SUPF_TG_1_5);
442 }
443 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_feature_device_in_iop_table_version_1_4)444 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_feature_device_in_iop_table_version_1_4) {
445   RawAddress bdaddr;
446   uint8_t feature_0105[2] = {0xC1, 0x00};
447   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
448   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
449           .WillOnce(Return(true));
450   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
451   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_4);
452   set_avrcp_feat_attr(2, ATTR_ID_SUPPORTED_FEATURES, AVRCP_SUPF_TG_1_5);
453   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
454   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
455           .WillOnce(DoAll(SetArrayArgument<2>(feature_0105, feature_0105 + 2), Return(true)));
456   sdpu_set_avrc_target_features(&avrcp_feat_attr, &bdaddr, get_avrc_target_version(&avrcp_attr));
457   ASSERT_EQ(get_avrc_target_feature(&avrcp_feat_attr), AVRCP_SUPF_TG_1_4);
458 }
459 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_feature_device_in_iop_table_version_1_3)460 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_feature_device_in_iop_table_version_1_3) {
461   RawAddress bdaddr;
462   uint8_t feature_0105[2] = {0xC1, 0x00};
463   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
464   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
465           .WillOnce(Return(false));
466   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
467           .WillOnce(Return(true));
468   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
469   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_3);
470   set_avrcp_feat_attr(2, ATTR_ID_SUPPORTED_FEATURES, AVRCP_SUPF_TG_1_5);
471   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
472   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
473           .WillOnce(DoAll(SetArrayArgument<2>(feature_0105, feature_0105 + 2), Return(true)));
474   sdpu_set_avrc_target_features(&avrcp_feat_attr, &bdaddr, get_avrc_target_version(&avrcp_attr));
475   ASSERT_EQ(get_avrc_target_feature(&avrcp_feat_attr), AVRCP_SUPF_TG_1_3);
476 }
477 
478 // cannot read device's controller feature from bt_config
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_feature_no_config_value)479 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_feature_no_config_value) {
480   RawAddress bdaddr;
481   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
482   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
483   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
484   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(0));
485   set_avrcp_feat_attr(2, ATTR_ID_SUPPORTED_FEATURES, AVRCP_SUPF_TG_1_5);
486   sdpu_set_avrc_target_features(&avrcp_feat_attr, &bdaddr, get_avrc_target_version(&avrcp_attr));
487   ASSERT_EQ(get_avrc_target_feature(&avrcp_feat_attr), AVRCP_SUPF_TG_1_5);
488 }
489 
490 // read device's controller feature from bt_config return only 1 byte
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_feature_config_value_1_byte)491 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_feature_config_value_1_byte) {
492   RawAddress bdaddr;
493   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_5));
494   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
495   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_5);
496   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(1));
497   set_avrcp_feat_attr(2, ATTR_ID_SUPPORTED_FEATURES, AVRCP_SUPF_TG_1_5);
498   sdpu_set_avrc_target_features(&avrcp_feat_attr, &bdaddr, get_avrc_target_version(&avrcp_attr));
499   ASSERT_EQ(get_avrc_target_feature(&avrcp_feat_attr), AVRCP_SUPF_TG_1_5);
500 }
501 
TEST_F(StackSdpUtilsTest,sdpu_set_avrc_target_feature_device_version_1_6)502 TEST_F(StackSdpUtilsTest, sdpu_set_avrc_target_feature_device_version_1_6) {
503   RawAddress bdaddr;
504   uint8_t config_0106[2] = {0x06, 0x01};
505   uint8_t feature_0106[2] = {0xC1, 0x01};
506   EXPECT_CALL(*localAvrcpVersionMock, AvrcpProfileVersionMock()).WillOnce(Return(AVRC_REV_1_6));
507   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_4_ONLY, &bdaddr))
508           .WillOnce(Return(false));
509   EXPECT_CALL(*localIopMock, InteropMatchAddr(INTEROP_AVRCP_1_3_ONLY, &bdaddr))
510           .WillOnce(Return(false));
511   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
512   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
513           .WillOnce(DoAll(SetArrayArgument<2>(config_0106, config_0106 + 2), Return(true)));
514   sdpu_set_avrc_target_version(&avrcp_attr, &bdaddr);
515   ASSERT_EQ(get_avrc_target_version(&avrcp_attr), AVRC_REV_1_6);
516   set_avrcp_feat_attr(2, ATTR_ID_SUPPORTED_FEATURES, AVRCP_SUPF_TG_1_5);
517   EXPECT_CALL(btif_config_interface_, GetBinLength(bdaddr.ToString(), _)).WillOnce(Return(2));
518   EXPECT_CALL(btif_config_interface_, GetBin(bdaddr.ToString(), _, _, _))
519           .WillOnce(DoAll(SetArrayArgument<2>(feature_0106, feature_0106 + 2), Return(true)));
520   sdpu_set_avrc_target_features(&avrcp_feat_attr, &bdaddr, get_avrc_target_version(&avrcp_attr));
521   ASSERT_EQ(get_avrc_target_feature(&avrcp_feat_attr),
522             AVRCP_SUPF_TG_1_6 | AVRC_SUPF_TG_PLAYER_COVER_ART);
523 }
524 
TEST_F(StackSdpUtilsTest,dynamic_hfp_version_with_invalid_length)525 TEST_F(StackSdpUtilsTest, dynamic_hfp_version_with_invalid_length) {
526   RawAddress bdaddr(RawAddress::kEmpty);
527   set_hfp_attr(INVALID_LENGTH, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_HF_LSB);
528   ASSERT_EQ(sdp_dynamic_change_hfp_version(&hfp_attr, bdaddr), false);
529 }
530 
TEST_F(StackSdpUtilsTest,dynamic_hfp_version_with_invalid_UUID)531 TEST_F(StackSdpUtilsTest, dynamic_hfp_version_with_invalid_UUID) {
532   RawAddress bdaddr(RawAddress::kEmpty);
533   set_hfp_attr(SDP_PROFILE_DESC_LENGTH, ATTR_ID_BT_PROFILE_DESC_LIST, INVALID_UUID);
534   ASSERT_EQ(sdp_dynamic_change_hfp_version(&hfp_attr, bdaddr), false);
535 }
536 
TEST_F(StackSdpUtilsTest,check_HFP_version_change_fail)537 TEST_F(StackSdpUtilsTest, check_HFP_version_change_fail) {
538   RawAddress bdaddr(RawAddress::kEmpty);
539   set_hfp_attr(SDP_PROFILE_DESC_LENGTH, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_HF_LSB);
540   test::mock::osi_properties::osi_property_get_bool.body =
541           [](const char* /* key */, bool /* default_value */) { return false; };
542   EXPECT_CALL(*localIopMock, InteropMatchAddrOrName(INTEROP_HFP_1_7_ALLOWLIST, &bdaddr,
543                                                     &btif_storage_get_remote_device_property))
544           .WillOnce(Return(false));
545   EXPECT_CALL(*localIopMock, InteropMatchAddrOrName(INTEROP_HFP_1_9_ALLOWLIST, &bdaddr,
546                                                     &btif_storage_get_remote_device_property))
547           .WillOnce(Return(false));
548   ASSERT_EQ(sdp_dynamic_change_hfp_version(&hfp_attr, bdaddr), false);
549 }
550 
TEST_F(StackSdpUtilsTest,check_HFP_version_change_success)551 TEST_F(StackSdpUtilsTest, check_HFP_version_change_success) {
552   RawAddress bdaddr(RawAddress::kEmpty);
553   set_hfp_attr(SDP_PROFILE_DESC_LENGTH, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_HF_LSB);
554   EXPECT_CALL(*localIopMock, InteropMatchAddrOrName(INTEROP_HFP_1_7_ALLOWLIST, &bdaddr,
555                                                     &btif_storage_get_remote_device_property))
556           .WillOnce(Return(true));
557   EXPECT_CALL(*localIopMock, InteropMatchAddrOrName(INTEROP_HFP_1_9_ALLOWLIST, &bdaddr,
558                                                     &btif_storage_get_remote_device_property))
559           .WillOnce(Return(true));
560   ASSERT_EQ(sdp_dynamic_change_hfp_version(&hfp_attr, bdaddr), true);
561 }
562 
TEST_F(StackSdpUtilsTest,check_HFP_version_fallback_success)563 TEST_F(StackSdpUtilsTest, check_HFP_version_fallback_success) {
564   RawAddress bdaddr(RawAddress::kEmpty);
565   set_hfp_attr(SDP_PROFILE_DESC_LENGTH, ATTR_ID_BT_PROFILE_DESC_LIST, UUID_HF_LSB);
566   EXPECT_CALL(*localIopMock, InteropMatchAddrOrName(INTEROP_HFP_1_7_ALLOWLIST, &bdaddr,
567                                                     &btif_storage_get_remote_device_property))
568           .WillOnce(Return(true));
569   EXPECT_CALL(*localIopMock, InteropMatchAddrOrName(INTEROP_HFP_1_9_ALLOWLIST, &bdaddr,
570                                                     &btif_storage_get_remote_device_property))
571           .WillOnce(Return(true));
572   ASSERT_TRUE(sdp_dynamic_change_hfp_version(&hfp_attr, bdaddr));
573 }
574 
TEST_F(StackSdpUtilsTest,sdpu_compare_uuid_with_attr_u16)575 TEST_F(StackSdpUtilsTest, sdpu_compare_uuid_with_attr_u16) {
576   tSDP_DISC_ATTR attr = {
577           .p_next_attr = nullptr,
578           .attr_id = 0,
579           .attr_len_type = bluetooth::Uuid::kNumBytes16,
580           .attr_value =
581                   {
582                           .v =
583                                   {
584                                           .u16 = 0x1234,
585                                   },
586                   },
587   };
588 
589   bool is_valid{false};
590   bluetooth::Uuid uuid = bluetooth::Uuid::FromString("1234", &is_valid);
591 
592   ASSERT_EQ(uuid.As16Bit(), attr.attr_value.v.u16);
593   ASSERT_TRUE(is_valid);
594   ASSERT_TRUE(sdpu_compare_uuid_with_attr(uuid, &attr));
595 }
596 
TEST_F(StackSdpUtilsTest,sdpu_compare_uuid_with_attr_u32)597 TEST_F(StackSdpUtilsTest, sdpu_compare_uuid_with_attr_u32) {
598   tSDP_DISC_ATTR attr = {
599           .p_next_attr = nullptr,
600           .attr_id = 0,
601           .attr_len_type = bluetooth::Uuid::kNumBytes32,
602           .attr_value =
603                   {
604                           .v =
605                                   {
606                                           .u32 = 0x12345678,
607                                   },
608                   },
609   };
610 
611   bool is_valid{false};
612   bluetooth::Uuid uuid = bluetooth::Uuid::FromString("12345678", &is_valid);
613 
614   ASSERT_EQ(uuid.As32Bit(), attr.attr_value.v.u32);
615   ASSERT_TRUE(is_valid);
616   ASSERT_TRUE(sdpu_compare_uuid_with_attr(uuid, &attr));
617 }
618 
TEST_F(StackSdpUtilsTest,sdpu_compare_uuid_with_attr_u128)619 TEST_F(StackSdpUtilsTest, sdpu_compare_uuid_with_attr_u128) {
620   tSDP_DISC_ATTR* p_attr = (tSDP_DISC_ATTR*)calloc(1, sizeof(tSDP_DISC_ATTR) + 16);
621   tSDP_DISC_ATTR attr = {
622           .p_next_attr = nullptr,
623           .attr_id = 0,
624           .attr_len_type = bluetooth::Uuid::kNumBytes128,
625           .attr_value = {},
626   };
627 
628   uint8_t data[] = {
629           0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
630           0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
631   };
632 
633   memcpy(p_attr, &attr, sizeof(tSDP_DISC_ATTR));
634   memcpy(p_attr->attr_value.v.array, data, 16);
635 
636   bool is_valid{false};
637   bluetooth::Uuid uuid =
638           bluetooth::Uuid::FromString("12345678-9abc-def0-1234-56789abcdef0", &is_valid);
639 
640   ASSERT_EQ(0, memcmp(uuid.To128BitBE().data(), (void*)p_attr->attr_value.v.array,
641                       bluetooth::Uuid::kNumBytes128));
642   ASSERT_TRUE(is_valid);
643   ASSERT_TRUE(sdpu_compare_uuid_with_attr(uuid, p_attr));
644 
645   free(p_attr);
646 }
647